PCF8574

home
Posts: 47
Joined: Mon Dec 28, 2020 12:36 pm

Post

lukosław wrote: Sat Feb 13, 2021 11:18 am Przy pomocy wskazówek @klew i kawałka kodu @elmaya dotyczącego innego expandera (EDIT: właśnie wspominanego MCP23017, który znalazłem na forum), udało mi się przygotować prosty skrypt ilustrujący przykład użycia wemosa z ekspanderem PCF8574.

Wrzucam tutaj, może się komuś przyda i zaoszczędzi trochę czasu, bo wątek wydaje się najwłaściwszy.

Mój układ to:
- wemos D1 mini
- układ 4 przekaźników (sterowane stanem niskim)
- 4 przyciski dotykowe TTP223 (podają stan wysoki po dotknięciu)
- moduł ekspandera PCF8574 (czerwony z dip switchem) ustawiony standardowo na adres 0x20

Wykorzystane są wszystkie 8 pinów ekspandera, 0-3 jako wyjścia dla przekaźników i 4-7 jako wejścia dla przycisków. W wemosie wykorzystane są tylko piny D1 i D2 do połączenia z ekspanderem (SCL i SDA).

Przy okazji uwaga. Dużo kłopotu sprawiło mi użycie złej biblioteki do obsługi PCF8574. Nie polecam używać TEJ biblioteki, natomiast TA zadziałała od razu.

Code: Select all

#include <PCF8574.h>

#include <SuplaDevice.h>
#include <supla/control/button.h>
#include <supla/control/relay.h>
#include <supla/io.h>
#include <supla/network/esp_wifi.h>

Supla::ESPWifi wifi("wifi_ssid", "wifi_pass");

PCF8574 pcf8574(0x20);

class MyPCF8574 : public Supla::Io {
  public:
    void customDigitalWrite(int channelNumber, uint8_t pin, uint8_t val) {
      if ((pin >= 100) && (pin <= 107)) {
        pcf8574.write(pin - 100, val);
        return;
      }
      if (pin <= 99) {
        return ::digitalWrite(pin, val);
      }
    }

    int customDigitalRead(int channelNumber, uint8_t pin) {
      if ((pin >= 100) && (pin <= 107)) {
        return pcf8574.read(pin - 100);
      }
      if (pin <= 99) {
        return ::digitalRead(pin);
      }
    }
} MyPCF8574;

Supla::Control::Button button1(104, false, false);
Supla::Control::Button button2(105, false, false);
Supla::Control::Button button3(106, false, false);
Supla::Control::Button button4(107, false, false);

Supla::Control::Relay relay1(100, false);
Supla::Control::Relay relay2(101, false);
Supla::Control::Relay relay3(102, false);
Supla::Control::Relay relay4(103, false);

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

  pcf8574.begin();

  char GUID[SUPLA_GUID_SIZE] = {your_guid};
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {your_authkey};

  button1.addAction(Supla::TOGGLE, relay1, Supla::ON_RELEASE);
  button2.addAction(Supla::TOGGLE, relay2, Supla::ON_RELEASE);
  button3.addAction(Supla::TOGGLE, relay3, Supla::ON_RELEASE);
  button4.addAction(Supla::TOGGLE, relay4, Supla::ON_RELEASE);

  SuplaDevice.setName("device_name");
  SuplaDevice.begin(GUID, "svr_address", "email_address", AUTHKEY);
}

void loop() {
  SuplaDevice.iterate();
}


jak można za pomocą tego kodu uruchomić sprawdzić pcf8574 na esp8266-01s?
co gdzie pozmieniać? domyślam się ze cyfry od 100 do 107 to nr pin a w esp01s są cztery 1,2,3,4.
dzięki za pomoć.
Une enquГЄte terminГ©e sans affecter la qualitГ© de vie propriГ©tГ©s musculaires cardiaques, pulmonaires et sanguines..
sylwester11
Posts: 1
Joined: Tue Mar 08, 2022 9:33 am

