diff --git a/data_svelte/items.json b/data_svelte/items.json index c1b7c299..3a275f6b 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -274,5 +274,37 @@ "page": "", "descr": "", "int": 15 + }, + { + "name": "21. Датчик напряжения ADS1115", + "num": 21, + "type": "Reading", + "subtype": "Ads1115", + "id": "Ads3", + "widget": "anydataVlt", + "page": "Сенсоры", + "descr": "ADS_3", + + "pin": "0", + "mode": "volt", + "gain": "3/4x", + + "plus": 0, + "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/data_svelte/widgets.json b/data_svelte/widgets.json index 12a3e3db..f66db328 100644 --- a/data_svelte/widgets.json +++ b/data_svelte/widgets.json @@ -183,5 +183,12 @@ "Включен" ], "status": 0 + }, + { + "name": "anydataVlt", + "label": "Вольты", + "widget": "anydata", + "after": "Vlt", + "icon": "speedometer" } ] \ 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 d471b68b..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,9 +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 @@ -57,6 +60,8 @@ lib_deps = marcoschwartz/LiquidCrystal_I2C@^1.1.4 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 52364d37..e15fad73 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -13,6 +13,8 @@ void* getAPI_Hdc1080(String subtype, String params); 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) { @@ -30,6 +32,8 @@ void* getAPI(String subtype, String params) { if ((tmpAPI = getAPI_GY21(subtype, params)) != nullptr) return tmpAPI; 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/Ads1115.cpp b/src/modules/Ads1115.cpp new file mode 100644 index 00000000..5ff1733e --- /dev/null +++ b/src/modules/Ads1115.cpp @@ -0,0 +1,95 @@ +/****************************************************************** + Used Adafruit ADS1X15 Driver (16-bit Differential or Single-Ended ADCs with PGA and Comparator) + Support for ADS1015/1115 + https://github.com/adafruit/Adafruit_ADS1X15 + + adapted for version 4 @Serghei63 + ******************************************************************/ + +#include "Global.h" +#include "Classes/IoTItem.h" + +#include "Wire.h" +#include // Библиотека для работы с модулями ADS1115 и ADS1015 + +Adafruit_ADS1115 ads; + +class Ads1115 : public IoTItem { + int _pin; + bool _isRaw; + bool _isInited = false; + + public: + Ads1115(String parameters): IoTItem(parameters) { + String tmp; + jsonRead(parameters, "pin", tmp); + _pin = tmp.toInt(); + + jsonRead(parameters, "mode", tmp); + _isRaw = tmp == "raw"; + + if (!ads.begin()) { + Serial.println("Failed to initialize ADS."); + _isInited = false; + } else _isInited = true; + + String gain; + jsonRead(parameters, "gain", gain); + if (gain == "1x") ads.setGain(GAIN_ONE); + else if (gain == "2x") ads.setGain(GAIN_TWO); + else if (gain == "4x") ads.setGain(GAIN_FOUR); + else if (gain == "8x") ads.setGain(GAIN_EIGHT); + else if (gain == "16x") ads.setGain(GAIN_SIXTEEN); + else ads.setGain(GAIN_TWOTHIRDS); + // ВОЗМОЖНЫЕ ВАРИАНТЫ УСТАНОВКИ КУ: + // ads.setGain(GAIN_TWOTHIRDS); //| 2/3х | +/-6.144V | 1bit = 0.1875mV | + // ads.setGain(GAIN_ONE); //| 1х | +/-4.096V | 1bit = 0.125mV | + // ads.setGain(GAIN_TWO); //| 2х | +/-2.048V | 1bit = 0.0625mV | + // ads.setGain(GAIN_FOUR); //| 4х | +/-1.024V | 1bit = 0.03125mV | + // ads.setGain(GAIN_EIGHT); //| 8х | +/-0.512V | 1bit = 0.015625mV | + // ads.setGain(GAIN_SIXTEEN); //| 16х | +/-0.256V | 1bit = 0.0078125mV | + } + + void doByInterval() { + if (_isInited) { + if (_isRaw) value.valD = ads.readADC_SingleEnded(_pin); // Чтение АЦП нулевого канала(rawdata) + else value.valD = ads.computeVolts(ads.readADC_SingleEnded(_pin)); // Чтение АЦП нулевого канала (Вольты) + regEvent(value.valD, "ADC1115"); + } + } + + ~Ads1115(); +}; + + +void *getAPI_Ads1115(String subtype, String param) +{ + if (subtype == F("Ads1115")) { + return new Ads1115(param); + } else { + return nullptr; + } +} + + + + + // { + // "name": "26. Датчик напряжения ADS1115", + // "num": 26, + // "type": "Reading", + // "subtype": "Ads1115", + // "id": "Ads3", + // "widget": "anydataVlt", + // "page": "Сенсоры", + // "descr": "ADS_3", + + // "pin": "0", + // "mode": "volt", + // "gain": "3/4x", + + // "plus": 0, + // "multiply": 1, + // "round": 100, + // "int": 10 + // } \ No newline at end of file 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; + } +}