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.
PCF8574
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ł.
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.
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();
}
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.
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();
}
-
- 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.