Rolladensteuerung

Hallo,

bin noch Anfänger was Arduino betrifft und als erstes größeres Projekt habe ich mir eine Rolladensteuerung ausgesucht.

Habe hierzu hier und auf anderen Seiten auch einiges gefunden und mir was funktionierendes zusammengebastelt.

Basis war die Rolladenschaltung von Rollladen Steuerung, die habe abgeändert und erweitert.
Jetzt hänge ich seit längerem an einer Unterfunktion (ich weis wurde schon viel geschrieben, kriege es aber leider nicht auf die Reihe).

Möchte gerne ein Hand und einen Automatikbetrieb

oben alles deklariert.
Kleiner Ausschnitt:


// Relais
int KF1 =2; // Rolladen 1 hoch
int KF2 =3; // Rolladen 1 runter
int KF3 =4; // Rolladen 2 hoch
int KF4 =5; // Rolladen 2 runter
int KF5 =6; // Rolladen 3 hoch
int KF6 =7; // Rolladen 3 runter
int KF7 =8; // Leinwand weiss hoch
int KF8 =9; // Leinwand weiss runter
int KF9 =10; // Leinwand schwarz hoch
int KF10 =11; // Leinwand schwarz runter 

jetzt zur problematischen Unterfunktion (es sollen weitere Unterfunktionen folgen

hier meine derzeitige Lösung die leider auch nicht funktioniert.

int Auto_hoch[] = { KF1, KF3, KF5 };
int Auto_runter[] = { KF2, KF4, KF6 };

in der Loop wird Auto_hoch bzw. runter HIGH und LOW geschalten, dabei sollten die besagten Relais schalten tun sie aber nicht. Habe es auch schon mit Ports direkt und vielen möglichen anderen versionen die ich gefunden habe umgesetzt. leider hat bisher nichts funktioniert.

könnt Ihr mir bitte sagen wo der Fehler ist.

Kann auch gerne den kompletten Sketch posten.

Grüße

Michael

Ihr Beitrag wurde an seinen aktuellen Speicherort verschoben, da er besser geeignet ist.

Den braucht es - sonst ist nur raten....
(Bitte dazu auf das </> Symbol klicken und den Code dazwischen einfügen oder in der IDE auf BEARBEITEN - FÜR FORUM KOPIEREN. Sonst sieht der so aus wie oben und das wird noch mehr raten)

Herzlich willkommen...

1 Like

Außerdem um was für Relais (Link/Foto) es sich handelt und wie die am Arduino angeschlossen sind.

Gruß Tommy

1 Like

Super dankeschön, geht ja echt schnell:)

hier die Relais:
https://www.reichelt.de/entwicklerboards-relais-modul-16-channel-12-v-debo-relais-16ch-p282567.html?CCOUNTRY=445&LANGUAGE=de

// ***************************************************************
// Rolladen Steuerung
// RTC DS3231 + LCD 2004
// Arduino Mega2560
// ***************************************************************


// Libs
// ***************************************************************
#include <OneWire.h>
#include <DallasTemperature.h>
//DS18b20 connected to A1
#define DS18B20 A1
OneWire ourWire(DS18B20);
DallasTemperature sensors(&ourWire);

# include <SimpleDHT.h> 
int SENSOR_DHT22 = A2; 

// Sensor einen Namen zuweisen (dht22) 
SimpleDHT22 dht22(SENSOR_DHT22); 

# include <RTClib.h>
# include <LiquidCrystal_I2C.h>

// Name des RTC-Moduls 
RTC_DS3231 rtc; 

LiquidCrystal_I2C lcd(0x27, 20, 4); 

// EINSTELLUNGEN +++++++++++++++++++++++++++++++++++++++++++++++++
// Einstellungen: Schaltbedingungen ------------------------------
// Und_Oder = 1 ==> ODER Verknüpfung
// Und_Oder = 2 ==> UND Verknüpfung
int Und_Oder = 2;

// Einstellungen Schaltpunkt 1 Hochfahren ------------------------
int Schwelle_1 = 300;                         // Wert analog am A0
int Stunden_1 = 7;                              // Uhrzeit Stunden
int Minuten_1 = 10;                             // Uhrzeit Minuten  

