ich habe zwei Deckenlampen und zwei wandtaster
ich wollte gerne die Deckenlampen mit einer IR Fernbedienung ein und aus schalten.
also gleich mal zwei relais und ir an den arduino ran und kleines sketch geschrieben.
nun ist es so das ich mit je einer Taste ein relai an und aus schalten kann.
das problem ist nun das ich mit den zwei Wandtastern die lampen auch ein und aus schalten muss, falls die fernbedienung mal nicht funktioniert. leider bekomme ich es nicht hin egal was ich auch versuche. ich kann das relai mit den wandtastern nur einschalten aber bekomme es mit noch einen druck nicht wieder ausgeschalten.
p.s. die wandtaster kann ich auch durch schalter ersetzen aber dann hätte ich ja ein dauer signal beim einschalten und könnte dieses dann nicht mit der ir fernbedienung wieder abschalten oder?
Mit welcher Spannung arbeiten deine Deckenlampen ?
Sollten das 230 Volt sein, dann ziehe einen Elektriker deines Vertrauens zu Rate.
Der soll entsprechende Relais in den Verteiler/Sicherungskasten einbauen und du steuerst die Relais per 5 oder 12 Volt.
Ok, dann ist das Problem nicht ganz so groß
Leider kann ich deinen Sketch hier Mobil nicht öffnen. Also poste den bitte in Code-Tags hier im Forum.
Das ist so üblich.
Dann seh ich mir den auch an.
Du schaltest bei Tastendruck nur ein, aber nicht aus. Ardubus Sketch zeigt das Umschalten.
Wie hast du die Schalter angeschlossen? Hast du Pull-Downs verbaut? Ohne Pull-Downs oder -Ups floaten die Eingänge und schalten nach Lust und Laune herum.
ja pull down wiederstände habe ich in die schaltung eingebracht.
es geht also 5 volt auf den schalter und der schaltet/tastes dann die 5volt durch zum arduino eingang.
ja ich weiß das im sketch jetzt nur das einschalten drin ist, habe die versuche die ich schon unternommen habe gelöscht weil sie nicht funktioniert haben.
und ich das sketch nicht zumüllen wollte.
ich habe es geschafft.
im prinzip einfach und es funktioniert.
ich habe auch das beispiel von ardubu probiert anzupassen und aus zu probieren
leider hatte es nicht funktioniert. im nachgang habe ich gesehen das ich beim anpassen fehler gemacht habe.
egal.
ich habe nun eine lösung gefunden und würde sie gerne noch zur verfügung stellen.
#include <IRremote.h>
int RECV_PIN = 11; //ir pin
int dl1=2; //relais ausgang
int dl2=3; //relais ausgang
int lampe1=0; //status
int lampe2=0; //status
int wtaster1=5; //Pin 5 eingang für Wandtaster1
int wtaster2=6; //Pin 6 eingang für Wandtaster2
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(115200);
pinMode (dl1, OUTPUT); //Deckenlampe 1
pinMode (dl2, OUTPUT); //Deckenlampe 2
pinMode (wtaster1, INPUT); //wandschalter oben
pinMode (wtaster2, INPUT); //wandschalter unten
digitalWrite(dl1, LOW); //Diese soll zunächst aus sein
digitalWrite(dl2, LOW); //Diese soll zunächst aus sein
irrecv.enableIRIn();
}
void loop() {
//IR Abfragen
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
if (results.value == 0xf7c03f)
if (lampe1==1)
{
lampe1=0;
}
else
{
lampe1=1;
}
if (results.value == 0xf740bf)
if (lampe2==1)
{
lampe2=0;
}
else
{
lampe2=1;
}
irrecv.resume();
}
//--------------
//Ausgang Schalten
if (lampe1==1){
digitalWrite(dl1,HIGH);
}
if (lampe1==0){
digitalWrite(dl1,LOW);
}
if (lampe2==1){
digitalWrite(dl2,HIGH);
}
if (lampe2==0){
digitalWrite(dl2,LOW);
}
//--------------
//Wandtaster abfragen
if (digitalRead(wtaster1) == HIGH)
if (lampe1==1)
{
lampe1=0;
delay(1000);
}
else
{
lampe1=1;
delay(1000);
}
if (digitalRead(wtaster2) == HIGH)
if (lampe2==1)
{
lampe2=0;
delay(1000);
}
else
{
lampe2=1;
delay(1000);
}
}
//--------------
Du hast in Deinem Code eine Ausgabe auf der seriellen Konsole vorgesehen.... dies kann (u.A.) eine Ursache für einen Neustart des Controllers sein, wenn nichts angeschlossen ist. Also wenn Du nicht 24/7 eine serielle Konsole dran hast, einfach auskommentieren und neu probieren.
Um sicher zu gehen, dass der Controller aus irgendwelchen Gründen neu startet, kannst Du ja im Setup eine 1 auf eine Stelle im EEPROM dazuaddieren. Sollte wieder etwas passieren, was nicht soll, dann mal den EEPROM auslesen. Ist der Wert verändert, gab es einen Neustart.
die wiederstände habe ich schon auf 1kohm ausgelegt.
ah ok . ja mit den eeprom funktionen usw kenne ich mich noch nicht so aus.
habe selber die tage noch an dem sketch gearbeitet und hänge es hier mal an.
momentan scheint es gut zu funktionieren und ich habe noch aus spaß mit eingebaut das lciht über die serielle schnittstelle ein und aus zu schalten.
DerLehmi:
Du hast in Deinem Code eine Ausgabe auf der seriellen Konsole vorgesehen.... dies kann (u.A.) eine Ursache für einen Neustart des Controllers sein, wenn nichts angeschlossen ist. Also wenn Du nicht 24/7 eine serielle Konsole dran hast, einfach auskommentieren und neu probieren.
Um sicher zu gehen, dass der Controller aus irgendwelchen Gründen neu startet, kannst Du ja im Setup eine 1 auf eine Stelle im EEPROM dazuaddieren. Sollte wieder etwas passieren, was nicht soll, dann mal den EEPROM auslesen. Ist der Wert verändert, gab es einen Neustart.
@DerLehmi: wie kann ich das mir dem eeprom in meinem aktuellen sketch realisieren??? dann habe ich gleich ein sinnvolles beispiel das ich eventuell auf andere projekte anpassen kann.
#include <IRremote.h>
int dl1 = 2; //relais ausgang
int dl2 = 3; //relais ausgang
int lampe1 = 0; //status
int lampe2 = 0; //status
int wtaster1 = 5; //Pin 5 eingang für Wandtaster1
int wtaster2 = 6; //Pin 6 eingang für Wandtaster2
int RECV_PIN = 11; //ir pin
IRrecv irrecv(RECV_PIN);
decode_results results;
int debugwert = 0;
//--------------
void setup()
{
Serial.begin(115200);
pinMode (dl1, OUTPUT); //Deckenlampe 1
pinMode (dl2, OUTPUT); //Deckenlampe 2
pinMode (wtaster1, INPUT); //Wandtaster1 oben
pinMode (wtaster2, INPUT); //Wandtaster2 unten
//SetupRelais
digitalWrite(dl1, LOW); //Diese soll zunächst aus sein
digitalWrite(dl2, LOW); //Diese soll zunächst aus sein
if (!Serial.available()) {
digitalWrite(dl1, LOW); //Diese soll zunächst aus sein
digitalWrite(dl2, LOW); //Diese soll zunächst aus sein
delay(500);
digitalWrite(dl1, HIGH); //Diese soll zunächst an sein
digitalWrite(dl2, HIGH); //Diese soll zunächst an sein
delay(500);
digitalWrite(dl1, LOW); //Diese soll zunächst aus sein
digitalWrite(dl2, LOW); //Diese soll zunächst aus sein
delay(500);
}
//SetupEnde
irrecv.enableIRIn(); //IR Aktivieren
}
//--------------
void loop() {
if (Serial.available())
{
debugloop();
chkSer();
}
irabfrage();
tasterabfrage();
ausgang_schalten();
}
//--------------
void irabfrage() {
//IR Abfragen
if (irrecv.decode(&results)) {
if (!Serial.available()) {
Serial.println("---------------------------------");
Serial.print("Aktueller HEX-code: ");
Serial.println(results.value, HEX);
Serial.println("---------------------------------");
}
if (results.value == 0xFF30CF) //Wohnzimmer
if (lampe1 == 1)
{
lampe1 = 0;
}
else
{
lampe1 = 1;
}
if (results.value == 0xFF6897) //Küche
if (lampe2 == 1)
{
lampe2 = 0;
}
else
{
lampe2 = 1;
}
delay(500);
irrecv.resume();
}
}
//--------------
void tasterabfrage() {
//Wandtaster abfragen
if (digitalRead(wtaster1) == HIGH)
if (lampe1 == 1)
{
lampe1 = 0;
delay(250);
}
else
{
lampe1 = 1;
delay(250);
}
if (digitalRead(wtaster2) == HIGH)
if (lampe2 == 1)
{
lampe2 = 0;
delay(250);
}
else
{
lampe2 = 1;
delay(250);
}
// delay(500);
}
//--------------
void debugloop() {
if (debugwert == 1) {
Serial.println("-----------------------");
Serial.print("Wandtaster 1: ");
Serial.println(digitalRead(wtaster1));
Serial.println("-----------------------");
Serial.print("Wandtaster 2: ");
Serial.println(digitalRead(wtaster2));
Serial.println("-----------------------");
Serial.println(results.value, HEX);
Serial.println("-----------------------");
delay(250);
}
}
//--------------
void ausgang_schalten() {
//Ausgang Schalten
if (lampe1 == 1) {
digitalWrite(dl1, HIGH);
}
if (lampe1 == 0) {
digitalWrite(dl1, LOW);
}
if (lampe2 == 1) {
digitalWrite(dl2, HIGH);
}
if (lampe2 == 0) {
digitalWrite(dl2, LOW);
}
delay(500);
}
//--------------
void chkSer(void) {
if (!Serial.available()) return;
switch (Serial.read()) {
case 'w':
if (lampe1 == 1)
{
lampe1 = 0;
Serial.println("Wohnzimmer aus");
delay(500);
}
else
{
lampe1 = 1;
Serial.println("Wohnzimmer an");
delay(500);
}
break;
case 'k':
if (lampe2 == 1)
{
lampe2 = 0;
Serial.println("Küche aus");
delay(500);
}
else
{
lampe2 = 1;
Serial.println("Küche an");
delay(500);
}
break;
case 'd':
if (debugwert == 1)
{
debugwert = 0;
Serial.println("Debug aus");
delay(500);
}
else
{
debugwert = 1;
Serial.println("Debug an");
delay(500);
}
break;
default:
Serial.println('?');
Serial.println("------------------------------");
Serial.println("Wohnzimmer An/Aus --> w");
Serial.println("Küche An/Aus --> k");
Serial.print("Status Wohnzimmer: ");
Serial.println(lampe1);
Serial.print("Status Küche: ");
Serial.println(lampe2);
Serial.println("----------");
Serial.println("Debug An/Aus --> d");
Serial.print("Status: ");
Serial.println(debugwert);
Serial.println("------------------------------");
}
}
flexcon:
wie kann ich das mir dem eeprom in meinem aktuellen sketch realisieren???
dann habe ich gleich ein sinnvolles beispiel das ich eventuell auf andere projekte anpassen kann.
Zu EEPROM-Sachen habe ich mir mal einen Merkzettel gemacht, den aufgebohrt und ins Netz gekippt.
HTH
Gregor
PS: Formatiere nicht zu wild herum. In Zitaten sieht das nicht so hübsch aus (und braucht ggf. mehr Platz). Wenn Du etwas hervorheben möchtest, nimm z. B. Farbe. Und dann vielleicht nicht gerade rot, sonst denkt jemand, Du würdest schreien oder so. Wenn Du allerdings gerade ertrinkst oder überfahren wirst, ist rot okay. Dann eilt's ja.