Skocz do zawartości

ESP8266 nodemcu v3 + RTC DS1307 - sporadycznie zła data - 2165-165-165 165:165:41


Xele

Pomocna odpowiedź

Witam

Od dłuższego czasu męczę się z tym RTC, gdzie codziennie na 288 zapisów mam od kilku do kilkunastu źle zapisanych dat, tak jak widać na zdjęciu i w opisie są to daty typu "2165-165-165 165:165:41". Na początku RTC był podłączony pod 3v3 bez baterii, później z baterią. W końcu zmieniłem na 5v z baterią bez i ciągle to samo się dzieje.

Po podłączeniu zasilania jeśli jest sieć WiFi to moduł synchronizuję się po przez serwer NTP. Codziennie o odpowiedniej godzinie czas się jeszcze raz synchronizuje. Myślałem, że być może to wina ponownej synchronizacji czasu i wywaliłem ten kod, ale mimo to gdy czas jest dobry to raz na jakiś czas mam tą cholerną datę 2165. Więc nie wiem, ale to chyba wina zasilania albo moduł jest zwalony.

Zasilany jest przez zasilacz 230v AC/DC 5v a gdy sieć domowa padnie to pobiera prąd z baterii 18650 + przetwornica step up do 5v.

Może ktoś miał podobny problem i go rozwiązał? Jeśli nie to wezmę po prostu inny moduł RTC. Dobrze by było jak by ktoś polecił sprawdzony, który działa parę lat.

 

Poniżej na zdjęciu widać dane w sql gdzie są dwie daty 2165. Kolumna reading_time jest to wywołana funkcja w esp

