Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Arduino uno r3 i 5 termometrów ds18b20 lcd 4x20

25 Lut 2018 00:24 1107 29
  • Poziom 4  
    Witam wszystkich forumowiczów. Z góry przepraszam jeśli umieściłem temat w złym miejscu.

    Posiadam arduino uno r3 , 5 sztuk termometrów ds18b20 i do tego wyświetlacz LCD 4x20. Miałem podłączone 4 termometry w trybie pasożytnicym z odczytem numerów seryjnych termometrów z rezystorem 2.2k i wszystko pięknie działało. Mój problem pojawił się gdy podłączył do tego 5 termometr w takim samym trybie. Wygląda to następująco. W moim przypadku 4 termometr jest na zewnątrz a ten "nowo" podłączony czyli 5 w pokoju jak i pozostałe. Wszystkie termometry odczytują poprawną temperaturę oprócz tego zewnętrznego który pokazuję 85.00. Zmniejszałem opór rezystora podciagajacego i nic to nie dało. Zmieniłem sposób obsługi termometrów i też nic. Nie mam już pomysłów więc proszę o pomoc. Szukałem w innych postach ale nic nie znalazłem.
  • PCBway
  • Użytkownik usunął konto  
  • Poziom 4  
    Przepraszam za mój błąd.

    Kod wygląda następująco:
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Użytkownik usunął konto  
  • Poziom 4  
    Dziękuję za wszelką pomoc i przepraszam za nieumiejętne napisanie posta. Pomogło dołączenie trzech równolegle połączonych rezystorów 2,2k. Więc tą kwestie można zamknąć.
    Ale mam teraz inny problem. Potrzebuję podłączyć do tego samego Arduino licznik energii ORNO OR-WE-505. Licznik wysyła 1000 impulsów na 1kWh. Jednym przewodem podpinam do licznika 5V z Arduino a drugi przewód podpinam z licznika pod pin 3 na Arduino który powinien odczytywać impulsy z licznika. Problem jest następujący że gdy licznik rzeczywiście wysyła jeden impuls na ok. 1 sekundę, Arduino odbiera ich 20-30 i nie wiem w czym leży problem.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod zaczerpnąłem ze strony nettigo. Jeśli licznik wysyła impuls to złącze w nim jest zwierane ( 20 i 21 ) , więc gdy przychodzi impuls to na pin 3 powinien wejść stan wysoki czyli logiczna jedynka, co skutkuje wywołaniem przerwania.

    Schemat licznika:
    Arduino uno r3 i 5 termometrów ds18b20 lcd 4x20
    Prosił bym o pomoc bo męczę się już z tym drugi dzień.
  • Użytkownik usunął konto  
  • Poziom 4  
    Przepraszam ale zapomniałem dodać że nie posiadam oscyloskopu ale udało mi się cokolwiek zobaczyć na mierniku ( tak wiem że to nie oscyloskop ale może w czymś pomoże ) . Gdy licznik wysyła impuls to na tym przewodzie który podłączam do 3 pinu pojawia się skok napięcia z 0V do 0,5-0,8 V. Jeśli źle to podłączyłem do proszę naprowadź mnie jak mam to poprawnie zrobić.
  • Moderator Mikrokontrolery Projektowanie
    misiek_misiek napisał:
    Pomogło dołączenie trzech równolegle połączonych rezystorów 2,2k. Więc tą kwestie można zamknąć.


    To może w przyszłości spowodować inne błędy. Wynika z tego, że problemem było niewystarczające ładowanie wbudowanych kondensatorów w trybie parasite. Zobacz w notach Dallasa jak sobie z tym radzić - trzeba wydłużyć czas trwania stanu wysokiego, albo zastosować strong pullup - tranzystor, który w odpowiednim momencie zwiera linię danych do Vcc umożliwiając szybkie ładowanie kondensatorów.
    Swoją droga nie robumiem po co ludzie sobie kmplikują życie używając trybu pasożytniczego.
    misiek_misiek napisał:
    Ale mam teraz inny problem. Potrzebuję podłączyć do tego samego Arduino licznik energii ORNO OR-WE-505. Licznik wysyła 1000 impulsów na 1kWh.


    Ponieważ te liczniki oferują znacznie więcej, więc proponuję ci połączyć się przy pomocy Modbusa z licznikiem (prosty interfejs RS485) i po prostu odczytywać z niego potrzebne parametry, a nie bawić się w liczenie impulsów.
  • Użytkownik usunął konto  
  • PCBway
  • Poziom 4  
    Łączę to w ten sposób:

    Arduino uno r3 i 5 termometrów ds18b20 lcd 4x20
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 4  
    Być może jestem na to za głupi i się nie nadaje.
    Rozumiem to tak że jeśli ustawiam pin 3 na INPUT to jest to pin wejsciowy z domyslnie zerem logicznym czyli 0V. Jak podlaczylem tak jak opisalem to rozumiem to tak że czekam na zbocze rosnace i z tego względu dalem przerwanie z RISING. W orginale kodu z nettigo przerwanie bylo na zbocze opadajace i pin 3 byl INPUT_PULLUP czyli wejsciowy z podciagnieciem czyli dla mnie domyslenie na nim jest 5V czyli jedynka logiczna ale oczywiście mogę sie mylić. Z tego co czytalem w internecie to mikrokontroler od 2.5 do 5 V traktuje to jako stan wysoki a niski od 0 do 1.1V. Z tego co pamietam to przyciski obslugiwalo sie w ten sposob ze z jednej strony podpinalo sie pod pin cyfrowy jako wejscie z podciagnieciem a z drugiej do gnd. Jesli sie mylę to proszę popraw mnie.
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 4  
    To postaram się napisać rozwiązanie a Ty jeśli możesz napisz czy będzie ono dobre.

    Widzę to tak że powinienem wgrać orginalny kodz nettigo o ktorym pisałem kilka postów wcześniej czyli z pinem 3 ustawionym w tryb INPUT_PULLUP i przerwaniem reagującym na zbocze FALLING. Przewód który podpinałem pod 5V podpinam pod pin 3 a przewód który podpinałem pod pin 3 podpinam teraz pod GND z Arduino.
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 4  
    Ok dziękuję Ci bardzo za mega pomoc. Postaram się jutro to podłączyc i sprawdzić jak działa. A tak przy okazji zapytam bo widać że masz przeogromną wiedzę w tym temacie. Czy wysyłałeś dane z esp8266 01 na serwis thingspeak. W moim przypadku wygląda to tak ze dane z Arduino wysyłam do esp po serial porcie, esp je odbiera w postaci Stringa i tworzy w mojej sieci domowej strone internetowa z tymi danymi. Mam drugie takie samo esp i chciałbym by wysyłało te dane do serwisu thingspeak ale jakoś mi to nie idzie.

    Kod który wgrywam do esp by łączyło się z thingspeak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jest to kod zaczerpnięty z internetu oczywiście.
    Kanał na thingspeak jest publiczny.
  • Użytkownik usunął konto  
  • Pomocny post

    Poziom 28  
    AnicoZ napisał:
    Niby nie trzeba pchać na usart ale jak wtedy debugować?


    Bardzo prosto : USART przeznaczyć na komunikację z układami ( np. ESP8266 ) a ewentualne debugowanie puścić na programowy "port szeregowy". Konwertery TTL/USB są tanie jak barszcz a w takich sytuacjach są jak znalazł.
  • Poziom 4  
    Ok. Dziękuję za podpowiedzi Panowie. Będę z tym kombinował.
  • Użytkownik usunął konto  

  • Poziom 28  
    AnicoZ napisał:
    I pojawi sie kilka "komplikatorów" w postaci bootloadera

    Można opóźnić wysyłanie danych po UART z ESP8266 i po problemie. Można programować Arduino przez ISP.

    AnicoZ napisał:
    zakłócania transmisji do urządzeń w chwili wysłania czegokolwiek do VirtualCom.


    Żadnych zakłóceń nie ma.
    AnicoZ napisał:
    odłaczyć mostek USB


    Nie trzeba odłączać.
    AnicoZ napisał:
    obciążenie procka może byc nawet 100%

    Co to oznacza? Każdy takt zegara poświęcony jest na transmisję? Tak nie jest.
    Ile danych do debugowania po porcie szeregowym potrzebuje osoba pisząca w Arduino IDE? ;) Można debugować nawet jedną diodą jak się trochę namęczyć i pomyśleć ..
    AnicoZ napisał:
    Arduino to zabawka. Można cos tam sprawdzic ale jak próbuje sie zrobic coś sensownego, to trzeba byc super ekspertem.

    Arduino to po prostu Arduino IDE. Same płytki to tylko najprostsza z możliwych aplikacja AVR i ARM . Można je programować w czym się tylko chce i jak się chce. Jeśli komuś mało, to jest XMEGA, ARM itd. W każdej rodzinie uC, by zrobić coś sensownego, trzeba być ekspertem.
  • Moderator Mikrokontrolery Projektowanie
    Nie znam się na Arduino, ale brak możliwści debugowania wynika chyba tylko z braku takiej możliwości w Arduino IDE? Można zainstalować nakładkę Arduino do Atmel Studio i sobie w nim spokojnie debugować. W końcu to tylko zwykłe programy w C++.
  • Użytkownik usunął konto  

  • Poziom 28  
    tmf napisał:
    ale brak możliwści debugowania wynika chyba tylko z braku takiej możliwości w Arduino IDE?


    Zgadza się. Tutaj mowa o najprostszej formie debugowania - czyli wysyłania prostych komunikatów czy wartości zmiennych do terminala na PC. Zwykle jest to kilkadziesiąt znaków, więc spokojnie można to zrobić programowym interfejsem, by jedyny dostępny USART zostawić do komunikacji z peryferiami z jakimi pracujemy. Po zdebugowaniu po prostu "wyłączamy" ten programowy interfejs szeregowy i po sprawie.
    AnicoZ napisał:
    Nie ma zakłóceń i nie trzeba odłączać? Schematy wskazują na coś innego. Mostek USB ma tylko rezystor szeregowy na linni TX (RX dla procka). Potrzeba dalsze wyjaśnienia?

    Więc w jakim celu w takim UNO wyprowadzony jest UART na złącza i dostępne sa shieldy korzystające z tego ? I jakim cudem w tej właśnie chwili działa mi komunikacja z ESP, bez odłączania czegokolwiek ?
    AnicoZ napisał:
    Przeglądałem bibioteke programowego ustarta. Przy większych predkościach pomiedzy bitami jest wstawiana petla czasowa aby uzyskac wymagana predkość transmisji.

    I jak to ma zakłócić sprzętowy USART ? I po co "większe prędkości" do prostego debugowania ?
    AnicoZ napisał:
    Tak, tylko to importowanie bardzo różnie wychodzi.

    Z nakładką VisualMicro działa bezbłędnie i zawsze. Dzieciaki na kilku stanowiskach katują ją już od dawna i nigdy nie było błędów czy problemów..
    AnicoZ napisał:
    jak beznadziejnie napisane sa niektóre biblioteki i je poprawiam.

    To akurat prawda.. Ale jak już wspomniałeś - ktoś, kto pisze proste programy w Arduino IDE nie zwraca na to uwagi i nie ma problemu. Ktoś, kto ma do napisania zoptymalizowany program, który ma działać niezawodnie, raczej nie korzysta z tego IDE a i z bibliotekami sobie poradzi ;)
  • Użytkownik usunął konto  

  • Poziom 28  
    AnicoZ napisał:
    Podłącz do RX AVR
    Pytanie - czy UNO bez bootloadera to wciąż Arduino ? Nie. Nie mieszaj proszę "pojęć".
    [/quote]
    Napisałeś, że trzeba odłączyć "mostek" oraz :
    AnicoZ napisał:
    Nie ma zakłóceń i nie trzeba odłączać? Schematy wskazują na coś innego. Mostek USB ma tylko rezystor szeregowy na linni TX (RX dla procka). Potrzeba dalsze wyjaśnienia?

    Więc tak, potrzebne wyjaśnienia. Kwestia bootloadera to co innego i pisałem o tym wyżej. Można z niego zrezygnować. Płytki Arduino to płytki ewaluacyjne i tak powinny być traktowane - po sprawdzeniu koncepcji, przenieść wsad na uC w urządzeniu docelowym, modyfikować bootloader lub całkowicie z niego zrezygnować - USBAsp można kupić za grosze. W przeciwnym wypadu trzeba mieć świadomość ograniczeń - choćby sytuacji z bootloaderem i masterami wysyłającymi dane zaraz po uruchomieniu zasilania.
    AnicoZ napisał:
    Nie pamiętam schematów Arduino, ale wydaje mi się, że w pewnych sytuacjach transmisja USB może zakłócić komunikację z urzadzeniem podłączonym do usarta.

    To chyba oczywiste, że jeśli komunikujesz się z czymś po porcie szeregowym Arduino, podłączysz się z USB i zaczniesz po nim wysyłać cokolwiek, to zakłócisz komunikacje Ale o tym nie było tutaj mowy. .
    AnicoZ napisał:
    W Arduino brakuje multipleksera, który w opcji z urzadzeniami podłączanymi do usart przełączałby pomiedzy mostkiem (bootoader) USB a urzadzeniem. W opcji komunikacja po USB multiplekser cały czas podłączony jest tylko z mostkiem. Po prostu brakuje np 74HC4053.

    A po co ten multiplekser?? Po co na siłę komplikować coś, co jest proste i działa dobrze? Do tego w wielu sytuacjach, uniemożliwiło by to zamierzone działanie.
    [quote="AnicoZ"]Arduino zrealizowano jak ZX Spectrum - DMA na rezystorach.
    Zrealizowano tak, jak Atmel zrealizował AVR. Targetem Arduino jest określona grupa użytkowników. Jeśli ktoś ma pretensje, że jest za proste to po prostu nie należy do tego targetu i wybrał złe narzędzie.
    Dodano po 7 [minuty]:
    AnicoZ napisał:
    Jeśli debugowanie ma nieblokowac programu głównego, to albo wysyła się je szybko,


    Jeśli ktoś pisze program z krytycznymi czasami, które muszą być zachowane nawet w czasie debugowania, to wybrał złe narzędzie do pracy ( IDE ). Ale nawet w tym wypadu da się to zrobić, trzeba tylko pomyśleć.
    AnicoZ napisał:
    , albo używając przerwań a to wymaga pamięci ram, której w AVR jest jak na lekarstwo

    Po co wysyłać informacje debugujące z wykorzystaniem przerwań? ?
    Nie wiem, sporo na AVR piszę, dość rozbudowane programy i nieczęsto mam brak RAMu... zwykle to flasha mi brakuje ... Ale jeśli ktoś nie wie, co robi, to szybko ten RAM zapełni ....
  • Użytkownik usunął konto  

  • Poziom 28  
    AnicoZ napisał:
    Już pisałem, aby nie blokować programu głównego. Dlatego debre sa mostki SPI/IIC z dużym FIFO.


    Jeśli masz w programie głównym coś, czego timing jest krytyczny, to stosujesz przerwania. Ale skoro tak się martwisz o to blokowanie programu głównego w trakcie ( i tylko w trakcie ) debugowania prostymi komunikatami typu "i=2" , "wifi ok" z prędkością 9600baud, to już widzę ten program co potwierdza m.in to :
    AnicoZ napisał:
    - ESP-01, aby wysłać dane trzeba wcześniej wiedzieć jaki mają rozmiar. Ile zajmuje skromna strona w HTML każdy wie.

    Ale jak widać nie każdy wie, że trzymanie tego w RAM to głupota. I po jakiego grzyba trzymać to na AVR, skoro na ESP można choćby SPIFFS zaprząc do roboty, czy umieścić wszystko we flash'u??? Wysyłasz to do ESP po USART ?? To co wtedy z tym zmartwieniem o blokowanie programu głównego ??
    AnicoZ napisał:
    A jak się poczyta to co napisałem, to widać, że najczęściej lepiej użyć ARM


    Nie sztuką jest wziąć największy dostępny uC i zapchać go bez żadnej optymalizacji. Sztuką jest pomyśleć, co można poprawić i odchudzić, by działało szybciej i zajmowało mniej pamięci. Ale owszem, gdy jest się na granicy, to bez sensu jest trzymanie się na siłę jednej rodziny, gdy za niższą cenę można dostać wydajniejszy uC z większą ilością pamięci.
  • Użytkownik usunął konto  

  • Poziom 28  
    AnicoZ napisał:
    Jak mam umieściś wszystko we flash, skoro nie wiem jaka treść będe generował. Są elementy stałe i są elementy, które się zmieniają. Owszem, mogę na przemian wysyłać dane z flash (stałe elementy) i generowane dynamicznie z ram ale ze względu na elementy dynamiczne nie wiem ile danych będę przysłał. Musiałbym więc najpierw zsumować wielkość elementów z flash ( kilkadziesiat czy więcej stringów) i tych, które sa dynamiczne. I tu może byc problem, co jeśli po tej operacji wielkość elementów dynamicznych ulegnie zmianie? Można je buforować, mozna ustawic flagę aby elementy dynamicznie nie zmieniały sie (to zły pomysł, bo są one prezentowane w terminalu przez USB i na LCD). Pewnie jest jeszcze kilka rozwiązań, tydzień roboty i działa z minimalna ilościa ram. Ja wole zrobić bufor na całą stronę zostawiając tylko duży nagłówek w flash. Nie robię tego tydzień tylko jeden dzień. Nakład finansowy, wymiana Mega324 na Mega1284 i mam 6 dni wolnego


    Ale jak to nie wiesz, jaką treść będziesz generował? Jakie to elementy dynamiczne, które raz są, raz ich nie ma ?Layout strony umieszczasz we flash, wysyłasz raz, na żądanie klienta a elementy zmienne wysyłasz np. Ajaxem ( w XMLu większość treści także z flasha ). Można nawet dynamiczne generować treść HTML - javascript Twoim przyjacielem ;)
    Inna sprawa to stawianie "zaawansowanych" serwerów na 8 bitowcu AVR... Trzeba znaleźć granicę, gdzie pchanie serwera na siłę w AVR mija się z celem.

    AnicoZ napisał:
    W przerwaniach. Nic mi sie nie blokuje.


    Więc dlaczego tak martwiło Cię klika komend po programowym interfejsie szeregowym w czasie i tylko w czasie debugowania ? :)
    AnicoZ napisał:
    Jak ma się dużo ram, to łatwiej się pisze, bo można stworzyć duże bufory nadawcze i stronę, dane dla terminala itp wysyłać do bufora i program główny pracuje dalej a dane z buforów są wysyłane w przerwaniach


    Chyba kolega myli AVR z np. XMEGA ;)
    Ale fakt - mając od groma pamięci, nie trzeba sie pilnować i można poszaleć :)