2 Taster abfragen und dabei einen Ausgang setzen

Hallo zusammen,

Ich komme einfach nicht weiter und zwar stehe ich vor folgenden Problem.
Ich habe zwei Taster am ARDUINO und einen Ausgang (LED).
Wird Taster 1 gedrückt so soll die LED angehen (Wenn Sie nicht bereits an ist)
Wird Taster 1 nochmals gedrückt so wird die LED wieder ausgeschaltet.(Wenn Sie noch an ist)
Gleiches für Taster 2.

Falls die LED an ist kann ich entweder über Taster 1oder 2 ausschalten.
Einfach gesagt ich habe zwei Bedienstellen und einen Ausgang der sowohl von Taster 1 oder Taster 2 geschalten wird.
Kann mir jemand helfen?
Danke schon mal.

Hallo,

worin genau liegt dein Problem?
Bist du dir nicht sicher beim Anschließen der LED und der Taster?
Oder hast du Probleme mit dem Sketch?

Ich habe das Problem mit dem mit dem Programmcode.

Powerhansii:
Ich habe das Problem mit dem mit dem Programmcode.

Und wie sieht dein bisheriger Sketch aus ?

Poste den bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Du kannst beide Taster am selben Eingangspin anschließen, dann ist es für deinen Sketch nur einer. :wink:

Ein paar Beispiele (Englisch):
https://www.arduino.cc/en/Tutorial/Switch

