Hallo ich habe bereits mit PCF8574 I2C gearbeitet und konnte damit Button Matrix betreiben.
Dabei habe ich 4 Pins als Output Verwendet und 4 Pins davon als Input.
Nun benötige im neuem Projekt 3x PCF8575-Chips die je 16 Pins haben. Ich kann die auch alle drei entsprechend ansteuern um LED zu schalten.
Nun stehen mir an einem der Chips 8 Pins zur verfügung um eine Button Matrix an zuklemmen.
Nun mein Problem ist ich kann Pins als Output verwenden und Wenn ich Pins als INPUT verwende, dann erhalte ich auch ein Signal bei pcf85753.digitalRead(6) ABER nur wenn ich diesen Pin (INPUT) direkt mit 5V verbinde.
Aber wenn ich jedoch diesen Pin (INPUT) mit dem zweiten Pin denn ich als OUTPUT gesetzt habe und nachgemessen auch 5V ausgibt, kann ich dieses Signal nicht mit pcf85753.digitalRead(6) einlesen.
Ich habe mal ein Code dafür erstellt das eben har genau dieses Szenario abdeckt.
PIN 6 wird mit 5V verbunden => IF-Bedinung ist erfühlt.
PIN 6 wird mit PIN 7 verbunden => IF-Bedinung ist NICHT erfühlt. wieso?
Verkabelung:
an den PCF8575 Chip sind 5V, GND, SLC, SDA Kabel angeschloßen.
=> da ich Pins schalten kann, gehe ich davon aus das die Verdrahtung und Kommunikation in Ordnung ist.
Habe ich was übersehen? Oder mein Code ist falsch?
Muss ggf. PIN 6 vorher mit einem Widerstand ans GND oder Ähnliches was ich nicht gemacht habe?
Bitte hilf mir mal auf die Sprünge.
wenn du die folgende Zeile meinst die im Grunde bei Imput unlogisch ist, dies hatte ich mal irgend wo mal gelesen dass man auch bei Imput auf HIGH setzen soll. habe auch ohne probiert.
pcf85753.digitalWrite(6, HIGH);
Oder meinst du eher was anderes auf das ich nicht komme?
Weil der pcf85753.digitalRead(6) wird nicht auf HIGH oder 1 gesetzt, so dass die if Abfrage dabei unwahr belebt wenn ich PIN 7 mit Pin 6 verbinde.
Also das setup ist dazu da, um einmalig irgendwas bei Programmstart zu machen.
Unter anderem eben auch zu definieren, was der PIN machen soll.
Das machst Du.
Und machst das in jedem Umlauf von loop erneut.
Das war mein Hinweis auf Zeile 1.
Das kann man machen, es ist nur unsinnig.
Du definierts Pin6 (Warum gibst Du denen eigentlich keinen VariablenNamen) jedesmal als INPUT und schreibst dann auch noch ein HIGH da rein.
Was soll denn da passieren?
Und wenn Du schon dabei bist, zu erklären, was Du erwartest,
was machst Du hier:
if(pcf85753.digitalRead(6) == HIGH || pcf85753.digitalRead(6) == 1) {
Das vor dem ODER ist das Gleiche wie hinter dem ODER.
Wozu das ODER???
Zur Fehleranalyse, schmeiss alles raus aus loop() und lese den PIN6 ein.
Ist der PIN HIGH, dann schreib auf PIN7 (Gib dem nen Namen) ein LOW und wenn der PIN6 LOW ist, schreib ein HIGH auf PIN7.
Mach Dir die Seriellen Ausgaben so, das Du jeweils die Zustände or und nachher siehst.
Da Du erstmal nur einen Pin schaltest, also immer vor dem schalten ssehen, wie er steht.
Beim nächsten Umlauf muss er sich geändert haben und das Spiel beginnt von vorn.
Und weil das zu schnell für den SerMon ist, ist ein delay() zum Test legitim.
Ich habe den code extra so simpel wie möglich erstellt ohne Variablen Name nur zum testen.
Im Grunde muss PIN 7 als Ausgang dienen und mit PIN 6 soll als Eingang dienen.
D.h. wenn PIN 7 HIGH ist soll dann auch pcf85753.digitalRead(6) = HIGH sein, weil die beiden PINS sind zusammen verdrahtet. Dies passiert jedoch nicht, das ist mein Problem.
Ich weiß das dieser Aufbau mit zwei Pins unsinnig ist, jedoch wenn man Button-Matrix einsetzt und weitere Pins dafür einsetzt, dann macht es sinn.
Ich muss PIN 7 steuern können einmal mit HIGH und einmal mit LOW belegen können. Das klappt. Nur der PIN 6 Input klappt nicht.
Daher dachte ich ob jemand damit Erfahrung hatte und mir einen Tipp geben könnte.
Der SX1509 kann aber auch noch weit mehr als eine Matrix, da wäre z.B. LED blinken, pulsen, PWM ... einmal einen Befehl über I2C senden und der IC kümmert sich um den Rest.
Mit einem PCF8574 (oder auch MCP23xxx) musst du das alles den Arduino schicken lassen.
ich habe sofort beide Libs mir angeschaut und konnte feststellen dass dein Code für den PCF8574 so wie leicht abgeändert auch für PCF8575 funktioniert.
Das ist abgeänderter Code für PCF8575
#include "PCF8575.h"
PCF8575 PCF_01(0x20);
void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.print("PCF8574_LIB_VERSION:\t");
Serial.println(PCF8575_LIB_VERSION);
PCF_01.begin();
int x = PCF_01.read16();
Serial.print("Read ");
Serial.println(x, HEX);
}
void loop()
{
delay(1000);
PCF_01.toggle(0);
int x = PCF_01.read16();
Serial.print("Read ");
Serial.println(x, BIN);
}
Der Pin 0 (PCF_01.toggle(0); ) wird im Sekunden Tackt ein und ausgeschaltet, die anderen Pins jedoch alle auf HIGH.
Ich brächte jetzt etwas Hilfe, wie kann ich mit dieser LIB einen Pin zum lesen bewegen?
z.B: Soll PIN 7 mit PIN6 verbunden werden.
PIN 7 Soll auf lesen eingestellt werden.
PIN 6 soll auf Senden eingestellt werden.
Sobald PIN 6 auf HIGH steht sollte dann auch PIN 7 ausgelesen werden als HIGH.
OK ich glaube ich kann mir meine Frage nun selbst beantworten.
Es geht wohl mit diesem Code.
//PCF_01.toggle(6);
PCF_01.write(6,LOW);
int x = PCF_01.readButton(7);
Wobei wenn PIN 7 nicht mit PIN 6 verbunden ist, gibt dann die function readButton(7) eine 1 aus. Nur wenn jedoch ich die beiden Pins Verbinde und PIN 6 auf LOW setze, so reagiert auch PIN 7 und gibt dann auch 0 bzw. LOW aus. Ist eben etwas umgedreht aber es funktioniert und dass reicht mir völlig.
Ich möchte allen Danken die mir hier geholfen haben.