исправления, компиляция для 32

This commit is contained in:
Dmitry Borisenko
2022-03-15 12:56:05 +01:00
parent cbe3ee7886
commit c2bb0e17f4
6 changed files with 493 additions and 642 deletions

View File

@@ -3,8 +3,8 @@
"name": "IoTmanagerVer4", "name": "IoTmanagerVer4",
"apssid": "IoTmanager", "apssid": "IoTmanager",
"appass": "", "appass": "",
"routerssid": "rise", "routerssid": "MercureSpeedZone",
"routerpass": "hostel3333", "routerpass": "",
"timezone": 1, "timezone": 1,
"ntp": "pool.ntp.org", "ntp": "pool.ntp.org",
"weblogin": "admin", "weblogin": "admin",

View File

@@ -1,6 +1,8 @@
#pragma once #pragma once
#include "Global.h" #include "Global.h"
#ifdef ESP8266 #ifdef ESP8266
//эта библиотека встроена в ядро
#include "ESPAsyncUDP.h" #include "ESPAsyncUDP.h"
#else #else
#include "AsyncUDP.h" #include "AsyncUDP.h"

View File

@@ -31,12 +31,13 @@ data_dir = data_svelte
[common_env_data] [common_env_data]
lib_deps_external = lib_deps_external =
bblanchon/ArduinoJson @6.18.0 bblanchon/ArduinoJson @6.18.0
me-no-dev/ESP Async WebServer ;me-no-dev/ESP Async WebServer
Links2004/WebSockets Links2004/WebSockets
knolleary/PubSubClient knolleary/PubSubClient
[env:esp8266_4mb_fromitems] [env:esp8266_4mb_fromitems]
lib_deps = lib_deps =
ESPAsyncUDP
adafruit/Adafruit MCP23017 Arduino Library@^2.0.2 adafruit/Adafruit MCP23017 Arduino Library@^2.0.2
adafruit/Adafruit ADS1X15 @ ^2.3.0 adafruit/Adafruit ADS1X15 @ ^2.3.0
Adafruit AHTX0 Adafruit AHTX0
@@ -52,6 +53,7 @@ lib_deps =
[env:esp32_4mb_fromitems] [env:esp32_4mb_fromitems]
lib_deps = lib_deps =
plerup/EspSoftwareSerial
adafruit/Adafruit MCP23017 Arduino Library@^2.0.2 adafruit/Adafruit MCP23017 Arduino Library@^2.0.2
adafruit/Adafruit ADS1X15 @ ^2.3.0 adafruit/Adafruit ADS1X15 @ ^2.3.0
Adafruit AHTX0 Adafruit AHTX0

View File

