Vector Napisano Styczeń 11, 2022 Udostępnij Napisano Styczeń 11, 2022 (edytowany) Cześć. To mój pierwszy kontakt z programowaniem i zrobiłem sobie taki tam zegarek (DS3231) z termometrem na zewnątrz (DS18B20) i wewnątrz (DHT22). Do rzeczy: Wgrywam szkic, ustawiam czas, ok - zresetował się i ustawił czas który poprawnie wyświetlił na LCD (4x20). W szkicu od razu ustawienia czasu/daty wstawiam w komentarz i wgrywam szkic od nowa. W ten sposób nie będzie mi się wgrywać ustawienie czasu przy pierwszej kompilacji. I to działa. Sęk w tym, że całość jest podłączona w pracy do mojego komputera przez USB, który po 8...9 godzinach jest wyłączany i całość przestaje pracować. Rano włączam komputer, zegaro-termometr rusza i jest ok. Ale czasami nagle ustawi sam sobie jakąś datę i jakiś czas (całkowicie losowo, choć rok jest ten który jest) i znów muszę wgrywać ustawianie czasu/daty, zakomentować ustawienia i wgrać na nowo. I znów działa. Co jest powodem, ze zegar RTC czasami sam z siebie zmienia czas/datę? Edytowano Styczeń 11, 2022 przez Vector poprawiłem błędy
_LM_ Styczeń 11, 2022 Udostępnij Styczeń 11, 2022 (edytowany) Cześć, przeczytaj i spróbuj jeszcze raz zadać pytanie Nic o twoim projekcie nie wiemy poza tym że nie działa, brak jest kodu źródłowego i schematu. Edytowano Styczeń 11, 2022 przez _LM_
Vector Styczeń 11, 2022 Autor tematu Udostępnij Styczeń 11, 2022 (edytowany) Ok, przepraszam, źle zacząłem , postaram się to poprawić. Więc: Elementy: Arduino-Nano, czujnik temp. DS18B20, czujnik temp/wilgotność DHT22, zegar RTC DS3231, wyświetlacz LCD 20x4, całość zmontowana jako kanapka czyli pod wyświetlaczem jest PCB z resztą elementów. Wygląda to tak jak na zdjęciu "kanapka term". Zasilanie brane z portu USB. Schemat wygląda jak na kolejnym screenie - "schemat term". Kod to tzw. zlepek różnych kawałków jakie znalazłem w sieci z ew. poprawkami (ile umiałem) : #include <DS3231.h> //zegar czasu rzeczywistego RTC (DS3231) #include <DHT.h> //czujnik temp/wilgotność DHT22 #include <OneWire.h> //biblioteka OneWire dla DS18B20 #include <DallasTemperature.h> //biblioteka dla wszystkich funkcji DS18B20 #include <LiquidCrystal.h> //biblioteka dla wyświetlacza LCD (16x2/20x4) #define ONE_WIRE_PIN 8 //czujnik DS18B20 na pinie 8 #define DHTPIN 9 // czujnik DHT22 T/W na pinie 9 #define DHTTYPE DHT22 // DHT22 T/W DHT dht(DHTPIN, DHTTYPE); DS3231 rtc(SDA, SCL); OneWire oneWire(ONE_WIRE_PIN); DallasTemperature sensors(&oneWire); DeviceAddress sensor1; const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); bool ControlAccess = 0; void setup(void) { Serial.begin(9600); sensors.begin(); lcd.begin(20, 4); dht.begin(); rtc.begin(); //ustawianie zegara RTC DS3231 // rtc.setDOW(2); //dzien tygodnia // rtc.setTime(12, 42 , 0); //czas // rtc.setDate(11, 1, 2022); //data } void loop() { //Request sensor data sensors.requestTemperatures(); float tempC = sensors.getTempC(sensor1); //odczyt temp. z czujnika DS18B20 float h = dht.readHumidity(); //wilgotność DHT22 float t = dht.readTemperature(); //temperatura DHT22 // sprawdzenie czy jest podpięty czujnik DHT if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } //Wyświetlenie na LCD 20x4 lcd.clear(); //temperatura zewnetrzna DS18B20, linia 1 lcd.setCursor(0, 0); lcd.print("Temp.zewn."); //ustawianie kursora w zależności od temperatury +/- if (tempC <= -10) { lcd.setCursor(13, 0); } if (tempC > -10 && tempC < 0 || tempC >= 10) { lcd.setCursor(14, 0); } if (tempC >= 0 && tempC < 10) { lcd.setCursor(15, 0); } //koniec ustawiania kursora lcd.print(tempC, 1); lcd.write(223); lcd.print("C"); //temperatura i wilgotność z DHT22, linia 2 lcd.setCursor(0, 1); lcd.print("Pokoj: "); lcd.print(h, 1); lcd.print("% "); lcd.print(t, 1); lcd.write(223); lcd.print("C"); //linia pozioma, linia 3 lcd.setCursor(0, 2); lcd.print("--------------------"); //data i czas z RTC DS3231, linia 4 lcd.setCursor(0, 3); lcd.print(rtc.getDateStr(2)); lcd.setCursor(15, 3); lcd.print(rtc.getTimeStr(1)); //(godz.min.) delay(2000); //Verificação do Funcionamento do Sensor de Temperatura Serial.print("Sensor Localization successfully!"); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" Sensor"); do { if (!sensors.getAddress(sensor1, 0)) { if (ControlAccess == 0) { lcd.clear(); lcd.setCursor(2, 1); lcd.print("Czujnika DS nie"); lcd.setCursor(5, 2); lcd.print("znaleziono!"); ControlAccess = 1; } Serial.println("Sensor not found!"); } } while (!sensors.getAddress(sensor1, 0)); ControlAccess = 0; } W listingu jest "zakomentowane" (co za słowo!) ustawianie daty i czasu (które zostało zrobione PO wgraniu kodu i tak wgrane jeszcze raz), żeby po ponownym uruchomieniu całości zegar nie ustawiał mi się z czasem jaki był w chwili kompilacji. Całość działa poprawnie, problemem jest tylko zegar RTC który od czasu do czasu sam ustawia sobie jakiś czas i jakąś losową datę. PS: teraz lepiej opisałem? Edytowano Styczeń 11, 2022 przez Vector 2
Vector Styczeń 12, 2022 Autor tematu Udostępnij Styczeń 12, 2022 Hmm.... chyba będzie ciężko sądząc po odpowiedziach. Parę godzin temu zegar wczoraj ustawiony znów się przestawił i teraz pokazuje 12.01.2022, godz. 01:05 a jest 14:28. Jest włączony od 7 rano.
farmaceuta Styczeń 12, 2022 Udostępnij Styczeń 12, 2022 (edytowany) RTC ma swoja baterie?? Jesli nie to moze jakies zaklocenia na zasilaniu go przestawiaja... A tak...bateria jest, to moze sprobuj ja wymienic...nie wiem czy to cos da, ale moze... Edytowano Styczeń 12, 2022 przez farmaceuta 1
Vector Styczeń 12, 2022 Autor tematu Udostępnij Styczeń 12, 2022 (edytowany) Tak, ma swoją. Też przed chwilą o niej pomyślałem i ją sprawdziłem - 3,1V (CR3022). Chyba jakieś zakłócenia bo nie wiem gdzie tkwi problem; chyba w sprzęcie a nie sofcie. Dzięki za podpowiedź. Edytowano Styczeń 12, 2022 przez Vector
BananWszyscy Styczeń 12, 2022 Udostępnij Styczeń 12, 2022 A to nie jest jeden z tych tanich odrzutowych ds3231? tam różne cyrki się potrafią dziać (a szczególnie dokładność pozostawia wiele do życzenia) 1
_LM_ Styczeń 12, 2022 Udostępnij Styczeń 12, 2022 @BananWszyscy nie patrzyłem w notę, ale czy w tym ds niema żadnych rejestrów kalibracyjnych? Zaś do @Vector jeśli masz czym sprawdzić, zmierz na nodze 1 częstotliwość sygnału, powinno być 32kHz 1
BananWszyscy Styczeń 12, 2022 Udostępnij Styczeń 12, 2022 Możesz zobaczyć, czy nie dostaje resetu na zasilaniu bateryjnym 1
slon Styczeń 12, 2022 Udostępnij Styczeń 12, 2022 Ustawianie czasu dla rtc można zautomatyzować clock.setDateTime(__DATE__, __TIME__); tutaj jest ładnie opisane 2
Harnas Styczeń 12, 2022 Udostępnij Styczeń 12, 2022 Ja bym dodał parę kondensatorów ceramicznych 1uF na zasilaniu. Przy DS3231, mikrokontrolerze itd. Wydaje mi się, że przy włączaniu/wyłączaniu zasilania, na zasilaniu może pojawiać się dużo zakłóceń i one jakoś przestawiają rejestry. Wystarczy żeby gdzieś tam przeskoczyła jedynka na zero i już jest x sekund w którąś stronę.
_LM_ Styczeń 12, 2022 Udostępnij Styczeń 12, 2022 7 godzin temu, Vector napisał: Parę godzin temu zegar wczoraj ustawiony znów się przestawił i teraz pokazuje 12.01.2022, godz. 01:05 a jest 14:28. Jest włączony od 7 rano Zegar nie "przestawił się" a ma tak duży błąd że ten scalak najpewniej jest uszkodzony i do wymiany, tu niema co gdybać normalnie włączony wskazywałby poprawny czas +- jakaś wartość w sekundach co najwyżej.
Vector Styczeń 12, 2022 Autor tematu Udostępnij Styczeń 12, 2022 7 godzin temu, BananWszyscy napisał: A to nie jest jeden z tych tanich odrzutowych ds3231? O kurcze, nie wiedziałem, że takie też bywały . Nie wiem jak to sprawdzić. Moduł kupiony na Alle za kilka złociszy. 6 godzin temu, _LM_ napisał: czy w tym ds niema żadnych rejestrów kalibracyjnych? Hmm..... zajrzę, dzięki za podpowiedź. 6 godzin temu, _LM_ napisał: masz czym sprawdzić, zmierz na nodze 1 częstotliwość sygnału, powinno być 32kHz Mam czym, jutro sprawdzę i dam znać. 5 godzin temu, BananWszyscy napisał: Możesz zobaczyć, czy nie dostaje resetu na zasilaniu bateryjnym Znaczy się zasilać nie z komputera poprzez USB tylko osobno z baterii? Zasilacz laboratoryjny może być? 51 minut temu, slon napisał: Ustawianie czasu dla rtc można zautomatyzować Ooo, dzięki, na pewnie się przyda . 20 minut temu, Harnas napisał: Ja bym dodał parę kondensatorów ceramicznych 1uF na zasilaniu I to może być strzał w dziesiątkę. Zrobię próbę i dam znać za kilka dni jeśli będzie zmiana na lepsze. -==============- Dzięki za podpowiedzi, dla Was to pewnie proste co gdzie szukać, ja trochę na razie macam .
BananWszyscy Styczeń 13, 2022 Udostępnij Styczeń 13, 2022 kilka zł za układ kosztujące ok 30 to tak jakiś kompromis może być. Kiedyś czytałem chyba na elektrodzie jak brali te najtańsze z ali i od "dobrego" dystrybutora i były mocne różnice
Vector Styczeń 13, 2022 Autor tematu Udostępnij Styczeń 13, 2022 (edytowany) No możliwe, choć prawdę mówiąc, nie pamiętam dokładnie ile za niego dałem, ale nie był to żaden majątek. Dziś po włączeniu oczywiście czas z... wczoraj. Ustawiłem znów czas i zegar pracował. Przed godz. 10 wyłączyłem zasilanie USB od niego. Włączam po 3 godzinach, na zegarze czas 10:58, czyli po godzinie od odłączenia zasilania zegar stanął ale się nie zresetował. Teraz idzie i już 4 minuty naliczył w przód (pokazuje 11:02). Czyli zegarek zatrzymuje się po ~godzinie przy braku zasilania z zewnątrz a chyba nie powinien; w końcu ma swoją baterię na PCB. Edytowano Styczeń 13, 2022 przez Vector
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ę »