PCF8574

Rafaello
Posty: 108
Rejestracja: ndz maja 29, 2016 1:34 pm

Witam,

na jednym z modułów potrzebuję zwiększyć ilość wyjść i wejść GPIO, mam pod ręką PCF8574. Kombinuje na bazie jakiś starych swoich skryptów w Arduino IDE, ale nic mi nie wychodzi. Może ktoś ma pod ręką działający skrypt gdzie ma wdrożony PCF8574.
Albert
Posty: 574
Rejestracja: pt sty 04, 2019 8:32 pm
Lokalizacja: Chełm

Nie ma nic takiego. Na dniach @krycha88 w Generic GUI przy współpracy z @elmaya dołożył obsługę MCP20317. Kosztuje kilkanaście zł i masz 16 przekaźników (16 dodatkowych gpio do wykorzystania jako przekaźniki/przyciski)
Rafaello
Posty: 108
Rejestracja: ndz maja 29, 2016 1:34 pm

Albert pisze: śr sty 13, 2021 12:15 pm Nie ma nic takiego. Na dniach @krycha88 w Generic GUI przy współpracy z @elmaya dołożył obsługę MCP20317. Kosztuje kilkanaście zł i masz 16 przekaźników (16 dodatkowych gpio do wykorzystania jako przekaźniki/przyciski)
Dzięki, właśnie wygrzebałem MCP23017, już wrzucam firmware i będę testował.
Awatar użytkownika
lukosław
Posty: 116
Rejestracja: pn paź 28, 2019 8:20 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.

Kod: Zaznacz cały

#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();
}
Awatar użytkownika
klew
Posty: 8177
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

Fajnie że wszystko ruszyło :)
Widzimy się na Supla Offline Party vol. 2 :!:
Tomasz_D
Posty: 4
Rejestracja: pt lip 02, 2021 1:53 pm

Witam

Powyższy przykład również u mnie na Wemosie zadziałał.
jednak czy może ktoś podpowiedzieć jakiej składni należy użyć aby zastosować większą liczbę ekspanderów.
Gdzie wpisać dodatkowe adresy itd.
Tomasz_D
Posty: 4
Rejestracja: pt lip 02, 2021 1:53 pm

Powalczyłem i udało mi się uruchomić wersję na dwa ekspandery, z większą ilością też będzie działać.
Rano podeślę kod jak ktoś zainteresowany.
radzik_r
Posty: 385
Rejestracja: ndz sie 11, 2019 5:32 pm

Tomasz_D pisze: wt lip 06, 2021 9:38 pm Powalczyłem i udało mi się uruchomić wersję na dwa ekspandery, z większą ilością też będzie działać.
Rano podeślę kod jak ktoś zainteresowany.
Wklej kod, może komuś się przyda.
Tomasz_D
Posty: 4
Rejestracja: pt lip 02, 2021 1:53 pm

Trochę to trwało, ale mam już kod na 4 ekspandery.
Wszystko zostało fizycznie przetestowane z wykorzystaniem 4 ekspanderów, 16 przycisków i 16 przekaźników.
Działa zarówno z przycisków jak i z aplikacji w telefonie.

Kod: Zaznacz cały

/*
16 przycisków 16 przekaźników
sterowanych za pomocą 4 ekspanderów PCF8574
*/


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


  uint8_t mac[6] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};

  #include <supla/network/esp_wifi.h>
  Supla::ESPWifi wifi("****", "****");

PCF8574 pcf85741(0x20);
PCF8574 pcf85742(0x21);
PCF8574 pcf85743(0x22);
PCF8574 pcf85744(0x23);