@@ -67,7 +67,7 @@ void setup() {
// IoTItems.push_back((IoTItem*)new externalVariable("{\"id\":\"rel4\",\"val\":34,\"int\":30}")); // IoTItems.push_back((IoTItem*)new externalVariable("{\"id\":\"rel4\",\"val\":34,\"int\":30}"));
// пример получения JSON всех Items // пример получения JSON всех Items
Serial.println(getParamsJson()); // Serial.println(getParamsJson());
//чтение одного параметра //чтение одного параметра
// Serial.println(findIoTItem("t1")->getValue()); // Serial.println(findIoTItem("t1")->getValue());

View File

@@ -5,6 +5,8 @@
******************************************************************/ ******************************************************************/
#include "Global.h" #include "Global.h"
#include "classes/IoTItem.h" #include "classes/IoTItem.h"
//встроена в ядро для 8266, для 32 по этому же имени обращаемся к другой библиотеке plerup/EspSoftwareSerial
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
extern IoTGpio IoTgpio; extern IoTGpio IoTgpio;
@@ -21,7 +23,7 @@ bool MHZ19uart_flag = true;
// int MHZ19C_PREHEATING_TIME = 2 * 60 * 1000;// покажет реальные данные после прогрева, через 2 мин. // int MHZ19C_PREHEATING_TIME = 2 * 60 * 1000;// покажет реальные данные после прогрева, через 2 мин.
int MHZ19C_PREHEATING_TIME = 2 * 30 * 1000; // покажет реальные данные после прогрева, через 2 мин. int MHZ19C_PREHEATING_TIME = 2 * 30 * 1000; // покажет реальные данные после прогрева, через 2 мин.
//int prevTemperature = 0; // int prevTemperature = 0;
int temperature = 0; int temperature = 0;
bool temperatureUpdated = false; bool temperatureUpdated = false;
int prevRange = 5000; int prevRange = 5000;
@@ -31,20 +33,17 @@ int prevABC = 1;
int ABC = 1; int ABC = 1;
bool ABCchanged = false; bool ABCchanged = false;
//Это файл сенсора, в нем осуществляется чтение сенсора. //Это файл сенсора, в нем осуществляется чтение сенсора.
class Mhz19uart : public IoTItem class Mhz19uart : public IoTItem {
{ private:
private:
//======================================================================================================= //=======================================================================================================
// Секция переменных. // Секция переменных.
public: public:
//======================================================================================================= //=======================================================================================================
Mhz19uart(String parameters) : IoTItem(parameters) Mhz19uart(String parameters) : IoTItem(parameters) {
{
rxPinCO2 = jsonReadInt(parameters, "rxPin"); rxPinCO2 = jsonReadInt(parameters, "rxPin");
txPinCO2 = jsonReadInt(parameters, "txPin"); txPinCO2 = jsonReadInt(parameters, "txPin");
range = jsonReadInt(parameters, "range"); range = jsonReadInt(parameters, "range");
@@ -53,11 +52,9 @@ public:
//======================================================================================================= //=======================================================================================================
// doByInterval() // doByInterval()
void doByInterval() void doByInterval() {
{
MHZ19uart_init(); MHZ19uart_init();
if (millis() > MHZ19C_PREHEATING_TIME) if (millis() > MHZ19C_PREHEATING_TIME) {
{
Serial.println("Start checkUARTCO2"); Serial.println("Start checkUARTCO2");
value.valD = MHZ19_request(1); value.valD = MHZ19_request(1);
} }
@@ -65,31 +62,28 @@ public:
} }
//======================================================================================================= //=======================================================================================================
~Mhz19uart() {}; ~Mhz19uart(){};
}; };
//после замены названия сенсора, на функцию можно не обращать внимания //после замены названия сенсора, на функцию можно не обращать внимания
//если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть //если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть
//создание и контроль соответствующих глобальных переменных //создание и контроль соответствующих глобальных переменных
class Mhz19pwm : public IoTItem class Mhz19pwm : public IoTItem {
{ private:
private:
//======================================================================================================= //=======================================================================================================
// Секция переменных. // Секция переменных.
int pwmPin; ///// желтый провод сенсора к D8 (14-D5 ok) int pwmPin; ///// желтый провод сенсора к D8 (14-D5 ok)
public: public:
//======================================================================================================= //=======================================================================================================
Mhz19pwm(String parameters) : IoTItem(parameters) Mhz19pwm(String parameters) : IoTItem(parameters) {
{
pwmPin = jsonReadInt(parameters, "pin"); pwmPin = jsonReadInt(parameters, "pin");
} }
//======================================================================================================= //=======================================================================================================
void doByInterval() void doByInterval() {
{
MHZ19pwm_init(); MHZ19pwm_init();
if (millis() > MHZ19C_PREHEATING_TIME) // if (millis() > MHZ19C_PREHEATING_TIME) //
{ {
@@ -100,23 +94,19 @@ public:
} }
//======================================================================================================= //=======================================================================================================
void MHZ19pwm_init() void MHZ19pwm_init() {
{
static bool MHZ19pwm_flag = true; static bool MHZ19pwm_flag = true;
if (MHZ19pwm_flag) if (MHZ19pwm_flag) {
{
pinMode(pwmPin, INPUT); pinMode(pwmPin, INPUT);
MHZ19pwm_flag = false; MHZ19pwm_flag = false;
} }
} }
int MHZ19pwm_request() int MHZ19pwm_request() {
{
int reply; int reply;
Serial.println("Запрос замера по PWM запущен"); Serial.println("Запрос замера по PWM запущен");
unsigned long th, tl, ppm = 0, ppm2 = 0, ppm3 = 0; unsigned long th, tl, ppm = 0, ppm2 = 0, ppm3 = 0;
do do {
{
th = pulseIn(pwmPin, HIGH, 1004000) / 1000; th = pulseIn(pwmPin, HIGH, 1004000) / 1000;
tl = 1004 - th; tl = 1004 - th;
ppm2 = 2000 * (th - 2) / (th + tl - 4); // расчёт для диапазона от 0 до 2000ppm ppm2 = 2000 * (th - 2) / (th + tl - 4); // расчёт для диапазона от 0 до 2000ppm
@@ -126,14 +116,11 @@ public:
// Serial.print(th); // Serial.print(th);
// Serial.println(" <- Milliseconds PWM is HIGH"); // Serial.println(" <- Milliseconds PWM is HIGH");
if (range == 2000) if (range == 2000) {
{
reply = ppm2; reply = ppm2;
Serial.print(ppm2); Serial.print(ppm2);
Serial.println(" <- ppm2 (PWM) with 2000ppm as limit"); Serial.println(" <- ppm2 (PWM) with 2000ppm as limit");
} } else {
else
{
reply = ppm3; reply = ppm3;
Serial.print(ppm3); Serial.print(ppm3);
Serial.println(" <- ppm3 (PWM) with 5000ppm as limit"); Serial.println(" <- ppm3 (PWM) with 5000ppm as limit");
@@ -142,21 +129,19 @@ public:
return reply; return reply;
} }
~Mhz19pwm() {}; ~Mhz19pwm(){};
}; };
//====================TEMP=================================================================================== //====================TEMP===================================================================================
class Mhz19temp : public IoTItem class Mhz19temp : public IoTItem {
{ private:
private:
//======================================================================================================= //=======================================================================================================
// Секция переменных. // Секция переменных.
public: public:
//====================TEMP=================================================================================== //====================TEMP===================================================================================
Mhz19temp(String parameters) : IoTItem(parameters) Mhz19temp(String parameters) : IoTItem(parameters) {
{
rxPinCO2 = jsonReadInt(parameters, "rxPin"); rxPinCO2 = jsonReadInt(parameters, "rxPin");
txPinCO2 = jsonReadInt(parameters, "txPin"); txPinCO2 = jsonReadInt(parameters, "txPin");
range = jsonReadInt(parameters, "range"); range = jsonReadInt(parameters, "range");
@@ -164,20 +149,15 @@ public:
} }
//======================================================================================================= //=======================================================================================================
void doByInterval() void doByInterval() {
{
// Serial.println("Start Mhz19temp doByInterval"); // Serial.println("Start Mhz19temp doByInterval");
if (temperatureUpdated) if (temperatureUpdated) {
{
value.valD = temperature; value.valD = temperature;
temperatureUpdated = false; temperatureUpdated = false;
} } else {
else
{
MHZ19uart_init(); MHZ19uart_init();
Serial.println("Start temperature request"); Serial.println("Start temperature request");
if (MHZ19_request(13)) if (MHZ19_request(13)) {
{
value.valD = temperature; value.valD = temperature;
}; // change }; // change
} }
@@ -187,139 +167,99 @@ public:
//======================================================================================================= //=======================================================================================================
~Mhz19temp() {}; ~Mhz19temp(){};
}; };
//=======================Range================ //=======================Range================
class Mhz19range : public IoTItem class Mhz19range : public IoTItem {
{ private:
public:
private: Mhz19range(String parameters) : IoTItem(parameters) {
public:
Mhz19range(String parameters) : IoTItem(parameters)
{
rxPinCO2 = jsonReadInt(parameters, "rxPin"); rxPinCO2 = jsonReadInt(parameters, "rxPin");
txPinCO2 = jsonReadInt(parameters, "txPin"); txPinCO2 = jsonReadInt(parameters, "txPin");
range = jsonReadInt(parameters, "range"); range = jsonReadInt(parameters, "range");
ABC = jsonReadInt(parameters, "ABC"); ABC = jsonReadInt(parameters, "ABC");
} }
void doByInterval() void doByInterval() {
{ if (range != prevRange) {
if (range != prevRange)
{
MHZ19uart_init(); MHZ19uart_init();
Serial.println("Start change range"); Serial.println("Start change range");
if (range == 2000) if (range == 2000) {
{ if (MHZ19_request(9)) {
if (MHZ19_request(9))
{
prevRange = 2000; prevRange = 2000;
value.valD = 2000; value.valD = 2000;
} // change range to 2000 } // change range to 2000
} } else {
else if (MHZ19_request(10)) {
{
if (MHZ19_request(10))
{
prevRange = 5000; prevRange = 5000;
value.valD = 5000; value.valD = 5000;
} // change range to 5000 } // change range to 5000
} }
} } else {
else
{
value.valD = prevRange; value.valD = prevRange;
} }
regEvent(value.valD, "Mhz19range"); //обязательный вызов хотяб один regEvent(value.valD, "Mhz19range"); //обязательный вызов хотяб один
} }
~Mhz19range() {}; ~Mhz19range(){};
}; };
//===================ABC================= //===================ABC=================
class Mhz19ABC : public IoTItem class Mhz19ABC : public IoTItem {
{ private:
public:
private: Mhz19ABC(String parameters) : IoTItem(parameters) {
public:
Mhz19ABC(String parameters) : IoTItem(parameters)
{
rxPinCO2 = jsonReadInt(parameters, "rxPin"); rxPinCO2 = jsonReadInt(parameters, "rxPin");
txPinCO2 = jsonReadInt(parameters, "txPin"); txPinCO2 = jsonReadInt(parameters, "txPin");
range = jsonReadInt(parameters, "range"); range = jsonReadInt(parameters, "range");
ABC = jsonReadInt(parameters, "ABC"); ABC = jsonReadInt(parameters, "ABC");
} }
void doByInterval() void doByInterval() {
{ if (ABC != prevABC) {
if (ABC != prevABC) if (ABC == 1) {
{ if (MHZ19_request(7)) {
if (ABC == 1)
{
if (MHZ19_request(7))
{
prevABC = 1; prevABC = 1;
value.valD = 1; value.valD = 1;
} // change ABC to 1 } // change ABC to 1
} } else {
else if (MHZ19_request(8)) {
{
if (MHZ19_request(8))
{
prevABC = 0; prevABC = 0;
value.valD = 0; value.valD = 0;
} // change ABC to 0 } // change ABC to 0
} }
} } else {
else
{
value.valD = prevABC; value.valD = prevABC;
} }
regEvent(value.valD, "Mhz19ABC"); //обязательный вызов хотяб один regEvent(value.valD, "Mhz19ABC"); //обязательный вызов хотяб один
} }
~Mhz19ABC() {}; ~Mhz19ABC(){};
}; };
///============== end of classes========================== ///============== end of classes==========================
void *getAPI_Mhz19(String subtype, String param) void *getAPI_Mhz19(String subtype, String param) {
{ if (subtype == F("Mhz19uart")) {
if (subtype == F("Mhz19uart"))
{
return new Mhz19uart(param); return new Mhz19uart(param);
} } else if (subtype == F("Mhz19pwm")) {
else if (subtype == F("Mhz19pwm"))
{
return new Mhz19pwm(param); return new Mhz19pwm(param);
} } else if (subtype == F("Mhz19temp")) {
else if (subtype == F("Mhz19temp"))
{
return new Mhz19temp(param); return new Mhz19temp(param);
} } else if (subtype == F("Mhz19range")) {
else if (subtype == F("Mhz19range"))
{
return new Mhz19range(param); return new Mhz19range(param);
} } else if (subtype == F("Mhz19ABC")) {
else if (subtype == F("Mhz19ABC"))
{
return new Mhz19ABC(param); return new Mhz19ABC(param);
} } else {
else
{
return nullptr; return nullptr;
} }
} }
void MHZ19uart_init() void MHZ19uart_init() {
{ if (MHZ19uart_flag) {
if (MHZ19uart_flag)
{
int reply; int reply;
swSerialCO2.begin(9600); swSerialCO2.begin(9600);
@@ -329,55 +269,42 @@ void MHZ19uart_init()
Serial.print("show range reply = "); Serial.print("show range reply = ");
Serial.println(reply); Serial.println(reply);
if (reply) if (reply) {
{
MHZ19uart_flag = false; MHZ19uart_flag = false;
} }
} }
if (!MHZ19uart_flag) if (!MHZ19uart_flag) {
{
static int prevABC; static int prevABC;
int reply; int reply;
if (ABC != prevABC) if (ABC != prevABC) {
{ if (ABC) {
if (ABC)
{
reply = MHZ19_request(7); // ABC on reply = MHZ19_request(7); // ABC on
} } else {
else
{
reply = MHZ19_request(8); // ABC off reply = MHZ19_request(8); // ABC off
} }
Serial.print("ABC change reply = "); Serial.print("ABC change reply = ");
Serial.println(reply); Serial.println(reply);
} }
if (reply) if (reply) {
{
prevABC = ABC; prevABC = ABC;
} }
} }
static bool MHZ19_range_flag = true; static bool MHZ19_range_flag = true;
if (MHZ19_range_flag && !MHZ19uart_flag && (millis() > 30 * 1000)) if (MHZ19_range_flag && !MHZ19uart_flag && (millis() > 30 * 1000)) {
{
int reply; int reply;
if (range == 2000) if (range == 2000) {
{
reply = MHZ19_request(9); // Установка шкалы 0-2000 reply = MHZ19_request(9); // Установка шкалы 0-2000
// 255 155 0 0 7 208 0 3 139 // 255 155 0 0 7 208 0 3 139
} } else {
else
{
reply = MHZ19_request(10); // Установка шкалы 0-5000 reply = MHZ19_request(10); // Установка шкалы 0-5000
// 255 155 0 0 19 136 0 3 199 // 255 155 0 0 19 136 0 3 199
} }
Serial.print("Scale change reply = "); Serial.print("Scale change reply = ");
Serial.println(reply); Serial.println(reply);
if (reply) if (reply) {
{
reply = MHZ19_request(2); // show range reply = MHZ19_request(2); // show range
Serial.print("show range reply = "); Serial.print("show range reply = ");
Serial.println(reply); Serial.println(reply);
@@ -387,19 +314,18 @@ void MHZ19uart_init()
} }
} }
int MHZ19_request(int request) int MHZ19_request(int request) {
{
int reply; int reply;
Serial.print("prevRange = "); Serial.print("prevRange = ");
Serial.println(prevRange); Serial.println(prevRange);
byte uartReqSamplePpm[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; // PPM byte uartReqSamplePpm[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; // PPM
// 255 1 134 0 0 0 0 0 121 // 255 1 134 0 0 0 0 0 121
// Response 255 134 1 148 67 0 0 0 162 // Response 255 134 1 148 67 0 0 0 162
byte uartReqSampleABCon[9] = {0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00, 0xE6}; // ABC logic on byte uartReqSampleABCon[9] = {0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00, 0xE6}; // ABC logic on
// 255 1 121 160 0 0 0 0 230 // 255 1 121 160 0 0 0 0 230
//Response 255 121 1 0 0 0 0 0 134 // Response 255 121 1 0 0 0 0 0 134
byte uartReqSampleABCoff[9] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86}; // ABC logic off byte uartReqSampleABCoff[9] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86}; // ABC logic off
byte uartReqSampleABCstatus[9] = {0xFF, 0x01, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82}; // ABC logic status byte uartReqSampleABCstatus[9] = {0xFF, 0x01, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82}; // ABC logic status
@@ -408,11 +334,11 @@ int MHZ19_request(int request)
byte uartReqSample3000Range[9] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x0B, 0xB8, 0xA3}; // задаёт диапазон 0 - 2000ppm byte uartReqSample3000Range[9] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x0B, 0xB8, 0xA3}; // задаёт диапазон 0 - 2000ppm
byte uartReqSample5000Range[9] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x13, 0x88, 0xCB}; // задаёт диапазон 0 - 5000ppm byte uartReqSample5000Range[9] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x13, 0x88, 0xCB}; // задаёт диапазон 0 - 5000ppm
// 255 1 153 0 0 0 19 136 203 // 255 1 153 0 0 0 19 136 203
// Response 255 153 1 0 0 0 0 0 102 // Response 255 153 1 0 0 0 0 0 102
byte uartReqSampleRequestRange[9] = {0xFF, 0x01, 0x9B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64}; // запрос диапазона byte uartReqSampleRequestRange[9] = {0xFF, 0x01, 0x9B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64}; // запрос диапазона
// request // 255 1 155 0 0 0 0 0 100 // request // 255 1 155 0 0 0 0 0 100
//reply // 255 1 155 0 0 0 0 0 100 // reply // 255 1 155 0 0 0 0 0 100
byte uartReqSampleZeroPnt[9] = {0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78}; // !!ZERO POINT CALIBRATION byte uartReqSampleZeroPnt[9] = {0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78}; // !!ZERO POINT CALIBRATION
byte uartReqSampleReset[9] = {0xFF, 0x01, 0x8D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72}; // reset byte uartReqSampleReset[9] = {0xFF, 0x01, 0x8D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72}; // reset
@@ -420,116 +346,80 @@ int MHZ19_request(int request)
byte request_cmd[9]; byte request_cmd[9];
// byte c; // byte c;
switch (request) switch (request) {
{
// случаи 3-7 для перезапуска сенсора // случаи 3-7 для перезапуска сенсора
case 1: case 1: {
{
Serial.println("Запрос No.1 - отправлен. Запрос замера по UART"); Serial.println("Запрос No.1 - отправлен. Запрос замера по UART");
for (int i = 0; i < 9; i++) for (int i = 0; i < 9; i++) {
{
request_cmd[i] = uartReqSamplePpm[i]; request_cmd[i] = uartReqSamplePpm[i];
} }
} } break;
break;
case 2: case 2: {
{ for (int i = 0; i < 9; i++) {
for (int i = 0; i < 9; i++)
{
request_cmd[i] = uartReqSampleRequestRange[i]; request_cmd[i] = uartReqSampleRequestRange[i];
} }
Serial.println("Запрос No.2 - отправлен. Запрос шкалы"); Serial.println("Запрос No.2 - отправлен. Запрос шкалы");
} } break;
break;
case 3: case 3: {
{
// код для запуска сенсора с работой по UART (запуск таймера) // код для запуска сенсора с работой по UART (запуск таймера)
Serial.println("Запрос No.3 - отправлен. Сенсор по UART запущен"); Serial.println("Запрос No.3 - отправлен. Сенсор по UART запущен");
} } break;
break; case 4: {
case 4:
{
// код для остановке сенсора с работой по UART (остановка таймера) // код для остановке сенсора с работой по UART (остановка таймера)
Serial.println("Запрос No.4 - отправлен. Сенсор по UART остановлен"); Serial.println("Запрос No.4 - отправлен. Сенсор по UART остановлен");
} } break;
break; case 5: {
case 5:
{
// код для запуска сенсора с работой по PWM (запуск таймера) // код для запуска сенсора с работой по PWM (запуск таймера)
Serial.println("Запрос No.5 - отправлен. Сенсор по PWM запущен"); Serial.println("Запрос No.5 - отправлен. Сенсор по PWM запущен");
} } break;
break; case 6: {
case 6:
{
// код для остановки сенсора с работой по PWM (остановка таймера) // код для остановки сенсора с работой по PWM (остановка таймера)
Serial.println("Запрос No.6 - отправлен. Сенсор по PWM остановлен"); Serial.println("Запрос No.6 - отправлен. Сенсор по PWM остановлен");
} } break;
break; case 7: {
case 7: for (int i = 0; i < 9; i++) {
{
for (int i = 0; i < 9; i++)
{
request_cmd[i] = uartReqSampleABCon[i]; request_cmd[i] = uartReqSampleABCon[i];
} }
Serial.println("Запрос No.7 - отправлен. Включаем функцию атокалибровки"); Serial.println("Запрос No.7 - отправлен. Включаем функцию атокалибровки");
} } break;
break; case 8: {
case 8: for (int i = 0; i < 9; i++) {
{
for (int i = 0; i < 9; i++)
{
request_cmd[i] = uartReqSampleABCoff[i]; request_cmd[i] = uartReqSampleABCoff[i];
} }
Serial.println("Запрос No.8 - отправлен. Выключаем функцию атокалибровки"); Serial.println("Запрос No.8 - отправлен. Выключаем функцию атокалибровки");
} } break;
break; case 9: {
case 9: for (int i = 0; i < 9; i++) {
{
for (int i = 0; i < 9; i++)
{
request_cmd[i] = uartReqSample2000Range[i]; request_cmd[i] = uartReqSample2000Range[i];
} }
Serial.println("Запрос No.9 - отправлен. Установливаем шкалу 0-2000"); Serial.println("Запрос No.9 - отправлен. Установливаем шкалу 0-2000");
} } break;
break; case 10: {
case 10: for (int i = 0; i < 9; i++) {
{
for (int i = 0; i < 9; i++)
{
request_cmd[i] = uartReqSample5000Range[i]; request_cmd[i] = uartReqSample5000Range[i];
} }
Serial.println("Запрос No.10 - отправлен. Установливаем шкалу 0-5000"); Serial.println("Запрос No.10 - отправлен. Установливаем шкалу 0-5000");
} } break;
break; case 11: {
case 11: for (int i = 0; i < 9; i++) {
{
for (int i = 0; i < 9; i++)
{
request_cmd[i] = uartReqSampleZeroPnt[i]; request_cmd[i] = uartReqSampleZeroPnt[i];
} }
Serial.println("Запрос No.11 - отправлен. Калибровка. Установливаем нулевой уровень"); Serial.println("Запрос No.11 - отправлен. Калибровка. Установливаем нулевой уровень");
} } break;
break; case 12: {
case 12: for (int i = 0; i < 9; i++) {
{
for (int i = 0; i < 9; i++)
{
request_cmd[i] = uartReqSampleReset1[i]; request_cmd[i] = uartReqSampleReset1[i];
} }
Serial.println("Запрос No.11 - отправлен. Запрос на Сброс"); Serial.println("Запрос No.11 - отправлен. Запрос на Сброс");
} } break;
break; case 13: {
case 13: for (int i = 0; i < 9; i++) {
{
for (int i = 0; i < 9; i++)
{
request_cmd[i] = uartReqSamplePpm[i]; request_cmd[i] = uartReqSamplePpm[i];
} }
Serial.println("Запрос No.13 - отправлен. Запрос по Температуре"); Serial.println("Запрос No.13 - отправлен. Запрос по Температуре");
} } break;
break;
default: default:
// byte c = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; // byte c = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
// if nothing else matches, do the default // if nothing else matches, do the default
@@ -540,8 +430,7 @@ int MHZ19_request(int request)
swSerialCO2.write(request_cmd, 9); swSerialCO2.write(request_cmd, 9);
Serial.print("Request : "); Serial.print("Request : ");
for (int i = 0; i < 9; i++) for (int i = 0; i < 9; i++) {
{
Serial.print(" "); Serial.print(" ");
Serial.print(request_cmd[i]); Serial.print(request_cmd[i]);
} }
@@ -554,8 +443,7 @@ int MHZ19_request(int request)
Serial.print("Response :"); Serial.print("Response :");
swSerialCO2.readBytes(response, 9); swSerialCO2.readBytes(response, 9);
for (int i = 0; i < 9; i++) for (int i = 0; i < 9; i++) {
{
Serial.print(" "); Serial.print(" ");
Serial.print(response[i]); Serial.print(response[i]);
} }
@@ -566,22 +454,16 @@ int MHZ19_request(int request)
crc = 255 - crc; crc = 255 - crc;
crc += 1; crc += 1;
if (!(response[0] == 0xFF && response[8] == crc)) if (!(response[0] == 0xFF && response[8] == crc)) {
{
Serial.println("Range CRC error: " + String(crc) + " / " + String(response[8])); Serial.println("Range CRC error: " + String(crc) + " / " + String(response[8]));
reply = 0; reply = 0;
} } else {
else
{
// Serial.println("No CRC errors"); // Serial.println("No CRC errors");
switch (request) switch (request) {
{ case 1: {
case 1:
{
unsigned int responseHigh = (unsigned int)response[2]; unsigned int responseHigh = (unsigned int)response[2];
unsigned int responseLow = (unsigned int)response[3]; unsigned int responseLow = (unsigned int)response[3];
unsigned int ppm = (256*responseHigh) + responseLow; unsigned int ppm = (256 * responseHigh) + responseLow;
Serial.print("CO2 UART = "); Serial.print("CO2 UART = ");
Serial.println(ppm); Serial.println(ppm);
@@ -592,88 +474,63 @@ int MHZ19_request(int request)
temperatureUpdated = true; temperatureUpdated = true;
reply = ppm; reply = ppm;
} } break;
break;
case 2: case 2: {
{
reply = 1; reply = 1;
Serial.println("Case 2 - OK. На запрос шкалы пришел ответ"); Serial.println("Case 2 - OK. На запрос шкалы пришел ответ");
} } break;
break; case 3: {
case 3:
{
// Serial.println("Case 3 - OK"); // Serial.println("Case 3 - OK");
reply = 1; reply = 1;
} } break;
break; case 4: {
case 4:
{
// Serial.println("Case 4 - OK"); // Serial.println("Case 4 - OK");
reply = 1; reply = 1;
} } break;
break; case 5: {
case 5:
{
// Serial.println("Case 5 - OK"); // Serial.println("Case 5 - OK");
reply = 1; reply = 1;
} } break;
break; case 6: {
case 6:
{
Serial.println("Case 6 - OK"); Serial.println("Case 6 - OK");
reply = 1; reply = 1;
} } break;
break; case 7: {
case 7:
{
Serial.println("Case 7 - OK. ABC включен"); Serial.println("Case 7 - OK. ABC включен");
reply = 1; reply = 1;
} } break;
break; case 8: {
case 8:
{
Serial.println("Case 8 - OK. ABC выключен"); Serial.println("Case 8 - OK. ABC выключен");
reply = 1; reply = 1;
} } break;
break; case 9: {
case 9:
{
Serial.println("Case 9 - OK. Установлена шкала 0-2000"); Serial.println("Case 9 - OK. Установлена шкала 0-2000");
reply = 1; reply = 1;
prevRange = 2000; prevRange = 2000;
} } break;
break; case 10: {
case 10:
{
Serial.println("Case 9 - OK. Установлена шкала 0-5000"); Serial.println("Case 9 - OK. Установлена шкала 0-5000");
reply = 1; reply = 1;
prevRange = 5000; prevRange = 5000;
} } break;
break; case 11: {
case 11:
{
reply = 1; reply = 1;
Serial.println("Запрос No.11 - сработал. Калибровка. Установлен нулевой уровень"); Serial.println("Запрос No.11 - сработал. Калибровка. Установлен нулевой уровень");
} } break;
break;
case 12: case 12: {
{
reply = 1; reply = 1;
Serial.println("Запрос No.12 - сработал. Сброс произошел"); Serial.println("Запрос No.12 - сработал. Сброс произошел");
} } break;
break;
case 13: case 13: {
{
reply = 1; reply = 1;
temperature = response[4] - 44; // - 40; temperature = response[4] - 44; // - 40;
Serial.println("Запрос No.12 - сработал. Температура получена"); Serial.println("Запрос No.12 - сработал. Температура получена");
Serial.println(temperature); Serial.println(temperature);
} } break;
break;
default: default:
// byte c = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; // byte c = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};

View File

@@ -14,9 +14,19 @@ extern IoTGpio IoTgpio;
#include "SdsDustSensor.h" #include "SdsDustSensor.h"
//встроена в ядро для 8266, для 32 по этому же имени обращаемся к другой библиотеке plerup/EspSoftwareSerial
#include <SoftwareSerial.h>
#ifdef ESP8266
int rxPinSDS = 13; // D7 подключаем к Tx сенсора int rxPinSDS = 13; // D7 подключаем к Tx сенсора
int txPinSDS = 12; // D6 подключаем к Rx сенсора int txPinSDS = 12; // D6 подключаем к Rx сенсора
SdsDustSensor sds(rxPinSDS, txPinSDS); SdsDustSensor sds(rxPinSDS, txPinSDS);
#endif
#ifdef ESP32
#include <HardwareSerial.h>
HardwareSerial sdsSerial(2);
SdsDustSensor sds(sdsSerial);
#endif
unsigned int warmUp; unsigned int warmUp;
unsigned int period; unsigned int period;
@@ -29,27 +39,27 @@ float Sds011request(int sensorID);
//для добавления сенсора вам нужно скопировать этот файл и заменить в нем текст AnalogAdc на название вашего сенсора //для добавления сенсора вам нужно скопировать этот файл и заменить в нем текст AnalogAdc на название вашего сенсора
//Название должно быть уникальным, коротким и отражать суть сенсора. //Название должно быть уникальным, коротким и отражать суть сенсора.
class Sds011_25 : public IoTItem class Sds011_25 : public IoTItem {
{ private:
private:
//======================================================================================================= //=======================================================================================================
// Секция переменных. // Секция переменных.
//Это секция где Вы можете объявлять переменные и объекты arduino библиотек, что бы //Это секция где Вы можете объявлять переменные и объекты arduino библиотек, что бы
//впоследствии использовать их в loop и setup //впоследствии использовать их в loop и setup
// unsigned int _pin; // unsigned int _pin;
public: public:
//======================================================================================================= //=======================================================================================================
// setup() // setup()
//это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора. //это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора.
//Такие как ...begin и подставлять в них параметры полученные из web интерфейса. //Такие как ...begin и подставлять в них параметры полученные из web интерфейса.
//Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции: //Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции:
// jsonReadStr, jsonReadBool, jsonReadInt // jsonReadStr, jsonReadBool, jsonReadInt
Sds011_25(String parameters) : IoTItem(parameters) Sds011_25(String parameters) : IoTItem(parameters) {
{
// _pin = jsonReadInt(parameters, "pin"); // _pin = jsonReadInt(parameters, "pin");
#ifdef ESP8266
rxPinSDS = jsonReadInt(parameters, "rxPin"); rxPinSDS = jsonReadInt(parameters, "rxPin");
txPinSDS = jsonReadInt(parameters, "txPin"); txPinSDS = jsonReadInt(parameters, "txPin");
#endif
warmUp = jsonReadInt(parameters, "warmUp"); // сек. пробужнение должен быть больше warmUp = jsonReadInt(parameters, "warmUp"); // сек. пробужнение должен быть больше
period = jsonReadInt(parameters, "period"); // сек. время зарогрева/продувки, затем идут замеры period = jsonReadInt(parameters, "period"); // сек. время зарогрева/продувки, затем идут замеры
} }
@@ -61,8 +71,7 @@ public:
//если у сенсора несколько величин то делайте несколько regEvent //если у сенсора несколько величин то делайте несколько regEvent
//не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции //не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции
//и выполнить за несколько тактов //и выполнить за несколько тактов
void doByInterval() void doByInterval() {
{
SDS011_init(); SDS011_init();
Serial.println("request from 25"); Serial.println("request from 25");
value.valD = Sds011request(25); value.valD = Sds011request(25);
@@ -70,31 +79,31 @@ public:
regEvent(value.valD, "Sds011_25"); //обязательный вызов хотяб один regEvent(value.valD, "Sds011_25"); //обязательный вызов хотяб один
} }
~Sds011_25() {}; ~Sds011_25(){};
}; };
//////////////////////////////////// for PM 10//= //////////////////////////////////// for PM 10//=
class Sds011_10 : public IoTItem class Sds011_10 : public IoTItem {
{ private:
private:
//======================================================================================================= //=======================================================================================================
// Секция переменных. // Секция переменных.
//Это секция где Вы можете объявлять переменные и объекты arduino библиотек, что бы //Это секция где Вы можете объявлять переменные и объекты arduino библиотек, что бы
//впоследствии использовать их в loop и setup //впоследствии использовать их в loop и setup
public: public:
//======================================================================================================= //=======================================================================================================
// setup() // setup()
//это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора. //это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора.
//Такие как ...begin и подставлять в них параметры полученные из web интерфейса. //Такие как ...begin и подставлять в них параметры полученные из web интерфейса.
//Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции: //Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции:
// jsonReadStr, jsonReadBool, jsonReadInt // jsonReadStr, jsonReadBool, jsonReadInt
Sds011_10(String parameters) : IoTItem(parameters) Sds011_10(String parameters) : IoTItem(parameters) {
{ // _pin = jsonReadInt(parameters, "pin");
// _pin = jsonReadInt(parameters, "pin"); #ifdef ESP8266
rxPinSDS = jsonReadInt(parameters, "rxPin"); rxPinSDS = jsonReadInt(parameters, "rxPin");
txPinSDS = jsonReadInt(parameters, "txPin"); txPinSDS = jsonReadInt(parameters, "txPin");
#endif
warmUp = jsonReadInt(parameters, "warmUp"); // сек. пробужнение должен быть больше warmUp = jsonReadInt(parameters, "warmUp"); // сек. пробужнение должен быть больше
period = jsonReadInt(parameters, "period"); // сек. время зарогрева/продувки, затем идут замеры period = jsonReadInt(parameters, "period"); // сек. время зарогрева/продувки, затем идут замеры
} }
@@ -107,46 +116,37 @@ public:
//не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции //не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции
//и выполнить за несколько тактов //и выполнить за несколько тактов
void doByInterval() void doByInterval() {
{
SDS011_init(); SDS011_init();
Serial.println("request from 10"); Serial.println("request from 10");
value.valD = Sds011request(10); value.valD = Sds011request(10);
regEvent(value.valD, "Sds011_10"); //обязательный вызов хотяб один regEvent(value.valD, "Sds011_10"); //обязательный вызов хотяб один
} }
~Sds011_10() {}; ~Sds011_10(){};
}; };
//после замены названия сенсора, на функцию можно не обращать внимания //после замены названия сенсора, на функцию можно не обращать внимания
//если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть //если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть
//создание и контроль соответствующих глобальных переменных //создание и контроль соответствующих глобальных переменных
void *getAPI_Sds011(String subtype, String param) void* getAPI_Sds011(String subtype, String param) {
{ if (subtype == F("Sds011_25")) {
if (subtype == F("Sds011_25"))
{
return new Sds011_25(param); return new Sds011_25(param);
} } else if (subtype == F("Sds011_10")) {
else if (subtype == F("Sds011_10"))
{
return new Sds011_10(param); return new Sds011_10(param);
} } else {
else
{
return nullptr; return nullptr;
} }
} }
float Sds011request(int sensorID) float Sds011request(int sensorID) {
{
float reply = 0; float reply = 0;
static int a = 0; static int a = 0;
static float pm25 = 0; static float pm25 = 0;
static float pm10 = 0; static float pm10 = 0;
static int startMillis = millis(); static int startMillis = millis();
if (a == 0) if (a == 0) {
{
Serial.print("SDS011 ... warmUp = "); Serial.print("SDS011 ... warmUp = ");
Serial.print(warmUp); Serial.print(warmUp);
Serial.print(" period = "); Serial.print(" period = ");
@@ -155,11 +155,9 @@ float Sds011request(int sensorID)
startMillis = millis(); startMillis = millis();
a = a + 1; a = a + 1;
} }
if (a == 1 && millis() >= (startMillis + warmUp * 1000)) if (a == 1 && millis() >= (startMillis + warmUp * 1000)) {
{
PmResult pm = sds.readPm(); PmResult pm = sds.readPm();
if (pm.isOk()) if (pm.isOk()) {
{
pm25 = pm.pm25; pm25 = pm.pm25;
pm10 = pm.pm10; pm10 = pm.pm10;
Serial.print("PM2.5 = "); Serial.print("PM2.5 = ");
@@ -168,41 +166,33 @@ float Sds011request(int sensorID)
Serial.println(pm10); Serial.println(pm10);
a = a + 1; a = a + 1;
sds.sleep(); sds.sleep();
} } else {
else
{
Serial.print("Could not read values from sensor 25, reason: "); Serial.print("Could not read values from sensor 25, reason: ");
Serial.println(pm.statusToString()); Serial.println(pm.statusToString());
a = a + 1; a = a + 1;
} }
} }
if (a > 1 && millis() >= (startMillis + period * 1000)) if (a > 1 && millis() >= (startMillis + period * 1000)) {
{
Serial.println("end of period for pm25"); Serial.println("end of period for pm25");
a = 0; a = 0;
} }
if (sensorID == 25) if (sensorID == 25) {
{
reply = pm25; reply = pm25;
} }
if (sensorID == 10) if (sensorID == 10) {
{
reply = pm10; reply = pm10;
} }
return reply; return reply;
} }
void SDS011_init() void SDS011_init() {
{ if (SDS011_init_flag) {
if (SDS011_init_flag)
{
sds.begin(); sds.begin();
Serial.println(sds.queryFirmwareVersion().toString()); // prints firmware version Serial.println(sds.queryFirmwareVersion().toString()); // prints firmware version
// Serial.println(sds.setActiveReportingMode().toString()); // // Serial.println(sds.setActiveReportingMode().toString()); //
String ReportingMode = sds.setActiveReportingMode().toString(); String ReportingMode = sds.setActiveReportingMode().toString();
Serial.println(ReportingMode); Serial.println(ReportingMode);
if (ReportingMode == "Mode: active") if (ReportingMode == "Mode: active") {
{
SDS011_init_flag = false; SDS011_init_flag = false;
} }
} }