Zwei statt einem Taster dürfte nicht sooo schwierig sein (siehe auch Antwort #4) :wink:

Und noch ein paar Beispiele auf Deutsch:
http://fluuux.de/2012/11/der-push-button/
http://www.mathias-wilhelm.de/arduino/beispiele/taste-schaltet-led/
https://blog.silvertech.at/arduino-mit-2-taster-ledlampe-oder-relay-schalten/

(Ich mag Google) :slight_smile:

Hallo zusammen.
Erstmal vielen Dank für die vielen Infos.
Aber ich denke ich muss meine Situation etwas genauer erklären.

ich habe zwei Bediensteten mit 2 Arduinos. An jeder Bedienstete befindet sich ein Taster. Den Zustand der Taster (also ob einer gedrückt wird oder nicht schicke ich mit I2C hin und her)
Wird nun beim ersten Arduino der Tastendruck bemerkt so schaltet sich ein Relais ein, und sendet ein Signal zum zweiten.
Am zweiten Arduino soll dann eine LED brennen die Zeigt dass das Relais an ist.
Drücke ich nun am zweiten Arduino den Taster (wo die LED brennt), dann schaltet sich die LED aus und ich übermittle den Tastendruck zum ersten Arduino. Dann soll dieser das Relais wieder ausschalten.

Ich hoffe man kann hieraus erkennen worin mein Problem besteht.
Vielen Dank euch allen

Viele Grüße
Powerhansi

Ich hoffe man kann hieraus erkennen worin mein Problem besteht.

Nicht wirklich? Hast du ein Problem mit den Tastern oder der Datenübertragung? Das sind zwei völlig verschiedene Sachen

Für die LEDs musst du einfach den aktuellen Zustand abspeichern

I2C bidirektional ist nicht ganz trivial. Vom Master kannst du beliebig zum Slave zu senden. Aber die andere Richtung muss der Master abfragen was los ist. Oder du spendierst eine weitere Datenleitung die auf dem Master einen Interrupt auslöst

Warum zwei Arduinos und eine störanfällige I2C Verbindung?

Drei Adern, mehr braucht man nicht um eine LED und einen Taster mit dem "Relais-Arduino" zu verbinden.

Oder du willst in Zukunft mehr an beiden Arduinos anstellen, dann solltest du dies aber auch erklären. So macht der ganze Aufwand keinen Sinn.

Gruß

MiReu

Ich habe die beiden Arduinos im Multimaster-Mode betrieben. Alles soweit kein Problem funktioniert gut. Aber es geht mir nicht um die Übertragung der Daten sondern wie ich mit den zwei Tastern (angeordnet an verschiedenen Stellen) das gleiche Relais schalten kann (wie oben beschrieben).
Danke

Wie gesagt, den aktuellen Zustand abspeichern und wenn ein Taster gedrückt wurde je nach Zustand schalten.

Das kannst du auch erst mal mit nur einem Arduino ausprobieren

zwei Taster (angeordnet an verschiedenen Stellen)

Information über eine lange Leitung übertragen geht am allereinfachsten mit dem Tastersignal selbst.

Und ich verstehe nicht, wieso du eine triviale Tasterschaltung nebst Relais und Led nicht hinbekommst, obwohl du eine rel. komplexe I2C-Multimaster Schaltung zumlaufen bekommst.

Die Information kannst du doch per I2C übermitteln und auf der anderen Seite dann das Relais schalten.

Wo ist da dein Problem ?

Hallo,

ich habe zwei getrennte Bedienstellen, die nur über eine I2C Leitung miteinander verbunden sind.
Keine Ahnung wie ich meine I2C Schaltung zum Laufen gebracht habe aber sie geht jetzt.
Meine Vorgabe ist jedoch dass ich die Daten über I2C übermittle (nicht seriell und auch nicht mit Hardwarekontakten :slight_smile: )

nochmal kurz zur Funktion:
-Taster 1 schaltet eine LED an und sendet sein Signal über I2C an den Master-> der soll das Relais einschalten (sofern es nicht an ist)
-mit Taster 2 kann ich das Relais ausschalten . Der Ausschaltbefehl soll auch an die LED über I2C übermittelt werden.
-Alternativ kann ich das Relais auch mit dem Taster 1 ausschalten.

Ich würde gerne meinen Code posten dann ist vielleicht verständlicher worin mein Problem liegt.
Wie funktioniert das?

Danke

Jetzt sollte es verständlicher sein:

[Code der ersten Bedienstelle]
#include <Wire.h>
extern TwoWire Wire1;

int test1=0; 
int r1=0; 
int r2=0; 
int r3=0; 
int r4=0; 

int relais1=0;
int relais2=0; 
int relais3=0;
int relais4=0; 
int Relais1_zustand=0;
int state=0; 
int lastState=0; 
int Relaisstate=0; 



void receiveEvent(int howMany)
{
   r1 = Wire1.read();
   r2 = Wire1.read();
   r3 = Wire1.read();
   r4 = Wire1.read();

  state = digitalRead(Taster7);
 
  if (state != lastState) 
  {
    if (state == HIGH) 
    {
      if (Relais7 == HIGH) 
      {
        Relaisstate = LOW;
        Serial.println("LED AUS");
      }
      else 
      {
        Relaisstate = HIGH;
      }
    }
    lastState = state;
  }
  
  

  if((digitalRead(Relais7)==LOW)&&((r1==HIGH)||(Relaisstate==HIGH))){
    Relais1_zustand=1; 
    }
  if((digitalRead(Relais7)==HIGH)&&((r1==LOW)||(Relaisstate==HIGH))){
    Relais1_zustand=0; 
    }
    digitalWrite(Relais7,Relais1_zustand); 

   

  
}

  void requestEvent()
{

  Wire1.write(relais1); 
  Wire1.write(relais2);
  Wire1.write(relais3); 
  Wire1.write(relais4); 
}


void Kommunikation(int *relaisstatus) {
  relais1=relaisstatus[7];
  relais2=relaisstatus[8];
  relais3=relaisstatus[9];
  relais4=relaisstatus[10]; 
}
#include <OneButton.h>
#include <Wire.h>
//extern TwoWire Wire1;

const int PC_eins=3; 
const int PC_zwei=4; 
const int PC_drei=6; 
const int PC_vier=5; 

const int LED1=11;
const int LED2=10;
const int LED3=8; 
const int LED4=9;

const int SLAVE_ADDRESS = 8; //Slave arduino ID

int relais[5];

//Taster einlesen
OneButton button1(PC_eins, false); 
OneButton button2(PC_zwei, false); 
OneButton button3(PC_drei, false); 
OneButton button4(PC_vier, false); 

int LED1_alt=0; 
int taster1_alt=0; 
int zustand1=0; 
int taster2_alt=0;

void setup()
{
pinMode(PC_eins, INPUT); 
pinMode(PC_zwei, INPUT); 
pinMode(PC_drei, INPUT); 
pinMode(PC_vier, INPUT); 

pinMode(LED1, OUTPUT); 
pinMode(LED2, OUTPUT); 
pinMode(LED3, OUTPUT); 
pinMode(LED4, OUTPUT); 

Serial.begin(9600);

button1.attachClick(Taster1); 
button1.setClickTicks(10); 
button2.attachClick(Taster2); 
button2.setClickTicks(10); 
button3.attachClick(Taster3); 
button3.setClickTicks(10); 
button4.attachClick(Taster4); 
button4.setClickTicks(10);
Wire.begin(); 

}

void Taster1(){
LED1_alt=digitalRead(LED1);
zustand1=!digitalRead(LED1); 
digitalWrite(LED1,zustand1); 
}

void Taster2(){
int zustand2=!digitalRead(LED2); 
digitalWrite(LED2,zustand2); 
}
void Taster3(){
int zustand3=!digitalRead(LED3); 
digitalWrite(LED3,zustand3); 
}

void Taster4(){
int zustand4=!digitalRead(LED4); 
digitalWrite(LED4,zustand4); 
}

void loop(){
button1.tick(); 
button2.tick(); 
button3.tick(); 
button4.tick(); 
delay(5);

Wire.requestFrom(SLAVE_ADDRESS, 4);// request 3 bytes from slave device #8
int relais1 = Wire.read(); // receive a byte as character
int relais2 = Wire.read(); // receive a byte as character
int relais3 = Wire.read(); // receive a byte as character
int relais4 = Wire.read(); // receive a byte as character

Serial.println("*******************"); 
Serial.print("Relais 1 :"); 
Serial.println(relais1); 
Serial.print("Relais 2 :"); 
Serial.println(relais2); 
Serial.print("Relais 3 :"); 
Serial.println(relais3); 
Serial.print("Relais 4 :"); 
Serial.println(relais4); 
Serial.println("*******************"); 

// transmit just this variable to the slave
Wire.beginTransmission (8);
Wire.write (digitalRead(LED1));
Wire.write (digitalRead(LED2));
Wire.write (digitalRead(LED3)); //andere Nummern
Wire.write (digitalRead(LED4)); //andere Nummern
Wire.endTransmission ();

if((digitalRead(LED1)==LOW) && (relais1==HIGH)){ //Falls LED aus ist, und Taster über I2C (relais1=AN) kommt-> LED an; 
LED_zustand=1; //LED AN
}
delay(100); 

if((digitalRead(LED1)==HIGH) && (relais1==LOW)){ //Falls LED aus ist, und Taster über I2C (relais1=AUS) kommt-> LED an; 
LED_zustand=0; //LED AUS
}
delay(100); 

digitalWrite(LED1, LED_zustand);

}

Bitte setze deinen Sketch komplett in Code-Tags, dann ist er evtl. besser zu lesen.

Und leider fehlt die Dokumentation, sodass er fast nicht zu verstehen ist.
Also bitte auch Kommentare hinzufügen.

Wie weit sind denn die beiden Stellen auseinander? I2C ist eine Verbindung für kleine Entfernungen. Taster kann man bei geeigneter Dimensionierung (20mA Stromschleife) viel weiter weg installieren und das Ganze an 1 Arduino.

Du brauchst dafür keine 2 Arduinos.

Entweder Du verschweigst uns weitere Funktionalitäten oder Du hast das Grundprinzip nicht verstanden.

Gruß Tommy