class MyPCF8574 : public Supla::Io {  public:
    void customDigitalWrite(int channelNumber, uint8_t pin, uint8_t val) {
      if ((pin >= 100) && (pin <= 107)) {
        pcf85741.write(pin - 100, val);
    return;    
      }
      if (pin <= 99) {
        return ::digitalWrite(pin, val);
      }
     if ((pin >= 108) && (pin <= 115)) {
      return pcf85742.write(pin - 108, val);
    }
        if ((pin >= 116) && (pin <= 123)) {
      return pcf85743.write(pin - 116, val);
    }
     if ((pin >= 124) && (pin <= 131)) {
      return pcf85744.write(pin - 124, val);
    }
    }

   

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

         }
         if ((pin >= 116) && (pin <= 123)) {
        return pcf85743.read(pin - 116);

         }
         if ((pin >= 124) && (pin <= 131)) {
        return pcf85744.read(pin - 124);
 
         }

    }
} 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::Button button5(112, false, false);
Supla::Control::Button button6(113, false, false);
Supla::Control::Button button7(114, false, false);
Supla::Control::Button button8(115, false, false);

Supla::Control::Button button9(120, false, false);
Supla::Control::Button button10(121, false, false);
Supla::Control::Button button11(122, false, false);
Supla::Control::Button button12(123, false, false);

Supla::Control::Button button13(128, false, false);
Supla::Control::Button button14(129, false, false);
Supla::Control::Button button15(130, false, false);
Supla::Control::Button button16(131, 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);

Supla::Control::Relay relay5(108, false);
Supla::Control::Relay relay6(109, false);
Supla::Control::Relay relay7(110, false);
Supla::Control::Relay relay8(111, false);

Supla::Control::Relay relay9(116, false);
Supla::Control::Relay relay10(117, false);
Supla::Control::Relay relay11(118, false);
Supla::Control::Relay relay12(119, false);

Supla::Control::Relay relay13(124, false);
Supla::Control::Relay relay14(125, false);
Supla::Control::Relay relay15(126, false);
Supla::Control::Relay relay16(127, false);


void setup() {

  Serial.begin(115200);
  delay(500);

    pcf85741.begin();
    pcf85742.begin();
    pcf85743.begin();
    pcf85744.begin();

  // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {0x,0x,0x,0x,0x,0x,0x,0x,0x,0x,0x,0x,0x,0x,0x,0x};

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {0x,0x,0x,0x,0x,0x,0x,0x,0x,0x,0x,0x,0x,0x,0x,0x};
 
  

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);
button5.addAction(Supla::TOGGLE, relay5, Supla::ON_RELEASE);
button6.addAction(Supla::TOGGLE, relay6, Supla::ON_RELEASE);
button7.addAction(Supla::TOGGLE, relay7, Supla::ON_RELEASE);
button8.addAction(Supla::TOGGLE, relay8, Supla::ON_RELEASE);
button9.addAction(Supla::TOGGLE, relay9, Supla::ON_RELEASE);
button10.addAction(Supla::TOGGLE, relay10, Supla::ON_RELEASE);
button11.addAction(Supla::TOGGLE, relay11, Supla::ON_RELEASE);
button12.addAction(Supla::TOGGLE, relay12, Supla::ON_RELEASE);
button13.addAction(Supla::TOGGLE, relay13, Supla::ON_RELEASE);
button14.addAction(Supla::TOGGLE, relay14, Supla::ON_RELEASE);
button15.addAction(Supla::TOGGLE, relay15, Supla::ON_RELEASE);
button16.addAction(Supla::TOGGLE, relay16, Supla::ON_RELEASE);




  SuplaDevice.setName("****");
  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    "****",  // SUPLA server address
                    "****",   // Email address used to login to Supla Cloud
                    AUTHKEY);          // Authorization key
    
}

void loop() {
  SuplaDevice.iterate();
}
stawek7902
Posty: 2
Rejestracja: ndz gru 05, 2021 1:48 pm

Zaznajomiwszy się z powyższym postem usilnie proszę jednak o dodanie możliwości konfiguracji ekspandera PCF8574 w GUI-Generic Bulider. Nie żebym miał cokolwiek przeciwko MCP23017, jednak producenci urządzeń domyślnie montują PCF i klops, nie da się używać pod SUPLA. Konkretnie, urządzenia wykorzystują ESP-32S. Myślę że takie udogodnienie powiększy grono urządzeń i wywoła szeroki uśmiech na twarzach użytkowników.
ODPOWIEDZ

Wróć do „Pomoc”