Anfängerfragen

Guten Morgen zusammen,

recht neu auf dem Gebiet und ein paar Fragen.
Ich habe schon etwas länger den ein oder anderen Arduino zu Hause.

Momentan benutze ich welche in Verbindung mit dem PI und FHEM zur Steuerung von Steckdosen, Licht usw.

Jetzt wollte ich mich mal an etwas neue probieren.

Ich würde gern das Signal von drei LED´s auf drei Eingänge des Arduinos legen und den Zustand abfragen.

z.B. an D1, D2 und D3 sind die Eingänge. Die Eingänge nehmen nach und nach den Zustand High an.
Den Zustand des Eingangs liest man ja mit digitalRead aus.

Nach einer gewissen Zeit, sind alle drei Eingänge HIGH und dann wechselt der Zustand auf LOW (LED´s blinken)

Wenn dieser Zustand eintritt soll ein Ausgang gesetzt werden. D0 z.B.

Ich möchte das natürlich gerne selbst programmieren.... was mir allerdings fehlt ist der Weg dahin.

Wie würdet ihr das machen?

VIelen Dank und viele Grüße

Michael

Beim UNO sind D0 und D1 für USB reserviert, eignen sich daher nicht.

Was Du vorhast, verstehe ich nicht wirklich, aber möglicherweise ja sowas:

digitalWrite(ausgang, !digitalRead(eingang1) && !digitalRead(eingang2) && !digitalRead(eingang3));

Erklärungen findest Du in der Referenz (IDE Hilfe/Referenz) und in den Beispielen der IDE.

Sind die LEDs an einem anderen Gerät?

ja die LED´s sind an einem anderen Gerät und ich will nur die elektrischen Signale der LED´s auf die Eingänge am Arduino. Welches Potential dabei geschaltet wird weiß ich noch nicht.

Beim UNO sind D0 und D1 für USB reserviert, eignen sich daher nicht.

war ja auch nur als Beispiel angedacht :slight_smile:

Was Du vorhast, verstehe ich nicht wirklich,....

Ich möchte gerne den Zustand eines anderen Gerätes abfragen. Je nach Zustand leuchtet eine LED oder zwei oder drei oder alle drei blinken.

Mich interessiert erstmal nur das Blinken der LED´s und das dann ein Ausgang gesetzt wird wenn der Zustand erreicht ist.

Grüße

littleswabi:
ja die LED´s sind an einem anderen Gerät und ich will nur die elektrischen Signale der LED´s auf die Eingänge am Arduino. Welches Potential dabei geschaltet wird weiß ich noch nicht.
....
Ich möchte gerne den Zustand eines anderen Gerätes abfragen. Je nach Zustand leuchtet eine LED oder zwei oder drei oder alle drei blinken.

Mich interessiert erstmal nur das Blinken der LED´s und das dann ein Ausgang gesetzt wird wenn der Zustand erreicht ist.

Dann solltest du zuvor messen, welche Spannung da anliegt.
Auch ist wichtig, ob das externe Gerät mit einem Trafo oder Netzteil betrieben wird.
Ohne eine Netztrennung können auch 230 Volt an der Led anliegen.

Und wenn möglich mit einem Optokoppler die Spannung abfragen.
Auch könntest du die Led optisch "abfragen".

okay mal davon abgesehen, welche SPannung da anliegt.

DIe LED´s optisch abzufragen hatte ich auch schon überlegt gefällt mir aber nicht da es dann außerhalb befestigt werden müsste.

Optokoppler habe ich mir schon besorgt. ELektisch habe ich eher das kleinere Problem :slight_smile:

littleswabi:
Optokoppler habe ich mir schon besorgt. ELektisch habe ich eher das kleinere Problem :slight_smile:

Na dann ist ja gut.

Also Spannung messen.

Durchaus möglich, dass die an der Led anliegende Spannung nicht reicht, um einen Optokoppler zu steuern.
Dann musst du dir die Schaltung des externen Gerätes ansehen.

okay... das hätten wir nun geklärt :slight_smile:

als erstes muss ich ja mal die Eingänge definieren...

int inPin1 = D5;
int inPin2 = D6;
int inPin3 = D7;
int outPin1= D8;
int valinPin1 = 0;
int valinPin2 = 0;
int valinPin3 = 0;

dann muss ich den Zustand der LED´s irgendwie speichern. Keine Ahnung ob ich das so machen kann mit int valinPin :slight_smile:

die Zustände müssen miteinander verglichen werden.

mit if vielleicht?

Wenn du an die LED direkt gehst muss man mal schauen ob auch der Vorwiderstand der LEDs ausreicht um die Koppler LEDs auch noch zu treiben.
Es kann auch passieren nach anpassen der Wiederstände das dann der "größte" teil des Stromes über die Koppler LED oder die Visu LED fließt da es zwei unterschiedliche Vorwärtspannungen gibt an den LEDs.
Nur ein paar kleine Ideen/Tips.
Grundsätzlich ist das die Beste Vorgehensweise da man keine Potentiale koppelt.
Gruß
DerDani

