I2C LED Beleuchten

Ok....merkwürdig.
Was passiert, wenn du die Zeile

"digitalWrite(LEDPin, LOW);"

auskommentierst ?

Tatsächlich leuchtet dann die LED so wie ich es möchte, aber nun bleibt die LED an nachdem ich den Taster betätigt habe und lässt sich nicht mehr ausschalten.

lucas95:
Tatsächlich leuchtet dann die LED so wie ich es möchte, aber nun bleibt die LED an nachdem ich den Taster betätigt habe und lässt sich nicht mehr ausschalten.

Hatte ich fast vermutet.
Dann arbeitet der PCF8575 anders als man vom Atmega das kennt.
Der schaltet in schneller Folge den Pin ein und aus.

Du musst den Zustand zwischenspeichern und diesen jeweils abfragen.
Oder nochmal in den Beispielen der Library schauen, ob es da einen Hinweis darauf gibt.

Ich benutze bisher nur den PCF8574, da gibt es dieses Problem nicht.

Hallo,

also noch mal

die 3 hellen LED´s hast Du direkt an 5V und 0V angeschlossen ? damit bekommen die was sie wollen je etwa 20mA und 5V

die 3 dunklen LED´s hast Du an den Ausgang pin 23 des Arduino angeschlossen und betreibst Ihn mit dem Sketch. ?

Wenn dem so solltest Du den Grund bereits wissen. Deine 3 LED´s wollen etwa 60mA haben , aus dem Pin kommen aber nur etwa 30mA raus. Damit gibt es wegen des Innenwiderstandes in dem Arduino einen unzulässig hohen Spannungsabfall im IC , was nebenbei den Pin auch killen kann. Damit hast Du am Ausgang dann keine 5 Volt mehr und die LED´s leuchten dunkler.
Du kannst nur eine von diesen LED an einem Pin betreiben. Du solltest Dir für Deine Grundlagenversuche ein Messgerät zulegen mit dem Du Strom und Spannung messen kannst.Um das hinzubekommen kannst Du einen MOSFET Transistor als Stromtreiber verwenden, dann sind auch 20 LED kein Problem.

Heinz

Nimm diese Variable

"int SchalterZustand;"

mal aus der Loop raus und setze sie global, also vor das Setup.

Hallo
@Dieter , das würde ja bedeuten das der Eingang ständig wechselt. Quasi es wird ein Wert aus der Lib übernommen der nicht dem Pegel des Eingangs ( Daten vom Bus ) entspricht. Sync Problem mit dem Bus ?? Externe Bus-Widerstände mal weg lassen ?

So kann man das Ding ja eigentlich nicht brauchen, hab im Moment keine Idee wie man das Signal des Eingangs speicher könnte. Mann müsste mal mit einer Flankenerkennung auf einen Zähler gehen um zu sehen was da passiert.

Heinz

Rentner:
Hallo,

also noch mal

die 3 hellen LED´s hast Du direkt an 5V und 0V angeschlossen ? damit bekommen die was sie wollen je etwa 20mA und 5V

die 3 dunklen LED´s hast Du an den Ausgang pin 23 des Arduino angeschlossen und betreibst Ihn mit dem Sketch. ?

Heinz, das hast du falsch verstanden.
Beide sind an jeweils einem Mega-Pin angeschlossen.
Der ein Pin wird über einen Taster vom Expander gesteuert, diese sind dunkel.
Der andere nur über den Mega-Pin und sind hell.

Rentner:
Hallo
@Dieter , das würde ja bedeuten das der Eingang ständig wechselt. Quasi es wird ein Wert aus der Lib übernommen der nicht dem Pegel des Eingangs ( Daten vom Bus ) entspricht. Sync Problem mit dem Bus ?? Externe Bus-Widerstände mal weg lassen ?

So kann man das Ding ja eigentlich nicht brauchen, hab im Moment keine Idee wie man das Signal des Eingangs speicher könnte. Mann müsste mal mit einer Flankenerkennung auf einen Zähler gehen um zu sehen was da passiert.

Heinz

Ja, sieht so aus.
Das Problem wird wohl die Variable sein, die ständig aktualisiert wird.

Ja, es ist das Problem mit der dem Taster über den PCF8575.
Im Seriellen Monitor schaltet der Taster beim konstanten betätigen immer von 0 auf 1 auf 0 usw.
Wenn ich ein Delay einbaue, dann leuchtet die LED auch mit vernünftiger Helligkeit über den Zeitraum des Delays.

Ich versuche mich gerade an einem Merker dafür. Denke das lässt sich vllt am ehesten über ein Delay realisieren, da der Taster logischerweise bei 0 steht, wenn er nicht betätigt wird und, wenn das für ein paar Millisekunden der Fall ist, bleibt die LED aus und anderenfalls geht sie an.

Was meint ihr?

