logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ESP8266 (ESP-07), DHT22, serwer WWW - Po pewnym czasie strona się nie wyświetla.

sq9etc 28 Mar 2020 18:15 4323 52
Najlepsze odpowiedzi

Why does an ESP8266 ESP-07 web server with a DHT22 stop serving the webpage after 1–2 days even though the module still seems to be running?

Najbardziej prawdopodobną przyczyną był błąd w kodzie związanym z obsługą czasu i formatowaniem tekstu, a nie sam serwer WWW czy DHT22 — po usunięciu fragmentu konwertującego czas z `uint32_t` na tekst program działał ponad 3 doby [#18627478][#18627620] Autor zauważył też, że w pierwotnej wersji serwer NTP był odpytywany co 10 s razem z czujnikiem, a po zmianie synchronizacji na raz na dobę po północy problem przestał występować tak szybko [#18627478] Wcześniej pojawiał się też `Soft WDT reset`, co wskazuje na zawieszenie w kodzie, a nie tylko na chwilowy błąd odczytu DHT [#18586389][#18595248] W wątku zwrócono uwagę, że warto sprawdzić poprawność bufora dla `sprintf()` i unikać używania wskaźników do literałów/źle zadeklarowanych łańcuchów, bo mogło to prowadzić do zapisu w złe miejsce pamięci i losowych restartów [#18628064][#18628130][#18632200][#18632496] Dodatkowo sugerowano sprawdzenie, czy ESP nadal odpowiada na ping, oraz czy w `loop()` jest kontrolowany stan klienta WiFi, bo w pokazanym kodzie tego brakowało [#18568097] Do obsługi DHT w ESP polecano też bibliotekę DHTesp zamiast Adafruit, ze względu na lepszą diagnostykę błędów [#18569094]
Wygenerowane przez model językowy.
REKLAMA
  • #1 18567706
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    Skopiowałem żywcem program z tej strony:
    ESP8266 DHT11/DHT22 Temperature and Humidity Web Server with Arduino IDE

    Niestety po dłuższym czasie (1 - 2 dni) strona WWW przestaje się wyświetlać w przeglądarce. Widać, że urządzenie żyje, ponieważ miga niebieska dioda na płytce, w chwili wysyłania komunikatów na port szeregowy.
    Czy ktoś się spotkał z podobnym przypadkiem i może coś podpowiedzieć?
    Układ jest podłączony jak na tym schemacie:
    Link
  • REKLAMA
  • #2 18567857
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 18567925
    kaczakat
    Poziom 34  
    Posty: 1748
    Pomógł: 317
    Ocena: 230
    Sprawdź działanie strony wysyłając jakiś licznik sekund. Wyeliminuje to zawieszanie się spowodowane DHT. Czasem ktoś narzeka, że co jakiś czas czujnik potrafi się zawiesić i pomaga jedynie odłączenie zasilania. Ja tego nie zauważyłem, ale nie testowałem jakoś długo stabilności działania. Taki czujnik można zasilić z pinu uC i jeśli przestanie odpowiadać zrobić ON/OFF. Ale to trzeba jakoś ogarnąć w kodzie.
    Pomogłem? Kup mi kawę.
  • #4 18568097
    Konto nie istnieje
    Poziom 1  
  • #5 18569011
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    khoam napisał:
    Z jaką wersją menadżera płytek ESP8266 skompilowałeś ten program? Najnowsza wersja to 2.6.3.

    Gdzie to można sprawdzić? Arduino IDE 1.8.12. Jeśli chodzi o wersje biblioteki do obsługi ESP8266, która wyświetla się w menadżerze płytek, to tak, jest to wersja 2.6.3.
  • #6 18569026
    Konto nie istnieje
    Poziom 1  
  • #7 18569030
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    kaczakat napisał:
    Czasem ktoś narzeka, że co jakiś czas czujnik potrafi się zawiesić i pomaga jedynie odłączenie zasilania.

    Też mam ten problem. Gdy połączyłem zalinkowany program z tym Network Time Protocol to miałem taki efekt. Dodałem sobie na stronie wyświetlanie daty i czasu oprócz temperatury i wilgotności. Po kilkudziesięciu minutach, do kilku godzin przestawały się pojawiać odczyty z DHT, a czas się zmieniał. Dołożyłem coś takiego, że gdy 3 razy czujnik nie zwróci prawidłowych wartości to robiłem ESP.reset. Niestety to nie pomogło. Musiałem wyłączyć i włączyć zasilanie układu. Po tym przez jakiś czas działało i znowu było to samo. Moduł resetował mi się w kółko po każdych nieudanych trzech próbach odczytu z DHT.

    Dodano po 4 [minuty]:

    khoam napisał:
    sq9etc napisał:
    Jeśli chodzi o wersje biblioteki do obsługi ESP8266, która wyświetla się w menadżerze płytek, to tak, jest to wersja 2.6.3.

    Tak, o to mi chodziło. Spróbuj przetestować pingowanie do ESP, kiedy nie masz dostępu do strony.

    O tym pingu nie pomyślałem, to jest jakaś myśl. Jak tak się stanie to sprawdzę. Na razie działa od prawie dwóch dni.
  • #8 18569094
    Konto nie istnieje
    Poziom 1  
  • #9 18569192
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    Możliwe, może kiedyś sprawdzę. Ale takie zachowanie czujnika sugeruje, że to nie jest problem software'owy, no chyba, że chodzi o oprogramowanie wbudowane czujnika. Po resecie chyba wszystko powinno się przeinicjalizować i działać normalnie.
  • REKLAMA
  • #10 18586389
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    sq9etc napisał:
    kaczakat napisał:
    Czasem ktoś narzeka, że co jakiś czas czujnik potrafi się zawiesić i pomaga jedynie odłączenie zasilania.

    Też mam ten problem. Gdy połączyłem zalinkowany program z tym Network Time Protocol to miałem taki efekt. Dodałem sobie na stronie wyświetlanie daty i czasu oprócz temperatury i wilgotności. Po kilkudziesięciu minutach, do kilku godzin przestawały się pojawiać odczyty z DHT, a czas się zmieniał. Dołożyłem coś takiego, że gdy 3 razy czujnik nie zwróci prawidłowych wartości to robiłem ESP.reset. Niestety to nie pomogło. Musiałem wyłączyć i włączyć zasilanie układu. Po tym przez jakiś czas działało i znowu było to samo. Moduł resetował mi się w kółko po każdych nieudanych trzech próbach odczytu z DHT.

    Dziś znowu mnie to spotkało.
    Tak wygląda fragment zrzutu do pliku z RealTerma:
    ...
    Local time: 2020-04-03 07:20:49
    Temperature: 22.00ÂşC
    Humidity: 48.70%
    020-04-03 07:20:49
    
    
    Local time: 2020-04-03 07:20:59
    Temperature: 22.00ÂşC
    Humidity: 48.70%
    
    Soft WDT reset
    
    >>>stack>>>
    
    ctx: sys
    sp: 3fffed40 end: 3fffffb0 offset: 01b0
    3fffeef0:  40242a1c efd8a1fc 60000600 4021223d  
    3fffef00:  00000000 3ffed558 00000000 00000000  
    3fffef10:  40231530 3ffed558 3ffee510 60000600  
    ...
    3fffff90:  3fffdad0 00000000 3ffeed50 40100229  
    3fffffa0:  3fffdad0 00000000 3ffeed50 402088e5  
    <<<stack<<<
    
     ets Jan  8 2013,rst cause:2, boot mode:(3,7)
    
    load 0x4010f000, len 1392, room 16 
    tail 0
    chksum 0xd0
    csum 0xd0
    v3d128e5c
    ~ld
    Starting UDP
    Local port:	123
    
    Time server IP:	194.146.251.100
    
    Sending NTP request ...
    
    Sending NTP request ...
    NTP response:	1585898481
    
    Local time: 2020-04-03 07:21:21
    Failed to read from DHT sensor!
    Failed to read from DHT sensor!
    020-04-03 07:21:21
    
    NTP response:	1585898486
    
    Local time: 2020-04-03 07:21:26
    Failed to read from DHT sensor!
    Failed to read from DHT sensor!
    020-04-03 07:21:26
    
    NTP response:	1585898496
    
    Local time: 2020-04-03 07:21:36
    Failed to read from DHT sensor!
    Failed to read from DHT sensor!
    ˙
     ets Jan  8 2013,rst cause:2, boot mode:(3,7)
    
    load 0x4010f000, len 1392, room 16 
    tail 0
    chksum 0xd0
    csum 0xd0
    v3d128e5c
    ~ld
    Starting UDP
    Local port:	123
    
    Time server IP:	194.146.251.100
    
    Sending NTP request ...
    
    Sending NTP request ...
    NTP response:	1585898511
    
    Local time: 2020-04-03 07:21:51
    Failed to read from DHT sensor!
    Failed to read from DHT sensor!
    020-04-03 07:21:51
    
    NTP response:	1585898516
    
    Local time: 2020-04-03 07:21:56
    Failed to read from DHT sensor!
    Failed to read from DHT sensor!
    020-04-03 07:21:56
    
    NTP response:	1585898526
    
    Local time: 2020-04-03 07:22:06
    Failed to read from DHT sensor!
    Failed to read from DHT sensor!
    ˙
     ets Jan  8 2013,rst cause:2, boot mode:(3,7)
    ...
    

    Wygląda na to, że zadziałał Watch Dog, ale z jakiej przyczyny nie wiem. Może opóźniała się odpowiedź z serwera NTP. Nie usprawiedliwia to jednak tego, że po resecie nie można już dogadać się z czujnikiem.
  • REKLAMA
  • #11 18586604
    Konto nie istnieje
    Poziom 1  
  • #13 18587948
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    khoam napisał:

    Dobrze byłoby, abyś pokazał jak to "połączyłeś", w szczególności w pętli loop().

    Kod:
    main.cpp
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    WiFi.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    WiFi.cpp
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    khoam napisał:
    sq9etc napisał:
    Nie usprawiedliwia to jednak tego, że po resecie nie można już dogadać się z czujnikiem.

    Trochę usprawiedliwia, biorąc pod uwagę, że po Soft WDT Reset zostają "śmieci" w pamięci RAM.

    Ja tam robię też ESP.reset().
  • #14 18589435
    Konto nie istnieje
    Poziom 1  
  • #15 18590612
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    khoam napisał:
    Jak wyglądają statystyki zajętości pamięci RAM po kompilacji?

    36 %. Co zrobić żeby w Atomie nie zamykało się samo to okienko z komunikatami kompilacji? Trudno zobaczyć tę zajętość pamięci, bo zaraz szybko się zamyka.

    Dodano po 9 [godziny] 5 [minuty]:

    yield() nie pomogło. Zobaczę jeszcze z zamianą ESP.reset() na ESP.restart().
  • #16 18592493
    Konto nie istnieje
    Poziom 1  
  • #17 18592514
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    khoam napisał:
    Zawiesił się program i wykonał Soft WTD Reset? Czy też po wymuszeniu ESP.reset() program nie wznowił pracy poprawnie? To są dwie różne rzeczy.

    Tego nie wiem, bo nie miałem podpiętego podsłuchu. Efekt był taki, że po jakimś czasie przestał się czytać DHT22 jak wcześniej. Mogę tylko podejrzewać, że przyczyna była ta sama, czyli Soft WDT Reset.
  • #18 18592528
    Konto nie istnieje
    Poziom 1  
  • #19 18595248
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    Po zmianach:
    -dodanie yield() tam gdzie sugerowałeś,
    -zamiana ESP.reset() na ESP.restart(),

    jest to samo, tzn.:
    -występuje Soft WDT reset,
    -po powyższym nie można dogadać się z DHT22, ESP.restart() nie pomaga na brak komunikacji z czujnikiem.
  • #20 18595375
    Konto nie istnieje
    Poziom 1  
  • #21 18595416
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    khoam napisał:
    sq9etc napisał:
    jest to samo, tzn.:
    -występuje Soft WDT reset,

    Czy również po tym, jak prawidłowo zostały wyświetlone ostatnie wartości temperatury i wilgotności (vide post #10)?

    Dokładnie tak.
    khoam napisał:
    Po jakim czasie wystąpił ten Soft WDT Reset?

    Za pierwszym razem po 1h 18m pracy, za drugim po prawie 4-ech godzinach poprawnej pracy.
  • #22 18595472
    Konto nie istnieje
    Poziom 1  
  • #23 18597673
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    khoam napisał:
    OK, to pozostaje do wyjaśnienia jedna kwestia. Odnoszę się do pierwszego kodu z postu #13.
    Co konkretnie chciałeś osiągnąć przez użycie zmiennych dHTReadingErrorsCount oraz prevDHTReadingErrorsCount? Od jakiego stanu tych zmiennych chciałeś uzależnić reset układu i w jakiej sytuacji?
    To co jest w kodzie, to widzę ;)


    Po trzech nieudanych próbach odczytu czujnika ma być wykonany reset. Z tym, że jeżeli w jednym cyklu nie uda się odczytać temperatury i wilgotności to zaliczam to jako jeden błąd. Dlatego wprowadziłem dwie zmienne i inkrementuję dHTReadingErrorsCount przy odczycie wilgotności, tylko gdy nie zrobiłem tego przy odczycie temperatury. Stąd ten warunek:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #24 18597882
    krzbor
    Poziom 29  
    Posty: 1755
    Pomógł: 41
    Ocena: 1063
    Miałem program na ESP, który czasami się restartował (kilka razy na dobę). ESP współpracowało z SIM800. Uznałem, że winą są zakłócenia z GSM. Musiałem jednak poprawić program i restarty były niemal cały czas. W końcu ustaliłem, że problem wynika ze zwracania "String" jako rezultat funkcji - powinno działać, a nie działa. Rozwiązałem problem rezygnując ze zwracania wartości "String" przez funkcję - "String" jest teraz przekazywany do funkcji przez referencję i wszystko zaczęło działać. W Twoim kodzie jest funkcja "processor", która zwraca String'a. Może też występuje ten sam problem co u mnie?
  • #25 18598097
    Konto nie istnieje
    Poziom 1  
  • #26 18598668
    krzbor
    Poziom 29  
    Posty: 1755
    Pomógł: 41
    Ocena: 1063
    Rzeczywiście, nie zauważyłem, że ta funkcja to callback. Moje doświadczenie z obiektem String było takie, że jeśli funkcja zwraca ten obiekt i jest on przypisywany do zmiennej globalnej, to jest OK (tak mam w innych projektach). Problem się pojawił, gdy rezultat funkcji zwracającej String był przechowywany w innej funkcji w zmiennej lokalnej - innymi słowy dochodziła obsługa stosu. Skoro tu mamy callback to też zachodzi ta sytuacja.
  • #27 18598763
    Konto nie istnieje
    Poziom 1  
  • #28 18613509
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    khoam napisał:
    sq9etc napisał:
    Po trzech nieudanych próbach odczytu czujnika ma być wykonany reset.

    Niezależnie od tego w jakim długim okresie czasu nastąpiły?

    Trafna uwaga, choć u mnie jak czujnik przestawał się czytać, to już na amen.

    Dodano po 4 [minuty]:
    Zamieniłem Send_P na Send, ale nic się nie zmieniło, tzn. po kilkudziesięciu minutach czujnik przestawał odpowiadać.
    Zakomentowałem część kodu odpowiedzialną za pobieranie i konwertowanie czasu do tekstu. Zamiast tego wyświetlam sobie numer odczytu od uruchomienia modułu. Na obecną chwilę jest 5080 odczytów, czyli od ponad 14-tu godzin wszystko działa. Dalej mam wyświetlane trzy zmienne jak miałem. Tak, że nie wygląda mi to na jakiś problem ze stringami.
  • #29 18613691
    Konto nie istnieje
    Poziom 1  
  • #30 18627478
    sq9etc
    Poziom 12  
    Posty: 228
    Pomógł: 11
    Ocena: 15
    Odremowałem fragment kodu konwertujący czas z zmiennej typu uint32_t na ciąg tekstowy i w tej postaci program działał przez ponad 3 doby.
    W pierwotnej wersji, skleconej na szybko z dwóch, którą prezentowałem na listingu była niefajna rzecz. Mianowicie serwer czasu był odpytywany tak samo często jak czujnik, czyli co 10 s.
    Teraz zmieniłem to w ten sposób, że synchronizacja następuje raz na dobę po północy wg czasu zimowego. Na razie działa od wieczora. Mam nadzieję, że w ten sposób będzie to już działać stabilnie przez dłuższy czas. Ciekaw jestem jaki będzie rozjazd czasu pod koniec doby. Czas inkrementuję sobie co odczyt czujnika, czyli co 10 s.

Podsumowanie tematu

✨ Użytkownik skopiował program do obsługi czujnika DHT22 na ESP8266 (ESP-07) i napotkał problem z wyświetlaniem strony WWW po 1-2 dniach działania. Inni uczestnicy dyskusji sugerują sprawdzenie wersji menedżera płytek ESP8266, pingowanie urządzenia w celu weryfikacji jego statusu oraz modyfikację kodu, aby lepiej obsługiwał błędy związane z DHT22. Wskazano również na możliwość problemów z pamięcią oraz zasilaniem, a także na konieczność użycia lepszej biblioteki do obsługi czujników DHT. Użytkownik zauważył, że po wprowadzeniu zmian w kodzie, takich jak dodanie funkcji yield() oraz zamiana ESP.reset() na ESP.restart(), problem nadal występuje. Ostatecznie, po usunięciu fragmentu kodu odpowiedzialnego za konwersję czasu, system działał stabilnie przez dłuższy czas.
Wygenerowane przez model językowy.
REKLAMA