Abfragen der der Zustände mit.
digitalRead(PIN)
Zustände abfragen bzw zuweisen mit
IF
ELSE IF
ELSE
je nachdem was du brauchst in der Refrence sind die IF-Abragen schön dokumentiert.
Mehrere Abfragen verknüpfen mit && (und) || (oder).
Gruß
DerDani

Hallo,

Ich habe das berühmte Blink Sketch etwas abgeändert und kommentiert. So solltest Du verstehen wie man Pins anspricht und die Werte speichert, wie man Werte Vergleicht überlasse ich aber Dir. :wink:

int led = 13;
int ledIN = 7; 
bool ledInStat;  // Die Variable ledStat hat die Aufgabe den Status der LED zu speichern. Der Variabletyp bool kann nur 0 oder 1 sein. Also true/false, richtig/falsch, ein/aus

void setup() {  // Setup läuft einmal beim start
  Serial.begin(9600);  // Serielle Verbindung starten
  pinMode(led, OUTPUT);  // Hier wird der Arduino Pin (led=13) als Ausgang definiert.
  pinMode(ledIN, INPUT);  // Hier wird der Pin 7 als Eingang definiert.
}

void loop() { // the loop routine runs over and over again forever:
  digitalWrite(led, HIGH);   // setzt den den led Pin auf HIGH
  delay(500);               // eine halbe Sekunde warten.
  digitalWrite(led, LOW);    // setzt den led Pin auf LOW.
  delay(500);               // wieder eine halbe Sekunde warten.

  ledInStat = digitalRead(ledIN);  // ließt den aktuellen Wert des Pin (ledIN=7)
  Serial.print("Digital IN: ");
  Serial.println(ledInStat);  // gibt den Wert über den Seriellen Monitor aus
}

lg dony

littleswabi:
okay... das hätten wir nun geklärt :slight_smile:

Ich hoffe das. :wink:

als erstes muss ich ja mal die Eingänge definieren...

Sieh dir dazu einfach mal die Beispiele in der IDE an.

Da ist alles recht umfangreich (02.Digital) beschrieben.

Vielen Dank erstmal für die Antworten. Das beschäftigt mich erstmal ein paar Tage :o

int inPin1 = D5; 			// Eingang LED1
int inPin2 = D6; 			// Eingang LED2
int inPin3 = D7; 			// Eingang LED3
int outPin = D8;			// Ausgang --> übergabe an FHEM
bool inPin1Stat;			// speichert den Status des Eingangs
bool inPin2Stat;			// speichert den Status des Eingangs
bool inPin3Stat;			// speichert den Status des Eingangs
bool allonStat;
bool blinking;

void setup (){
	pinMode(inPin1,INPUT)
	pinMode(inPin2,INPUT)
	pinMode(inPin3, INPUT)
	pinMode(outPin,OUTPUT)
	Serial.begin(9600) ; 	// open serial port
}

void loop() {
	
	inPin1Stat = digitalRead(inPin1); 	
	inPin2Stat = digitalRead(inPin2);
	inPin3Stat = digitalRead(inPin3);
	
	
	Serial.print("Digital INPUT: ");
	Serial.print(inPin1Stat);				// gibt den aktuellen Wert des Eingangs wieder
	Serial.print(inPin2Stat);				// gibt den aktuellen Wert des Eingangs wieder
	Serial.print(inPin3Stat);				// gibt den aktuellen Wert des Eingangs wieder
	
	if (inPin1Stat == HIGH && inPin2Stat == HIGH && inPin3Stat == HIGH)
		allonStat = true;
	
	if (inPin1Stat == LOW && inPin2Stat == LOW && inPin3Stat == LOW && allonStat == true)
		blinking = true;
	
	if (blinking = true) digitalWrite(outPin, HIGH)
	
    if (inPin1Stat == LOW && inPin2Stat == LOW && inPin3Stat == LOW && blinking == true)
		second(500)
	
	delay(1000)
}

hier mal ein erster Versuch. Konnte es leider noch nicht testen :slight_smile:

if (inPin1Stat == HIGH && inPin2Stat == HIGH && inPin3Stat == HIGH)
		allonStat = true;
	
if (inPin1Stat == LOW && inPin2Stat == LOW && inPin3Stat == LOW && allonStat == true)
		blinking = true;

Ich fürchte, blinking wird nie true, da dies ein logischer Widerspruch ist: Alle Eingänge können nicht gleichzeitig HIGH und LOW sein.

littleswabi:
Wenn dieser Zustand eintritt ...

Ich habe den Eindruck, Du möchtest nicht den statischen Zustand, sondern die Änderung erkennen können. Dann brauchst Du sowas wie if(alterZustand != neuerZustand) oder if(!alterZustand && neuerZustand) oder sowas. Könnte das sein?

