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.
Danke Tommy56 für schnelle Antwort.
Habe eigentlich erst ohne "Delay" programmiert, genau das gleiche.
Habe jetzt "Delay" wieder rausgenommen, auch nicht.
Waldi
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
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.
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
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