21-04-2018, 10:22
Witam,
Mam problem ze stabilnością działania kodu zawartego w załączniku. Program kompiluje się i działa poprawnie przez 3 - 4 godziny, po tym czasie przestaje publikować wyniki odczytów.
Od strony sprzętowej konfiguracja wygląda tak:
- Arduino Uno R3 lub Mega (bez różnicy, Mega działa nawet trochę krócej)
- Ethernet Shield W5100 (ten ze slotem SD)
- zasilacz 12V 2A
- 4 czujniki DS18B20
Teraz program jest maksymalnie odchudzony. Domyślnie pomiędzy kolejnymi seriami odczytów była przerwa, ale użycie delay(); powodowało zawieszanie się po kilku minutach. Wyrzuciłem również komunikację przez monitor portu szeregowego.
W tym momencie przychodzą mi na myśl trzy rzeczy:
- Fragmentacja pamięci spowodowana zadeklarowaniem buforów jako zmiennych lokalnych. Problem mam taki, że jeżeli zadeklaruję je jako globalne to nie wiem jak je wyczyścić przed kolejnym odtworzeniem pętli. Efekt jest taki, że w pierwszym powtórzeniu wynik jest poprawny (np. { id1 : 20,1 }, a kolejne powtórzenia przepełniają bufor ({ id1 : 20,1 } { id1 : 20,2 } { id1 : 21,3 } i tak aż do przepełnienia.
- Zbyt częste / źle skonstruowane odczyty z czujników.
- Wadliwy Ethernet Shield - ma jakiś problem z inicjalizacją. Po podłączeniu zestawu do zasilania diody na module sieciowym kilkukrotnie zapalają się i gasną. Po czasie 10 - 30 sekund zapalają się na stałe, program działa (wyniki da się odcztać przez Serial.print(); ale komunikacja sieciowa nie działa. Po drugim lub trzecim resecie diody zapalają się natychmiast po zresetowaniu i wtedy komunikacja działa poprawnie aż do zawieszenia.
Jakiś czas temu używałem tego sprzętu do odczytu tych czterech termometrów, ale wyniki raportowałem bezpośrednio do Domoticza przez HTTP GET. Program miał kilometr tekstu, używał bardzo długich stringów, przesyłał mnóstwo danych... i potrafił działać 3 tygodnie bez przerwy. Przejście na MQTT miało zoptymalizować cały proces.
W tym momencie chcę dokupić kolejny Ethernet Shield żeby wykluczyć ewentualny problem sprzętowy.
Jednocześnie zwracam się z prośbą o przejrzenie kodu pod kątem jakichś ewidentnych błędów.
Mam problem ze stabilnością działania kodu zawartego w załączniku. Program kompiluje się i działa poprawnie przez 3 - 4 godziny, po tym czasie przestaje publikować wyniki odczytów.
Od strony sprzętowej konfiguracja wygląda tak:
- Arduino Uno R3 lub Mega (bez różnicy, Mega działa nawet trochę krócej)
- Ethernet Shield W5100 (ten ze slotem SD)
- zasilacz 12V 2A
- 4 czujniki DS18B20
Teraz program jest maksymalnie odchudzony. Domyślnie pomiędzy kolejnymi seriami odczytów była przerwa, ale użycie delay(); powodowało zawieszanie się po kilku minutach. Wyrzuciłem również komunikację przez monitor portu szeregowego.
W tym momencie przychodzą mi na myśl trzy rzeczy:
- Fragmentacja pamięci spowodowana zadeklarowaniem buforów jako zmiennych lokalnych. Problem mam taki, że jeżeli zadeklaruję je jako globalne to nie wiem jak je wyczyścić przed kolejnym odtworzeniem pętli. Efekt jest taki, że w pierwszym powtórzeniu wynik jest poprawny (np. { id1 : 20,1 }, a kolejne powtórzenia przepełniają bufor ({ id1 : 20,1 } { id1 : 20,2 } { id1 : 21,3 } i tak aż do przepełnienia.
- Zbyt częste / źle skonstruowane odczyty z czujników.
- Wadliwy Ethernet Shield - ma jakiś problem z inicjalizacją. Po podłączeniu zestawu do zasilania diody na module sieciowym kilkukrotnie zapalają się i gasną. Po czasie 10 - 30 sekund zapalają się na stałe, program działa (wyniki da się odcztać przez Serial.print(); ale komunikacja sieciowa nie działa. Po drugim lub trzecim resecie diody zapalają się natychmiast po zresetowaniu i wtedy komunikacja działa poprawnie aż do zawieszenia.
Jakiś czas temu używałem tego sprzętu do odczytu tych czterech termometrów, ale wyniki raportowałem bezpośrednio do Domoticza przez HTTP GET. Program miał kilometr tekstu, używał bardzo długich stringów, przesyłał mnóstwo danych... i potrafił działać 3 tygodnie bez przerwy. Przejście na MQTT miało zoptymalizować cały proces.
W tym momencie chcę dokupić kolejny Ethernet Shield żeby wykluczyć ewentualny problem sprzętowy.
Jednocześnie zwracam się z prośbą o przejrzenie kodu pod kątem jakichś ewidentnych błędów.