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