Smart Home Automation Forum
[KC868-A16] Problem with PCF8574 I/O - Printable Version

+- Smart Home Automation Forum (https://www.kincony.com/forum)
+-- Forum: Technical Support (https://www.kincony.com/forum/forumdisplay.php?fid=1)
+--- Forum: KC868-A series and Uair Smart Controller (https://www.kincony.com/forum/forumdisplay.php?fid=6)
+--- Thread: [KC868-A16] Problem with PCF8574 I/O (/showthread.php?tid=3034)



[KC868-A16] Problem with PCF8574 I/O - alessiovietri - 07-04-2023

Hello, i'm tryng to read inputs from the PCF8574 channels. This is my code:

Code:
//Apple Homekit for KC868-E16S/KC868-E16T
//first time to use: use serial port send "W" to config wifi ssid and password
//if you want to eraser all data, re-config, use serial port send "E"
//default qrcode is 46637726

#include "HomeSpan.h"
#include "PCF8574.h"

PCF8574 pcfInLeft(0x22);

void pcfInit(){
 
  pcfInLeft.pinMode(P0, INPUT);
  pcfInLeft.pinMode(P1, INPUT);
  pcfInLeft.pinMode(P2, INPUT);
  pcfInLeft.pinMode(P3, INPUT);
  pcfInLeft.pinMode(P4, INPUT);
  pcfInLeft.pinMode(P5, INPUT);
  pcfInLeft.pinMode(P6, INPUT);
  pcfInLeft.pinMode(P7, INPUT);
 
  if (pcfInLeft.begin()) {
    Serial.println("pcf OK");
  }
  else{
    Serial.println("pcf ERROR");
  }

}

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

  delay(1000);

  pcfInit();     

} // end of setup()

//////////////////////////////////////

void loop(){

  uint8_t in0 = pcfInLeft.digitalRead(P0);
  Serial.println("in0");
  Serial.println(in0);
  uint8_t in1 = pcfInLeft.digitalRead(P1);
  Serial.println("in1");
  Serial.println(in1);
  uint8_t in2 = pcfInLeft.digitalRead(P2);
  Serial.println("in2");
  Serial.println(in2);
  uint8_t in3 = pcfInLeft.digitalRead(P3);
  Serial.println("in3");
  Serial.println(in3);
  uint8_t in4 = pcfInLeft.digitalRead(P4);
  Serial.println("in4");
  Serial.println(in4);
  uint8_t in5 = pcfInLeft.digitalRead(P5);
  Serial.println("in5");
  Serial.println(in5);
  uint8_t in6 = pcfInLeft.digitalRead(P6);
  Serial.println("in6");
  Serial.println(in6);
  uint8_t in7 = pcfInLeft.digitalRead(P7);
  Serial.println("in7");
  Serial.println(in7);

  delay(1000);
 
} // end of loop()

But the method  pcfInLeft.begin() always returns false and the inputs are always read as off. What's wrong?

Thanks in advance

I forgot to mention that the KCS software knows when the inputs go on, so it's not a wiring-related problem


RE: [KC868-A16] Problem with PCF8574 I/O - admin - 07-04-2023

you should install pcf8574 library firstly.
demo source code about INPUT and OUTPUT:
https://www.kincony.com/forum/showthread.php?tid=1620
https://www.kincony.com/forum/showthread.php?tid=1619


RE: [KC868-A16] Problem with PCF8574 I/O - alessiovietri - 07-04-2023

(07-04-2023, 01:14 PM)admin Wrote: you should install pcf8574 library firstly.
demo source code about INPUT and OUTPUT:
https://www.kincony.com/forum/showthread.php?tid=1620
https://www.kincony.com/forum/showthread.php?tid=1619


Thank you very much, i did it for both inputs and outputs:

Code:
#include "Arduino.h"
#include "PCF8574.h"

// Set i2c address
PCF8574 pcf8574_in_left(0x22, 4, 5);// 0x22 is address, IO4 is SDA   IO5 is SCL
PCF8574 pcf8574_in_right(0x21, 4, 5);// 0x22 is address, IO4 is SDA   IO5 is SCL
PCF8574 pcf8574_out_right(0x24, 4, 5);
PCF8574 pcf8574_out_left(0x25, 4, 5);

void setup()
{
    Serial.begin(115200);
   
    delay(1000);

    // INPUTS
    pcf8574_in_left.pinMode(P0, INPUT);
    pcf8574_in_left.pinMode(P1, INPUT);
    pcf8574_in_left.pinMode(P2, INPUT);
    pcf8574_in_left.pinMode(P3, INPUT);
    pcf8574_in_left.pinMode(P4, INPUT);
    pcf8574_in_left.pinMode(P5, INPUT);
    pcf8574_in_left.pinMode(P6, INPUT);
    pcf8574_in_left.pinMode(P7, INPUT);
   
    pcf8574_in_right.pinMode(P0, INPUT);
    pcf8574_in_right.pinMode(P1, INPUT);
    pcf8574_in_right.pinMode(P2, INPUT);
    pcf8574_in_right.pinMode(P3, INPUT);
    pcf8574_in_right.pinMode(P4, INPUT);
    pcf8574_in_right.pinMode(P5, INPUT);
    pcf8574_in_right.pinMode(P6, INPUT);
    pcf8574_in_right.pinMode(P7, INPUT);

    Serial.print("Init pcf8574_in_left...");
    if (pcf8574_in_left.begin()) {
        Serial.println("OK");
    }
    else {
        Serial.println("KO");
    }

    Serial.print("Init pcf8574_in_right...");
    if (pcf8574_in_right.begin()) {
        Serial.println("OK");
    }
    else {
        Serial.println("KO");
    }

    // OUTPUTS
    pcf8574_out_right.pinMode(P0, OUTPUT);
    pcf8574_out_right.pinMode(P1, OUTPUT);
    pcf8574_out_right.pinMode(P2, OUTPUT);
    pcf8574_out_right.pinMode(P3, OUTPUT);
    pcf8574_out_right.pinMode(P4, OUTPUT);
    pcf8574_out_right.pinMode(P5, OUTPUT);
    pcf8574_out_right.pinMode(P6, OUTPUT);
    pcf8574_out_right.pinMode(P7, OUTPUT);

    pcf8574_out_left.pinMode(P0, OUTPUT);
    pcf8574_out_left.pinMode(P1, OUTPUT);
    pcf8574_out_left.pinMode(P2, OUTPUT);
    pcf8574_out_left.pinMode(P3, OUTPUT);
    pcf8574_out_left.pinMode(P4, OUTPUT);
    pcf8574_out_left.pinMode(P5, OUTPUT);
    pcf8574_out_left.pinMode(P6, OUTPUT);
    pcf8574_out_left.pinMode(P7, OUTPUT);

    Serial.print("Init pcf8574_out_right...");
    if (pcf8574_out_right.begin()) {
        Serial.println("PCF8574_out_right_OK");
    }
    else{
        Serial.println("PCF8574_out_right_KO");
    }

    Serial.print("Init pcf8574_out_left...");
    if (pcf8574_out_left.begin()) {
        Serial.println("PCF8574_out_left_OK");
    }
    else{
        Serial.println("PCF8574_out_left_KO");
    }
}

void loop()
{
    /*
        for(int i=0;i<=7;i++)
        {
            pcf8574_out_right.digitalWrite(i, LOW);
            delay(500);
        }
        for(int j=0;j<=7;j++)
        {
            pcf8574_out_left.digitalWrite(j,LOW);
            delay(500);
        }
        for(int i=0;i<=7;i++)
        {
            pcf8574_out_right.digitalWrite(i, LOW);
            delay(500);
        }
        for(int j=0;j<=7;j++)
        {
            pcf8574_out_left.digitalWrite(j,LOW);
            delay(500);
        }
    */

    uint8_t valInLeft1 = pcf8574_in_left.digitalRead(P0);
    uint8_t valInLeft2 = pcf8574_in_left.digitalRead(P1);
    uint8_t valInLeft3 = pcf8574_in_left.digitalRead(P2);
    uint8_t valInLeft4 = pcf8574_in_left.digitalRead(P3);
    uint8_t valInLeft5 = pcf8574_in_left.digitalRead(P4);
    uint8_t valInLeft6 = pcf8574_in_left.digitalRead(P5);
    uint8_t valInLeft7 = pcf8574_in_left.digitalRead(P6);
    uint8_t valInLeft8 = pcf8574_in_left.digitalRead(P7);

    // Check input 1 left
    if (valInLeft1 == LOW) {
        Serial.println("INPUT 1 LEFT ACTIVATED");
        pcf8574_out_left.digitalWrite(P0, LOW);
    }
    else {
        pcf8574_out_left.digitalWrite(P0, HIGH);
    }

    // Check input 2 left
    if (valInLeft2 == LOW) {
        Serial.println("INPUT 2 LEFT ACTIVATED");
        pcf8574_out_left.digitalWrite(P1, LOW);
    }
    else {
        pcf8574_out_left.digitalWrite(P1, HIGH);
    }

    // Check input 3 left
    if (valInLeft3 == LOW) {
        Serial.println("INPUT 3 LEFT ACTIVATED");
        pcf8574_out_left.digitalWrite(P2, LOW);
    }
    else {
        pcf8574_out_left.digitalWrite(P2, HIGH);
    }

    // Check input 4 left
    if (valInLeft4 == LOW) {
        Serial.println("INPUT 4 LEFT ACTIVATED");
        pcf8574_out_left.digitalWrite(P3, LOW);
    }
    else {
        pcf8574_out_left.digitalWrite(P3, HIGH);
    }

    // Check input 5 left
    if (valInLeft5 == LOW) {
        Serial.println("INPUT 5 LEFT ACTIVATED");
        pcf8574_out_left.digitalWrite(P4, LOW);
    }
    else {
        pcf8574_out_left.digitalWrite(P4, HIGH);
    }

    // Check input 6 left
    if (valInLeft6 == LOW) {
        Serial.println("INPUT 6 LEFT ACTIVATED");
        pcf8574_out_left.digitalWrite(P5, LOW);
    }
    else {
        pcf8574_out_left.digitalWrite(P5, HIGH);
    }

    // Check input 7 left
    if (valInLeft7 == LOW) {
        Serial.println("INPUT 7 LEFT ACTIVATED");
        pcf8574_out_left.digitalWrite(P6, LOW);
    }
    else {
        pcf8574_out_left.digitalWrite(P6, HIGH);
    }

    // Check input 8 left
    if (valInLeft8 == LOW) {
        Serial.println("INPUT 8 LEFT ACTIVATED");
        pcf8574_out_left.digitalWrite(P7, LOW);
    }
    else {
        pcf8574_out_left.digitalWrite(P7, HIGH);
    }

    uint8_t valInRight1 = pcf8574_in_right.digitalRead(P0);
    uint8_t valInRight2 = pcf8574_in_right.digitalRead(P1);
    uint8_t valInRight3 = pcf8574_in_right.digitalRead(P2);
    uint8_t valInRight4 = pcf8574_in_right.digitalRead(P3);
    uint8_t valInRight5 = pcf8574_in_right.digitalRead(P4);
    uint8_t valInRight6 = pcf8574_in_right.digitalRead(P5);
    uint8_t valInRight7 = pcf8574_in_right.digitalRead(P6);
    uint8_t valInRight8 = pcf8574_in_right.digitalRead(P7);

    // Check input 1 right
    if (valInRight1 == LOW) {
        Serial.println("INPUT 1 RIGHT ACTIVATED");
        pcf8574_out_right.digitalWrite(P0, LOW);
    }
    else {
        pcf8574_out_right.digitalWrite(P0, HIGH);
    }

    // Check input 2 right
    if (valInRight2 == LOW) {
        Serial.println("INPUT 2 RIGHT ACTIVATED");
        pcf8574_out_right.digitalWrite(P1, LOW);
    }
    else {
        pcf8574_out_right.digitalWrite(P1, HIGH);
    }

    // Check input 3 right
    if (valInRight3 == LOW) {
        Serial.println("INPUT 3 RIGHT ACTIVATED");
        pcf8574_out_right.digitalWrite(P2, LOW);
    }
    else {
        pcf8574_out_right.digitalWrite(P2, HIGH);
    }

    // Check input 4 right
    if (valInRight4 == LOW) {
        Serial.println("INPUT 4 RIGHT ACTIVATED");
        pcf8574_out_right.digitalWrite(P3, LOW);
    }
    else {
        pcf8574_out_right.digitalWrite(P3, HIGH);
    }

    // Check input 5 right
    if (valInRight5 == LOW) {
        Serial.println("INPUT 5 RIGHT ACTIVATED");
        pcf8574_out_right.digitalWrite(P4, LOW);
    }
    else {
        pcf8574_out_right.digitalWrite(P4, HIGH);
    }

    // Check input 6 right
    if (valInRight6 == LOW) {
        Serial.println("INPUT 6 RIGHT ACTIVATED");
        pcf8574_out_right.digitalWrite(P5, LOW);
    }
    else {
        pcf8574_out_right.digitalWrite(P5, HIGH);
    }

    // Check input 7 right
    if (valInRight7 == LOW) {
        Serial.println("INPUT 7 RIGHT ACTIVATED");
        pcf8574_out_right.digitalWrite(P6, LOW);
    }
    else {
        pcf8574_out_right.digitalWrite(P6, HIGH);
    }

    // Check input 8 right
    if (valInRight8 == LOW) {
        Serial.println("INPUT 8 RIGHT ACTIVATED");
        pcf8574_out_right.digitalWrite(P7, LOW);
    }
    else {
        pcf8574_out_right.digitalWrite(P7, HIGH);
    }

    delay(1000);

}



RE: [KC868-A16] Problem with PCF8574 I/O - admin - 07-04-2023

ok, good.