• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Czas (timeout, timery, alarmy).
#1
Cześć. Arduino mam od chyba 10 lat. Dwa tygodnie temu go wypakowałem z woreczka   Big Grin , by pierwszy raz użyć jako sterowanie do klimy do roślinki. Ot podlej jeśli trzeba, ogrzej, zapal światło, nawilż powietrze... W sumie wszystko gotowe i nawet działa (no prawie). Problem mam z "czasem". 
Chodzi o to, że pompa może się włączać od 9tej do 21szej (na 5 sekund) co godzinę, lampa ma świecić od 6tej do 0(24). Nawilżanie  powietrza to powiedzmy co 15 minut (niezależnie od pory dnia), ekran OLED ma się wyłączyć po minucie od ostatniego kręcenia koderem, wiatraczek ma na noc wolniej się kręcić (hałas, podobnie jak pompka).

Póki co, to działa z takim kodem (co pełną godzinę):
Kod:
  if ((now.hour() == i) && (now.minute() == 0) && (now.second() == 0)) { ...}

albo takim (co kwadrans):
Kod:
  DateTime now = rtc.now();
  uint8_t m = now.minute();
  uint8_t s = now.second();
  if (sensorLFNow < shouldVal[3] && ((m % 15) + s == 0)) {
  digitalWrite(HUMIDIFIER, HIGH);
  humStart = now.second(); }
Potem jest w loop funkcja sprawdzająca, czy  już wyłączyć mgłę...

Kod:
if (digitalRead(HUMIDIFIER) && (now.second() >= humStart + shouldVal[5])) digitalWrite(HUMIDIFIER, LOW);

(w shouldVal[] są wartości ustawialne na ekranie i zapisane w EEPROM, takie jak wartości zadane dla sensorów, czasy akcji, godziny...)

No i to działa ale... "nie podobasz mi się".

Przejrzałem sporo bibliotek dotyczących "timingu" na arduino.cc (nie wszystkie, bo jest ich od ch..olery). Żadna nie spełnia wszystkich wymagań (albo jej nie znalazłem). Do "timeout" ekranu działa wyśmienicie biblioteka "TaskScheduler" (choć to armata na muchę). Ale wszystkie inne jej funkcje są na "millis" a nie na RTC. Do uruchamiania "na godzinę" idealny byłby CronAlarms, ale ten z kolei nie obsługuje opcji "9-21 * * *" a generowanie 12 "cronów" do jednej pompki też nie jest eleganckie. TimeAlarms - chyba najbardziej mi pasuje. Nie ogarnę nią timeout'u, czasu np. pompowania ani zakresu godzin, ale same alarmy + timer są proste do ogarnięcia (pozostaje wyłączenie timera o pewnej godzinie, ale to załatwi po prostu inny alarm). 

A jakich bibliotek do ogarniania czasu/timerów/alarmów/timeoutów Wy używacie? Coś polecicie może, co załatwi moje potrzeby za jednym zamachem?

Pozdrawiam
Tadek
 
Odpowiedź
#2
Ja sobie podzieliłem dobę na 1440, czyli tyle ile minut, można sobie zrobić tablicę z wartościami int16, np. 16 elementów, tyle mają typowe timery komercyjne. Jeśli w danym obiegu loop zostanie zauważona wartość z tablicy to jest wykonywana akcja, np. z drugiego wymiaru tablicy, ON/OFF/0 - pole nieaktywne, czy tam 0/1/2. Przy takim podejściu interfejs może być prosty, np. przez stronę WWW wystarczy suwak o wartości 0-1399 i masz ustawioną palcem godzinę w ułamek sekundy.
Na początku loop przeprowadzam operacje z czasem, sprawdzam która to sekunda, minuta, itd. Jeśli w danym loop jest nowa sekunda, nowa minuta, to w takim loop nadaję flagę=1 odpowiednim zmiennym, tak by akcje, które się mają wykonać RAZ w przypadku nowej sekundy, nowej minuty, mogły się wykonać w tym obiegu LOOP. W moich poprzednich postach znajdziesz funkcje czas() i różne sposoby jej użycia, nie jest powiązana z RTC, ale można ją załadować na początku wartościami z RTC i okresowo synchronizować.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(28-06-2024, 22:00)kaczakat napisał(a): Ja sobie podzieliłem dobę na 1440 (cut)
Dzięki za odpowiedź. Sorry, że tak późno, ale jakoś mi powiadomienie o odpowiedzi nie doszło.

Ciekawa opcja ale skończyło się na TimeAlarms.h. Jakoś tak przejrzyściej. Wink

Zastanawiam się nad wykorzystaniem alarmów z DS3231 ale nie bardzo wiem, jak dwoma alarmami ogarnąć przynajmniej 4 alarmy (raczej 6) i jeden timer włączający się co godzinę, między "alarm_1" i "alarm_2". Na TimeAlarms działa w sumie poprawnie ("w sumie", bo jest jeden problem i to niestety sprzętowy (podłączyłem do innego wątku)).

Alarm_1 włącza "okres hałasu czy tam 'tryb dzienny'" (timer_1 pompuje co godzinę (jeśli trzeba) aż do wieczora (Alarm_2 wyłącza timer).
Alarm_3 włącza "oświetlenie" i wyłącza go Alarm_4.
Alarm_5 w sumie podobny do _1 i na upartego można by je połączyć (z _1 a Alarm_6 z _2).

Jakoś nie mam weny, żeby ogarnąć dwa alarmy z DS3231 i przedefiniowywać je na następny alarm. Na szybko dla testu ogarnąłem przedefiniowanie jednego alarmu na "co 10 sekund" - da się "w locie", działa zależnie od tego, co jest pomiędzy. Jeśli delay(7 sekund), to dostaje "małpiego rozumu" (przynajmniej przy użyciu przerwania) ale przy normalnym wykonaniu kilku instrukcji działa.

Edit: Jeszcze jedna opcja i chyba tę wybiorę. Sprzętowy_1 z DS3231, wywoływana co godzinę funkcja, która obrobi wszystko co ma co godzinę obrobić na "if else" albo "switch case". Raz wywołany nie uruchomi się drugi raz, jeśli zdąży w tej samej sekundzie całość obrobić. Sprzętowy_2 będzie raz na minutę robił pomiary do wyświetlenia. Ewentualnie odwrotnie, bo chyba Alarm2 nie ogarnia "sekundowej" rozdzielczości. Inna sprawa, że gdzieś już widziałem, że na przerwaniach jest ciężko obydwa ogarnąć. Czyli trzeba będzie się douczyć. Może ESP8266 ma jakieś swoje alarmy?
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości