Wintergarten 6 Motoren über Fernbedienung steuern

Hallo,
habe lange gezögert aber ohne eure Hilfe komme ich nicht weiter.
Programmieren ist noch nicht mein Ding. Etwas rumgespielt und 2014 Treppenbeleuchtung gebaut. Sketch im Internet gefunden, etwas umgebaut und Funktioniert. Elektronik und löten ist für mich nicht fremd. Nur Arduino-Befehle kenne ich nicht so doll. Vor allem "wer mit wem wann und wo" kenne ich noch nicht.
So!
Jetzt zu Problem:
Habe 6 Getr. Motoren 12V, ca. 700mA, 30U/Min. Damit möchte ich im Wintergarten 6 Sonnensegel hoch und runter fahren. Per Schalter funktioniert das alles. Sketch habe ich erstellt (nicht lachen über Sketch, bin nicht jung, aber trotz dem Anfänger). Fernbedienung vom Fernseher habe ich in Sketch integriert.
Aufgabe: Sonnensegel "HOCH" - "STOP" - "RUNTER".
Bei "ÜBERLASTUNG" - "AUS" jede einzelne Sonnensegel.
Möchte keine Endschalter haben. Schaltung für Motorüberlastung habe ich schon ausgetüftelt. Bekomme 0V bis ca.12Volt Überlastungssignal. Mache davon 5 Volt. Das sollte mein "STOP" - Pegel sein. Genau da liegt mein Problem, kriege nicht in Sketch integriert.

                      //ARDUINO MEGA 2560
#include <IRremote.h>                       //Library wird eingebunden

int RECV_PIN_A0 = A0;                           //Ir-Empfänger am Pin A0

int Ueberlastung;
int STOP_M1 = A1;                              //Bei Überlastung "Getr.-Motor 1" - "AUS"
//int STOP_M2 = A2;                              //Bei Überlastung "Getr.-Motor 2" - "AUS"

int SS1_ZU = 2;                            //Definieren SonnenSegel 1 "ZU"
int SS2_ZU = 3;                            //Definieren SonnenSegel 2 "ZU"

int SS1_AUF = 8;                            //Definieren SonnenSegel 1 "AUF"
int SS2_AUF = 9;                            //Definieren SonnenSegel 2 "AUF"

IRrecv irrecv(RECV_PIN_A0);
decode_results results;

void setup()
{
pinMode (SS1_ZU, OUTPUT);                  
pinMode (SS2_ZU, OUTPUT);                   

pinMode (SS1_AUF, OUTPUT);                  
pinMode (SS2_AUF, OUTPUT);                   

pinMode (STOP_M1, INPUT);                   
//pinMode (STOP_M2, INPUT);                   

Serial.begin(9600); 
             
irrecv.enableIRIn();
}

void loop() {
  Ueberlastung = digitalRead(STOP_M1);
 Serial.println(Ueberlastung,DEC);
 delay(500);
 
if (irrecv.decode(&results))                  //Wenn ein Signal erkannt wird,

{            
Serial.println(results.value, DEC);           //wird dieses ausgegeben

if (results.value == 16)                      //"16" Taste1 Fernbedienung
  {digitalWrite (SS1_ZU, HIGH);               //Taste 1 gedrückt - SonnenSegel_1 "RUNTER" - SS1_ZU an
   digitalWrite (SS1_AUF, LOW);}              //und SS1_AUF aus

if (results.value == 2064)                    //"2064" Taste2 Fernbedienung
  {digitalWrite (SS2_ZU, HIGH);               //Taste 2 gedrückt - SonnenSegel_2 "RUNTER" - SS2_ZU an
   digitalWrite (SS2_AUF, LOW);}              //und SS2_AUF aus

if (results.value == 1552)                    //"1552" Taste7 Fernbedienung
  {digitalWrite (SS1_AUF, HIGH);              //Taste 7 gedrückt - SonnenSegel_1 "HOCH" - SS1_ZU an
   digitalWrite (SS1_ZU, LOW);}               //und SS1_ZU aus

if (results.value == 3600)                    //"3600" Taste8 Fernbedienung
  {digitalWrite (SS2_AUF, HIGH);              //Taste 8 gedrückt - SonnenSegel_2 "HOCH" - SS2_ZU an
   digitalWrite (SS2_ZU, LOW);}               //und SS2_ZU aus

if (results.value == 1488)                    //"1448" Taste13 Fernbedienung
  {digitalWrite (SS1_ZU, LOW);                //Taste 13 gedrückt - SonnenSegel_1 "RUNTER" - aus
   digitalWrite (SS1_AUF, LOW);}              // und                SonnenSegel_1  "HOCH"  - aus

if (results.value == 2640)                    //"2640" Taste14 Fernbedienung
  {digitalWrite (SS2_ZU, LOW);                //Taste 14 gedrückt - SonnenSegel_2 "RUNTER" - aus
   digitalWrite (SS2_AUF, LOW);}              // und                SonnenSegel_2  "HOCH"  - aus

if (results.value == 2704)                    //Wenn die OFF-Taste gedrückt wird, Motor1 bis Motor6,
  {digitalWrite (SS1_ZU, LOW);                //"ZU" oder "AUF" - alles "AUS"
   digitalWrite (SS2_ZU, LOW);
   digitalWrite (SS1_AUF, LOW);
   digitalWrite (SS2_AUF, LOW);}

//if (digitalRead(STOP_M1)==HIGH);     //Wenn Überlastung "HIGH", dann SS1_ZU "LOW"
// { digitalWrite (SS1_ZU, LOW);}     // SS1_ZU bleibt aber überall und immer "LOW"

irrecv.resume();

}}

Könnt ihr mir helfen?
Würde mich sehr über eure Hilfe freuen.

Du legst den Arduino pro Loop-Durchlauf für ne halbe Sekunde schlafen. In der Zeit macht er überhaupt nichts.
Da wird kei IR-Empfänger ausgewertet, keine Überlasterkennung gemacht - einfach nix.

Was Ueberlastung = digitalRead(STOP_M1); macht ist mir auch nicht klar.

Wenn aber 0,001 Sekunde nach beginn Deines delay(500) eine Überlast erfolgt, wird die ignoriert.

Schau Dir BlinkwithoutDelay und die Nachtwächtererklärung (kein Witz) an. Du musst das Ganze ohne delay bauen, da Du schnell auf ereignisse wie Überstrom und IR-Befehle reagieren musst.

Gruß Tommy

Versuche es mal ohne Semikolon:

if (digitalRead(STOP_M1)==HIGH) { digitalWrite (SS1_ZU, LOW);}

Danke Tommy56 für schnelle Antwort.
Habe eigentlich erst ohne "Delay" programmiert, genau das gleiche.
Habe jetzt "Delay" wieder rausgenommen, auch nicht.
Waldi

Dann stelle doch mal den Code mit millis() komplett hier rein.

Gruß Tommy

Danke agmue für schnelle Antwort.
Semikolon habe ich jetzt rausgenommen, Programm läuft. Nur bei "STOP_M1==HIGH" Motor1 hält nicht an. Wenn ich erst dauer "HIGH" auf z.B. "STOP_M1" Pin:A1 gebe, dann kann ich Motor1-"SS1_ZU" nicht mehr einschalten.
Waldi

Entschuldigung, mein Fehler. Habe mein Problem nicht deutlich genug erklärt.
"SS1_ZU" - Rechtslauf, "SS1_AUF" - Linkslauf für Motor1 . Gesteuert über H-Brücke.
Z.B.: Taste1 kurz betätigt "SS1_ZU" - ist "HIGH", "SS1_AUF"- "LOW". SonenSegel_1 fährt "RUNTER".
Angenommen beim RUNTER oder HOCH fahren kommt zu Überlastung: "STOP_M1==HIGH" - (Störung oder Ende). Motor1 muss stoppen. Im mein Fall läuft aber weiter.
Übrigens, Sketch habe ich bis auf 2 Motoren gekürzt. Sonst wird´s zu lang.
Waldi

Tommy56,
Sketch hat keine Code mit millis(), wenn Du das meinst. Wenn Du meinst soll ich in Programm einbauen, dann weiß ich nicht wo und wie.
Waldi

So wie ich verstehe, ist Befehl

 Ueberlastung = digitalRead(STOP_M1);
 Serial.println(Ueberlastung,DEC);

nur für serieller Monitor zuständig, oder liege ich falsch?
Testhalbe habe komplett deaktiviert, kein Problem, läuft genau so.
Waldi

Wenn Du vorher delay(500) drin hattest, wird das ja Deiner Meinung nach einen Grund gehabt haben.
Einfach das delay Löschen ist dann wohl nicht die Lösung, sondern die Zeitsteuerung mit Millis, nicht mit Delay machen.
Suche mal nach BlinkWithoutDelay und der Nachtwächtererklärung (kein Witz). Dann verstehst Du, was ich meine.

Gruß Tommy

So funktioniert es:

void loop() {
  Ueberlastung = digitalRead(STOP_M1);
  //Serial.println(Ueberlastung);

  if (irrecv.decode(&results))                  //Wenn ein Signal erkannt wird,
  {
...
    irrecv.resume();
  }
  if (Ueberlastung)   //Wenn Überlastung "HIGH", dann SS1_ZU "LOW"
  {
    digitalWrite (SS1_ZU, LOW); // SS1_ZU bleibt aber überall und immer "LOW"
  }
}

Die Abfrage nach Überlastung funktioniert nur außerhalb der Tastenabfrage!

Hatte ich leider übersehen :frowning:

Mein Testsketch mit Codes für meine Ferbedienung:

//ARDUINO MEGA 2560
#include <IRremote.h>                       //Library wird eingebunden

const byte RECV_PIN_A0 = A0;                           //Ir-Empfänger am Pin A0

bool Ueberlastung;
const byte STOP_M1 = A1;                              //Bei Überlastung "Getr.-Motor 1" - "AUS"
//const byte STOP_M2 = A2;                              //Bei Überlastung "Getr.-Motor 2" - "AUS"

const byte SS1_ZU = 2;                            //Definieren SonnenSegel 1 "ZU"
const byte SS2_ZU = 3;                            //Definieren SonnenSegel 2 "ZU"

const byte SS1_AUF = 8;                            //Definieren SonnenSegel 1 "AUF"
const byte SS2_AUF = 9;                            //Definieren SonnenSegel 2 "AUF"

IRrecv irrecv(RECV_PIN_A0);
decode_results results;

void setup()
{
  pinMode (SS1_ZU, OUTPUT);
  pinMode (SS2_ZU, OUTPUT);

  pinMode (SS1_AUF, OUTPUT);
  pinMode (SS2_AUF, OUTPUT);

  pinMode (STOP_M1, INPUT_PULLUP);
  //pinMode (STOP_M2, INPUT);

  Serial.begin(9600);

  irrecv.enableIRIn();
}

void loop() {
  Ueberlastung = digitalRead(STOP_M1);
  //Serial.println(Ueberlastung);

  if (irrecv.decode(&results))                  //Wenn ein Signal erkannt wird,
  {
    uint16_t taste = results.value & 0xFFFF;
    Serial.println(taste, HEX);           //wird dieses ausgegeben

    if (taste == 0x30CF)                      //"16" Taste1 Fernbedienung
    { digitalWrite (SS1_ZU, HIGH);               //Taste 1 gedrückt - SonnenSegel_1 "RUNTER" - SS1_ZU an
      digitalWrite (SS1_AUF, LOW);
    }              //und SS1_AUF aus

    if (taste == 0x10EF)                    //"2064" Taste2 Fernbedienung
    { digitalWrite (SS2_ZU, HIGH);               //Taste 2 gedrückt - SonnenSegel_2 "RUNTER" - SS2_ZU an
      digitalWrite (SS2_AUF, LOW);
    }              //und SS2_AUF aus

    if (taste == 0x18E7)                    //"1552" Taste7 Fernbedienung
    { digitalWrite (SS1_AUF, HIGH);              //Taste 7 gedrückt - SonnenSegel_1 "HOCH" - SS1_ZU an
      digitalWrite (SS1_ZU, LOW);
    }               //und SS1_ZU aus

    if (taste == 0x38C7)                    //"3600" Taste8 Fernbedienung
    { digitalWrite (SS2_AUF, HIGH);              //Taste 8 gedrückt - SonnenSegel_2 "HOCH" - SS2_ZU an
      digitalWrite (SS2_ZU, LOW);
    }               //und SS2_ZU aus

    if (taste == 0x7A85)                    //"1448" Taste13 Fernbedienung
    { digitalWrite (SS1_ZU, LOW);                //Taste 13 gedrückt - SonnenSegel_1 "RUNTER" - aus
      digitalWrite (SS1_AUF, LOW);
    }              // und                SonnenSegel_1  "HOCH"  - aus

    if (taste == 0x5AA5)                    //"2640" Taste14 Fernbedienung
    { digitalWrite (SS2_ZU, LOW);                //Taste 14 gedrückt - SonnenSegel_2 "RUNTER" - aus
      digitalWrite (SS2_AUF, LOW);
    }              // und                SonnenSegel_2  "HOCH"  - aus

    if (taste == 0x6897)                    //Wenn die OFF-Taste gedrückt wird, Motor1 bis Motor6,
    { digitalWrite (SS1_ZU, LOW);                //"ZU" oder "AUF" - alles "AUS"
      digitalWrite (SS2_ZU, LOW);
      digitalWrite (SS1_AUF, LOW);
      digitalWrite (SS2_AUF, LOW);
    }
    irrecv.resume();
  }
  if (Ueberlastung)   //Wenn Überlastung "HIGH", dann SS1_ZU "LOW"
  {
    digitalWrite (SS1_ZU, LOW); // SS1_ZU bleibt aber überall und immer "LOW"
  }
}

Tommy56,
hast Du recht, Grund für "Delay" war nur visuell zu sehen wie mein "Überlastung" - Befehl auf HIGH und LOW reagiert und auf Monitor lief das ganze etwas zu schell.
Nach BlinkWithoutDelay und der Nachtwächtererklärung (kein Witz) werde ich gleich suchen. Für jede Vorschlag und Rat bin ich sehr dankbar. Wie gesagt, bin noch Anfänger.
Waldi

agmue, tausend Dank für dein Rat,
Ich habe noch ein Fehler von mir gefunden. Pin "STOP_M1 = A1" hing bei mir einfach in die Luft, nur zum testen hat A1 "HIGH" bekommen. Dann habe ich A1 auf "Minus" über 10Kom Widerstand gelegt. Sketch nach Dein Rat umgebaut

                      //ARDUINO MEGA 2560
#include <IRremote.h>                       //Library wird eingebunden

int RECV_PIN_A0 = A0;                           //Ir-Empfänger am Pin A0

int Ueberlastung;
int STOP_M1 = A1;                              //Bei Überlastung "Getr.-Motor 1" - "AUS"
//int STOP_M2 = A2;                              //Bei Überlastung "Getr.-Motor 2" - "AUS"

int SS1_ZU = 2;                            //Definieren SonnenSegel 1 "ZU"
int SS2_ZU = 3;                            //Definieren SonnenSegel 2 "ZU"

int SS1_AUF = 8;                            //Definieren SonnenSegel 1 "AUF"
int SS2_AUF = 9;                            //Definieren SonnenSegel 2 "AUF"

IRrecv irrecv(RECV_PIN_A0);
decode_results results;