timestamp(DateTime::TIMESTAMP_FULL

z biblioteki:

#include "RTClib.h"

a kolumna ttt to czas w którym momencie dane zostały zapisane do sql, czyli w chwili wysłania po http post z esp. Czasami dwa rekordy są wysłane jednocześnie bo esp gubi sieć wifi i zapisuje dane na karte sd a po przywróceniu sieci wysyła dane z sd i równocześnie nowe dane i tak co 5 minut się usypia i wstaje.

poniżej kod synchronizacji RTC poprzez NTP.

#include <NTPClient.h>
  
void rtc_time()
{
  if (WiFi.status() == WL_CONNECTED)
  {
    timeClient.update();
    timeClient.forceUpdate();

    unsigned long epochTime = timeClient.getEpochTime();
    struct tm *ptm = gmtime ((time_t *)&epochTime);
    int currentHour = timeClient.getHours();
    int currentMinute = timeClient.getMinutes();
    int currentSecond = timeClient.getSeconds();
    int monthDay = ptm->tm_mday;
    int currentMonth = ptm->tm_mon + 1;
    int currentYear = ptm->tm_year + 1900;
    rtc.adjust(DateTime(currentYear , currentMonth , monthDay , currentHour , currentMinute , currentSecond));
  }
}

 

oraz kod pobierania daty z RTC

 DateTime time = rtc.now();
 date = time.timestamp(DateTime::TIMESTAMP_FULL);

która powinna ciągle zwracać: 2022-02-12 19:50:20

sql.jpg

Link do komentarza
Share on other sites

Wiem że to nie rozwiązanie problemu a zastosowanie innej (prawidłowej) metody...
 

create table jakastam (
-- jakieś kolumny
reading_time datetime default current_timestamp,
-- jakieś inne kolumny
  );

 

Link do komentarza
Share on other sites

1 godzinę temu, ethanak napisał:

create table jakastam ( -- jakieś kolumny reading_time datetime default current_timestamp, -- jakieś inne kolumny );

Rozumiem, że ta kolumna ustawi prawidłowy czas w momencie zapisu danych i tak właśnie jest ustawiona kolumna ttt, która służy tylko mi do podglądu jak zostaje zapisana kolumna reading_time z esp. Gdyby dane wysyłały się cały czas online to w porządku, ale u mnie np. w nocy wifi jest wyłączone i ESP działa offline. Więc zapisuje wszystkie dane na sd łącznie z czasem 2022-02-12 19:50:20 od RTC, który zostaje wysłany jak tylko zadziała sieć WiFi. Podsumowując rano jak włącze wifi to ESP wysyła około 100 rekordów z prawidłową datą z karty sd do sql. No prawie prawidłową bo jest ten błąd 2165-165-165 165:165:41.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

5V mam do zasilania nodemcu po vinie i do czujnika sps30 sensirion. Mam jeszcze drugi moduł DS1307 do sprawdzenia. Zobaczę jak z nim będzie. Problem jest taki, że mam to już na dworze zrobione i nie chce mi się za bardzo rozbierać tego, zwłaszcza że RTC przylutowałem. Byłem pewien że problem będzie banalny i zostawiłem to na końcu. Myślałem jeszcze żeby filtrować dane w sql i modyfikować rekord z tą datą, ale do tego muszę się douczyć.

Link do komentarza
Share on other sites

1 godzinę temu, Xele napisał:

Myślałem jeszcze żeby filtrować dane w sql i modyfikować rekord z tą datą

To akurat też dałoby się zrobić, ale prościej chyba w PHP przy wpisywaniu do bazy (tzn. jeśli data jest nieprawidłowa, zamień na datę ostatniego wpisu plus 5 minut).

Dziwi mnie jedna rzecz - pole typu DATETIME w MySQL nie powinno przyjąć takiej dziwnej wartości...

Ale ja i tak spróbowałbym innego modułu.

  • Lubię! 1
Link do komentarza
Share on other sites

Zmieniam dzisiaj na drugi moduł DS1307 i dam znać jak to będzie działać.

W bazie sql mam w ten sposób zrobione jak na obrazku. Na sql mało co się znam jak coś.

sql2.png

Link do komentarza
Share on other sites

zmień reading_time na timestamp (uwaga, w 2038 może przestać działać) albo lepiej datetime.

W php możesz w takiej sytuacji skorzystać z tego, że mysql wywali błąd przy próbie wprowadzenia takiej dziwacznej daty i odpowiednio na to zareagować.

A zmieniałbym nie na inny egzemplarz, tylko inny typ modułu.

Link do komentarza
Share on other sites

Drugi moduł RTC działał jak należy i go podmieniłem. Po czym problem nadal zaczął występować. W końcu zacząłem odpinać wszystkie czujniki podłączone pod i2c. Gdy odpiąłem sps30 to zaczął działać prawidłowo. Dzisiaj postaram się zająć tym. Wychodzi na to że po linii sda/scl występuje problem. Do sps30 miałem jeszcze płytkę do której podłącza się kabel z końcówkami JST z sps30 i od tego kable szły do ESP.  Na tej płytce są rezystory 10k pod sda/scl możliwe że coś źle podłączyłem i zegar rtc się zacinał czy coś. Dam znać.

Link do komentarza
Share on other sites

Cytat

Jaka prędkość i2c? Jaka długość przewodów?

Dzięki tym pytaniom uświadomiłem sobie, że w sumie nic nie wiem o magistrali i2c. Trochę poczytałem i wiem, że prędkość jest standardowa, bo jej nie ustawiałem, pewnie 100khz?. Jeśli chodzi o przewody to sps30 ma z 40cm a reszta z 10-20cm.

RTC, sht30, ds1307 no i SPS30 

Link do komentarza
Share on other sites

Jednak nic z tego. SPS30 podłączyłem tak jak być powinno i dalej się wszystko chrzani. Czy z rezystorami 10k na liniach sda/scl czy bez i tak jest to samo. Jest jakiś problem pomiędzy sps30 a ds1307. Czasami nawet nie widzi RTC. Zamówiłem DS3231 napiszę kod pod niego i zobaczymy co z tego będzie. Poniżej daje zdjęcie odczytów co sekundę na którym widać jak data sama się zmienia przy samym tylko odczytywaniu. Czy to może być wina różnych napięć od czujników i2c? nie mierzyłem sps30 a on pracuję przy 5v, piszą że i2c obsługuje 3.3v i 5v. 

wifi.png

Link do komentarza
Share on other sites

I2C obsługuje 3.3V albo 5V, ale konkretny czujnik nie musi. Podłącz tego sps30 przez konwerter, może zadziała.

BTW. WROOM jest niewiele droższy, ale możesz zrobić bez problemu dwie magistrale I2C. Problem może być taki, że ESP32 nie toleruje 5V na pinach.

Link do komentarza
Share on other sites

Z deszczu pod rynnę. Przyszedł mi chyba uszkodzony ds3231. Próbowałem go uruchomić na arduino uno i dwóch esp nodemcu v3. Zero reakcji, dioda power świeci. Próbowałem kilka bibliotek i nic. Zasilany przez arduino albo osobno. i2c scanner nic nie wykrywa. Więc zwracam i wezmę następny. 

Zmierzyłem napięcie w sps30 i i2c działa pod 3.3v. Więc chyba przez konwerter nie ma sensu podłączać.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.