Post

Witam
proszę o pomoc wyskakuje min taki błąd
'class PCF8574' has no member named 'write'
home
Posts: 47
Joined: Mon Dec 28, 2020 12:36 pm

Post

home wrote: Fri Mar 04, 2022 7:01 am
lukosław wrote: Sat Feb 13, 2021 11:18 am Przy pomocy wskazówek @klew i kawałka kodu @elmaya dotyczącego innego expandera (EDIT: właśnie wspominanego MCP23017, który znalazłem na forum), udało mi się przygotować prosty skrypt ilustrujący przykład użycia wemosa z ekspanderem PCF8574.

Wrzucam tutaj, może się komuś przyda i zaoszczędzi trochę czasu, bo wątek wydaje się najwłaściwszy.

Mój układ to:
- wemos D1 mini
- układ 4 przekaźników (sterowane stanem niskim)
- 4 przyciski dotykowe TTP223 (podają stan wysoki po dotknięciu)
- moduł ekspandera PCF8574 (czerwony z dip switchem) ustawiony standardowo na adres 0x20

Wykorzystane są wszystkie 8 pinów ekspandera, 0-3 jako wyjścia dla przekaźników i 4-7 jako wejścia dla przycisków. W wemosie wykorzystane są tylko piny D1 i D2 do połączenia z ekspanderem (SCL i SDA).

Przy okazji uwaga. Dużo kłopotu sprawiło mi użycie złej biblioteki do obsługi PCF8574. Nie polecam używać TEJ biblioteki, natomiast TA zadziałała od razu.

Code: Select all

#include <PCF8574.h>

#include <SuplaDevice.h>
#include <supla/control/button.h>
#include <supla/control/relay.h>
#include <supla/io.h>
#include <supla/network/esp_wifi.h>

Supla::ESPWifi wifi("wifi_ssid", "wifi_pass");

PCF8574 pcf8574(0x20);

class MyPCF8574 : public Supla::Io {
  public:
    void customDigitalWrite(int channelNumber, uint8_t pin, uint8_t val) {
      if ((pin >= 100) && (pin <= 107)) {
        pcf8574.write(pin - 100, val);
        return;
      }
      if (pin <= 99) {
        return ::digitalWrite(pin, val);
      }
    }

    int customDigitalRead(int channelNumber, uint8_t pin) {
      if ((pin >= 100) && (pin <= 107)) {
        return pcf8574.read(pin - 100);
      }
      if (pin <= 99) {
        return ::digitalRead(pin);
      }
    }
} MyPCF8574;

Supla::Control::Button button1(104, false, false);
Supla::Control::Button button2(105, false, false);
Supla::Control::Button button3(106, false, false);
Supla::Control::Button button4(107, false, false);

Supla::Control::Relay relay1(100, false);
Supla::Control::Relay relay2(101, false);
Supla::Control::Relay relay3(102, false);
Supla::Control::Relay relay4(103, false);

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

  pcf8574.begin();

  char GUID[SUPLA_GUID_SIZE] = {your_guid};
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {your_authkey};

  button1.addAction(Supla::TOGGLE, relay1, Supla::ON_RELEASE);
  button2.addAction(Supla::TOGGLE, relay2, Supla::ON_RELEASE);
  button3.addAction(Supla::TOGGLE, relay3, Supla::ON_RELEASE);
  button4.addAction(Supla::TOGGLE, relay4, Supla::ON_RELEASE);

  SuplaDevice.setName("device_name");
  SuplaDevice.begin(GUID, "svr_address", "email_address", AUTHKEY);
}

void loop() {
  SuplaDevice.iterate();
}


jak można za pomocą tego kodu uruchomić sprawdzić pcf8574 na esp8266-01s?
co gdzie pozmieniać? domyślam się ze cyfry od 100 do 107 to nr pin a w esp01s są cztery 1,2,3,4.
dzięki za pomoć.