void setup()
{
pinMode (SS1_ZU, OUTPUT);                  
pinMode (SS2_ZU, OUTPUT);                   

pinMode (SS1_AUF, OUTPUT);                  
pinMode (SS2_AUF, OUTPUT);                   

pinMode (STOP_M1, INPUT);                   
//pinMode (STOP_M2, INPUT);                   

Serial.begin(9600); 
             
irrecv.enableIRIn();
}

void loop() {
 Ueberlastung = digitalRead(STOP_M1);
 //Serial.println(Ueberlastung,DEC);

 
if (irrecv.decode(&results))                  //Wenn ein Signal erkannt wird,

{            
Serial.println(results.value, DEC);           //wird dieses ausgegeben

if (results.value == 16)                      //"16" Taste1 Fernbedienung
  {digitalWrite (SS1_ZU, HIGH);               //Taste 1 gedrückt - SonnenSegel_1 "RUNTER" - SS1_ZU an
   digitalWrite (SS1_AUF, LOW);}              //und SS1_AUF aus

if (results.value == 2064)                    //"2064" Taste2 Fernbedienung
  {digitalWrite (SS2_ZU, HIGH);               //Taste 2 gedrückt - SonnenSegel_2 "RUNTER" - SS2_ZU an
   digitalWrite (SS2_AUF, LOW);}              //und SS2_AUF aus

if (results.value == 1552)                    //"1552" Taste7 Fernbedienung
  {digitalWrite (SS1_AUF, HIGH);              //Taste 7 gedrückt - SonnenSegel_1 "HOCH" - SS1_ZU an
   digitalWrite (SS1_ZU, LOW);}               //und SS1_ZU aus

if (results.value == 3600)                    //"3600" Taste8 Fernbedienung
  {digitalWrite (SS2_AUF, HIGH);              //Taste 8 gedrückt - SonnenSegel_2 "HOCH" - SS2_ZU an
   digitalWrite (SS2_ZU, LOW);}               //und SS2_ZU aus

if (results.value == 1488)                    //"1448" Taste13 Fernbedienung
  {digitalWrite (SS1_ZU, LOW);                //Taste 13 gedrückt - SonnenSegel_1 "RUNTER" - aus
   digitalWrite (SS1_AUF, LOW);}              // und                SonnenSegel_1  "HOCH"  - aus

if (results.value == 2640)                    //"2640" Taste14 Fernbedienung
  {digitalWrite (SS2_ZU, LOW);                //Taste 14 gedrückt - SonnenSegel_2 "RUNTER" - aus
   digitalWrite (SS2_AUF, LOW);}              // und                SonnenSegel_2  "HOCH"  - aus

if (results.value == 2704)                    //Wenn die OFF-Taste gedrückt wird, Motor1 bis Motor6,
  {digitalWrite (SS1_ZU, LOW);                //"ZU" oder "AUF" - alles "AUS"
   digitalWrite (SS2_ZU, LOW);
   digitalWrite (SS1_AUF, LOW);
   digitalWrite (SS2_AUF, LOW);}

//if (digitalRead(STOP_M1)==HIGH)   //Wenn Überlastung "HIGH", dann SS1_ZU "LOW"
//{ digitalWrite (SS1_ZU, LOW);}     // SS1_ZU bleibt aber überall und immer "LOW"

irrecv.resume();
}
 if (Ueberlastung)   //Wenn Überlastung "HIGH", dann SS1_ZU "LOW"
  {
    digitalWrite (SS1_ZU, LOW); // SS1_ZU bleibt aber überall und immer "LOW"
  }
}

und siehe da - läuft wie geschmiert.
Jetzt funktioniert es wirklich wie ich mir das vorgestellt habe! Muss Sketch noch komplett zusammenbauen und auf Herz und Niere testen.
Bin begeistert.
Wenn fertig ist werde ich mich noch einmal melden.
Danke an alle die mir geholfen haben. Ohne Eure Hilfe würde mich noch lange rumquälen.
Waldi