Xele Napisano Luty 12, 2022 Udostępnij Napisano Luty 12, 2022 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
ethanak Luty 12, 2022 Udostępnij Luty 12, 2022 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 );
Xele Luty 12, 2022 Autor tematu Udostępnij Luty 12, 2022 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.
ethanak Luty 12, 2022 Udostępnij Luty 12, 2022 A, to nie doczytałem. Co do modułu RTC - ja używam DS3231, dokładniejszy, zasilanie z 3.3V + bateria. BTW. to dlatego masz 5V zasilania?
Xele Luty 13, 2022 Autor tematu Udostępnij Luty 13, 2022 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ć.
ethanak Luty 13, 2022 Udostępnij Luty 13, 2022 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. 1
Xele Luty 13, 2022 Autor tematu Udostępnij Luty 13, 2022 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ś.
ethanak Luty 13, 2022 Udostępnij Luty 13, 2022 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.
Xele Luty 15, 2022 Autor tematu Udostępnij Luty 15, 2022 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ć.
Xele Luty 15, 2022 Autor tematu Udostępnij Luty 15, 2022 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
Xele Luty 16, 2022 Autor tematu Udostępnij Luty 16, 2022 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.
ethanak Luty 16, 2022 Udostępnij Luty 16, 2022 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.
Xele Luty 18, 2022 Autor tematu Udostępnij Luty 18, 2022 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ć.
Pomocna odpowiedź
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ę »