Powtarzanie co X godzin - 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: Powtarzanie co X godzin (/watek-powtarzanie-co-x-godzin) Strony:
1
2
|
Powtarzanie co X godzin - Cizar - 03-01-2021 Witam, W układzie mam podłączone RTC i chciałbym aby jeden z pinów wyjściowych (np 6) zmieniał stan z niskiego na wysoki co x godzin, po czym wracał do stanu niskiego. Gdzie x będzie początkowo zdefiniowaną zmienną najchętniej typu int. Będzie to aktywowało przekaźnik z czasówką. Czy ktoś może podpowiedzieć mi jak to zrobić, uwzględniając że zawsze liczy od 6 rano? Zagadnienie dodatkowe, jak uzależnić żeby relayHeat działał tylko i wyłącznie gdy glight jest włączone? Poniżej podaję cały kod gdyby był potrzebny. Z góry dziękuję za pomoc. Kod: #include <LCDWIKI_GUI.h> //Core graphics library RE: Powtarzanie co X godzin - Jarewa0606 - 03-01-2021 A czytałeś przykłady dla DS3231 bo ma taką możliwość... Np.. /* DS3231: Real-Time Clock. Alarm simple Read more: www.jarzebski.pl/arduino/komponenty/zegar-czasu-rzeczywistego-rtc-DS3231.html GIT: https://github.com/jarzebski/Arduino-DS3231 Web: http://www.jarzebski.pl © 2014 by Korneliusz Jarzebski */ #include <Wire.h> #include <DS3231.h> DS3231 clock; RTCDateTime dt; boolean isAlarm = false; boolean alarmState = false; int alarmLED = 4; void alarmFunction() { Serial.println("*** INT 0 ***"); isAlarm = true; } void setup() { Serial.begin(9600); // Initialize DS3231 Serial.println("Initialize DS3231");; clock.begin(); // Disarm alarms and clear alarms for this example, because alarms is battery backed. // Under normal conditions, the settings should be reset after power and restart microcontroller. clock.armAlarm1(false); clock.armAlarm2(false); clock.clearAlarm1(); clock.clearAlarm2(); // Manual (Year, Month, Day, Hour, Minute, Second) clock.setDateTime(2014, 4, 25, 0, 0, 0); // Set Alarm1 - Every 20s in each minute // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true) clock.setAlarm1(0, 0, 0, 10, DS3231_MATCH_S); // Attach Interrput 0. In Arduino UNO connect DS3231 INT to Arduino Pin 2 attachInterrupt(0, alarmFunction, FALLING); // Setup LED Pin pinMode(alarmLED, OUTPUT); } void loop() { dt = clock.getDateTime(); Serial.println(clock.dateFormat("d-m-Y H:i - l", dt)); if (isAlarm) { digitalWrite(alarmLED, alarmState); alarmState = !alarmState; clock.clearAlarm1(); } delay(1000); } RE: Powtarzanie co X godzin - Cizar - 03-01-2021 Dziękuję za odpowiedź. W prawdzie używam innej biblioteki ale funkcjonalności są te same. Też mam komendy: rtc.enableInterrupts(18,4,0); // interrupt at (h,m,s) rtc.enableInterrupts(EveryMinute); //interrupt at EverySecond, EveryMinute, EveryHour Jeśli będę musiał użyję tej pierwszej trzy razy... Przy okazji czy możesz mi objaśnić czemu służy linijka: attachInterrupt(0, alarmFunction, FALLING); Nie rozumiem jej. RE: Powtarzanie co X godzin - Jarewa0606 - 04-01-2021 W DS3231 można ustawić dwa alarmy (różnia sie zakresem) musi być podłączony pin do przerywania i to jest to co się pytasz, SQW/INT podłączamy pod piny gdzie działa przerwanie wtedy nawet obudzi i wykona kod... attachInterrupt(0, alarmFunction, FALLING); To jest właśnie włączenie przerwania te "0" to INT0 chyba pin nr2 jak się nie mylę w uno. Wiec SQW/INT połączony z pinem 2 w uno. I jak dostanie sygnał to wykona się kod w "alarmFunction()" RE: Powtarzanie co X godzin - Cizar - 05-01-2021 Jak człowiek nie pyta, to umiera głupi. Przeczytałem to co napisałeś i mam więcej wątpliwości tylko. Jeśli można mieć dwa alarmy to mam problem, potrzebuję aktywować dwa różne urządzenia w dwóch różnych zakresach. Pierwsze to spryskiwacz, odpalany dwa razy od 1 do 3 razy dziennie, na kilkanaście-kilkadziesiąt sekund. Jak często i na ile dojdę metodą prób i błędów. Drugie to generator mgły tzw fogger. Tutaj jest ciut gorzej bo chciałbym żeby włączał się rano i wieczorem na ok godzinę. Przykład z biblioteki niby działa ale na serialprint co sekunda wyświetla "External Interrupt detected" mimo że podpięty mam tylko ekran. Poza tym chyba patrzę w złą stronę, arduino nie musi być budzone ani wykrywać alarmów. Przecież nawet w markecie są do kupienia takie programowalne "czasówki" które zawsze o zaprogramowanej godzinie puszczają prąd na określony czas. Na googlu nic nie mogę znaleźć, domyślam się że źle szukam. Może ktoś napisał program do mrugnięcia diodą codziennie w południe? Edit: Ha, dwie minuty po poście wymyśliłem frazę dla googla i voilà: https://starter-kit.nettigo.pl/2016/04/biblioteka-timers-16-4-0/ Wieczorkiem sprawdzę czy ma to prawo bytu. Co ciekawe artykuł zaczyna się znajomo. RE: Powtarzanie co X godzin - Agregacik - 05-01-2021 RTC DS3231 jest dość dokładnym zegarem. Można z niego wyciągać aktualną godzinę minutę i sekundę o dacie i dniu tygodnia nie wspomnę. Dodatkowo biblioteka Jarzębskiego pozwala na "odczyt" czasu UNIXowego (komenda dt.unixtime) co daje możliwość obliczania upływającego czasu podobnie jak millis() tylko co sekundę. Jest to dobre do odliczanie czasów dłuższych i to nawet jak w międzyczasie procesorek zostanie zresetowany, tylko jak użyjemy pamięci EEPROM do zapamiętania czasu startu. Czyli zapamiętujemy czas UNIXowy w danej chwili najlepiej do pamięci EEPROM i sprawdzamy czy upłynął już czas zapamiętany + zadany i mamy już odliczanie czasu. Tu należy zwrócić uwagę, aby nie "zapamiętywać" zbyt często do pamięci EEPROM procesorka bo ona się zużywa, ale dwa do 4 razy na dobę można. Przy takim rozwiązaniu trzeba poczytać o tej pamięci. No ale mając RTC to nic prostszego jak pytać go czy już upłynęła dana godzina np dt = clock.getDateTime(); Tu odczytujemy dane z zegarka i zadajemy zadanie dla procesorka: if ( dt.hour == 12 && dt.minute == 0 && dt.second >= 0) { a tu wpisujemy co ma robić np. o godzinie 12 w południe. } Dla uruchomienia mgiełki na godzinę rano i wieczorem wystarczy napisać tak dt = clock.getDateTime(); if ( dt.hour == 6 || dt.hour == 18) { digitalWrite(6, HIGH); // uruchamiasz mgiełkę wysokim stanem na pinie 6 } else { digitalWrite(6i, LOW); // wyłączasz mgiełkę pinem 6 stanem niskim } Czyli już masz rozwiązanie jak uruchamiać mgiełkę rano i wieczorem. Chyba prostsze niż z przerwaniami. Dalej to już przykład migania niezależnego diodami, z użyciem millis, pomoże Ci na uruchamianie na określony czas innych psikaczy itp. RE: Powtarzanie co X godzin - Jarewa0606 - 05-01-2021 Ta biblioteka używa millis(); tylko jest dla leniwych. Użycie jej niesie sporo niespodzianek RE: Powtarzanie co X godzin - Agregacik - 05-01-2021 (05-01-2021, 17:58)Jarewa0606 napisał(a): Ta biblioteka używa millis(); tylko jest dla leniwych. Użycie jej niesie sporo niespodzianekPiszesz oczywiście o Timers. RE: Powtarzanie co X godzin - Cizar - 07-01-2021 Naprawdę dziękuję, DZIAŁA (wydaje mi się że trochę prowizorycznie ale będę jeszcze kombinował). Strasznie dużo satysfakcji daje działające urządzenie nawet jeśli oprawa graficzna jest zerowa. Podpowiedzcie jeszcze proszę, oryginalny kod nie był oczywiście mój i od samego początku zawierał taki zapis: . . . digitalWrite(relayHeat, 0); heatVal = 0; . . . String relayState(int x) { switch (x) { case 0: return "ON "; break; case 1: return "OFF" ; break; default: return "ON "; break; } } Był bardzo wygodny i pozwalał na bieżąco monitorować stan przekaźników. Problem w tym że zdefiniowane piny nie wchodziły na HIGH. Czy jest jakiś zapis żeby dla wszystkich relayState jeśli jest 0 to było HIGH i analogicznie 1 = LOW? Podoba mi się gdy wyświetla mi stan przekaźników. RE: Powtarzanie co X godzin - Jarewa0606 - 07-01-2021 A co to jest?? digitalWrite(relayHeat, 0); heatVal = 0; To powinno być inaczej... Powinieneś dać flagę czyli bool flag_relay1 =false; uint8_t relayHeat =3 ; // wyjście przekaźnika setup(){ pinMode( relayHeat, OUTPUT); Serial.begin(9600); } loop(){ digitalWrite( relayHeat, flag_relay1); flag_relay1 =! flag_relay1; Serial.println (flag_relay1); delay(1000); } efekt zobaczysz na monitorze rs...... Może uświadomisz sobie to.... |