mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-30 03:49:13 +03:00
Merge pull request #132 from biveraxe/ver4dev
Добавляем прослойку для расширения GPIO
This commit is contained in:
@@ -5,4 +5,5 @@
|
|||||||
extern std::vector<IoTItem*> IoTItems; // вектор ссылок базового класса IoTItem - список всех запущенных сенсоров
|
extern std::vector<IoTItem*> IoTItems; // вектор ссылок базового класса IoTItem - список всех запущенных сенсоров
|
||||||
|
|
||||||
extern void configure(String path);
|
extern void configure(String path);
|
||||||
|
void clearConfigure();
|
||||||
extern IoTItem* myIoTItem;
|
extern IoTItem* myIoTItem;
|
||||||
|
|||||||
@@ -49,11 +49,13 @@
|
|||||||
#include "Utils/SerialPrint.h"
|
#include "Utils/SerialPrint.h"
|
||||||
#include "Utils/StringUtils.h"
|
#include "Utils/StringUtils.h"
|
||||||
#include "PeriodicTasks.h"
|
#include "PeriodicTasks.h"
|
||||||
|
#include "classes/IoTGpio.h"
|
||||||
|
|
||||||
/*********************************************************************************************************************
|
/*********************************************************************************************************************
|
||||||
*****************************************глобальные объекты классов***************************************************
|
*****************************************глобальные объекты классов***************************************************
|
||||||
**********************************************************************************************************************/
|
**********************************************************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
extern TickerScheduler ts;
|
extern TickerScheduler ts;
|
||||||
extern WiFiClient espClient;
|
extern WiFiClient espClient;
|
||||||
extern PubSubClient mqtt;
|
extern PubSubClient mqtt;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
#include "Utils/WiFiUtils.h"
|
#include "Utils/WiFiUtils.h"
|
||||||
#include "DeviceList.h"
|
#include "DeviceList.h"
|
||||||
|
#include "ESPConfiguration.h"
|
||||||
|
|
||||||
#ifdef STANDARD_WEB_SOCKETS
|
#ifdef STANDARD_WEB_SOCKETS
|
||||||
extern void standWebSocketsInit();
|
extern void standWebSocketsInit();
|
||||||
|
|||||||
21
include/classes/IoTGpio.h
Normal file
21
include/classes/IoTGpio.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
class IoTGpio {
|
||||||
|
public:
|
||||||
|
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);
|
||||||
|
|
||||||
|
int pinNums; // база для определения диапазона номеров пинов. pinNums + используемый
|
||||||
|
void regDriver(IoTGpio* newDriver);
|
||||||
|
|
||||||
|
private:
|
||||||
|
IoTGpio* _drivers[5]; //ссылки на объекты доступа к портам более 100, 200, 300, 400. Нулевой элемент используется как маркер - и возвращается nullptr при обращении
|
||||||
|
|
||||||
|
};
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include "classes/IoTGpio.h"
|
||||||
|
|
||||||
struct IoTValue {
|
struct IoTValue {
|
||||||
float valD = 0;
|
float valD = 0;
|
||||||
@@ -27,6 +28,8 @@ class IoTItem {
|
|||||||
|
|
||||||
IoTValue value; // хранение основного значения, котрое обновляется из сценария, execute(), loop() или doByInterval()
|
IoTValue value; // хранение основного значения, котрое обновляется из сценария, execute(), loop() или doByInterval()
|
||||||
|
|
||||||
|
IoTGpio* getGpioDriver();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
String _subtype;
|
String _subtype;
|
||||||
String _id;
|
String _id;
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
#include "ESPConfiguration.h"
|
#include "ESPConfiguration.h"
|
||||||
|
#include "classes/IoTGpio.h"
|
||||||
|
|
||||||
|
extern IoTGpio IoTgpio;
|
||||||
|
|
||||||
std::vector<IoTItem*> IoTItems;
|
std::vector<IoTItem*> IoTItems;
|
||||||
void* getAPI(String subtype, String params);
|
void* getAPI(String subtype, String params);
|
||||||
@@ -19,9 +22,19 @@ void configure(String path) {
|
|||||||
} else {
|
} else {
|
||||||
myIoTItem = (IoTItem*)getAPI(subtype, jsonArrayElement);
|
myIoTItem = (IoTItem*)getAPI(subtype, jsonArrayElement);
|
||||||
if (myIoTItem) {
|
if (myIoTItem) {
|
||||||
|
IoTGpio* tmp = myIoTItem->getGpioDriver();
|
||||||
|
if (tmp) IoTgpio.regDriver(tmp);
|
||||||
IoTItems.push_back(myIoTItem);
|
IoTItems.push_back(myIoTItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
file.close();
|
file.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearConfigure() {
|
||||||
|
Serial.printf("Start clearing config\n");
|
||||||
|
for (unsigned int i = 0; i < IoTItems.size(); i++) {
|
||||||
|
if (IoTItems[i]) delete IoTItems[i];
|
||||||
|
}
|
||||||
|
IoTItems.clear();
|
||||||
}
|
}
|
||||||
@@ -29,6 +29,7 @@ WebSocketsServer standWebSocket = WebSocketsServer(81);
|
|||||||
/*********************************************************************************************************************
|
/*********************************************************************************************************************
|
||||||
***********************************************глобальные переменные**************************************************
|
***********************************************глобальные переменные**************************************************
|
||||||
**********************************************************************************************************************/
|
**********************************************************************************************************************/
|
||||||
|
IoTGpio IoTgpio(0);
|
||||||
|
|
||||||
String settingsFlashJson = "{}"; //переменная в которой хранятся все настройки, находится в оперативной памяти и синхронизированна с flash памятью
|
String settingsFlashJson = "{}"; //переменная в которой хранятся все настройки, находится в оперативной памяти и синхронизированна с flash памятью
|
||||||
String errorsHeapJson = "{}"; //переменная в которой хранятся все ошибки, находится в оперативной памяти только
|
String errorsHeapJson = "{}"; //переменная в которой хранятся все ошибки, находится в оперативной памяти только
|
||||||
|
|||||||
@@ -71,6 +71,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
|
|||||||
//**сохранение**//
|
//**сохранение**//
|
||||||
if (headerStr == "/gifnoc|") {
|
if (headerStr == "/gifnoc|") {
|
||||||
writeFileUint8tByFrames("config.json", payload, length, headerLenth, 256);
|
writeFileUint8tByFrames("config.json", payload, length, headerLenth, 256);
|
||||||
|
clearConfigure();
|
||||||
|
configure("/config.json");
|
||||||
}
|
}
|
||||||
// page connection===================================================================
|
// page connection===================================================================
|
||||||
//**отправка**//
|
//**отправка**//
|
||||||
|
|||||||
43
src/classes/IoTGpio.cpp
Normal file
43
src/classes/IoTGpio.cpp
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#include "classes/IoTGpio.h"
|
||||||
|
|
||||||
|
|
||||||
|
IoTGpio::IoTGpio(int pins) { // инициируем стартовым числом диапазона доступных пинов для создаваемого экземпляра 0 - системный, далее 100, 200, 300, 400 или иной
|
||||||
|
pinNums = pins;
|
||||||
|
_drivers[0] = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
IoTGpio::~IoTGpio(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IoTGpio::pinMode(uint8_t pin, uint8_t mode) {
|
||||||
|
if (_drivers[pin/100]) _drivers[pin/100]->pinMode(pin, mode);
|
||||||
|
else ::pinMode(pin, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IoTGpio::digitalWrite(uint8_t pin, uint8_t val) {
|
||||||
|
if (_drivers[pin/100]) _drivers[pin/100]->digitalWrite(pin, val);
|
||||||
|
else ::digitalWrite(pin, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
int IoTGpio::digitalRead(uint8_t pin) {
|
||||||
|
if (_drivers[pin/100]) return _drivers[pin/100]->digitalRead(pin);
|
||||||
|
else return ::digitalRead(pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int IoTGpio::analogRead(uint8_t pin) {
|
||||||
|
if (_drivers[pin/100]) return _drivers[pin/100]->analogRead(pin);
|
||||||
|
else return ::analogRead(pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IoTGpio::analogWrite(uint8_t pin, int val) {
|
||||||
|
if (_drivers[pin/100]) _drivers[pin/100]->analogWrite(pin, val);
|
||||||
|
else ::analogWrite(pin, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IoTGpio::regDriver(IoTGpio* newDriver) {
|
||||||
|
_drivers[newDriver->pinNums/100] = newDriver;
|
||||||
|
}
|
||||||
@@ -83,4 +83,8 @@ IoTItem* findIoTItem(String name) { // поиск элемента модуля
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
IoTItem* myIoTItem;
|
IoTItem* myIoTItem;
|
||||||
|
|
||||||
|
IoTGpio* IoTItem::getGpioDriver() {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
#include "Classes/IoTItem.h"
|
#include "Classes/IoTItem.h"
|
||||||
|
|
||||||
|
extern IoTGpio IoTgpio;
|
||||||
|
|
||||||
//Это файл сенсора, в нем осуществляется чтение сенсора.
|
//Это файл сенсора, в нем осуществляется чтение сенсора.
|
||||||
//для добавления сенсора вам нужно скопировать этот файл и заменить в нем текст AnalogAdc на название вашего сенсора
|
//для добавления сенсора вам нужно скопировать этот файл и заменить в нем текст AnalogAdc на название вашего сенсора
|
||||||
//Название должно быть уникальным, коротким и отражать суть сенсора.
|
//Название должно быть уникальным, коротким и отражать суть сенсора.
|
||||||
@@ -32,7 +34,7 @@ class AnalogAdc : public IoTItem {
|
|||||||
//не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции
|
//не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции
|
||||||
//и выполнить за несколько тактов
|
//и выполнить за несколько тактов
|
||||||
void doByInterval() {
|
void doByInterval() {
|
||||||
value.valD = analogRead(_pin);
|
value.valD = IoTgpio.analogRead(_pin);
|
||||||
|
|
||||||
regEvent(value.valD, "AnalogAdc"); //обязательный вызов хотяб один
|
regEvent(value.valD, "AnalogAdc"); //обязательный вызов хотяб один
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ class Bme280t : public IoTItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void doByInterval() {
|
void doByInterval() {
|
||||||
float value = _bme->readTemperature();
|
value.valD = _bme->readTemperature();
|
||||||
if (value < 145) regEvent(value, "Bme280t");
|
if (value.valD < 145) regEvent(value.valD, "Bme280t");
|
||||||
else SerialPrint("E", "Sensor Bme280t", "Error");
|
else SerialPrint("E", "Sensor Bme280t", "Error");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,8 +43,8 @@ class Bme280h : public IoTItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void doByInterval() {
|
void doByInterval() {
|
||||||
float value = _bme->readHumidity();
|
value.valD = _bme->readHumidity();
|
||||||
if (value < 100) regEvent(value, "Bme280h");
|
if (value.valD < 100) regEvent(value.valD, "Bme280h");
|
||||||
else SerialPrint("E", "Sensor Bme280h", "Error");
|
else SerialPrint("E", "Sensor Bme280h", "Error");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,10 +62,10 @@ class Bme280p : public IoTItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void doByInterval() {
|
void doByInterval() {
|
||||||
float value = _bme->readPressure();
|
value.valD = _bme->readPressure();
|
||||||
if (value > 0) {
|
if (value.valD > 0) {
|
||||||
value = value / 1.333224 / 100;
|
value.valD = value.valD / 1.333224 / 100;
|
||||||
regEvent(value, "Bme280p");
|
regEvent(value.valD, "Bme280p");
|
||||||
} else SerialPrint("E", "Sensor Bme280p", "Error");
|
} else SerialPrint("E", "Sensor Bme280p", "Error");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ class Bmp280t : public IoTItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void doByInterval() {
|
void doByInterval() {
|
||||||
float value = _bmp->readTemperature();
|
value.valD = _bmp->readTemperature();
|
||||||
if (String(value) != "nan") regEvent(value, "Bmp280t");
|
if (String(value.valD) != "nan") regEvent(value.valD, "Bmp280t");
|
||||||
else SerialPrint("E", "Sensor DHTt", "Error");
|
else SerialPrint("E", "Sensor DHTt", "Error");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,10 +43,10 @@ class Bmp280p : public IoTItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void doByInterval() {
|
void doByInterval() {
|
||||||
float value = _bmp->readPressure();
|
value.valD = _bmp->readPressure();
|
||||||
if (String(value) != "nan") {
|
if (String(value.valD) != "nan") {
|
||||||
value = value / 1.333224 / 100;
|
value.valD = value.valD / 1.333224 / 100;
|
||||||
regEvent(value, "Bmp280p");
|
regEvent(value.valD, "Bmp280p");
|
||||||
} else SerialPrint("E", "Sensor DHTh", "Error");
|
} else SerialPrint("E", "Sensor DHTh", "Error");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ class Dht1122t : public IoTItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void doByInterval() {
|
void doByInterval() {
|
||||||
float value = _dht->getTemperature();
|
value.valD = _dht->getTemperature();
|
||||||
if (String(value) != "nan") regEvent(value, "Dht1122t");
|
if (String(value.valD) != "nan") regEvent(value.valD, "Dht1122t");
|
||||||
else SerialPrint("E", "Sensor DHTt", "Error");
|
else SerialPrint("E", "Sensor DHTt", "Error");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,8 +43,8 @@ class Dht1122h : public IoTItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void doByInterval() {
|
void doByInterval() {
|
||||||
float value = _dht->getHumidity();
|
value.valD = _dht->getHumidity();
|
||||||
if (String(value) != "nan") regEvent(value, "Dht1122h");
|
if (String(value.valD) != "nan") regEvent(value.valD, "Dht1122h");
|
||||||
else SerialPrint("E", "Sensor DHTh", "Error");
|
else SerialPrint("E", "Sensor DHTh", "Error");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ class Sht20t : public IoTItem {
|
|||||||
|
|
||||||
void doByInterval() {
|
void doByInterval() {
|
||||||
sht->read();
|
sht->read();
|
||||||
float value = sht->getTemperature();
|
value.valD = sht->getTemperature();
|
||||||
if (value > -46.85F) regEvent(value, "Sht20t");
|
if (value.valD > -46.85F) regEvent(value.valD, "Sht20t");
|
||||||
else SerialPrint("E", "Sensor Sht20t", "Error");
|
else SerialPrint("E", "Sensor Sht20t", "Error");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,8 +27,8 @@ class Sht20h : public IoTItem {
|
|||||||
|
|
||||||
void doByInterval() {
|
void doByInterval() {
|
||||||
sht->read();
|
sht->read();
|
||||||
float value = sht->getHumidity();
|
value.valD = sht->getHumidity();
|
||||||
if (value != -6) regEvent(value, "Sht20h");
|
if (value.valD != -6) regEvent(value.valD, "Sht20h");
|
||||||
else SerialPrint("E", "Sensor Sht20h", "Error");
|
else SerialPrint("E", "Sensor Sht20h", "Error");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -69,12 +69,12 @@ class Ds18b20 : public IoTItem {
|
|||||||
string2hex(_addr.c_str(), deviceAddress);
|
string2hex(_addr.c_str(), deviceAddress);
|
||||||
}
|
}
|
||||||
//получаем температуру по адресу
|
//получаем температуру по адресу
|
||||||
float value = sensors->getTempC(deviceAddress);
|
value.valD = sensors->getTempC(deviceAddress);
|
||||||
|
|
||||||
char addrStr[20] = "";
|
char addrStr[20] = "";
|
||||||
hex2string(deviceAddress, 8, addrStr);
|
hex2string(deviceAddress, 8, addrStr);
|
||||||
|
|
||||||
if (value != -127) regEvent(value, "addr: " + String(addrStr)); //обязательный вызов для отправки результата работы
|
if (value.valD != -127) regEvent(value.valD, "addr: " + String(addrStr)); //обязательный вызов для отправки результата работы
|
||||||
else SerialPrint("E", "Sensor Ds18b20", "Error");
|
else SerialPrint("E", "Sensor Ds18b20", "Error");
|
||||||
}
|
}
|
||||||
//=======================================================================================================
|
//=======================================================================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user