Merge pull request #6673 from baschdello/development

Nova SDS polling enhancement
This commit is contained in:
Theo Arends 2019-10-17 17:01:33 +02:00 committed by GitHub
commit fa892d34c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 47 additions and 26 deletions

View File

@ -429,8 +429,8 @@
#define CO2_HIGH 1200 // Above this CO2 value show red light (needs PWM or WS2812 RG(B) led and enable with SetOption18 1) #define CO2_HIGH 1200 // Above this CO2 value show red light (needs PWM or WS2812 RG(B) led and enable with SetOption18 1)
#define USE_PMS5003 // Add support for PMS5003 and PMS7003 particle concentration sensor (+1k3 code) #define USE_PMS5003 // Add support for PMS5003 and PMS7003 particle concentration sensor (+1k3 code)
//#define PMS_MODEL_PMS3003 // Enable support of PMS3003 instead of PMS5003/PMS7003 (needs the USE_PMS5003 above) //#define PMS_MODEL_PMS3003 // Enable support of PMS3003 instead of PMS5003/PMS7003 (needs the USE_PMS5003 above)
#define USE_NOVA_SDS // Add support for SDS011 and SDS021 particle concentration sensor (+0k7 code) #define USE_NOVA_SDS // Add support for SDS011 and SDS021 particle concentration sensor (+1k5 code)
#define WORKING_PERIOD 5 // Working period of the SDS Sensor, Takes a reading every X Minutes #define STARTING_OFFSET 30 // Turn on NovaSDS XX-seconds before tele_period is reached
#define USE_SERIAL_BRIDGE // Add support for software Serial Bridge (+0k8 code) #define USE_SERIAL_BRIDGE // Add support for software Serial Bridge (+0k8 code)
//#define USE_MP3_PLAYER // Use of the DFPlayer Mini MP3 Player RB-DFR-562 commands: play, volume and stop //#define USE_MP3_PLAYER // Use of the DFPlayer Mini MP3 Player RB-DFR-562 commands: play, volume and stop
#define MP3_VOLUME 10 // Set the startup volume on init, the range can be 0..30(max) #define MP3_VOLUME 10 // Set the startup volume on init, the range can be 0..30(max)

View File