Ich habe den Eindruck, Du möchtest nicht den statischen Zustand, sondern die Änderung erkennen können.

Ich habe den Eindruck, dafür verwendet er allonStat.

Wenn alle drei inPinxStat einmal gleichzeitig HIGH waren, wird allonStat scharf geschaltet.
wenn danach alle 3 wieder LOW sind und allonStat immer noch true, wird blinking=true gesetzt.

Allerdings wird allonStat nie wieder false, das gepostete ist nicht ganz komplett, und die ursprüngliche Aufgabenstellung habe ich auch nicht verstanden...

if (inPin1Stat == HIGH && inPin2Stat == HIGH && inPin3Stat == HIGH)
		allonStat = true;

Wenn alle Eingänge HIGH sind soll allonStat true werden.

Nachdem alle Eingänge HIGH sind fangen die LEDS am externen Gerät an zu blinken. Da mich das blinken so nicht interessiert sondern nur der nachfolgende Zustand nach HIGH alle LED´s LOW hab ich mir gedacht das ich das so mache.

Wenn alle Eingänge LOW sind und allonStat = true dann "blinken" die LED´s. Ist vielleicht etwas blöd ausgedrückt

if (inPin1Stat == LOW && inPin2Stat == LOW && inPin3Stat == LOW && allonStat == true)
		blinking = true;

Hallo,

Jetzt wurde bereits viel gesagt aber ich habe den Code zumindest kompilierfähig und möchte ihn deshalb nicht Geheim halten.

//int inPin1 = D5;       // Nicht so
int inPin1 = 5;       // Eingang LED1
int inPin2 = 6;      // Eingang LED2
int inPin3 = 7;      // Eingang LED3
int outPin = 8;      // Ausgang --> übergabe an FHEM
bool inPin1Stat;      // speichert den Status des Eingangs
bool inPin2Stat;      // speichert den Status des Eingangs
bool inPin3Stat;      // speichert den Status des Eingangs
bool allonStat;
bool blinking;

void setup (){
  pinMode(inPin1,INPUT);
  pinMode(inPin2,INPUT);
  pinMode(inPin3, INPUT);
  pinMode(outPin,OUTPUT);
  Serial.begin(9600);  // open serial port
}

void loop() {
  
  inPin1Stat = digitalRead(inPin1);   
  inPin2Stat = digitalRead(inPin2);
  inPin3Stat = digitalRead(inPin3);
  
  
  Serial.print("Digital INPUT: ");
  Serial.print(inPin1Stat);       // gibt den aktuellen Wert des Eingangs wieder
  Serial.print(inPin2Stat);       // gibt den aktuellen Wert des Eingangs wieder
  Serial.print(inPin3Stat);       // gibt den aktuellen Wert des Eingangs wieder
  
  if (inPin1Stat && inPin2Stat && inPin3Stat)
    allonStat = true; 
  
  if (!inPin1Stat && !inPin2Stat && !inPin3Stat && allonStat)
    blinking = true;
  
  if (blinking) digitalWrite(outPin, HIGH); 
  
  if (!inPin1Stat && !inPin2Stat && !inPin3Stat && blinking) delay(500); 
  
  delay(1000);
}

Einige fehlende Semikolon ( ; ) die am Ende jedes Befehl stehen müssen.

Das hier kannst du kürzen:

if (inPin1Stat == LOW && inPin2Stat == LOW && inPin3Stat == LOW && allonStat == true)

anstelle von:

if (!inPin1Stat && !inPin2Stat && !inPin3Stat && allonStat)

Ziemlich am Ende steht noch ein second(), das habe ich in ein delay() geändert.

lg dony

ich probiere das heute Abend gleich mal aus :slight_smile:

Vielen Dank schon mal für die tolle Unterstützung!!!!

Michael

Hi

Wenn Du's noch schöner machen willst, kannst Du die Pin-Zuweisungen als const byte machen.
const = Konstant, kann der Compiler irgendwo vergraben.
byte 0...255 (ohne Vorzeichen), sollte für die Pin-Nummer ausreichend sein, braucht ein Byte Platz, im Gegensatz zu int, was beim Arduino zwei Byte benötigt und ein Vorzeichen beinhaltet - theoretisch könntest Du also auch die Pin-Nummer -32767 angeben. Sofern Du mit 256 (0...255) Pinnen am µC auskommst, ist byte hier Dein Freund.

Wenn das Blinken auch wieder 'normal werden kann', müsstest Du Dein Programm noch darauf trimmen, auch diese Änderung erfassen zu können und z.B. allonStat wieder auf false setzen.
Wenn Das nicht benötigt wird, wird der Arduino spätestens mit dem nächsten Reset wieder scharf geschaltet.

MfG

michael_x:
Ich habe den Eindruck, dafür verwendet er allonStat.

Ja, dieser Eindruck setzt sich auch bei mir langsam durch :-[