| Rolladen Steuerungmit Arduino UNO, RTC DS3231 und 7-Segment-Anzeige
Neben den erwähnten Komponenten enthält die Schaltung den Taster S1. Mit ihm kann man manuell die Zeit zurücksetzen.
Diese Funktion wird bei der praktischen Anwendung der Schaltung nicht benötigt. Sie soll lediglich die Vorgänge zu Demonstrationszwecken
(Kurzvideo) beschleunigen.
Der SchaltplanSchaltplan (Arduino ohne USB-Anschluss oder Netzteil: Vin > 6 V) Das ProgrammIn dem Programm verzichtete ich auf die Befehle "delay" und "goto". Damit wird das Hauptprogramm an keiner Stelle angehalten
und kann problemlos über weitere Funktionen erweitert werden. Schließlich kann Arduino noch viel mehr.
// Rolladen Steuerung // RTC DS3231 + 7Segmentanzeige 4 Digit mit TM1637 // Arduino UNO // *************************************************************** // EINSTELLUNGEN +++++++++++++++++++++++++++++++++++++++++++++++++ // Einstellungen: Schaltbedingungen ------------------------------ // Und_Oder = 1 ==> ODER Verknüpfung // Und_Oder = 2 ==> UND Verknüpfung int Und_Oder = 1; // Einstellungen Schaltpunkt 1 ----------------------------------- int Schwelle_1 = 300; // Wert analog am A0 int Stunden_1 = 7; // Uhrzeit Stunden int Minuten_1 = 10; // Uhrzeit Minuten // Einstellungen Schaltpunkt 2 ----------------------------------- int Schwelle_2 = 400; // Wert analog am A0 int Stunden_2 = 7; // Uhrzeit Stunden int Minuten_2 = 20; // Uhrzeit Minuten // Einstellungen Relais-Schaltdauer in Millisekunden ------------- int Relais_Zeit = 5000; // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include <TM1637Display.h> #include <DS3231.h> #define CLK 2 #define DIO 3 DS3231 clock; RTCDateTime dt; TM1637Display display(CLK, DIO); String Ausgabe; bool Doppelpunkt_Takter = false; unsigned long MillisAktuell = 0; unsigned long Relais_Millis = 0; int Relais_1 = 4; int Relais_2 = 5; int Schalter = 6; int Helligkeitssensor = A0; int Eingangsspannung; int Schaltpunktliste_1 [] = {0,0,0,0}; int Schaltpunktliste_2 [] = {0,0,0,0}; // Funktion Status ----------------------------------------------- int Status (int Liste[]=3) { int Wert = 0; if ((Liste [0] == 1) or (Liste [1] == 1)) { Liste [2] = 1; } if (((Liste [0] + Liste [1]) == 2) && (Und_Oder == 2)) { Liste [2] = 2; } return Wert = Liste [2]; } // SETUP --------------------------------------------------------- void setup() { clock.begin(); display.setBrightness(10); display.clear(); MillisAktuell = Relais_Millis = millis(); pinMode(Relais_1, OUTPUT); pinMode(Relais_2, OUTPUT); pinMode(Schalter, INPUT_PULLUP); // Einstellungen aktuelle Zeit +++++++++++++++++++++++++++++++++++ // Kommentar-Markierung // entfernen, Zeit einstellen: // (Jahr,Monat,Tag,Stunde,Minute,Sekunde) und übertragen. // Anschließend mit // als Kommentar markieren und wieder übertragen. // clock.setDateTime(2020, 03, 17, 7, 9, 0); // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ } // HAUPTPROGRAMM ------------------------------------------------- void loop() { // Takt für den Doppelpunkt ++++++++++++++++++++++++++++++++++++ if ((MillisAktuell + 1000) < millis()) { MillisAktuell = millis(); Doppelpunkt_Takter = false; } if ((MillisAktuell + 500) < millis()) { Doppelpunkt_Takter = true; } // Zeit auslesen und anzeigen ---------------------------------- dt = clock.getDateTime(); Ausgabe = String(dt.hour); if (dt.second < 10) { Ausgabe = Ausgabe + "0"; } Ausgabe = Ausgabe + String(dt.second); if (Doppelpunkt_Takter) { display.showNumberDecEx(Ausgabe.toInt(), 0b01000000, false, 4, 4); } if (not Doppelpunkt_Takter) { display.showNumberDecEx(Ausgabe.toInt(), 0b00000000, false, 4, 4); } Eingangsspannung = analogRead (Helligkeitssensor); if ((dt.hour == Stunden_1) && (dt.second == Minuten_1)) { Schaltpunktliste_1 [0] = 1; } if (Eingangsspannung < Schwelle_1) { Schaltpunktliste_1 [1] = 1; } // Schaltpunkt 1 ------------------------------------------------ if ((Status (Schaltpunktliste_1) == Und_Oder) && (Schaltpunktliste_1 [3] == 0)) { Schaltpunktliste_1 [3] = 1; digitalWrite (Relais_1, HIGH); Relais_Millis = millis(); } if ((Schaltpunktliste_1 [3] == 1) && ((Relais_Millis + Relais_Zeit) < millis())) { Schaltpunktliste_1 [3] = 2; digitalWrite (Relais_1, LOW); for (int i=0; i<4; i++) { Schaltpunktliste_2 [i] = 0; } } // Schaltpunkt 2 ------------------------------------------------ if ((dt.hour == Stunden_2) && (dt.second == Minuten_2)) { Schaltpunktliste_2 [0] = 1; } if (Eingangsspannung > Schwelle_2) { Schaltpunktliste_2 [1] = 1; } if ((Status (Schaltpunktliste_2) == Und_Oder) && (Schaltpunktliste_2 [3] == 0)) { Schaltpunktliste_2 [3] = 1; digitalWrite (Relais_2, HIGH); Relais_Millis = millis(); } if ((Schaltpunktliste_2 [3] == 1) && ((Relais_Millis + Relais_Zeit) < millis())) { Schaltpunktliste_2 [3] = 2; digitalWrite (Relais_2, LOW); for (int i=0; i<4; i++) { Schaltpunktliste_1 [i] = 0; } } // Zeit per Hand rücksetzen if (digitalRead (6) == LOW) {clock.setDateTime(2020, 03, 17, 7, 9, 0);} } // **************************************************************
Kurzvideo
Das hier aufgelistete Programm entspricht dem, das zum Testen angewendet wurde. Um das Programm in der Praxis einsetzen
zu können sind kleine Änderungen notwendig:
Die Komponenten
|