upd Pcf8574

This commit is contained in:
Mit4el
2023-10-08 19:33:40 +03:00
parent 15776fc6a7
commit a3ec0681da

View File

@@ -1,28 +1,23 @@
#include "Global.h" #include "Global.h"
#include "classes/IoTItem.h" #include "classes/IoTItem.h"
#include "classes/IoTGpio.h" #include "classes/IoTGpio.h"
#include <Adafruit_BusIO_Register.h> #include <Adafruit_BusIO_Register.h>
#include <Adafruit_I2CDevice.h> #include <Adafruit_I2CDevice.h>
#define PCF8574_I2CADDR_DEFAULT 0x20 ///< DS3502 default I2C address #define PCF8574_I2CADDR_DEFAULT 0x20 ///< DS3502 стандартный I2C адрес
class Adafruit_PCF8574_mod { class Adafruit_PCF8574_mod {
public: public:
Adafruit_PCF8574_mod() {}; Adafruit_PCF8574_mod() : _pinConfig(0xFF) {}; // По умолчанию все пины настроены как входы
bool begin(uint8_t i2c_address = PCF8574_I2CADDR_DEFAULT, TwoWire *wire = &Wire) { bool begin(uint8_t i2c_address = PCF8574_I2CADDR_DEFAULT, TwoWire *wire = &Wire) {
i2c_dev = new Adafruit_I2CDevice(i2c_address, wire); i2c_dev = new Adafruit_I2CDevice(i2c_address, wire);
return i2c_dev->begin();
if (!i2c_dev->begin()) {
return false;
}
return true;
} }
bool digitalWriteByte(uint8_t d) { bool digitalWriteByte(uint8_t d) {
_writebuf = d; _writebuf = d;
return i2c_dev->write(&_writebuf, 1); return updateRegister();
} }
uint8_t digitalReadByte(void) { uint8_t digitalReadByte(void) {
@@ -32,20 +27,20 @@ class Adafruit_PCF8574_mod {
bool digitalWrite(int pinnum, bool val) { bool digitalWrite(int pinnum, bool val) {
if (val) { if (val) {
_writebuf |= 1 << pinnum; _writebuf |= (1 << pinnum);
} else { } else {
_writebuf &= ~(1 << pinnum); _writebuf &= ~(1 << pinnum);
} }
return i2c_dev->write(&_writebuf, 1); return updateRegister(); // Обновляем регистр после изменения состояния пина
} }
bool pinMode(int pinnum, uint8_t val) { bool pinMode(int pinnum, uint8_t val) {
if ((val == INPUT) || (val == INPUT_PULLUP)) { if ((val == INPUT) || (val == INPUT_PULLUP)) {
_writebuf |= 1 << pinnum; _pinConfig |= (1 << pinnum);
} else { } else {
_writebuf &= ~(1 << pinnum); _pinConfig &= ~(1 << pinnum);
} }
return i2c_dev->write(&_writebuf, 1); return updateRegister(); // Обновляем регистр после изменения конфигурации пина
} }
bool digitalRead(int pinnum) { bool digitalRead(int pinnum) {
@@ -55,6 +50,12 @@ class Adafruit_PCF8574_mod {
private: private:
uint8_t _readbuf = 0, _writebuf = 0; uint8_t _readbuf = 0, _writebuf = 0;
uint8_t _pinConfig; // Конфигурация пинов (вход/выход)
bool updateRegister() {
uint8_t outputValue = (_writebuf & ~_pinConfig) | (_pinConfig);
return i2c_dev->write(&outputValue, 1); // Отправляем обновленное значение регистра на устройство
}
Adafruit_I2CDevice *i2c_dev; Adafruit_I2CDevice *i2c_dev;
}; };
@@ -66,7 +67,7 @@ class Pcf8574Driver : public IoTGpio {
public: public:
Pcf8574Driver(int index, String addr) : IoTGpio(index) { Pcf8574Driver(int index, String addr) : IoTGpio(index) {
if (!_pcf.begin(hexStringToUint8(addr), &Wire)) { if (!_pcf.begin(hexStringToUint8(addr), &Wire)) {
Serial.println("PCF8574 Init Error."); Serial.println("Ошибка инициализации PCF8574."); // Переводим на русский
} }
} }
@@ -85,11 +86,8 @@ class Pcf8574Driver : public IoTGpio {
void digitalInvert(int pin) { void digitalInvert(int pin) {
_pcf.digitalWrite(pin, 1 - _pcf.digitalRead(pin)); _pcf.digitalWrite(pin, 1 - _pcf.digitalRead(pin));
} }
~Pcf8574Driver() {};
}; };
class Pcf8574 : public IoTItem { class Pcf8574 : public IoTItem {
private: private:
Pcf8574Driver* _driver; Pcf8574Driver* _driver;
@@ -108,7 +106,7 @@ class Pcf8574 : public IoTItem {
int index; int index;
jsonRead(parameters, "index", index); jsonRead(parameters, "index", index);
if (index > 4) { if (index > 4) {
Serial.println("Pcf8574 wrong index. Must be 0 - 4"); Serial.println("Неправильный индекс Pcf8574. Должен быть 0 - 4."); // Переводим на русский
return; return;
} }
@@ -122,14 +120,13 @@ class Pcf8574 : public IoTItem {
} }
} }
//возвращает ссылку на экземпляр класса Pcf8574Driver
IoTGpio* getGpioDriver() { IoTGpio* getGpioDriver() {
return _driver; return _driver;
} }
~Pcf8574() { ~Pcf8574() {
delete _driver; delete _driver;
}; }
}; };
void* getAPI_Pcf8574(String subtype, String param) { void* getAPI_Pcf8574(String subtype, String param) {