mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-30 11:59:12 +03:00
добавлен mhz19 и sds011
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,7 @@
|
|||||||
"menuSection": "Сенсоры",
|
"menuSection": "Сенсоры",
|
||||||
"configItem": [
|
"configItem": [
|
||||||
{
|
{
|
||||||
"name": "MHZ-19 CO2 (UART)",
|
"name": "MHZ-19 CO2 UART",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Mhz19uart",
|
"subtype": "Mhz19uart",
|
||||||
"id": "co2uart",
|
"id": "co2uart",
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
"plus": 0,
|
"plus": 0,
|
||||||
"multiply": 1,
|
"multiply": 1,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"pin": 0,
|
"warmUp": 120,
|
||||||
"rxPin": 13,
|
"rxPin": 13,
|
||||||
"txPin": 12,
|
"txPin": 12,
|
||||||
"int": 15,
|
"int": 15,
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
"ABC": 1
|
"ABC": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "MHZ-19 CO2 (PWM)",
|
"name": "MHZ-19 CO2 PWM",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Mhz19pwm",
|
"subtype": "Mhz19pwm",
|
||||||
"id": "co2pwm",
|
"id": "co2pwm",
|
||||||
@@ -30,11 +30,13 @@
|
|||||||
"plus": 0,
|
"plus": 0,
|
||||||
"multiply": 1,
|
"multiply": 1,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
|
"warmUp": 120,
|
||||||
"pin": 15,
|
"pin": 15,
|
||||||
|
"maxRetriesNotAvailable": 10,
|
||||||
"int": 300
|
"int": 300
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Cенсор температуры от MHZ-19 UART",
|
"name": "MHZ-19 Температура UART",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Mhz19temp",
|
"subtype": "Mhz19temp",
|
||||||
"id": "Mhz19temp",
|
"id": "Mhz19temp",
|
||||||
@@ -46,64 +48,28 @@
|
|||||||
"round": 1,
|
"round": 1,
|
||||||
"rxPin": 13,
|
"rxPin": 13,
|
||||||
"txPin": 12,
|
"txPin": 12,
|
||||||
"ABC": 1,
|
|
||||||
"int": 30
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Рабочий диапазон от MHZ-19 UART",
|
|
||||||
"type": "Reading",
|
|
||||||
"subtype": "Mhz19range",
|
|
||||||
"id": "Mhz19range",
|
|
||||||
"widget": "anydataPpm",
|
|
||||||
"page": "Сенсоры",
|
|
||||||
"descr": "Диапазон",
|
|
||||||
"plus": 0,
|
|
||||||
"multiply": 1,
|
|
||||||
"round": 1,
|
|
||||||
"rxPin": 13,
|
|
||||||
"txPin": 12,
|
|
||||||
"range": 5000,
|
|
||||||
"ABC": 1,
|
|
||||||
"int": 30
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Автокалибровка от MHZ-19 UART",
|
|
||||||
"type": "Reading",
|
|
||||||
"subtype": "Mhz19ABC",
|
|
||||||
"id": "Mhz19ABC",
|
|
||||||
"widget": "anydataDef",
|
|
||||||
"page": "Сенсоры",
|
|
||||||
"descr": "ABC",
|
|
||||||
"rxPin": 13,
|
|
||||||
"txPin": 12,
|
|
||||||
"range": 5000,
|
|
||||||
"ABC": 1,
|
|
||||||
"int": 30
|
"int": 30
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"about": {
|
"about": {
|
||||||
"authorName": "Alex K",
|
"authorName": "Alex K",
|
||||||
"authorContact": "https://t.me/cmche",
|
"authorContact": "https://t.me/cmche",
|
||||||
"authorGit": "",
|
"authorGit": "https://github.com/CHE77/Mhz19forIotManager",
|
||||||
"specialThanks": "",
|
"specialThanks": "",
|
||||||
"moduleName": "Mhz19",
|
"moduleName": "Mhz19",
|
||||||
"moduleVersion": "1.0",
|
"moduleVersion": "2.0 - можно переназначать пины",
|
||||||
"usedRam": 15,
|
"moduleDesc": "Позволяет получить значения уровня концетрации CO2 с Mhz19 по UART и/или ШИМ. Замер по ШИМ может производить 1-2 сек. задержки",
|
||||||
"subTypes": [
|
|
||||||
"Mhz19uart",
|
|
||||||
"Mhz19pwm",
|
|
||||||
"Mhz19temp",
|
|
||||||
"Mhz19range",
|
|
||||||
"Mhz19ABC"
|
|
||||||
],
|
|
||||||
"title": "Датчик температуры и CO2 с Mhz19",
|
|
||||||
"moduleDesc": "Позволяет получить значения температуры и CO2 с Mhz19.",
|
|
||||||
"propInfo": {
|
"propInfo": {
|
||||||
|
"plus": "поправочный коэффиент +c",
|
||||||
|
"multiply": "поправочный коэффиент k*",
|
||||||
|
"round": "округление",
|
||||||
"int": "Количество секунд между опросами датчика.",
|
"int": "Количество секунд между опросами датчика.",
|
||||||
"rxPin": "",
|
"rxPin": "Esp8266: GPIO 13 - D7, ESP32: GPIO 19 - RX1, > MHZ19: TXD зеленый провод",
|
||||||
"txPin": "",
|
"txPin": "Esp8266: GPIO 12 - D6, ESP32: GPIO 18 - TX1, > MHZ19: RXD синий провод",
|
||||||
"range": "",
|
"range": "Шкала по умолчанию 0-5000ppm. Также можно выбрать 2000",
|
||||||
"ABC": ""
|
"ABC": "Автокалибровка. По умолчанию включена. Раз в сутки на 20 мин. надо выставлять на свежий воздух.",
|
||||||
|
"pin": "пин получения значений по ШИМ. Esp8266: GPIO 15 - D8, ESP32: GPIO 21, > MHZ19: PWM желтый провод",
|
||||||
|
"maxRetriesNotAvailable": "Максимальное количество попыток опроса сенсора по ШИМ. (может задерживать контроллер)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"defActive": false,
|
"defActive": false,
|
||||||
|
|||||||
@@ -14,55 +14,86 @@ extern IoTGpio IoTgpio;
|
|||||||
|
|
||||||
#include "SdsDustSensor.h"
|
#include "SdsDustSensor.h"
|
||||||
|
|
||||||
//встроена в ядро для 8266, для 32 по этому же имени обращаемся к другой библиотеке plerup/EspSoftwareSerial
|
//#define __DEBUG_SDS_DUST_SENSOR__
|
||||||
#include <SoftwareSerial.h>
|
|
||||||
|
int rxPinSDS; // Esp8266: 14/D5 – подключаем к Tx сенсора
|
||||||
|
int txPinSDS; // Esp8266: 16/D0 – подключаем к Rx сенсора
|
||||||
|
|
||||||
|
// SdsDustSensor sds(rxPinSDS, txPinSDS);
|
||||||
|
SdsDustSensor *sds = nullptr;
|
||||||
|
|
||||||
// to do убрать глобальный экземпляр
|
|
||||||
#ifdef ESP8266
|
|
||||||
int rxPinSDS = 13; // D7 – подключаем к Tx сенсора
|
|
||||||
int txPinSDS = 12; // D6 – подключаем к Rx сенсора
|
|
||||||
SdsDustSensor sds(rxPinSDS, txPinSDS);
|
|
||||||
#endif
|
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
#include <HardwareSerial.h>
|
#include <HardwareSerial.h>
|
||||||
HardwareSerial sdsSerial(2);
|
HardwareSerial sdsSerial(2);
|
||||||
SdsDustSensor sds(sdsSerial);
|
// SdsDustSensor sds(sdsSerial);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned int warmUp;
|
int retryDelayMs = 5;
|
||||||
unsigned int period;
|
int maxRetriesNotAvailable = 100;
|
||||||
|
unsigned int purge = 30;
|
||||||
|
unsigned int interval = 300;
|
||||||
|
unsigned int purgeDelay = 270;
|
||||||
|
unsigned int continuous = 0;
|
||||||
|
bool startUp = true;
|
||||||
|
|
||||||
|
TickerScheduler ts_sds(2);
|
||||||
|
|
||||||
|
enum TimerTask_t_sds
|
||||||
|
{
|
||||||
|
WAKEUP,
|
||||||
|
PRINT
|
||||||
|
};
|
||||||
|
|
||||||
|
int firstSensor = 0;
|
||||||
bool SDS011_init_flag = true;
|
bool SDS011_init_flag = true;
|
||||||
void SDS011_init();
|
void SDS011_init();
|
||||||
float Sds011request(int sensorID);
|
void Sds011request(int sensorID);
|
||||||
|
|
||||||
|
IoTItem *item_Sds011_25 = nullptr; // pointer
|
||||||
|
IoTItem *item_Sds011_10 = nullptr;
|
||||||
|
|
||||||
//Это файл сенсора, в нем осуществляется чтение сенсора.
|
//Это файл сенсора, в нем осуществляется чтение сенсора.
|
||||||
//для добавления сенсора вам нужно скопировать этот файл и заменить в нем текст 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");
|
{
|
||||||
#ifdef ESP8266
|
item_Sds011_25 = this;
|
||||||
|
|
||||||
rxPinSDS = jsonReadInt(parameters, "rxPin");
|
rxPinSDS = jsonReadInt(parameters, "rxPin");
|
||||||
txPinSDS = jsonReadInt(parameters, "txPin");
|
txPinSDS = jsonReadInt(parameters, "txPin");
|
||||||
#endif
|
|
||||||
warmUp = jsonReadInt(parameters, "warmUp"); // сек. пробужнение должен быть больше
|
purge = jsonReadInt(parameters, "purge"); // сек. пробужнение должен быть больше
|
||||||
period = jsonReadInt(parameters, "period"); // сек. время зарогрева/продувки, затем идут замеры
|
interval = jsonReadInt(parameters, "int"); // сек. время зарогрева/продувки, затем идут замеры
|
||||||
|
continuous = jsonReadInt(parameters, "continuousMode"); // сек. время зарогрева/продувки, затем идут замеры
|
||||||
|
maxRetriesNotAvailable = jsonReadInt(parameters, "maxRetriesNotAvailable"); // сек. время зарогрева/продувки, затем идут замеры
|
||||||
|
retryDelayMs = jsonReadInt(parameters, "retryDelayMs"); // сек. время зарогрева/продувки, затем идут замеры
|
||||||
|
if (continuous)
|
||||||
|
{
|
||||||
|
SerialPrint("i", "Sensor Sds011", "Continuous mode");
|
||||||
|
ts_sds.remove(PRINT);
|
||||||
|
ts_sds.remove(WAKEUP);
|
||||||
|
}
|
||||||
|
purgeDelay = interval - purge;
|
||||||
|
|
||||||
|
SDS011_init();
|
||||||
|
firstSensor = 0;
|
||||||
}
|
}
|
||||||
//=======================================================================================================
|
//=======================================================================================================
|
||||||
// doByInterval()
|
// doByInterval()
|
||||||
@@ -72,41 +103,70 @@ class Sds011_25 : public IoTItem {
|
|||||||
//если у сенсора несколько величин то делайте несколько regEvent
|
//если у сенсора несколько величин то делайте несколько regEvent
|
||||||
//не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции
|
//не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции
|
||||||
//и выполнить за несколько тактов
|
//и выполнить за несколько тактов
|
||||||
void doByInterval() {
|
void doByInterval()
|
||||||
|
{
|
||||||
SDS011_init();
|
SDS011_init();
|
||||||
Serial.println("request from 25");
|
// SerialPrint("i", "Sensor Sds011", "Request for 2.5");
|
||||||
value.valD = Sds011request(25);
|
Sds011request(25);
|
||||||
|
// value.valD = Sds011request(25);
|
||||||
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. Здесь вы можете выполнять методы инициализации сенсора.
|
|
||||||
//Такие как ...begin и подставлять в них параметры полученные из web интерфейса.
|
Sds011_10(String parameters) : IoTItem(parameters)
|
||||||
//Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции:
|
{
|
||||||
// jsonReadStr, jsonReadBool, jsonReadInt
|
item_Sds011_10 = this;
|
||||||
Sds011_10(String parameters) : IoTItem(parameters) {
|
|
||||||
// _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"); // сек. пробужнение должен быть больше
|
purge = jsonReadInt(parameters, "purge"); // сек. пробужнение должен быть больше
|
||||||
period = jsonReadInt(parameters, "period"); // сек. время зарогрева/продувки, затем идут замеры
|
interval = jsonReadInt(parameters, "int"); // сек. время зарогрева/продувки, затем идут замеры
|
||||||
|
continuous = jsonReadInt(parameters, "continuousMode"); // сек. время зарогрева/продувки, затем идут замеры
|
||||||
|
if (continuous)
|
||||||
|
{
|
||||||
|
SerialPrint("i", "Sensor Sds011", "Continuous mode");
|
||||||
|
ts_sds.remove(PRINT);
|
||||||
|
ts_sds.remove(WAKEUP);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("i", "Sensor Sds011", "WakeUp mode");
|
||||||
|
}
|
||||||
|
purgeDelay = interval - purge;
|
||||||
|
SDS011_init();
|
||||||
|
firstSensor = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//луп выполняющий переодическое дерганье
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
ts_sds.update();
|
||||||
|
if (enableDoByInt)
|
||||||
|
{
|
||||||
|
currentMillis = millis();
|
||||||
|
difference = currentMillis - prevMillis;
|
||||||
|
if (difference >= _interval)
|
||||||
|
{
|
||||||
|
prevMillis = millis();
|
||||||
|
this->doByInterval();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//=======================================================================================================
|
//=======================================================================================================
|
||||||
// doByInterval()
|
// doByInterval()
|
||||||
@@ -117,12 +177,13 @@ class Sds011_10 : public IoTItem {
|
|||||||
//не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции
|
//не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции
|
||||||
//и выполнить за несколько тактов
|
//и выполнить за несколько тактов
|
||||||
|
|
||||||
void doByInterval() {
|
void doByInterval()
|
||||||
|
{
|
||||||
SDS011_init();
|
SDS011_init();
|
||||||
Serial.println("request from 10");
|
// SerialPrint("i", "Sensor Sds011", "Request for 10ppm");
|
||||||
value.valD = Sds011request(10);
|
Sds011request(10);
|
||||||
|
// value.valD = Sds011request(10);
|
||||||
regEvent(value.valD, "Sds011_10"); //обязательный вызов хотяб один
|
// regEvent(value.valD, "Sds011_10"); //обязательный вызов хотяб один
|
||||||
}
|
}
|
||||||
~Sds011_10(){};
|
~Sds011_10(){};
|
||||||
};
|
};
|
||||||
@@ -130,71 +191,148 @@ class Sds011_10 : public IoTItem {
|
|||||||
//после замены названия сенсора, на функцию можно не обращать внимания
|
//после замены названия сенсора, на функцию можно не обращать внимания
|
||||||
//если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть
|
//если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть
|
||||||
//создание и контроль соответствующих глобальных переменных
|
//создание и контроль соответствующих глобальных переменных
|
||||||
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) {
|
void Sds011request(int sensorID)
|
||||||
float reply = 0;
|
{
|
||||||
static int a = 0;
|
float pm25 = 0;
|
||||||
static float pm25 = 0;
|
float pm10 = 0;
|
||||||
static float pm10 = 0;
|
|
||||||
static int startMillis = millis();
|
|
||||||
|
|
||||||
if (a == 0) {
|
if (firstSensor == 0)
|
||||||
Serial.print("SDS011 ... warmUp = ");
|
firstSensor = sensorID;
|
||||||
Serial.print(warmUp);
|
|
||||||
Serial.print(" period = ");
|
if (firstSensor == sensorID)
|
||||||
Serial.println(period);
|
{
|
||||||
sds.wakeup();
|
if (!continuous)
|
||||||
startMillis = millis();
|
{
|
||||||
a = a + 1;
|
ts_sds.remove(PRINT);
|
||||||
}
|
ts_sds.remove(WAKEUP);
|
||||||
if (a == 1 && millis() >= (startMillis + warmUp * 1000)) {
|
}
|
||||||
PmResult pm = sds.readPm();
|
|
||||||
if (pm.isOk()) {
|
PmResult pm = sds->readPm();
|
||||||
|
// SerialPrint("i", "Sensor Sds011", "sds.readPm()");
|
||||||
|
if (pm.isOk())
|
||||||
|
{
|
||||||
pm25 = pm.pm25;
|
pm25 = pm.pm25;
|
||||||
pm10 = pm.pm10;
|
pm10 = pm.pm10;
|
||||||
Serial.print("PM2.5 = ");
|
// SerialPrint("i", "Sensor Sds011", pm.toString());
|
||||||
Serial.print(pm25);
|
|
||||||
Serial.print(" PM10 = ");
|
if (item_Sds011_25 && pm25)
|
||||||
Serial.println(pm10);
|
{
|
||||||
a = a + 1;
|
item_Sds011_25->value.valD = pm25;
|
||||||
sds.sleep();
|
item_Sds011_25->regEvent(item_Sds011_25->value.valD, "Sds011_25");
|
||||||
} else {
|
}
|
||||||
Serial.print("Could not read values from sensor 25, reason: ");
|
|
||||||
Serial.println(pm.statusToString());
|
if (item_Sds011_10 && pm10)
|
||||||
a = a + 1;
|
{
|
||||||
|
item_Sds011_10->value.valD = pm10;
|
||||||
|
item_Sds011_10->regEvent(item_Sds011_10->value.valD, "Sds011_10");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
String msg = "Could not read values from sensor. Reason: " + pm.statusToString();
|
||||||
|
SerialPrint("E", "Sensor Sds011", msg);
|
||||||
|
SDS011_init_flag = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!continuous)
|
||||||
|
{
|
||||||
|
sds->sleep();
|
||||||
|
SerialPrint("i", "Sensor Sds011", "sleep");
|
||||||
|
String msg = "wakeUp planned in " + String(purgeDelay) + " seconds";
|
||||||
|
SerialPrint("i", "Sensor Sds011", msg);
|
||||||
|
ts_sds.add(
|
||||||
|
PRINT, purgeDelay * 1000, [](void *)
|
||||||
|
{ SerialPrint("i", "Sensor Sds011", "delayed wakeUp"); },
|
||||||
|
nullptr, false);
|
||||||
|
ts_sds.add(
|
||||||
|
WAKEUP, purgeDelay * 1000, [](void *)
|
||||||
|
{ sds->wakeup(); },
|
||||||
|
nullptr, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (a > 1 && millis() >= (startMillis + period * 1000)) {
|
else
|
||||||
Serial.println("end of period for pm25");
|
{
|
||||||
a = 0;
|
//пропускаем вызов от второго сенсора
|
||||||
}
|
}
|
||||||
if (sensorID == 25) {
|
|
||||||
reply = pm25;
|
return;
|
||||||
}
|
|
||||||
if (sensorID == 10) {
|
|
||||||
reply = pm10;
|
|
||||||
}
|
|
||||||
return reply;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDS011_init() {
|
void SDS011_init()
|
||||||
if (SDS011_init_flag) {
|
{
|
||||||
sds.begin();
|
if (SDS011_init_flag)
|
||||||
Serial.println(sds.queryFirmwareVersion().toString()); // prints firmware version
|
{
|
||||||
// Serial.println(sds.setActiveReportingMode().toString()); //
|
|
||||||
String ReportingMode = sds.setActiveReportingMode().toString();
|
#ifdef ESP8266
|
||||||
Serial.println(ReportingMode);
|
|
||||||
if (ReportingMode == "Mode: active") {
|
if (!sds)
|
||||||
|
{
|
||||||
|
Serial.println("no sds, creating");
|
||||||
|
sds = new SdsDustSensor(rxPinSDS, txPinSDS, retryDelayMs, maxRetriesNotAvailable);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serial.println("sds already created");
|
||||||
|
}
|
||||||
|
|
||||||
|
sds->begin(9600);
|
||||||
|
delay(200); //
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ESP32
|
||||||
|
sdsSerial.begin(9600, SERIAL_8N1, rxPinSDS, txPinSDS);
|
||||||
|
delay(200);
|
||||||
|
if (!sds)
|
||||||
|
{
|
||||||
|
Serial.println("no sds, creating");
|
||||||
|
sds = new SdsDustSensor(sdsSerial, retryDelayMs, maxRetriesNotAvailable);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serial.println("sds already created");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (startUp)
|
||||||
|
{
|
||||||
|
sds->wakeup();
|
||||||
|
SerialPrint("i", "Sensor Sds011", "wakeup on startUp"); // уже начинаем продувку
|
||||||
|
startUp = false;
|
||||||
|
}
|
||||||
|
String msg = sds->queryFirmwareVersion().toString(); //
|
||||||
|
SerialPrint("i", "Sensor Sds011", msg);
|
||||||
|
String ReportingMode = sds->setActiveReportingMode().toString();
|
||||||
|
|
||||||
|
if (ReportingMode == "Mode: active")
|
||||||
|
{
|
||||||
|
SerialPrint("i", "Sensor Sds011", ReportingMode);
|
||||||
SDS011_init_flag = false;
|
SDS011_init_flag = false;
|
||||||
|
if (continuous)
|
||||||
|
{
|
||||||
|
sds->wakeup();
|
||||||
|
SerialPrint("i", "Sensor Sds011", "wakeUp if continuous");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ReportingMode += " - check wiring!";
|
||||||
|
SerialPrint("E", "Sensor Sds011", ReportingMode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"menuSection": "Сенсоры",
|
"menuSection": "Сенсоры",
|
||||||
"configItem": [
|
"configItem": [
|
||||||
{
|
{
|
||||||
"name": "SDS011 PM25 Датчик пыли",
|
"name": "SDS011 PM25 Пыль",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sds011_25",
|
"subtype": "Sds011_25",
|
||||||
"id": "pmuart25",
|
"id": "pmuart25",
|
||||||
@@ -12,14 +12,16 @@
|
|||||||
"plus": 0,
|
"plus": 0,
|
||||||
"multiply": 1,
|
"multiply": 1,
|
||||||
"round": 10,
|
"round": 10,
|
||||||
"rxPin": 13,
|
"rxPin": 14,
|
||||||
"txPin": 12,
|
"txPin": 16,
|
||||||
"int": 15,
|
"int": 270,
|
||||||
"warmUp": 30,
|
"purge": 30,
|
||||||
"period": 300
|
"continuousMode": 0,
|
||||||
|
"maxRetriesNotAvailable": 100,
|
||||||
|
"retryDelayMs": 5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "SDS011 PM10 Датчик пыли",
|
"name": "SDS011 PM10 Пыль",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sds011_10",
|
"subtype": "Sds011_10",
|
||||||
"id": "pmuart10",
|
"id": "pmuart10",
|
||||||
@@ -29,33 +31,34 @@
|
|||||||
"plus": 0,
|
"plus": 0,
|
||||||
"multiply": 1,
|
"multiply": 1,
|
||||||
"round": 10,
|
"round": 10,
|
||||||
"rxPin": 13,
|
"rxPin": 14,
|
||||||
"txPin": 12,
|
"txPin": 16,
|
||||||
"int": 15,
|
"int": 270,
|
||||||
"warmUp": 30,
|
"purge": 30,
|
||||||
"period": 300
|
"continuousMode": 0,
|
||||||
|
"maxRetriesNotAvailable": 100,
|
||||||
|
"retryDelayMs": 5
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"about": {
|
"about": {
|
||||||
"authorName": "Alex K",
|
"authorName": "Alex K",
|
||||||
"authorContact": "https://t.me/cmche",
|
"authorContact": "https://t.me/cmche",
|
||||||
"authorGit": "",
|
"authorGit": "https://github.com/CHE77/SDS011forIotManager",
|
||||||
"specialThanks": "",
|
"specialThanks": "",
|
||||||
"moduleName": "Sds011",
|
"moduleName": "Sds011",
|
||||||
"moduleVersion": "1.0",
|
"moduleVersion": "2.0 - можно переназначать пины, за один опрос - обновляются два элемента",
|
||||||
"usedRam": 15,
|
|
||||||
"subTypes": [
|
|
||||||
"Sds011_25",
|
|
||||||
"Sds011_10"
|
|
||||||
],
|
|
||||||
"title": "Датчик пыли",
|
|
||||||
"moduleDesc": "Позволяет получить значения концентрации пыли в воздухе с Sds011.",
|
"moduleDesc": "Позволяет получить значения концентрации пыли в воздухе с Sds011.",
|
||||||
"propInfo": {
|
"propInfo": {
|
||||||
"int": "Количество секунд между опросами датчика.",
|
"plus": "поправочный коэффиент +c",
|
||||||
"rxPin": "",
|
"multiply": "поправочный коэффиент k*",
|
||||||
"txPin": "",
|
"round": "округление",
|
||||||
"warmUp": "",
|
"rxPin": "Esp8266: GPIO 14 - D5, ESP32: GPIO 16 - RX2, > подключаем к TXD сенсора",
|
||||||
"period": ""
|
"txPin": "Esp8266: GPIO 16 - D0, ESP32: GPIO 17 - TX2, > подключаем к RXD сенсора",
|
||||||
|
"int": "Количество секунд между опросами датчика",
|
||||||
|
"purge": "Время продувки сенсора перед замером. Cек.",
|
||||||
|
"continuousMode": "1 - Непрерывный режим, 0 - Режим с остановкой (щедящий)",
|
||||||
|
"maxRetriesNotAvailable": "Количество попыток ожидания ответа сенсора при опросе (не нужно менять)",
|
||||||
|
"retryDelayMs": "Задержка между попытками, миллисекунды (не нужно менять)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"defActive": false,
|
"defActive": false,
|
||||||
|
|||||||
Reference in New Issue
Block a user