Lies doch bitte alle der letzten Posts (#24), da ist sicher eine Lösung (ändern der Variablen) dabei.

Top danke!!! So einfach kanns sein :smiley:

Eine letzte Frage habe ich noch.

Und zwar versuche ich gerade folgendes:

#include "PCF8575.h"
#include "Arduino.h"

PCF8575 pcf8575_rot(0x20);

int LEDPin[2] = {22, 23};
int SchalterZustand[2];
char InputPin[2] = {'P0', 'P1'};

void setup() {
 
Serial.begin(9600);

pcf8575_rot.begin();

}

void loop() {

 for (int i = 0; i <= 2; i++)
 { 
  pinMode(LEDPin[i], OUTPUT);

  pcf8575_rot.pinMode(InputPin[i], INPUT);
   
  if(SchalterZustand[i])
     {
     digitalWrite(LEDPin[i], HIGH);
     }
  else
    {
    digitalWrite(LEDPin[i], LOW); 
    }
 }   
      
}

Allerdings ist im seriellen Monitor nun beim Drücken der beiden Taster keine 1 zu sehen.
Folglich spreche ich also die Buttons nicht an. Wisst ihr wie ich das implementieren kann wie auch bei den LEDs, weil da funkt es.

char ist vermutlich nicht die korrekte Methode oder übersehe ich etwas anderes?

Danke!

lucas95:
Allerdings ist im seriellen Monitor nun beim Drücken der beiden Taster keine 1 zu sehen.

Ich vermisse ein Serial.println() oder dergleichen.

Die Zeile hab ich entfernt, aber zur Kontrolle hab ich den Befehl genutzt. Und da letztendlich nur die Taster darauf Einfluss haben, frag ich mich nur, wo der Fehler im dargestellten Code liegt.

lucas95:
Die Zeile hab ich entfernt, aber zur Kontrolle hab ich den Befehl genutzt. Und da letztendlich nur die Taster darauf Einfluss haben, frag ich mich nur, wo der Fehler im dargestellten Code liegt.

Kannst du noch etwas besser beschreiben wie du das meinst.
Wenn du eine Zeile entfernst, kann es damit auch nicht mehr funktionieren.

Okay, also ich möchte in der Schleife die Ein- und Ausgänge deklarieren, welche ich zuvor als Globale Variabeln definiert habe über die Arrays. Bedeutet, wenn der Wert von i in der Schleife 1 annimmt, dann soll der erste Wert des Arrays InputPin als Eingang definiert werden und dasselbe für die Werte des Arrays LEDPin als Ausgang. Sprich mein erster Eingang ist der Pin P0 des I2C Moduls, wie auch im Programm zuvor, und der Pin 22 des Arduinos als Ausgang. Dann soll wie zuvor bei betätigen des Tasters die LED leuchten.

#include "PCF8575.h"
#include "Arduino.h"

PCF8575 pcf8575_rot(0x20);

int LEDPin[2] = {22, 23};
int SchalterZustand[2];
char InputPin[2] = {'P0', 'P1'};

void setup() {
 
Serial.begin(9600);

pcf8575_rot.begin();

}

void loop() {

 for (int i = 0; i <= 2; i++)
 { 
  pinMode(LEDPin[i], OUTPUT);
  
  pcf8575_rot.pinMode(InputPin[i], INPUT);

  SchalterZustand[i] = pcf8575_rot.digitalRead(InputPin[i]);
  
  Serial.println(SchalterZustand[i]);
  
  if(SchalterZustand[i] == 1)
     {
     digitalWrite(LEDPin[i], HIGH);
     }
  else
    {
    digitalWrite(LEDPin[i], LOW); 
    }
 }   
      
}

Hier der überarbeitete Code.

Kanns sein, dass es nicht funkt, weil ich die Variabeln InputPin als char deklariert habe und im folgenden über die Schleife einen Integer abrufe?

Hallo,

nur mal nebenbei

was macht der pinMode() im loop

du hast zwei Elemente
int SchalterZustand[2]

das gilt dann für den index 0 und 1

for schleife also
for (int i = 0; i <= 1; i++)

Heinz

#include "PCF8575.h"
#include "Arduino.h"

PCF8575 pcf8575_rot(0x20);

int LEDPin[2] = {22, 23};
int SchalterZustand[2];
char InputPin[2] = {'P0', 'P1'};

void setup() {
 
Serial.begin(9600);

for (int a = 0; a < 2; a++)
{
  pinMode(LEDPin[a], OUTPUT);
  
  pcf8575_rot.pinMode(InputPin[a], INPUT);
}

pcf8575_rot.begin();

}

void loop() {

 for (int i = 0; i < 2; i++)
 { 
  
  SchalterZustand[i] = pcf8575_rot.digitalRead(InputPin[i]);
  
  Serial.println(SchalterZustand[i]);
  
  if(SchalterZustand[i] == 1)
     {
     digitalWrite(LEDPin[i], HIGH);
     }
  else
    {
    digitalWrite(LEDPin[i], LOW); 
    }
 }   
      
}

Dann so.

lucas95:
Dann so.

Wenn es dann funktioniert, ist doch gut, oder ?

Tut es leider nicht. Der Code scheint die Werte Variable InputPin P0 und P1 nicht richtig einzulesen, sodass über die Taster nichts geschieht.