Deckenlampenschaltung

Hallo,
ich habe mal wieder ein problem.

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?

vielen dank schon mal

deckenlampe.ino (1.32 KB)

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.

die deckenlampen laufen nur auf 12v und die relais werden mit 5v angesteuert

Ok, dann ist das Problem nicht ganz so groß :slight_smile:
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.

sorry, so! :slight_smile:

#include <IRremote.h>

int RECV_PIN = 11;
int dl1=2;   //Pin für Relai 1
int dl2=3;   //Pin für Relai 2

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(9600);

pinMode (dl1, OUTPUT);   //Deckenlampe 1
pinMode (dl2, OUTPUT);   //Deckenlampe 2

pinMode (wtaster1, INPUT);     //wandschalter unten
pinMode (wtaster2, INPUT);     //wandschalter oben

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(2,HIGH);
}
if (lampe1==0){
 digitalWrite(2,LOW);
}
if (lampe2==1){
 digitalWrite(3,HIGH);
}
if (lampe2==0){
 digitalWrite(3,LOW);
}
//--------------


//Wandschalter Abfragen
 if (digitalRead(wtaster1) == HIGH && (lampe1) == 0){
   lampe1=1;
 }
 if (digitalRead(wtaster2) == HIGH && (lampe2) == 0){
   lampe2=1;
 }
//--------------  

}

ich habe hier mal einen Sketch mit dem du einen Ausgang toogeln kannst

/*
 *© Ardubu März 2016
 *Umschalten eines Ausgangs mit einem Taster, 
 *Taster wird zwischen GND und pin_x angeschlossen
 *interner Pullup Widerstand aktiviert
 *der counter zählt von 0 bis 255 jeden Tastendruck
*/

#define DEBUG //Nur zur Fehlersuche aktivieren
#define taste2Pin 4 //Taster an D4 und GND
#define led2Pin 7   // LED an D7
#define debounce_delay 15 //Entprellzeit für den Taster in ms
  bool led_state, taster2State, taster2State_alt;// Variablendeklaration (global)
  uint8_t counter; //Zählt wie oft die Taste gedrückt wurde
void setup() {
  #ifdef DEBUG
  Serial.begin(115200);
  Serial.println("Setup");
  #endif
  pinMode(taste2Pin, INPUT_PULLUP);
  pinMode(led2Pin, OUTPUT);
 }

void loop() {

 static uint32_t debounce_time, start;
 if (millis()-debounce_time>debounce_delay)taster2State = digitalRead(taste2Pin); //einlesen des Tasters
 if(!taster2State) start=millis(); // wann wurde der Taster gedrückt
   
 if (taster2State != taster2State_alt) // bei Pegelwechsel 
    {
     debounce_time=millis();
     #ifdef DEBUG
               Serial.println(counter);
     #endif
     if(!taster2State)//wenn Taster gedrückt
       {
        counter++;
        led_state = !led_state;//Ausgang wechseln
        digitalWrite(led2Pin,led_state);}
        taster2State_alt = taster2State; // state aktualisieren
        }
}//Ende loop

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);
  }
}
//--------------

danke trotzdem an alle

deckenlampe.ino (1.53 KB)

Hi leute, leider ist nun doch ein problem aufgetreten und zwar hat sich um 4 uhr nachts einfach das licht eingeschalten.

weiß jemand woran das liegen kann? vielleicht irgendwelche fehler vom IR empfänger.

ich hänge mal noch das sketch an.vielleicht liegt ja da der fehler.
oder jemand hat noch verbesserungsvorschläge.

danke schon mal

p.s. die Deckenlampen laufen alle auf 12v bei mir. Der 230volt bereicht wird in KEINER weise angefasst!

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

//--------------

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
//  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();
}

//--------------

void loop() {
  if (Serial.available()){
    debugloop();
  }

  irabfrage();
  tasterabfrage();
  ausgang_schalten();
}

//--------------

void irabfrage(){
  //IR Abfragen
  if (irrecv.decode(&results)) {

    Serial.println(results.value, HEX);

    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;
      }
    irrecv.resume();
  }
}

//--------------

void tasterabfrage(){
  //Wandtaster abfragen
  if (digitalRead(wtaster1) == HIGH)
    if (lampe1 == 1)
    {
      lampe1 = 0;
      delay(500);
    }
    else
    {
      lampe1 = 1;
      delay(500);
    }

  if (digitalRead(wtaster2) == HIGH)
    if (lampe2 == 1)
    {
      lampe2 = 0;
      delay(500);
    }
    else
    {
      lampe2 = 1;
      delay(500);
    }
}

//--------------

void debugloop() {
  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(500);
}

//--------------

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);
}

//--------------

deckenlampe.ino (2.73 KB)

flexcon:
Hi leute, leider ist nun doch ein problem aufgetreten und zwar hat sich um 4 uhr nachts einfach das licht eingeschalten.

Wie groß sind deine Pulldown-Widerstände.

Evtl. kommen da Störungen rein. Mach die mal kleiner. Ruhig 1 kOhm.

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("------------------------------");
  }
}

danke schon mal

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.