Arduino Polska Forum
"wykrywanie" zmiany dnia - ds3231 - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: "wykrywanie" zmiany dnia - ds3231 (/watek-wykrywanie-zmiany-dnia-ds3231)



"wykrywanie" zmiany dnia - ds3231 - Lucek20 - 13-12-2021

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? 

Kod:
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?


RE: "wykrywanie" zmiany dnia - ds3231 - Jarewa0606 - 13-12-2021

Przeczytaj notę katalogowa ds ma odczyt dnia.. Chyba now. Day jak pamietam


A po drugie najlepiej się operuje na "unixie"

A po trzecie kod jak kod. Naucz się że nie zawsze urządzenia mogą być sprawne. Sprawdzanie statusu przed odczytem załatwiło by sprawę. A tak twuj program się zawiesi i nie będziesz wiedział co zawiesiło..


"wykrywanie" zmiany dnia - ds3231 - MadMrQ - 16-12-2021

now.day powinno w Twoim wypadku wypluć dzień tygodnia.

Wysłane z mojego POCOPHONE F1 przy użyciu Tapatalka


RE: "wykrywanie" zmiany dnia - ds3231 - Lucek20 - 20-12-2021

(16-12-2021, 15:49)MadMrQ napisał(a): now.day powinno w Twoim wypadku wypluć dzień tygodnia.

Wysłane z mojego POCOPHONE F1 przy użyciu Tapatalka

 Zrobiłem to za pomocą czasu unix. Działa wyśmienicie. Dzięki za pomoc i odpowiedzi.