// Einstellungen Schaltpunkt 2 Runterfahren ----------------------
int Schwelle_2 = 400;                         // Wert analog am A0
int Stunden_2 = 7;                              // Uhrzeit Stunden
int Minuten_2 = 11;                             // Uhrzeit Minuten  

// Einstellungen Relais-Schaltdauer in Millisekunden -------------
int Relais_Zeit = 5000;
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


String Ausgabe;
bool Doppelpunkt_Takter = false;
unsigned long MillisAktuell = 0;
unsigned long Relais_Millis = 0;
int Schalter = 53;

//für den Handbetrieb
int S1 =22; // Handschalter Rolladen 1 hoch
int S2 =23; // Handschalter Rolladen 1 runter
int S3 =24; // Handschalter Rolladen 2 hoch
int S4 =25; // Handschalter Rolladen 2 runter
int S5 =26; // Handschalter Rolladen 3 hoch
int S6 =27; // Handschalter Rolladen 3 runter
int S7 =28; // Handschalter Leinwand weiss hoch
int S8 =29; // Handschalter Leinwand weiss runter
int S9 =30; // Handschalter Leinwand schwarz hoch
int S10 =31; // Handschalter Leinwand schwarz runter
int S11 =32; // alle Rolladen hoch
int S12 =33; // alle Rolladen runter
int S13 =34; // Leinwand 16:9
int S14 =35; // Leinwand 21:9
int S15 =36; // Leinwände hoch (Kino Ende)

// Relais
int KF1 =2; // Rolladen 1 hoch
int KF2 =3; // Rolladen 1 runter
int KF3 =4; // Rolladen 2 hoch
int KF4 =5; // Rolladen 2 runter
int KF5 =6; // Rolladen 3 hoch
int KF6 =7; // Rolladen 3 runter
int KF7 =8; // Leinwand weiss hoch
int KF8 =9; // Leinwand weiss runter
int KF9 =10; // Leinwand schwarz hoch
int KF10 =11; // Leinwand schwarz runter 

// Auto
int Auto_hoch[] = { KF1, KF3, KF5 };
int Auto_runter[] = { KF2, KF4, KF6 };

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

const int Potentiometer = A0;  //Potentiometer
int val = 0;

//const int Aussentemp = A1;  //18B20
//int atemp = 0;

String Datum_Uhrzeit_Aktuell;

