Steuerschuetze Moeller Stecksystem


Google-Suche auf MEINE-SCHALTUNG.de :





Online Rechner

Chronik

Dauerkalender


Rolladen Steuerung

mit Arduino UNO, RTC DS3231 und 7-Segment-Anzeige


In dem folgenden Beispiel wird der UNO R3 (Mega328P) die Rollladen-Steuerung übernehmen. Das dazugehörige Programm (Sketch) soll so gestaltet werden, dass mit einigen Programm- Einstellungen mehrere Variationen der Steuerung möglich sind. Grundsätzlich sollen die Rollladen morgens automatisch hochgefahren und abends runtergefahren werden. Es soll die Möglichkeit bestehen, die Rollladen nur auf Zeit zu fahren oder sie nur mit einem Dämmerungssensor zu betreiben. Des Weiteren soll es möglich sein, die beiden Signalgeber (Zeit und Helligkeit) mit „ODER“ oder „UND“ zu verknüpfen. Für die Bewegung der Rollladen übernehmen zwei Relais die Verantwortung. In dem Beispiel werden sie mit zwei Dioden symbolisiert. Die gelbe Diode steht für Morgen (die Rollladen werden hochgefahren), die blaue Diode für den Abend (Rollladen fahren runter). Ein Helligkeitssensor wird in der Testschaltung mit einem Poti, der an einen analogen Eingang des Arduino angeschlossen ist, symbolisiert. Die Zeit, für die die Relais ihre Kontakte schließen, soll ebenfalls einstellbar sein.
Für die richtige Zeit sorgt die Real Time Clock (kurz RTC) DS3231. Über den I2C-Bus korrespondiert das Modul mit Arduino und liefert bei Nachfrage die aktuelle Zeit. Diese wird mit der 4-Digit Siebensegment-Anzeige im Format HH:MM angezeigt. Die aktuelle Zeit kann bei Bedarf mit dem Programm gesetzt werden.

Testschaltung auf Steckbrett


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.
Die Verschaltung der Komponenten sieht wie folgt aus:

Der Schaltplan

Schaltplan

Schaltplan (Arduino ohne USB-Anschluss oder Netzteil: Vin > 6 V)

Das Programm

In 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.
Um auf dem Kurzvideo die Funktionalität demonstrieren zu können, kommen statt Minuten nur Sekunden zum Einsatz. Nachdem die Rollos einmal hoch und runtergefahren sind, kann zwecks der Demonstration die Zeit manuell mit dem Taster S1 wieder zurückgesetzt werden. In der Praxis wiederholen sich die Schaltvorgänge erst nach 24 Stunden. Die möglichen Einstellungen sind im Programm in Kommentar-Zeilen beschrieben. Die Eingaben werden nicht auf Plausibilität geprüft.
Um bestimmte Betriebsarten realisieren zu können, muss man bei den Einstellungen im Programm ein wenig "schummeln":

ZEIT - BETRIEB
Im Zeitbetrieb werden die Rollladen ausschließlich zeitabhängig geschaltet.
Verknüpfung Und_Oder = 1
Die Spannungswerte für den analogen Eingang müssen so eingestellt werden, dass sie nie erreicht werden können. Z.B.
Schwelle_1 = 0;
Schwelle_2 = 1500;

HELLIGKEIT - BETRIEB
Die Rolladen werden in abhängigkeit von der gemessenen Helligkeit geschaltet.
Verknüpfung Und_Oder = 1
Die Schaltzeiten müssen so eingestellt werden, dass sie nie erreicht werden können. Z.B.
Stunden_1 = 25;
Stunden_2 = 25;

ODER – Betrieb
Und_Oder = 1;
Die Zeiten und Schaltschwellen müssen plausibel eingestellt werden.

UND – Betrieb
Und_Oder = 2;
Die Zeiten und Schaltschwellen müssen plausibel eingestellt werden.

// ***************************************************************
// 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

Kurzvideo



Praxis

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:

1 - die Sequenz "dt.second" muss an allen Stellen im Programm mit "dt.minute" ersetzt werden.
2 - der Taster S1 und die Programmteile:

int Schalter = 6;
pinMode(Schalter, INPUT_PULLUP);
// Zeit per Hand rücksetzen
if (digitalRead (6) == LOW) {clock.setDateTime(2020, 03, 17, 7, 9, 0);}

können entfernt werden.
3 - Anstatt von Poti R3 soll ein Helligkeitssensor angeschlossen werden.

Die Komponenten


Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz