Skocz do zawartości

DS3231 - sam zmienia sobie datę/czas


Pomocna odpowiedź

Napisano (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 przez Vector
poprawiłem błędy
(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 przez _LM_
(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? 🙂 

kanapka term.jpg

schemat term.jpg

Edytowano przez Vector
  • Lubię! 2

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.

(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 przez farmaceuta
  • Lubię! 1
(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 przez Vector

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ę.

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.

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 😉 .

(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 przez Vector

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...