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.

DS18B20 zwraca zero po pewnym upływie czasu

02 Mar 2018 08:33 468 18
  • Poziom 13  
    Witam
    Zrobiłem termometr internetowy w oparciu o Arduino Nano, moduł ENC28J60, oraz dwa DS18B20. Testowałem go przez ostatnie dwa tygodnie i do wczoraj było ok. Od wczoraj nagle zaczął wkazywać na czujnikach temperatury zero stopni. Sieć się nie zawiesiła bo do bazy mysql zapisuje wartości 0 z aktualną datą. Po restarcie wróciło do normy. Proszę o pomoc w znalezieniu przyczyny. Wklejam kod poniżej.



    Kod: c
    Zaloguj się, aby zobaczyć kod
  • PCBway

  • Poziom 26  
    Witaj, nie wiem jakiej biblioteki używasz ale jeśli to jest ta
    http://tomczak.org.pl/index.php/dydaktyka/swbud/arduino-odczyt-termometru-cyfrowego/ to masz coś takiego jak, sprawdzanie sumy kontrolnej
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Wtedy będziesz wiedział czy te 0 to błąd w transmisji DS18b20<->arduino, czy kwestja ENC.

    Pozdrawiam
    [/code]
  • PCBway
  • Poziom 18  
    Sprawdzałeś oscyloskopem czy jest transmisja na DS18B209?
  • Poziom 13  
    Nie sprawdziłem bo po pierwsze oscyloskopu nie posiadam, a po drugie zdążyłem zresetować układ. Tak jak wspomniałem stało się to po 2 tygodniach nieustannej pracy.
  • Poziom 18  
    rafik73 napisał:
    scyloskopu nie posiadam

    To jak sobie wyobrażasz pracę z układami elektronicznymi? Oscyloskop, w przypadku urządzeń z protokołem rejestrator wielokanałowy to podstawa. Bez tego to miesiącami czy latami możesz szukać błędu.

    Kup sobie np SaleAE. Jak znów przydarzy się problem podłączysz rejestrator i juz coś będziesz wiedział. Czasem jednak bez oscyloskopu się nie da rady. Tak jak cieśla bez bez hebla, tak elektronik bez oscyloskopu sie nie obędzie. Owszem, cieśla może heblować żyletką ale ile czasu będzie robił prostą rzecz?

    Nie pisz, ze trzeba dużo kasy. SaleAE 30..50zł, oscyloskop (marny ale już coś można zrobić) to 100zł, sensowny 500, cyfrowy 2x25MHz 1000zł.
  • Poziom 20  
    A to nie dlatego, że "przekręcił" Ci się licznik milis() i zaczął liczyć od zera, na co Twój kod nie jest przygotowany?
  • Poziom 13  
    nie sądzę, millis przekręca licznik po 49 dniach a ja wyraźnie określiłem, że stało się to 2 tygodniach.
  • Poziom 31  
    Jeśli żądania HTTP z odczytami wciąż przychodziły do serwera, no to jedynym widocznym w powyższym kodzie źródłem tych zer jest sensors.getTempCByIndex(), więc ewentualnie tam trzebaby się jeszcze zagłębić.
    A jak jest podłączone zasilanie tych czujników? Trzecim przewodem na stałe?
    Miałem kiedyś przypadek, że zawilgocony czujnik podawał 0 stopni z poprawnym CRC8, dopóki nie wysechł. (Zasilany pasożytniczo.)
  • Poziom 18  
    Sam Sung napisał:
    Miałem kiedyś przypadek, że zawilgocony czujnik podawał 0 stopni z poprawnym CRC8, dopóki nie wysechł. (Zasilany pasożytniczo.)

    Szansa na to 1/256 ale w programie autora nie ma sprawdzania CRC. W takiej sytuacji, zależnie od tego jaką biblioteke OneWire ma, jak zewrze magistrale to będzie odczytywał 0 stopni albo -127.
    Jakby program był napisany poprawnie, to wykrywałby złe crc. Nawet jak błąd się znów pojawi, to nie mając sprzetu (oscyloskop, sonda logiczna, rejestrator wielokanałowy) nie ma jak sprawdzić co działa a co nie.

    Co do innych "błędów" programowych, to nie używa watchdoga.

    Program napisany "na sztukę". Nadaje się do zademonstrowania, że termometr można odczytać przez stronę ale nie do normalnego użytku.

    Można zrobić łatkę, uruchomić warchdoga i co np jeden dzień wymuszać restart procka. Nieprofesjonalne ale skuteczne.
    Też mam problem z zawieszaniem się ESP (wszystko wskazuje na problem z ESP), po ok 20 godzinach pracy. Mam o tyle komfortową sytuację, ze czekam niecały dzień a nie dwa tygodnie aby powstał błąd.
  • Poziom 13  
    ghost2000 napisał:
    Program napisany "na sztukę". Nadaje się do zademonstrowania, że termometr mozna odczytać przez strone ale nie do normalnego użytku.


    Proszę o jakieś konkrety. Chętnie się czegoś nauczę.
  • Poziom 18  
    rafik73 napisał:
    ghost2000 napisał:
    Program napisany "na sztukę". Nadaje się do zademonstrowania, że termometr mozna odczytać przez strone ale nie do normalnego użytku.


    Proszę o jakieś konkrety. Chętnie się czegoś nauczę.

    Konkretnie sprawdzaj crc. Kolega wcześniej juz o tym pisał. Kolejna sprawa watchdog. A tak naprawde konkretnie, to radze zapomnieć o Arduino, które nie ma mozliwości sprzetowego debugowania.
  • Poziom 18  
    rafik73 napisał:
    Postaram się dołączyć wtc do kodu. Myślałem jeszcze o pamięci. Może potestować za pomocą MemoryFree ?

    https://github.com/sudar/MemoryFree?files=1

    Aby naprawdę dowiedzieć się ile max jest zajmowane pamięci, należy wypełnić ją jakąś wartością od wierzchołka sterty do końca stosu a później sprawdzać. Wynika to z tego, ze tak jak zajętość ram na zmienne i stertę można dość łatwo poznać, to zajętość stosu już nie za bardzo zwłaszcza jak system przerwań ma wiele poziomów.

    Proste metody testowania zajętości ram mogą być bardzo mylące.
    Jakbyś miał możliwość debugowania, to można ram wypełnić jakąś wartością, zresetować procka, uruchomić program po pewnym czasie zatrzymać i podejrzeć ram.

    To co w debugerze jest proste i nie zajmuje pamięci w Arduino wymaga pisania procedur zajmujących flash i czasem ram. Widzisz więc, że Arduino to nie jest poważna platforma.
  • Poziom 31  
    ghost2000 napisał:
    Sam Sung napisał:
    Miałem kiedyś przypadek, że zawilgocony czujnik podawał 0 stopni z poprawnym CRC8, dopóki nie wysechł. (Zasilany pasożytniczo.)

    Szansa na to 1/256

    Twierdzę, że złe połączenia mogą powodować zafałszowanie pomiaru na etapie konwersji temperatury. Zły wynik wpisany wówczas do scratchpadu może być później poprawnie odczytany z dobrze wyliczonym dla niego CRC8. Nie musi to być więc kwestia kolizji CRC8. Poprawne CRC8 po prostu nie daje gwarancji, że wynik pomiaru jest prawidłowy.

    Narzekasz na brak możliwości sprzętowego debuggowania na Arduino, a nawet nie przeczytałeś kodu, który należałoby zdebuggować :)
    W https://github.com/milesburton/Arduino-Temper...rol-Library/blob/master/DallasTemperature.cpp widać, że CRC8 jest sprawdzane.

    Poza tym od autora wiemy jedynie, że
    Cytat:
    do bazy mysql zapisuje wartości 0 z aktualną datą

    więc w grę wchodzi jeszcze kod po stronie serwera, który odbiera wyniki z klienta HTTP na Adruino i zapisuje je do MySQL.
    Może to on zamienia jakieś specyficzne wartości na 0?
  • Poziom 18  
    Sam Sung napisał:
    Narzekasz na brak możliwości sprzętowego debuggowania na Arduino, a nawet nie przeczytałeś kodu, który należałoby zdebuggować :)
    W https://github.com/milesburton...b/master/DallasTemperature.cpp widać, że CRC8 jest sprawdzane.

    Bibliotek OneWire dla Arduino jest kilka. Nie mam ochoty każdej sprawdzać. Miałem taką, gdzie zwarcie magistrali dawało 0 stopni. Biblioteka po resecie OneWire nie sprawdzała nawet czy magistrala przyjęła poziom wysoki przed impulsem PRESENCE. Dla mnie szkoda czasu na sprawdzanie bibliotek niewiadomego pochodzenia gdy mam swoją działająca zgodnie ze specyfikacją. Napisałem sobie także taką co używa USARTA (zdaje się według MAXIM'a). O zaletach takiego rozwiązania nie będę pisał.
  • Poziom 31  
    ghost2000 napisał:
    Bibliotek OneWire dla Arduino jest kilka. Nie mam ochoty każdej sprawdzać. (...) Dla mnie szkoda czasu na sprawdzanie bibliotek niewiadomego pochodzenia gdy mam swoją działająca zgodnie ze specyfikacją.
    Świetnie, gratuluję, ale czy uważasz, że to pomaga autorowi tematu? Podobnie jak uwagi o tym, że Arduino do niczego się nie nadaje, a bez oscyloskopu ani rusz?

    @rafik73 proponuję logować na serwerze pełną treść zapytań w przypadku, gdy do bazy trafia 0, to gdy problem wystąpi znowu, może się czegoś ciekawszego dowiemy. No i kod serwera też mógłbyś wkleić.
  • Poziom 18  
    Sam Sung napisał:
    Świetnie, gratuluję, ale czy uważasz, że to pomaga autorowi tematu? Podobnie jak uwagi o tym, że Arduino do niczego się nie nadaje, a bez oscyloskopu ani rusz?

    Pomaga. Musi wiedzieć że sprzęt jest potrzebny ułatwia pracę a czasem jest wręcz niezbędny.
    Z bibliotekami trzeba sie zapoznać, zrozumieć a nie traktować jak czarną skrzynkę, w przeciwnym przypadku, bardzo długo można szukać drobnego błędu.

    Błąd pojawia się co 2 tygodnie, więc ma sporo czasu aby zaznajomić sie z biblioteka OneWire, bo stawiam, ze tam może być problem.


    Elektronika zajmuje się od zawsze. Niejednokrotnie szukałem banalnego błędu (np zasilanie). Mając sprzęt, bywało, że szukałem tydzień. Ile bym szukał bez sprzętu? Miesiąc? Rok?
  • Poziom 13  
    Sam Sung napisał:

    @rafik73 proponuję logować na serwerze pełną treść zapytań w przypadku, gdy do bazy trafia 0, to gdy problem wystąpi znowu, może się czegoś ciekawszego dowiemy. No i kod serwera też mógłbyś wkleić.


    Bardzo proszę.
    Plik odbierający dane z arduino:

    Kod: php
    Zaloguj się, aby zobaczyć kod


    Plik odczytujący dane zapisane w MYSQL i wysyłający je w JSON:

    Kod: php
    Zaloguj się, aby zobaczyć kod


    Skrypt JS odczytujący JSON po AJAX'ie i przesyłający dane do strony, która wyświetla
    temperatury:

    Kod: javascript
    Zaloguj się, aby zobaczyć kod


    i w końcu strona, która wyświetla temperatury:

    Kod: php
    Zaloguj się, aby zobaczyć kod


    Skrypty zawierają dodaną zmienną getFreeMemory_value, która
    przekazuje ilość pozostałej pamięci. Dorzucam poniżej zaktyualizowany
    program do pomiaru temperatury na Arduino:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zastanawiam się nad

    Kod: php
    Zaloguj się, aby zobaczyć kod


    czy

    Kod: php
    Zaloguj się, aby zobaczyć kod


    nie byłoby bardziej transparentne?