diff --git a/data_svelte/items.json b/data_svelte/items.json index f345cae8..3a275f6b 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -293,5 +293,18 @@ "multiply": 1, "round": 100, "int": 10 + }, + { + "name": "22. Расширитель портов Mcp23017", + "num": 22, + "type": "Reading", + "subtype": "Mcp23017", + "id": "Mcp", + "widget": "", + "page": "", + "descr": "", + + "addr": "0x20", + "index": 1 } ] \ No newline at end of file diff --git a/include/Global.h b/include/Global.h index a53c9c65..bf0e010e 100644 --- a/include/Global.h +++ b/include/Global.h @@ -54,6 +54,7 @@ /********************************************************************************************************************* *****************************************глобальные объекты классов*************************************************** **********************************************************************************************************************/ +extern IoTGpio IoTgpio; extern TickerScheduler ts; extern WiFiClient espClient; diff --git a/include/classes/IoTGpio.h b/include/classes/IoTGpio.h index ed817b66..a77341ea 100644 --- a/include/classes/IoTGpio.h +++ b/include/classes/IoTGpio.h @@ -6,16 +6,16 @@ class IoTGpio { IoTGpio(int pins); ~IoTGpio(); - void pinMode(uint8_t pin, uint8_t mode); - void digitalWrite(uint8_t pin, uint8_t val); - int digitalRead(uint8_t pin); - int analogRead(uint8_t pin); - void analogWrite(uint8_t pin, int val); + virtual void pinMode(uint8_t pin, uint8_t mode); + virtual void digitalWrite(uint8_t pin, uint8_t val); + virtual int digitalRead(uint8_t pin); + virtual int analogRead(uint8_t pin); + virtual void analogWrite(uint8_t pin, int val); - int pinNums; // база для определения диапазона номеров пинов. pinNums + используемый + int index; void regDriver(IoTGpio* newDriver); private: - IoTGpio* _drivers[5]; //ссылки на объекты доступа к портам более 100, 200, 300, 400. Нулевой элемент используется как маркер - и возвращается nullptr при обращении + IoTGpio* _drivers[5] = {nullptr}; //ссылки на объекты доступа к портам более 100, 200, 300, 400. Нулевой элемент используется как маркер - и возвращается nullptr при обращении }; \ No newline at end of file diff --git a/include/classes/IoTItem.h b/include/classes/IoTItem.h index d7f65cdf..7d012b7d 100644 --- a/include/classes/IoTItem.h +++ b/include/classes/IoTItem.h @@ -28,7 +28,7 @@ class IoTItem { IoTValue value; // хранение основного значения, котрое обновляется из сценария, execute(), loop() или doByInterval() - IoTGpio* getGpioDriver(); + virtual IoTGpio* getGpioDriver(); protected: String _subtype; diff --git a/platformio.ini b/platformio.ini index 3c8f1ed1..25a94fd4 100644 --- a/platformio.ini +++ b/platformio.ini @@ -18,6 +18,7 @@ lib_deps_external = me-no-dev/ESP Async WebServer Links2004/WebSockets knolleary/PubSubClient + [env:esp8266_4mb] build_flags = -Desp8266_4mb="esp8266_4mb" framework = arduino @@ -33,10 +34,11 @@ lib_deps = adafruit/Adafruit BME280 Library Adafruit AHTX0 marcoschwartz/LiquidCrystal_I2C@^1.1.4 - me-no-dev/ESPAsyncUDP ;для esp32 данная библиотека встроена в ядро + me-no-dev/ESPAsyncUDP ClosedCube HDC1080 https://github.com/JonasGMorsch/GY-21.git adafruit/Adafruit ADS1X15 @ ^2.3.0 + adafruit/Adafruit MCP23017 Arduino Library@^2.0.2 monitor_filters = esp8266_exception_decoder upload_speed = 921600 monitor_speed = 115200 @@ -59,6 +61,7 @@ lib_deps = ClosedCube HDC1080 https://github.com/JonasGMorsch/GY-21.git adafruit/Adafruit ADS1X15 @ ^2.3.0 + adafruit/Adafruit MCP23017 Arduino Library@^2.0.2 monitor_filters = esp32_exception_decoder upload_speed = 921600 monitor_speed = 115200 diff --git a/src/Main.cpp b/src/Main.cpp index e7f46b3c..901a7417 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -61,6 +61,15 @@ void setup() { // test Serial.println("-------test start--------"); Serial.println("--------test end---------"); + + //тест перебора пинов из расширения + // for (int i = 109; i < 112; i++) { + // IoTgpio.pinMode(i, OUTPUT); + // IoTgpio.digitalWrite(i, !IoTgpio.digitalRead(i)); + // delay(1000); + // IoTgpio.digitalWrite(i, !IoTgpio.digitalRead(i)); + // delay(1000); + // } } void loop() { diff --git a/src/classes/IoTGpio.cpp b/src/classes/IoTGpio.cpp index 84fd1e6f..18ea2f6d 100644 --- a/src/classes/IoTGpio.cpp +++ b/src/classes/IoTGpio.cpp @@ -1,9 +1,8 @@ #include "classes/IoTGpio.h" -IoTGpio::IoTGpio(int pins) { // инициируем стартовым числом диапазона доступных пинов для создаваемого экземпляра 0 - системный, далее 100, 200, 300, 400 или иной - pinNums = pins; - _drivers[0] = nullptr; +IoTGpio::IoTGpio(int Index) { // указываем за какой интервал пинов будет отвечать данный экземпляр 0 - сис, 1 - 100, 2 - 200, 3 - 300, 4 -400 + index = Index; } IoTGpio::~IoTGpio(){ @@ -12,28 +11,33 @@ IoTGpio::~IoTGpio(){ void IoTGpio::pinMode(uint8_t pin, uint8_t mode) { - if (_drivers[pin/100]) _drivers[pin/100]->pinMode(pin, mode); + int pinH = pin/100; + if (_drivers[pinH]) _drivers[pinH]->pinMode(pin - pinH*100, mode); else ::pinMode(pin, mode); } void IoTGpio::digitalWrite(uint8_t pin, uint8_t val) { - if (_drivers[pin/100]) _drivers[pin/100]->digitalWrite(pin, val); + int pinH = pin/100; + if (_drivers[pinH]) _drivers[pinH]->digitalWrite(pin - pinH*100, val); else ::digitalWrite(pin, val); } int IoTGpio::digitalRead(uint8_t pin) { - if (_drivers[pin/100]) return _drivers[pin/100]->digitalRead(pin); + int pinH = pin/100; + if (_drivers[pinH]) return _drivers[pinH]->digitalRead(pin - pinH*100); else return ::digitalRead(pin); } int IoTGpio::analogRead(uint8_t pin) { - if (_drivers[pin/100]) return _drivers[pin/100]->analogRead(pin); + int pinH = pin/100; + if (_drivers[pinH]) return _drivers[pinH]->analogRead(pin - pinH*100); else return ::analogRead(pin); } void IoTGpio::analogWrite(uint8_t pin, int val) { - if (_drivers[pin/100]) _drivers[pin/100]->analogWrite(pin, val); + int pinH = pin/100; + if (_drivers[pinH]) _drivers[pinH]->analogWrite(pin - pinH*100, val); else { #ifdef ESP32 // todo: написать для esp32 аналог функции analogWrite @@ -46,5 +50,5 @@ void IoTGpio::analogWrite(uint8_t pin, int val) { void IoTGpio::regDriver(IoTGpio* newDriver) { - _drivers[newDriver->pinNums/100] = newDriver; + _drivers[newDriver->index] = newDriver; } \ No newline at end of file diff --git a/src/modules/API.cpp b/src/modules/API.cpp index c3ff2aef..e15fad73 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -14,6 +14,7 @@ void* getAPI_GY21(String subtype, String params); void* getAPI_Lcd2004(String subtype, String params); void* getAPI_SysExt(String subtype, String params); void* getAPI_Ads1115(String subtype, String params); +void* getAPI_Mcp23017(String subtype, String params); //============================================================================================ void* getAPI(String subtype, String params) { @@ -32,6 +33,7 @@ void* getAPI(String subtype, String params) { if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_SysExt(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Ads1115(subtype, params)) != nullptr) return tmpAPI; + if ((tmpAPI = getAPI_Mcp23017(subtype, params)) != nullptr) return tmpAPI; //================================================================================================================ return nullptr; diff --git a/src/modules/Mcp23017.cpp b/src/modules/Mcp23017.cpp new file mode 100644 index 00000000..2c64d5a1 --- /dev/null +++ b/src/modules/Mcp23017.cpp @@ -0,0 +1,69 @@ +#include "Global.h" +#include "Classes/IoTItem.h" +#include "classes/IoTGpio.h" +#include + + +class Mcp23017 : public IoTItem, IoTGpio { + private: + + public: + Adafruit_MCP23X17 mcp; + + Mcp23017(String parameters, int index): IoTItem(parameters), IoTGpio(index) { + + } + + void doByInterval() { + + + //regEvent(value.valD, "Mcp23017"); + } + + IoTGpio* getGpioDriver() { + return this; + } + + void pinMode(uint8_t pin, uint8_t mode) { + mcp.pinMode(pin, mode); + } + + void digitalWrite(uint8_t pin, uint8_t val) { + mcp.digitalWrite(pin, val); + } + + int digitalRead(uint8_t pin) { + return mcp.digitalRead(pin); + } + + ~Mcp23017() {}; +}; + + +void* getAPI_Mcp23017(String subtype, String param) { + if (subtype == F("Mcp23017")) { + String addr; + uint8_t deviceAddress[1]; + jsonRead(param, "addr", addr); + Serial.printf("deviceAddress %s = %02x \n", addr.c_str(), hexStringToUint8(addr)); + + String index_str; + jsonRead(param, "index", index_str); + int index = index_str.toInt(); + if (index > 4) { + Serial.println("MCP23X17 wrong index. Must be 0 - 4"); + return nullptr; + } + + Mcp23017* newItem = new Mcp23017(param, index); + if (!newItem->mcp.begin_I2C(hexStringToUint8(addr))) { + Serial.println("MCP23X17 Init Error."); + delete newItem; + return nullptr; + } + + return newItem; + } else { + return nullptr; + } +}