Skocz do zawartości

DS3231 - wykrywanie zmiany dnia


Pomocna odpowiedź

Napisano (edytowany)

Napisałem ten sam temat na sąsiednim forum, ale tu chyba większy ruch. Buduję pewien projekt - nie jest to tajemnica, ale za dużo by pisać. Będzie tam opcja wyświetlania wykresu dobowego temperatury i wilgotności. W jaki sposób wykryć zmianę dnia? 

void aktualizacjaWykresuTemeperaturyIWilgotnosci() {
  DateTime now = rtcDS3231.now();
  int godzina = now.hour();
  int minuta = now.minute();
  czasDS3231 = (godzina * 60) + minuta;
	  int i = indexTempGodz;
  // jesli uplynelo 2 miuty i minuty sa parzyste
  if (czasDS3231 - zapamietanyCzasDS3231 != 0 && (czasDS3231) % 2 == 0) {
    zapamietanyCzasDS3231 = czasDS3231;
    if (godz[i] != ((godzina * 60) + minuta) / 2) { // po to zeby nie zapisywalo tej samej wspolrzednej osi X
      indexTempGodz++;
      int a = ((godzina * 60) + minuta) / 2; // wylicza współrzędną osi X
      int c;
      float b = dht.getTemperature() * 5;
      float d = dht.getHumidity() * 2.5;
	      // sprawdza poprawnosc danych
      if (dht.getStatus()) {
        Serial.println("Blad odczytu danych z czujnika");
      } else {
        FRAM.read(adresEepromGodzDzis, c);
        if (c > a) {
          indexTempGodz = 1;
          przepisanieDoEepromTemperaturyZWczorajDoPrzedwczoraj(); //  nie zmieniać kolejności!!!
          przepisanieDoEepromTemperaturyZDzisDoWczoraj();  //  nie zmieniać kolejności!!!
          adresEepromTempDzis = 1000;
          adresEepromWilgotnoscDzis = 4000;
          adresEepromGodzDzis = 7000;
          FRAM.write(adresEepromTempDzis, -9999);
          FRAM.write(adresEepromWilgotnoscDzis, -9999);
          FRAM.write(adresEepromGodzDzis, -9999);
          godz[i] = -9999;
          temp[i] = -9999;
          wilgotnosc[i] = -9999;
	        } else {
          godz[i] = a;
          temp[i] = b;
          wilgotnosc[i] = d;
          godz[i + 1] = -9999;
          temp[i + 1] = -9999;
          wilgotnosc[i + 1] = -9999;
          adresEepromTempDzis = adresEepromTempDzis + 4; 
          adresEepromWilgotnoscDzis = adresEepromWilgotnoscDzis + 4; 
          adresEepromGodzDzis = adresEepromGodzDzis + 4; 
          zapisDoEepromTemperaturyIWilgotnosciIGodziny();
        }
      }
    }
  }
}


Mam o to taki kod. W skrócie wykrywa on zmianę dnia jeżeli aktualna godzina jest mniejsza od ostatniej zapisanej w pamięci. Działa to dobrze jeżeli ostatni pomiar był wczoraj o godzinie 13:30, a kolejny pomiar jest dziś o godzinie wcześniejszej niż 13:30 ( czyli urządzenie było wyłączone krócej jak 23:59 minut). W wypadku gdy urządzenie będzie wyłączone dłużej niż 24 godziny, wtedy warunek if (c > a) {kolejny dzień) , gdzie c - poprzednia godzina, a - aktualna godzina, nie będzie spełniony, bo w rzeczywistości wyglądać to będzie c < a. 
Więc czy jest jakiś inny sposób na wykrycie kolejnego dnia, nie opierając na odczycie godziny?

Edytowano przez lucek20
(edytowany)

Też nad tym myślałem, ale jeżeli będę zapamiętywał datę, a urządzenie będzie wyłączone dłużej jak jeden dzień, to będą inne problemy. Moje rozwiązanie w tym wypadku też jest nieskuteczne.

Ogólnie to mam dane z trzech dni. Dla lepszej widoczności wrzucam zdjęcie z wyświetlacza. Jeżeli według mojego aktualnego rozwiązania zostanie wykryty nowy dzień to wykres zostaje przepisany do "wczoraj" , a wczorajszy do "przedwczoraj". Jeżeli będę zapisywał datę i nią się sugerował, to jak wykryć zmianę o 2 dni, tak aby wykres z dziś był przepisany do przedwczoraj? 

P_20211213_135625.jpg

Edytowano przez lucek20

Jeśli zapamiętasz datę to możesz sobie wyliczyć numer dnia np. od 1 stycznia 2000.

Ja to robię zupełnie inaczej - nie zapamiętuję jakichś dat, DS chodzi mi w UTC, zapamiętuję po prostu UnixTime a dopiero przy wyświetlaniu przeliczam tto na rzeczywiste godziny/minuty. Może w tę stronę?

Coś w stylu:
 

uint32_t UnixTime;

...

DateTime now = rtc.now();
UnixTime = now.unixtime();

 

  • Lubię! 1
  • Pomogłeś! 1

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