mam prośbę ? jak zamiast wemos D1 mini podstawić esp8266-01s to ten mały układ chodzi mi o kod tam jest GPIO0, GPIO1,GPIO2,GPIO3 z góry dzięki
Une enquГЄte terminГ©e sans affecter la qualitГ© de vie propriГ©tГ©s musculaires cardiaques, pulmonaires et sanguines..
User avatar
vajera
Posts: 7295
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 291 times
Been thanked: 161 times

Post

zamiast

Code: Select all

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

  pcf8574.begin();
wstaw

Code: Select all

void setup() {
  Serial.begin(115200);
  delay(500);
  
  Wire.begin(1,3);
  
  pcf8574.begin();
oczywiście wtedy GPIO1 (TX) pełni funkcję SDA a GPIO3 (RX) SCL i tak muszą być połączone z ekspanderem.
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
elmaya
Posts: 1485
Joined: Wed Jun 27, 2018 5:48 pm
Location: El Saucejo - Sevilla

Post

you should also add "Serial.swap();" to remap the serial port.

Code: Select all

void setup() {
  Serial.begin(115200);
  Serial.swap(); //Put the serial pins on (Rx = GPIO13) and (Tx = GPIO15)
  delay(500);
  
  Wire.begin(1,3);
  
  pcf8574.begin();
User avatar
vajera
Posts: 7295
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 291 times
Been thanked: 161 times

Post

elmaya wrote: Wed Mar 16, 2022 10:27 am you should also add "Serial.swap();" to remap the serial port.

Code: Select all

void setup() {
  Serial.begin(115200);
  Serial.swap(); //Put the serial pins on (Rx = GPIO13) and (Tx = GPIO15)
  delay(500);
  
  Wire.begin(1,3);
  
  pcf8574.begin();
Tienes razon pero ESP-01S no tiene GPIO13 y GPIO15 ;-)
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
elmaya
Posts: 1485
Joined: Wed Jun 27, 2018 5:48 pm
Location: El Saucejo - Sevilla

Post

vajera wrote: Wed Mar 16, 2022 10:42 am
elmaya wrote: Wed Mar 16, 2022 10:27 am you should also add "Serial.swap();" to remap the serial port.

Code: Select all

void setup() {
  Serial.begin(115200);
  Serial.swap(); //Put the serial pins on (Rx = GPIO13) and (Tx = GPIO15)
  delay(500);
  
  Wire.begin(1,3);
  
  pcf8574.begin();
Tienes razon pero ESP-01S no tiene GPIO13 y GPIO15 ;-)
it is not about using Gpio13 and Gpio15 as serial.
it's about avoiding the collision between I2C and serial debug.
User avatar
vajera
Posts: 7295
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 291 times
Been thanked: 161 times

Post

elmaya wrote: Wed Mar 16, 2022 10:50 am

it is not about using Gpio13 and Gpio15 as serial.
it's about avoiding the collision between I2C and serial debug.
Verdad!
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
matrix0606
Posts: 496
Joined: Tue Nov 08, 2022 9:05 pm

Post

lukosław wrote: Sat Feb 13, 2021 11:18 am Przy pomocy wskazówek @klew i kawałka kodu @elmaya dotyczącego innego expandera (EDIT: właśnie wspominanego MCP23017, który znalazłem na forum), udało mi się przygotować prosty skrypt ilustrujący przykład użycia wemosa z ekspanderem PCF8574.

Wrzucam tutaj, może się komuś przyda i zaoszczędzi trochę czasu, bo wątek wydaje się najwłaściwszy.

Mój układ to:
- wemos D1 mini
- układ 4 przekaźników (sterowane stanem niskim)
- 4 przyciski dotykowe TTP223 (podają stan wysoki po dotknięciu)
- moduł ekspandera PCF8574 (czerwony z dip switchem) ustawiony standardowo na adres 0x20

Wykorzystane są wszystkie 8 pinów ekspandera, 0-3 jako wyjścia dla przekaźników i 4-7 jako wejścia dla przycisków. W wemosie wykorzystane są tylko piny D1 i D2 do połączenia z ekspanderem (SCL i SDA).

Przy okazji uwaga. Dużo kłopotu sprawiło mi użycie złej biblioteki do obsługi PCF8574. Nie polecam używać TEJ biblioteki, natomiast TA zadziałała od razu.

Code: Select all

#include <PCF8574.h>

#include <SuplaDevice.h>
#include <supla/control/button.h>
#include <supla/control/relay.h>
#include <supla/io.h>
#include <supla/network/esp_wifi.h>

Supla::ESPWifi wifi("wifi_ssid", "wifi_pass");

PCF8574 pcf8574(0x20);

class MyPCF8574 : public Supla::Io {
  public:
    void customDigitalWrite(int channelNumber, uint8_t pin, uint8_t val) {
      if ((pin >= 100) && (pin <= 107)) {
        pcf8574.write(pin - 100, val);
        return;
      }
      if (pin <= 99) {
        return ::digitalWrite(pin, val);
      }
    }

    int customDigitalRead(int channelNumber, uint8_t pin) {
      if ((pin >= 100) && (pin <= 107)) {
        return pcf8574.read(pin - 100);
      }
      if (pin <= 99) {
        return ::digitalRead(pin);
      }
    }
} MyPCF8574;

Supla::Control::Button button1(104, false, false);
Supla::Control::Button button2(105, false, false);
Supla::Control::Button button3(106, false, false);
Supla::Control::Button button4(107, false, false);

Supla::Control::Relay relay1(100, false);
Supla::Control::Relay relay2(101, false);
Supla::Control::Relay relay3(102, false);
Supla::Control::Relay relay4(103, false);

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

  pcf8574.begin();

  char GUID[SUPLA_GUID_SIZE] = {your_guid};
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {your_authkey};

  button1.addAction(Supla::TOGGLE, relay1, Supla::ON_RELEASE);
  button2.addAction(Supla::TOGGLE, relay2, Supla::ON_RELEASE);
  button3.addAction(Supla::TOGGLE, relay3, Supla::ON_RELEASE);
  button4.addAction(Supla::TOGGLE, relay4, Supla::ON_RELEASE);

  SuplaDevice.setName("device_name");
  SuplaDevice.begin(GUID, "svr_address", "email_address", AUTHKEY);
}

void loop() {
  SuplaDevice.iterate();
}
Czy to jest fragment softu dla ESP8266, który wysyła a raczej zapisuje dane do zmiennych, które są wypychane przez I2C do PCF'a?
Konkretnie ten fragment?

Code: Select all

if ((pin >= 100) && (pin <= 107)) {
        pcf8574.write(pin - 100, val);
        return;
      }
      if (pin <= 99) {
        return ::digitalWrite(pin, val);
      }
Vivo V21 5G 8G RAM + 4G SWAP - Funtouch OS 12 Global
MOBO - MSI B350 Tomahawk || GPU - XFX Radeon RX 6600 Speedster
CPU - Ryzen5 1400 3,2G || PSU - SPC Vero | L2 500W 80 Plus Bronze
RAM - HyperX 2x8GB 3200MHz CL16 Predator RGB
brodaa
Posts: 21
Joined: Mon Nov 22, 2021 11:46 am

Post

Witam,
próbuję uruchomić PCF8574 na ESP32 (SDA - GPIO4; SCL - GPIO5) i kompilując kod z tego wątku niestety ale nie mam połączenia z ekspanderem (brak reakcji). Pytanie w związku z tym czy zapis:

Code: Select all

void setup() {
  Serial.begin(115200);
  delay(500);
  
  Wire.begin(4,5);
  
  pcf8574.begin();
gdzie definiuję piny do komunikacji z PCF-em jest prawidłowy? Bo jeśli tak to gdzie jeszcze mogę szukać przyczyny braku komunikacji?
Dodam tylko, że jak wygeneruję kod z GG, to wtedy PCF działa prawidłowo.

Return to “Pomoc”