@ -31,14 +31,11 @@
#include <TasmotaSerial.h> #include <TasmotaSerial.h>
#ifndef WORKING_PERIOD #ifndef STARTING_OFFSET
#define WORKING_PERIOD 5 // NodaSDS sleep working period in minutes #define STARTING_OFFSET 30 // Turn on NovaSDS XX-seconds before tele_period is reached
#endif #endif
#ifndef NOVA_SDS_REINIT_CHECK #if STARTING_OFFSET < 10
#define NOVA_SDS_REINIT_CHECK 80 // NodaSDS reinitalized check in seconds #error "Please set STARTING_OFFSET >= 10"
#endif
#ifndef NOVA_SDS_QUERY_INTERVAL
#define NOVA_SDS_QUERY_INTERVAL 3 // NodaSDS query interval in seconds
#endif #endif
#ifndef NOVA_SDS_RECDATA_TIMEOUT #ifndef NOVA_SDS_RECDATA_TIMEOUT
#define NOVA_SDS_RECDATA_TIMEOUT 150 // NodaSDS query data timeout in ms #define NOVA_SDS_RECDATA_TIMEOUT 150 // NodaSDS query data timeout in ms
@ -51,11 +48,14 @@ TasmotaSerial *NovaSdsSerial;
uint8_t novasds_type = 1; uint8_t novasds_type = 1;
uint8_t novasds_valid = 0; uint8_t novasds_valid = 0;
uint8_t cont_mode = 1;
struct sds011data { struct sds011data {
uint16_t pm100; uint16_t pm100;
uint16_t pm25; uint16_t pm25;
} novasds_data; } novasds_data;
uint16_t pm100_sum;
uint16_t pm25_sum;
// NovaSDS commands // NovaSDS commands
#define NOVA_SDS_REPORTING_MODE 2 // Cmnd "data reporting mode" #define NOVA_SDS_REPORTING_MODE 2 // Cmnd "data reporting mode"
@ -68,8 +68,8 @@ struct sds011data {
#define NOVA_SDS_SET_MODE 1 // Subcmnd "set mode" #define NOVA_SDS_SET_MODE 1 // Subcmnd "set mode"
#define NOVA_SDS_REPORT_ACTIVE 0 // Subcmnd "report active mode" - Sensor received query data command to report a measurement data #define NOVA_SDS_REPORT_ACTIVE 0 // Subcmnd "report active mode" - Sensor received query data command to report a measurement data
#define NOVA_SDS_REPORT_QUERY 1 // Subcmnd "report query mode" - Sensor automatically reports a measurement data in a work period #define NOVA_SDS_REPORT_QUERY 1 // Subcmnd "report query mode" - Sensor automatically reports a measurement data in a work period
#define NOVA_SDS_WORK 0 // Subcmnd "work mode" #define NOVA_SDS_SLEEP 0 // Subcmnd "sleep mode"
#define NOVA_SDS_SLEEP 1 // Subcmnd "sleep mode" #define NOVA_SDS_WORK 1 // Subcmnd "work mode"
bool NovaSdsCommand(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint16_t sensorid, uint8_t *buffer) bool NovaSdsCommand(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint16_t sensorid, uint8_t *buffer)
@ -124,10 +124,10 @@ bool NovaSdsCommand(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint16_t sensor
void NovaSdsSetWorkPeriod(void) void NovaSdsSetWorkPeriod(void)
{ {
// set sensor working period // set sensor working period to default
NovaSdsCommand(NOVA_SDS_WORKING_PERIOD, NOVA_SDS_SET_MODE, Settings.novasds_period, NOVA_SDS_DEVICE_ID, nullptr); NovaSdsCommand(NOVA_SDS_WORKING_PERIOD, NOVA_SDS_SET_MODE, 0, NOVA_SDS_DEVICE_ID, nullptr);
// set sensor report only on query // set sensor report on query
NovaSdsCommand(NOVA_SDS_REPORTING_MODE, NOVA_SDS_SET_MODE, NOVA_SDS_REPORT_QUERY, NOVA_SDS_DEVICE_ID, nullptr); NovaSdsCommand(NOVA_SDS_REPORTING_MODE, NOVA_SDS_SET_MODE, NOVA_SDS_REPORT_QUERY, NOVA_SDS_DEVICE_ID, nullptr);
} }
bool NovaSdsReadData(void) bool NovaSdsReadData(void)
@ -146,19 +146,40 @@ bool NovaSdsReadData(void)
void NovaSdsSecond(void) // Every second void NovaSdsSecond(void) // Every second
{ {
if (0 == (uptime % NOVA_SDS_REINIT_CHECK)) { if (!novasds_valid)
if (!novasds_valid) { { //communication problem, reinit
NovaSdsSetWorkPeriod(); NovaSdsSetWorkPeriod();
} novasds_valid=1;
} else if (0 == (uptime % NOVA_SDS_QUERY_INTERVAL)) { }
if (NovaSdsReadData()) { if((Settings.tele_period - STARTING_OFFSET <= 0))
novasds_valid = 10; {
} else { if(!cont_mode)
if (novasds_valid) { { //switched to continuous mode
novasds_valid--; cont_mode = 1;
} NovaSdsCommand(NOVA_SDS_SLEEP_AND_WORK, NOVA_SDS_SET_MODE, NOVA_SDS_WORK, NOVA_SDS_DEVICE_ID, nullptr);
} }
} }
else
cont_mode = 0;
if(tele_period == Settings.tele_period - STARTING_OFFSET && !cont_mode)
{ //lets start fan and laser
NovaSdsCommand(NOVA_SDS_SLEEP_AND_WORK, NOVA_SDS_SET_MODE, NOVA_SDS_WORK, NOVA_SDS_DEVICE_ID, nullptr);
}
if(tele_period >= Settings.tele_period-5 && tele_period <= Settings.tele_period-2)
{ //we are doing 4 measurements here
if(!(NovaSdsReadData())) novasds_valid=0;
pm100_sum += novasds_data.pm100;
pm25_sum += novasds_data.pm25;
}
if(tele_period == Settings.tele_period-1)
{ //calculate the average of 4 measuremens
novasds_data.pm100 = pm100_sum >> 2;
novasds_data.pm25 = pm25_sum >> 2;
if(!cont_mode)
NovaSdsCommand(NOVA_SDS_SLEEP_AND_WORK, NOVA_SDS_SET_MODE, NOVA_SDS_SLEEP, NOVA_SDS_DEVICE_ID, nullptr); //stop fan and laser
pm100_sum = pm25_sum = 0;
}
} }
/*********************************************************************************************\ /*********************************************************************************************\