2022-10-03 01:02:12 +03:00
|
|
|
#include "Global.h"
|
|
|
|
|
#include "classes/IoTItem.h"
|
|
|
|
|
#include "classes/IoTGpio.h"
|
|
|
|
|
|
2022-10-03 12:06:17 +03:00
|
|
|
#include <Adafruit_BusIO_Register.h>
|
|
|
|
|
#include <Adafruit_I2CDevice.h>
|
|
|
|
|
|
|
|
|
|
#define PCF8574_I2CADDR_DEFAULT 0x20 ///< DS3502 default I2C address
|
2022-10-03 01:02:12 +03:00
|
|
|
|
2022-10-03 12:06:17 +03:00
|
|
|
class Adafruit_PCF8574_mod {
|
|
|
|
|
public:
|
|
|
|
|
Adafruit_PCF8574_mod() {};
|
|
|
|
|
bool begin(uint8_t i2c_address = PCF8574_I2CADDR_DEFAULT, TwoWire *wire = &Wire) {
|
|
|
|
|
i2c_dev = new Adafruit_I2CDevice(i2c_address, wire);
|
|
|
|
|
|
|
|
|
|
if (!i2c_dev->begin()) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool digitalWriteByte(uint8_t d) {
|
|
|
|
|
_writebuf = d;
|
|
|
|
|
return i2c_dev->write(&_writebuf, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint8_t digitalReadByte(void) {
|
|
|
|
|
i2c_dev->read(&_readbuf, 1);
|
|
|
|
|
return _readbuf;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool digitalWrite(uint8_t pinnum, bool val) {
|
|
|
|
|
if (val) {
|
|
|
|
|
_writebuf |= 1 << pinnum;
|
|
|
|
|
} else {
|
|
|
|
|
_writebuf &= ~(1 << pinnum);
|
|
|
|
|
}
|
|
|
|
|
return i2c_dev->write(&_writebuf, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool pinMode(uint8_t pinnum, uint8_t val) {
|
|
|
|
|
if ((val == INPUT) || (val == INPUT_PULLUP)) {
|
|
|
|
|
_writebuf |= 1 << pinnum;
|
|
|
|
|
} else {
|
|
|
|
|
_writebuf &= ~(1 << pinnum);
|
|
|
|
|
}
|
|
|
|
|
return i2c_dev->write(&_writebuf, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool digitalRead(uint8_t pinnum) {
|
|
|
|
|
i2c_dev->read(&_readbuf, 1);
|
|
|
|
|
return (_readbuf >> pinnum) & 0x1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
uint8_t _readbuf = 0, _writebuf = 0;
|
|
|
|
|
|
|
|
|
|
Adafruit_I2CDevice *i2c_dev;
|
|
|
|
|
};
|
|
|
|
|
|
2022-10-03 01:02:12 +03:00
|
|
|
class Pcf8574Driver : public IoTGpio {
|
|
|
|
|
private:
|
2022-10-03 12:06:17 +03:00
|
|
|
Adafruit_PCF8574_mod _pcf;
|
2022-10-03 01:02:12 +03:00
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
Pcf8574Driver(int index, String addr) : IoTGpio(index) {
|
2022-10-03 12:06:17 +03:00
|
|
|
if (!_pcf.begin(hexStringToUint8(addr), &Wire)) {
|
2022-10-03 01:02:12 +03:00
|
|
|
Serial.println("PCF8574 Init Error.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void pinMode(uint8_t pin, uint8_t mode) {
|
|
|
|
|
_pcf.pinMode(pin, mode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void digitalWrite(uint8_t pin, uint8_t val) {
|
|
|
|
|
_pcf.digitalWrite(pin, val);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int digitalRead(uint8_t pin) {
|
|
|
|
|
return _pcf.digitalRead(pin);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void digitalInvert(uint8_t pin) {
|
|
|
|
|
_pcf.digitalWrite(pin, 1 - _pcf.digitalRead(pin));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
~Pcf8574Driver() {};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Pcf8574 : public IoTItem {
|
|
|
|
|
private:
|
|
|
|
|
Pcf8574Driver* _driver;
|
2022-10-10 22:54:44 +03:00
|
|
|
String _addr;
|
2022-10-03 01:02:12 +03:00
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
Pcf8574(String parameters) : IoTItem(parameters) {
|
|
|
|
|
_driver = nullptr;
|
|
|
|
|
|
2022-10-10 22:54:44 +03:00
|
|
|
jsonRead(parameters, "addr", _addr);
|
|
|
|
|
if (_addr == "") {
|
2022-10-03 01:02:12 +03:00
|
|
|
scanI2C();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int index;
|
|
|
|
|
jsonRead(parameters, "index", index);
|
|
|
|
|
if (index > 4) {
|
|
|
|
|
Serial.println("Pcf8574 wrong index. Must be 0 - 4");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-10 22:54:44 +03:00
|
|
|
_driver = new Pcf8574Driver(index, _addr);
|
2022-10-03 01:02:12 +03:00
|
|
|
}
|
|
|
|
|
|
2022-10-10 22:54:44 +03:00
|
|
|
void doByInterval() {
|
|
|
|
|
if (_addr == "") {
|
|
|
|
|
scanI2C();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-10-03 01:02:12 +03:00
|
|
|
|
|
|
|
|
//возвращает ссылку на экземпляр класса Pcf8574Driver
|
|
|
|
|
IoTGpio* getGpioDriver() {
|
|
|
|
|
return _driver;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
~Pcf8574() {
|
|
|
|
|
delete _driver;
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void* getAPI_Pcf8574(String subtype, String param) {
|
|
|
|
|
if (subtype == F("Pcf8574")) {
|
|
|
|
|
return new Pcf8574(param);
|
|
|
|
|
} else {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
}
|