Skocz do zawartości

DS3231 - wykrywanie zmiany dnia


lucek20

Pomocna odpowiedź

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
Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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

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.