Poniższy timer oparty na Arduino robi dokładnie to. Można ustawić czas włączenia i czas wyłączenia w oparciu o cały kalendarz! Jest on oparty na prostym zegarze czasu rzeczywistego DS3231 (RTC), układzie Arduino ATMEGA328 i małym przekaźniku 5 V do uruchamiania stycznika 5 kW, który steruje prądem zmiennym.
Wyzwalacz, aby przejść dalej
"Wujku zrobiłeś cały timer zależny od kalendarza, ale nigdzie nie pokazujesz zegara/kalendarza, czasu alarmu itp. Powinien wyświetlać czas przynajmniej po to, żeby wiedzieć, co będzie robił dalej, albo co zrobił do tej pory" - powiedział syn mojego przyjaciela, Reon, jako swoje pierwsze wrażenie.
W kodzie Arduino DS3231_AC_Scheduler.ino do obsługi czasu włączenia i wyłączenia użyto instrukcji switch() połączonych z instrukcjami 'if'. Dlatego zegar z konieczności zatrzymywał się wewnątrz pętli 'if'. Dopiero po wygaśnięciu instrukcji 'if' pętla się kończyła, zegar się uruchamiał i wykonywana była kolejna instrukcja 'switch'. Dlatego w tym szkicu wyświetlacz zegara działał z przerwami, gdy wykonywał pętlę. W ten sposób nie udało się osiągnąć ciągłego wyświetlania zegara, jak chciał Reon!
Niestety! Gdyby można uruchomić drugie Arduino niezależnie, na tym samym zegarze dzielącym czas, rozwiązałoby to problem w pełni. W przeciwnym razie, czy można używać w Arduino dwóch zegarów równolegle?
Pomysł
Człowiek z jednym zegarem zawsze zna czas, ale z dwoma zegarami nigdy nie jest do końca pewny! Dlatego, gdy jest projekt zależny od czasu, zawsze lepiej jest mieć jeden zegar wspólny dla wszystkich. Choć rozwiązanie nie jest superdokładne, to jednak zdaje egzamin całkiem dobrze, a to wystarczy.
Układ multi-master I2C RTC może być zbudowany przy użyciu RTC DS3231. Jest to dość precyzyjny RTU, który ma wbudowany czujnik temperatury do dostosowywania częstotliwości zegara do korekty temperatury. Utrzymuje on bardzo precyzyjne taktowania przez długi czas.
Zasada działania
DS3231 jest bardzo precyzyjnym RTU, który jest tutaj współdzielony przez dwa Arduino, a może być współdzielony również przez więcej mikrokontrolerów. Jedno Arduino uruchamia timer, podczas gdy drugie wyświetla czas i wszystkie inne informacje, które mają być wyświetlane. Do obsługi godziny, minuty i sekundy w prosty dziesiętny sposób, zastosowano sztuczkę, która jest również używana przez wiele osób w Internecie:
unsigned long now_time = hour*10000+minute*100+second;
Przykładowo: 72323 to 7:23:23
TFT ILI9163 to kolorowy wyświetlacz 128×128 punktów, który działa na magistrali SPI wraz z pinami Reset, AO i CS, które działają na drugim Arduino. Gdy pin GPIO odpala się na pierwszym Arduino (Board1), to samo jest odczytywane przez drugie Arduino (Board2) na pinie A3 za pomocą digitalRead(przekaźnik), aby uruchomić przekaźnik włączania/wyłączania wyświetlacza.
Schemat
Cyfrowe piny 3 i 4 działają jako piny sterujące przekaźnikiem z pierwszego Arduino, podczas gdy pin A3 na drugim Arduino odczytuje ten stan w celu przetworzenia na drugim Arduino. TFT ILI9163 jest podłączony do drugiego Arduino do wyświetlania czasu. RTC DS3231 jest wspólny dla obu Arduino. Połączenia przekaźników (RL1 i RL2) idą dalej do styczników w celu wyłączenia prądu przemiennego, który musi wytrzymać większe obciążenie.
W zależności od działania wyzwalającego w programie, oba przekaźniki RL1 i RL2 będą zasilane lub odłączane jednocześnie.
W kodzie źródłowym używane są następujące formaty czasu włączenia/wyłączenia przekaźnika:
//—– Enter on times ———-
int on_hour[]={12,12,12, 12,12,12, 12,12,12 };
int on_min[] ={15,17,19, 22,23,25, 27,29,31 };
int on_sec[] ={15,15,15, 15,15,15, 15,15, 15};
//—– Enter off times ———-
int off_hour[]={12,12,12, 12,12,12, 12,12,12 };
int off_min[] ={16,18,20, 22,24,26, 28,30,32 };
int off_sec[] ={15,15,15, 15,15, 15, 15,15, 15 };
Odpowiednio, przekaźniki (RL1 i RL2) będą albo włączone albo wyłączone. W powyższym przykładzie czas włączenia przekaźników w pierwszym przypadku wynosi 12 godzin, 15 minut i 15 sekund. Analogicznie, czas wyłączenia przekaźników w pierwszym przypadku wynosi 12 godzin, 16 minut i 15 sekund. Te czasy włączenia/wyłączenia można zmienić w kodzie zgodnie z wymaganiami, ale w tym samym formacie, jak pokazano powyżej. Każdy z tych czasów włączenia/wyłączenia przekaźników można zobaczyć na wyświetlaczu TFT wraz z zegarem czasu rzeczywistego (data i godzina).
Istnieją dwa kody źródłowe dla tego projektu. Pierwszy kod to DS3231_AC_Scheduler.ino dla Board1, a drugi to DS3231_AC_Scheduler_Display.ino dla Board2. Pierwszy kod źródłowy jest używany do ustawiania timingów do sterowania przekaźnikami w określonym czasie przez Board1. Drugi kod źródłowy jest używany do wyświetlania czasu, daty i stanu przekaźników na wyświetlaczu TFT przez Board2. Przed kompilacją i załadowaniem kodów źródłowych do odpowiednich płytek Arduino, trzeba dołączyć odpowiednie biblioteki, takie jak RtcDS3231.h, TFT_ILI9163C.h i Adafruit_GFX.h w Arduino IDE.
Podsumowanie
Więcej pomysłów na układy z podwójnym współdzieleniem RTC jest możliwych, w szczególności w stroboskopie, gdzie jeden mikrokontroler będzie tworzył zmienny impuls, podczas gdy drugi będzie wyświetlał częstotliwość impulsu i obrót wału, podczas gdy oba mikrokontrolery współdzielą jeden RTC.