Home › Forums › The libraries hosted on the site › PCF8574 i2c digital I/O expander › Cannot set SDA CLK on ESP8266
- This topic has 6 replies, 2 voices, and was last updated 2 years, 10 months ago by
Renzo Mischianti.
-
AuthorPosts
-
-
28 July 2022 at 12:07 #22065
Hello,
been busy with this library, thank you for that, but I have a problem getting the PCF to work on a non-standard SDA and CLK pin definition on an ESP8266.
First: what is working:
I’m using a ESP8266 which has standard defined data and clock pins.
When connecting my PCF to these pins everything is ok: I2C scanner finds an I2C device on 0x20 and a simple read_button progrmam with this lib does work as well.
Now the problem:
Because of some other hardware connected to the ESP I need to physically change the data line so now I use this in my code:#define SDA 4 // D2=GPIO4
#define SCL 0 // D3=GPIO0// Set i2c address
PCF8574 pcf8574(0x20, SCL, SDA);This all compiles without error but the simple test_button program does not respond.
Also, checking if the PCF did start by using this little code gives a KO:
if (pcf8574.begin()){
Serial.println(“OK”);
}else{
Serial.println(“KO”);
}
so the PCF is not being found and it gives an error.When using the I2C scanner and passing the SCL and SDA lines in the wire command (Wire.begin(SDA,CLK);) the program does see the PCF without error which tells me the wire definition is ok and the PCF being found (of course also on 0x@0).
So…how can I get the pcf library to use these new SCL and SDA lines?
(Just as a bind going test I changed PCF8574 pcf8574(0x20, SCL, SDA); into PCF8574 pcf8574(0x20, SDA, SCL); because the definition with Wire is also (SDA,SCL) but then the compiler returns an error….
Thank you for your response and your work on the library!
-
28 July 2022 at 12:37 #22069
Hi Joppnl,
other people tell me about that problem, for now, seems that aWire.begin();
at the beginning of the setup function fix the problem.
But I must investigate.Bye Renzo
-
28 July 2022 at 13:20 #22070
Hello Renzo,
thank you for your (quick) reply and support.
Tested it but:
Wire.begin(); is not working, neither a Wire.begin(SDA,SCL); , also not working (with the values SDA and SCL being correct (as tested with the I2Cscanner).PS: “normally” taking care of the I2C bus is manually programed by calling the Wire.h and the Wire.being() functions.
If I see your standard examples it is not necessary to do so with your lib however, that might be confusing as there (in my case) are more I2C devices connected.
Therefore: may_be it’s better to have the I2C config done like in other libs: manually in the program and not by the library as it can be confusing and conflicting with other I2C connected devices…..
Thanks!
Thanks for your help,
-
28 July 2022 at 14:09 #22078
Hi Joppnl,
I tested the connection with this sketch#include "Arduino.h" #include "PCF8574.h" #define SDA D2 // D2=GPIO4 #define SCL D3 // D3=GPIO0 // Set i2c address PCF8574 pcf8574(0x38, SDA, SCL); void setup() { Serial.begin(115200); // Set pinMode to OUTPUT pcf8574.pinMode(P0, INPUT); pcf8574.pinMode(P1, INPUT_PULLUP); pcf8574.pinMode(P5, OUTPUT); pcf8574.pinMode(P6, OUTPUT, LOW); pcf8574.pinMode(P7, OUTPUT); pcf8574.begin(); } bool startVal = HIGH; void loop() { // pcf8574.digitalWrite(P0, HIGH); // delay(1000); // pcf8574.digitalWrite(P0, LOW); byte val = pcf8574.digitalRead(P0); Serial.print("PIN 0: "); Serial.println(val); val = pcf8574.digitalRead(P1); Serial.print("PIN 1: "); Serial.println(val); pcf8574.digitalWrite(P7, startVal); if (startVal==HIGH) { startVal = LOW; }else{ startVal = HIGH; } delay(3000); }
It works correctly without any change.
I think there is an issue with your code. Try to change the define like so:
#define SDA D2 // D2=GPIO4 #define SCL D3 // D3=GPIO0
Bye Renzo
Attachments:
You must be logged in to view attached files. -
28 July 2022 at 15:34 #22082
Hello Renzo,
big Thanks:
your sketch is working with me (would be strange if it wouldnt…) and also my little test sketch is working as well.Confusing thing is that everywhere with programming the 8266 you can not use the D.. numbering but must use the GPIO numbers (where with other procressors like Uno etc you can use the D numbering).
However with your lib you can or ..must use the D numbering which is more convenient but different from the othe programming.
But now we know….we can use it and it’s working great,
Thank you for your support!
-
28 July 2022 at 15:53 #22083
I’ll fix It in the future release, for memory optimization I use uint8_t but the Wire library use int and this generates the issue.
Bye Renzo -
28 July 2022 at 20:42 #22085
Wait for version 2.3.3, the problem is fixed.
Thanks for the help to fix It Renzo
-
-
AuthorPosts
- You must be logged in to reply to this topic.