void setup() 
{

//start reading
sensors.begin();

  Serial.begin(9600);
 
  // auf serielle Verbindung warten
  while (!Serial) {;}

  rtc.begin();

  // LCD initialisieren
  lcd.init();
  lcd.backlight();

  MillisAktuell = Relais_Millis = millis();
  pinMode(KF1, OUTPUT);
  pinMode(KF2, OUTPUT);
  pinMode(KF3, OUTPUT);
  pinMode(KF4, OUTPUT);
  pinMode(KF5, OUTPUT);
  pinMode(KF6, OUTPUT);
  pinMode(KF7, OUTPUT);
  pinMode(KF8, OUTPUT);
  pinMode(KF9, OUTPUT);
  pinMode(KF10, OUTPUT);
  pinMode(Schalter, INPUT_PULLUP);
  pinMode(S1, INPUT_PULLUP);
  pinMode(S2, INPUT_PULLUP);
  pinMode(S3, INPUT_PULLUP);
  pinMode(S4, INPUT_PULLUP);
  pinMode(S5, INPUT_PULLUP);
  pinMode(S6, INPUT_PULLUP);
  pinMode(S7, INPUT_PULLUP);
  pinMode(S8, INPUT_PULLUP);
  pinMode(S9, INPUT_PULLUP);
  pinMode(S10, INPUT_PULLUP);
  pinMode(S11, INPUT_PULLUP);
  pinMode(S12, INPUT_PULLUP);
  pinMode(S13, INPUT_PULLUP);
  pinMode(S14, INPUT_PULLUP);
  pinMode(S15, 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.
// keine führende 0 setzen
rtc.adjust(DateTime(2021, 12, 15, 7, 9, 55));
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}

// HAUPTPROGRAMM -------------------------------------------------
void loop() 
{

  // Zeit auslesen und anzeigen ----------------------------------
    // Anzeige LCD
  
       String Stunde, Minute;

  // aktuelle Zeit lesen
  DateTime aktuell = rtc.now();
  
  Ausgabe = String(aktuell.hour());
  if (aktuell.minute() < 10) { 
  Ausgabe = Ausgabe + "0"; } 
  Ausgabe = Ausgabe + String(aktuell.minute())+ String(aktuell.second());

Serial.println (" ");
Serial.println ("Zeit");
Serial.print (Ausgabe);
Serial.println (" ");
Serial.println ("Helligkeitssensor");
Serial.print (val);
Serial.println (" ");
Serial.print("Aussentemperatur (°C): ");
Serial.println (sensors.getTempCByIndex(0)); //für Analog (geht aber nicht) da 1Wire Digital signal(atemp);

  Eingangsspannung = analogRead (Helligkeitssensor);


  
  if ((aktuell.hour() == Stunden_1) && (aktuell.minute() == 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 (Auto_hoch, HIGH);
    Relais_Millis = millis(); }
  if ((Schaltpunktliste_1 [3] == 1) && ((Relais_Millis + Relais_Zeit) < millis())) {
    Schaltpunktliste_1 [3] = 2; 
    digitalWrite (Auto_hoch, LOW); 
    for (int i=0; i<4; i++) { 
      Schaltpunktliste_2 [i] = 0; } }

  // Schaltpunkt 2 ------------------------------------------------
  if ((aktuell.hour() == Stunden_2) && (aktuell.minute() == 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 (Auto_runter, HIGH);
    Relais_Millis = millis(); }
  if ((Schaltpunktliste_2 [3] == 1) && ((Relais_Millis + Relais_Zeit) < millis())) {
    Schaltpunktliste_2 [3] = 2; 
    digitalWrite (Auto_runter, LOW);
    for (int i=0; i<4; i++) { 
      Schaltpunktliste_1 [i] = 0; } }

  // Zeit per Hand rücksetzen
  if (digitalRead (53) == LOW) {rtc.adjust(DateTime(2021, 12, 15, 7, 9, 55));}


//---------------------------------- Analogwert auf LCD anzeigen
//  lcd.setCursor(8,0);
  val = analogRead(Potentiometer);
//  if (val<1000) lcd.print(' ');
//  if (val<100)  lcd.print(' ');
//  if (val<10)   lcd.print(' ');
//  lcd.print(val);
//----------------------------------

//atemp = analogRead(Aussentemp);


float Temperatur;   
  float Luftfeuchtigkeit;  
  
  // Daten lesen  
  dht22.read2(&Temperatur, &Luftfeuchtigkeit, NULL);

  // . duch , ersetzen
  String AnzeigeTemperatur = String(Temperatur);  
  AnzeigeTemperatur.replace(".", ","); 
  String AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit);   
  AnzeigeLuftfeuchtigkeit.replace(".", ",");   

  // Anzeige LCD
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Temp.: ");
  lcd.setCursor(6, 1);
  lcd.print(AnzeigeTemperatur + " C");
  
  lcd.setCursor(0, 2);
  lcd.print("Luftf.: ");
  lcd.setCursor(8, 2);
  lcd.print(AnzeigeLuftfeuchtigkeit + " %");
  
  // Wochentag, Datum und Zeit anzeigen
  lcd.setCursor(0, 0);

  /*
    Wochentag anzeigen
    0 = Sonntag
    1 = Montag
    ...
    6 = Samstag
  */
  switch (aktuell.dayOfTheWeek())
  {
    case 0:
      lcd.print("So");
      break;
    case 1:
      lcd.print("Mo");
      break;
    case 2:
      lcd.print("Di");
      break;
    case 3:
      lcd.print("Mi");
      break;
    case 4:
      lcd.print("Do");
      break;
    case 5:
      lcd.print("Fr");
      break;
    case 6:
      lcd.print("Sa");
      break;
  }

  lcd.setCursor(3, 0);
  lcd.print(aktuell.day());
  lcd.print(".");

  switch (aktuell.month())
  {
    case 1:
      lcd.print("1");
      break;
    case 2:
      lcd.print("2");
      break;
    case 3:
      lcd.print("3");
      break;
    case 4:
      lcd.print("4");
      break;
    case 5:
      lcd.print("5");
      break;
    case 6:
      lcd.print("6");
      break;
    case 7:
      lcd.print("7");
      break;
    case 8:
      lcd.print("8");
      break;
    case 9:
      lcd.print("9");
      break;
    case 10:
      lcd.print("10");
      break;
    case 11:
      lcd.print("11");
      break;
    case 12:
      lcd.print("12");
      break;
  }
  lcd.print(".");
  lcd.print(aktuell.year());
  
  lcd.setCursor(15, 0);

  // wenn Stunden < 10 -> führende 0 setzen
  if (aktuell.hour() < 10) lcd.print("0");
  lcd.print(aktuell.hour());
  lcd.print(':');

  // wenn Minuten < 10 -> führende 0 setzen
  if (aktuell.minute() < 10) lcd.print("0");
  lcd.print(aktuell.minute());
 
  lcd.setCursor(0, 3);
  lcd.print("Aussentemp.:" );
 //read temperature and output via LCD
sensors.requestTemperatures();
lcd.setCursor(12,3);
lcd.print(sensors.getTempCByIndex(0));
lcd.setCursor(17,3);
lcd.print( " C" );

  // 60 Sekunden Pause
delay(2000);
  
}       
// **************************************************************


Grüße

Michael

Die Relais werden über Koppelrelais

vor den Motoren gegenseitig veriegelt.

Handbetrieb wollte ich über One Button realiesieren, falls Ihr Ideen oder bessere Vorschläge habt bitte gerne.

Grüße

Michael

Ok, die Relais kannst Du direkt LOW-aktiv ansteuern.
Falls Du damit 230V steuern willst, so sind diese Relaisplatinen dafür nicht geeignet, da die Abstände auf der Platine dafür zu niedrig sind. Auch wenn Reichelt etwas anderes schreibt.

Gruß Tommy

1 Like

Danke, über die Platine wollte ich nur 12V und ab den Koppelrelais (veriegelung) 230V Schalten

teste gerade noch über LED´s HIGH, hatte ich gar nicht bedacht, danke.
Heisst ich muss dann HIGH und LOW drehen in der Auto oder?

Grüße

Michael

verriegeln auf den Koppelrelais brauchst Du nicht.
Die Koppelrelais sind gut und richtig.

Die Schaltung für die Verriegelung baue ich grundsätzlich schon auf dem Relaisboard.

+12V ---+
       /  (K1.1)
      /
      + +
        |
        +
       /  (K2.1)
      /
      + +
      | |
      1 2

K1 muss immer anziehen, damit eines der Koppelrelais 1 oder 2 überhaupt anspringt und mit K2 schalte ich das passende Koppelrelais....

Somit ist ausgeschlossen, das Koppel1 und Koppel2 gleichzeitig ziehen können :wink:

Aber das ist nicht die Frage - Mal sehen, was ich da aus dem Code rauslese....

1 Like

Wenn das Relais anziehen soll, muss es LOW bekommen. Das kannst Du auch mit den LED testen, indem Du diese nach +5V schaltest.

Gruß Tommy

1 Like

Kannst Du mal bitte hinter die Pins als Kommentar schreiben, was die alles machen?
das macht es eindeutig einfacher, da die Namen der Pins nicht sprechen.

  pinMode(KF1, OUTPUT);
  pinMode(KF2, OUTPUT);
  pinMode(KF3, OUTPUT);
  pinMode(KF4, OUTPUT);
  pinMode(KF5, OUTPUT);
  pinMode(KF6, OUTPUT);
  pinMode(KF7, OUTPUT);
  pinMode(KF8, OUTPUT);
  pinMode(KF9, OUTPUT);
  pinMode(KF10, OUTPUT);
  pinMode(Schalter, INPUT_PULLUP);
  pinMode(S1, INPUT_PULLUP);
  pinMode(S2, INPUT_PULLUP);
  pinMode(S3, INPUT_PULLUP);
  pinMode(S4, INPUT_PULLUP);
  pinMode(S5, INPUT_PULLUP);
  pinMode(S6, INPUT_PULLUP);
  pinMode(S7, INPUT_PULLUP);
  pinMode(S8, INPUT_PULLUP);
  pinMode(S9, INPUT_PULLUP);
  pinMode(S10, INPUT_PULLUP);
  pinMode(S11, INPUT_PULLUP);
  pinMode(S12, INPUT_PULLUP);
  pinMode(S13, INPUT_PULLUP);
  pinMode(S14, INPUT_PULLUP);
  pinMode(S15, INPUT_PULLUP);

Hallo,

das habe ich ja oben bei den int.


//für den Handbetrieb
int S1 =22; // Handschalter Rolladen 1 hoch
int S2 =23; // Handschalter Rolladen 1 runter
int S3 =24; // Handschalter Rolladen 2 hoch
int S4 =25; // Handschalter Rolladen 2 runter
int S5 =26; // Handschalter Rolladen 3 hoch
int S6 =27; // Handschalter Rolladen 3 runter
int S7 =28; // Handschalter Leinwand weiss hoch
int S8 =29; // Handschalter Leinwand weiss runter
int S9 =30; // Handschalter Leinwand schwarz hoch
int S10 =31; // Handschalter Leinwand schwarz runter
int S11 =32; // alle Rolladen hoch
int S12 =33; // alle Rolladen runter
int S13 =34; // Leinwand 16:9
int S14 =35; // Leinwand 21:9
int S15 =36; // Leinwände hoch (Kino Ende)

// Relais
int KF1 =2; // Rolladen 1 hoch
int KF2 =3; // Rolladen 1 runter
int KF3 =4; // Rolladen 2 hoch
int KF4 =5; // Rolladen 2 runter
int KF5 =6; // Rolladen 3 hoch
int KF6 =7; // Rolladen 3 runter
int KF7 =8; // Leinwand weiss hoch
int KF8 =9; // Leinwand weiss runter
int KF9 =10; // Leinwand schwarz hoch
int KF10 =11; // Leinwand schwarz runter 

// Auto
int Auto_hoch[] = { KF1, KF3, KF5 };
int Auto_runter[] = { KF2, KF4, KF6 };

hätte ich zusammefassen sollen oder?
Bin halt dem Beispiel gefolgt wie es auf meineSchaltung.de angefangen wurde, hat ja auch funktioniert bis ich das mit der Unterfunktion angefangen habe um mehrere Relais gleichzeitig zu schalten.
Rollladen Steuerung

Danke

Grüße

Michael

Alles gut - mal sehen, ob ich da durch komme... - Ich hab das in der Zuweisung überlesen ;(

Nein, Du hättest die Pins entsprechend ihrer Funktion benennen sollen. Macht zwar ein wenig mehr Schreibarbeit im Sketch, aber das macht es wesentlich übersichtlicher. Ausserdem sparst Du dann den einen oder anderen Kommentar im Sketch.
S1,S2.. usw. sind vollkommen nichtssagende Namen.

if ( digitalRead(handSchalterR1Hoch) == HIGH ) ...

ist doch wesentlich aussagekräftiger als

if (digitalRead(S1) == HIGH ) ...

1 Like

super danke dir, guter Rat.

Das mit den S hatte ich bisher in meinem kleinen sketchen die waren aber auch sehr übersichtlich.

Dann nochmal ich: der Schalter an Pin 53 ist der Umschalter zwischen Hand / Automatik?

PIN53 setzt die Zeit zurück um nicht jedesmal neu hochladen zu müssen (Auto test) wird bei laufender Anlage dann gelöscht oder // gesetzt.

Bisher läuft nur Automatik, umschalter Auto / Hand habe ich noch gar nicht.
soll vorerst Simultan laufen heist wenn vor erreichen der Zeit und Dunkelheit runtergefahren wird dann wird am morgen Auto wieder hochfahren.

Das macht es schwieriger.
Denn damit kannst Du der Automatik nicht sagen, das sie ständig prüfen soll was da draussen so los ist.
Damit muss die verriegelt werden.
Na mal schaun.

1 Like

wie würdet ihr den umschalter Auto / Hand umsetzen?
müsste dann in die vorher vor umschalten auf Hand eingestellte Stellung gefahren werden.

Hab jetzt Kinderdienst :slight_smile: hoffe ich schaffe es heute nochmal

Danke Grüße

Michael

Status merken - umschalten / automatik unterbinden - und beim zurück status wieder setzen.
Hat nur einen Nachteil:
Wenn die Zeit abgelaufen ist, geht es schief.