2020-08-15 17:45:02 +00:00
//#define DEBUG
2020-10-10 13:50:59 +00:00
//Compile with platformio run --environment sensorespx
2020-10-14 21:32:25 +00:00
//Compile and upload: platformio run --environment sensorespx -t upload
//Spiffs data upload with (comment in data_dir line unter platformio section): platformio run --environment sensorespx -t uploadfs
2020-10-10 13:50:59 +00:00
2020-10-02 17:45:33 +00:00
//GPIO2 is blue led on wemos_d1
2020-08-16 09:09:12 +00:00
2020-10-02 17:45:33 +00:00
# include "Arduino.h"
# include <Homie.h>
# define FW_NAME "sensoresp" //gets printed on topic/$fw/name
# define FW_VERSION "1.0.0" //gets printed on topic/$fw/version
2020-08-15 17:45:02 +00:00
2020-10-02 18:28:14 +00:00
2020-10-02 17:45:33 +00:00
struct sensordata
{
2020-10-02 18:28:14 +00:00
unsigned long lastreadtime = 0 ;
2020-10-03 10:21:18 +00:00
unsigned long readdelay = 1000 * 10 ; //polling delay
2020-10-02 18:28:14 +00:00
float minchange = 0 ; //send new value if difference to last sent value is greater than this
float lastsentvalue = 0 ;
unsigned long lastsent = 0 ;
2020-10-02 21:25:33 +00:00
unsigned long senddelaymax = 1000 * 60 * 5 ; //maximum time until current value is send
2020-10-02 18:28:14 +00:00
} ;
2020-08-15 17:45:02 +00:00
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_DHT22
2020-10-10 13:50:59 +00:00
// Digital pin connected to the DHT sensor. // dht pins: 1=power, 2=data, 3=NC, 4=GND. 10k from data to power needed
2020-10-02 17:45:33 +00:00
# include <Adafruit_Sensor.h> //required for dht library
# include <DHT.h>
DHT dht ( DHTPIN , DHT22 , 11 ) ; //default:11
2020-10-02 18:28:14 +00:00
struct sensordata dataDHT22_temperature ; //struct values are changed in setup()
2020-10-02 21:25:33 +00:00
float value_temperatureDHT = 0 ;
2020-10-02 18:28:14 +00:00
struct sensordata dataDHT22_humidity ; //struct values are changed in setup()
2020-10-02 21:25:33 +00:00
float value_humidityDHT = 0 ;
2020-10-10 13:50:59 +00:00
# endif
# ifdef SENSOR_BMP180
//Connect SCL to D1, SDA to D2, GND and 3v3
# include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp180 ;
struct sensordata dataBMP180_temperature ; //struct values are changed in setup()
float value_temperatureBMP = 0 ;
struct sensordata dataBMP180_pressure ; //struct values are changed in setup()
float value_pressureBMP = 0 ;
2020-10-02 17:45:33 +00:00
# endif
2020-08-15 17:45:02 +00:00
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_BH1750
2020-10-10 13:50:59 +00:00
//SCL=D1, SDA=D2
2020-10-02 17:45:33 +00:00
# include <Wire.h>
# include <BH1750.h>
BH1750 lightMeter ( 0x23 ) ;
2020-10-02 18:28:14 +00:00
sensordata dataBH1750 ;
2020-10-02 21:25:33 +00:00
float value_lightBH1750 = 0 ;
2020-10-02 17:45:33 +00:00
# endif
2020-08-16 09:09:12 +00:00
2020-08-15 17:45:02 +00:00
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_PIR
2020-10-14 21:32:25 +00:00
// PIR Sensors HC-SR501 (modified to put out shortest pulse time short pins 5 and 6 of ic)
//pir sensor needs 5v through an inductor for filtering. output level is 3.3v
2020-10-02 18:28:14 +00:00
sensordata dataPIR ;
2020-10-02 21:25:33 +00:00
bool value_PIR = false ;
2020-10-02 17:45:33 +00:00
# endif
2020-08-15 17:45:02 +00:00
2020-10-10 13:50:59 +00:00
# ifdef SENSOR_LDR
struct sensordata dataLDR ;
float value_ldr = 0 ;
# ifdef SENSOR_LDR_CALIB1
# define LDRARRAYSIZE 18
//black wire of ldr connects to A0 with 10k to gnd. red wire connects with 1k to gnd and 2k2 to 3v3
static const unsigned int out_ldr [ ] = { 0 , 30 , 50 , 60 , 130 , 170 , 250 , 420 , 780 , 1300 , 2600 , 5000 , 5350 , 7700 , 10900 , 12000 , 17000 , 20000 } ; // x10 (i.e. gets later divided by 10)
static const unsigned int in_ldr [ ] = { 0 , 12 , 100 , 150 , 350 , 400 , 450 , 650 , 730 , 780 , 840 , 930 , 948 , 970 , 993 , 1005 , 1019 , 1023 } ; // 0 - 1023
# endif
2020-10-23 20:13:32 +00:00
int get_lux ( const unsigned int * _in , const unsigned int * _out , byte size ) ; //for analog ldr light calculation
2020-10-10 13:50:59 +00:00
# endif
2020-10-14 21:32:25 +00:00
# ifdef SENSOR_MHZ19
struct sensordata dataMHZ19 ;
/*
* MHZ19 Library : https : //platformio.org/lib/show/1620/SevSegSPI
* Software Serial Library : https : //platformio.org/lib/show/168/EspSoftwareSerial
* SDS018 example : https : //github.com/crystaldust/sds018/blob/master/sds018.ino
*/
// SW Serial
//SW Serial RX: to mhz19 tx (green cable)
//SW Serial TX: to mhz19 rx (blue cable)
2020-10-23 07:14:43 +00:00
//co2 sensor needs 5v. Maybe better to Connect USB 5V directly (not through wemos d1 onboard diode which gives only 4.7V! at '5V' output)
2020-10-14 21:32:25 +00:00
2020-10-15 21:13:25 +00:00
//if ABC is disabled (see in setup function) sensor should be calibrated manually. leave outdoors (=400ppm) with no direct sunlight for >20min, then connect HD pin to GND for at least 7 seconds.
2020-10-22 18:31:52 +00:00
/* Pinout (view from top, connector at the bottom)
* Vin , GND , NC , PWM
* | | | |
* / - - - - - - - - - - - - - - - - - \
* | |
* | |
* | |
* | |
* \ - - - - - - - - - - - - - - - - - /
* | | | | |
* Vo Rx Tx NC HD
2020-10-23 07:14:43 +00:00
*
* [ Connector ]
2020-10-22 18:31:52 +00:00
*/
2020-10-15 21:13:25 +00:00
2020-10-23 07:14:43 +00:00
# ifndef SOFTWARESERIAL_H
2020-10-14 21:32:25 +00:00
# include <SoftwareSerial.h>
2020-10-23 07:14:43 +00:00
# define SOFTWARESERIAL_H
# endif
2020-10-14 21:32:25 +00:00
SoftwareSerial mhz19_swSerial ;
# define BAUD_RATE_MHZ19 9600
# include <MHZ19.h>
MHZ19 mhz19 ;
bool mhz19_ready = false ;
int value_co2 = - 1 ; //[ppm]
2020-10-22 21:00:33 +00:00
int mhz19_readValue_reimplemented ( Stream * _streamRef , MHZ19 * _mhz19Ref ) ; //declare function
2020-10-14 21:32:25 +00:00
# endif
2020-10-10 13:50:59 +00:00
2020-10-23 07:14:43 +00:00
# ifdef SENSOR_SDS018
struct sensordata dataSDS018_pm25 ;
struct sensordata dataSDS018_pm10 ;
//SDS18 dust sensor for 2.5µm and 10µm
//Needs 5V
bool sds018_dustok = false ;
float value_pm25 = - 1 ;
float value_pm10 = - 1 ;
# ifndef SOFTWARESERIAL_H
# include <SoftwareSerial.h>
# define SOFTWARESERIAL_H
# endif
SoftwareSerial sds018_swSerial ;
# define BAUD_RATE_SDS018 9600
unsigned long lastread_sds018 = 0 ; //to save last read time for both readings
void readSDS018 ( ) ;
# endif
2020-10-02 17:45:33 +00:00
// data/homie/config.json hochladen mit platformio run --target uploadfs
// config contains homie device name, mqtt ip and wifi credentials
2020-08-15 17:45:02 +00:00
2020-10-02 17:45:33 +00:00
/*
float humidity ; //[%RH] DHT
float temperature ; //[deg C] DHT
float light ; //[Lux] BH1750
bool movement //true bei pir output hight, false wenn low HC12?501?
*/
2020-08-15 17:45:02 +00:00
2020-10-02 17:45:33 +00:00
HomieNode sensorNode ( " sensors " , " Sensors " , " sensors " ) ; //id, name, type
2020-08-15 17:45:02 +00:00
char tempstring [ 16 ] ; //for dtostrf
void loopHandler ( ) ;
2020-10-02 17:45:33 +00:00
void checkESPStatus ( ) ;
2020-08-15 17:45:02 +00:00
void setup ( ) {
Serial . begin ( 115200 ) ;
Serial . println ( ) ;
2020-10-02 17:45:33 +00:00
Serial . println ( " Booting " ) ;
2020-08-15 17:45:02 +00:00
2020-10-15 21:13:25 +00:00
delay ( 1000 ) ; //wait for sensors to get powered
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_DHT22
Serial . println ( " initializing dht " ) ;
2020-10-02 18:28:14 +00:00
dht . begin ( ) ;
2020-10-09 15:14:43 +00:00
# ifdef dataDHT22_temperature_minchange
dataDHT22_temperature . minchange = dataDHT22_temperature_minchange ;
# endif
# ifdef dataDHT22_humidity_minchange
2020-10-10 13:50:59 +00:00
dataDHT22_humidity . minchange = dataDHT22_humidity_minchange ;
# endif
# endif
# ifdef SENSOR_BMP180
2020-10-14 21:32:25 +00:00
Serial . println ( " initializing bmp180 " ) ;
2020-10-10 13:50:59 +00:00
if ( ! bmp180 . begin ( ) ) {
Serial . println ( " #ERROR: BMP180 init fail \n \n " ) ;
}
# ifdef dataBMP180_temperature_minchange
dataBMP180_temperature . minchange = dataBMP180_temperature_minchange ;
# endif
# ifdef dataBMP180_pressure_minchange
dataBMP180_pressure . minchange = dataBMP180_pressure_minchange ;
2020-10-09 15:14:43 +00:00
# endif
2020-10-02 17:45:33 +00:00
# endif
2020-08-16 09:09:12 +00:00
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_BH1750
Serial . println ( " initializing bh1750 " ) ;
2020-10-10 13:50:59 +00:00
Wire . begin ( ) ;
2020-10-02 17:45:33 +00:00
if ( lightMeter . begin ( BH1750 : : CONTINUOUS_HIGH_RES_MODE ) ) {
Serial . println ( F ( " BH1750 Advanced begin " ) ) ;
} else {
Serial . println ( F ( " Error initialising BH1750 " ) ) ;
}
2020-10-09 15:14:43 +00:00
# ifdef dataBH1750_minchange
dataBH1750 . minchange = dataBH1750_minchange ;
# endif
# ifdef dataBH1750_senddelaymax
dataBH1750 . senddelaymax = dataBH1750_senddelaymax ;
# endif
2020-10-02 17:45:33 +00:00
# endif
# ifdef SENSOR_PIR
2020-10-10 13:50:59 +00:00
Serial . println ( " initializing pir " ) ;
2020-10-02 17:45:33 +00:00
pinMode ( PIRPIN , INPUT_PULLUP ) ;
2020-10-09 15:14:43 +00:00
# ifdef dataPIR_readdelay
dataPIR . readdelay = dataPIR_readdelay ;
# endif
# ifdef dataPIR_senddelaymax
dataPIR . senddelaymax = dataPIR_senddelaymax ;
# endif
2020-10-02 17:45:33 +00:00
# endif
2020-08-15 17:45:02 +00:00
2020-10-10 13:50:59 +00:00
# ifdef SENSOR_LDR
Serial . println ( " initializing ldr " ) ;
2020-10-14 21:32:25 +00:00
pinMode ( LDR_PIN , INPUT ) ; //ldr
# ifdef dataLDR_readdelay
dataLDR . readdelay = dataLDR_readdelay ;
# endif
# ifdef dataLDR_senddelaymax
dataLDR . senddelaymax = dataLDR_senddelaymax ;
# endif
# ifdef dataLDR_minchange
dataLDR . minchange = dataLDR_minchange ;
# endif
# endif
# ifdef SENSOR_MHZ19
Serial . println ( " initializing mhz19 " ) ;
# ifdef dataMHZ19_minchange
dataMHZ19 . minchange = dataMHZ19_minchange ;
# endif
# ifdef dataMHZ19_readdelay
dataMHZ19 . readdelay = dataMHZ19_readdelay ;
# endif
mhz19_swSerial . begin ( BAUD_RATE_MHZ19 , SWSERIAL_8N1 , MHZ19_SERIAL_RX , MHZ19_SERIAL_TX , false , 256 ) ;
mhz19 . setSerial ( & mhz19_swSerial ) ;
2020-10-15 21:13:25 +00:00
uint8_t mhz19abctries = 10 ;
while ( ! mhz19 . disableABC ( ) & & mhz19abctries > 0 ) { //disable automatic baseline correction (abc does calibration every 24h -> needs to have 400ppm co2 level sometime during that time)
delay ( 500 ) ; //wait some time for mhz to be initialized
Serial . print ( " disableABC Failed! try= " ) ; Serial . println ( mhz19abctries ) ;
mhz19abctries - - ;
}
if ( mhz19abctries > 0 ) {
Serial . println ( " mhz19 abc disabled successfully " ) ;
}
2020-10-10 13:50:59 +00:00
# endif
2020-10-23 07:14:43 +00:00
# ifdef SENSOR_SDS018
Serial . println ( " initializing sds018 " ) ;
sds018_swSerial . begin ( BAUD_RATE_SDS018 , SWSERIAL_8N1 , SDS018_SERIAL_RX , SDS018_SERIAL_TX , false , 256 ) ;
# ifdef dataSDS018_pm25_minchange
dataSDS018_pm25 . minchange = dataSDS018_pm25_minchange ;
# endif
# ifdef dataSDS018_pm10_minchange
dataSDS018_pm10 . minchange = dataSDS018_pm10_minchange ;
# endif
# endif
2020-08-15 17:45:02 +00:00
2020-10-23 20:13:32 +00:00
//Homie_setFirmware(FW_NAME, FW_VERSION);
//Homie_setBrand(FW_NAME);
2020-08-15 17:45:02 +00:00
Homie_setFirmware ( FW_NAME , FW_VERSION ) ;
Homie . setLoopFunction ( loopHandler ) ;
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_DHT22
2020-10-10 13:50:59 +00:00
# ifndef SENSOR_BMP180
sensorNode . advertise ( " temperature " ) ;
# else
sensorNode . advertise ( " temperature_dht " ) ;
# endif
2020-10-02 17:45:33 +00:00
sensorNode . advertise ( " humidity " ) ;
# endif
# ifdef SENSOR_BH1750
sensorNode . advertise ( " light " ) ;
2020-10-02 21:25:33 +00:00
lightMeter . readLightLevel ( ) ; //make first reading, could be 0
2020-10-02 17:45:33 +00:00
# endif
2020-10-10 13:50:59 +00:00
# ifdef SENSOR_LDR
sensorNode . advertise ( " light " ) ;
analogRead ( LDR_PIN ) ; //first reading could be false
# endif
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_PIR
2020-10-02 21:25:33 +00:00
sensorNode . advertise ( " motion " ) ;
2020-10-02 17:45:33 +00:00
# endif
2020-10-10 13:50:59 +00:00
# ifdef SENSOR_BMP180
sensorNode . advertise ( " temperature " ) ;
sensorNode . advertise ( " pressure " ) ;
# endif
2020-10-14 21:32:25 +00:00
# ifdef SENSOR_MHZ19
sensorNode . advertise ( " co2 " ) ;
# endif
2020-10-23 07:14:43 +00:00
# ifdef SENSOR_SDS018
sensorNode . advertise ( " dust_pm25 " ) ;
sensorNode . advertise ( " dust_pm10 " ) ;
# endif
2020-08-15 17:45:02 +00:00
2020-10-10 13:50:59 +00:00
Serial . println ( " connecting.. " ) ;
2020-08-15 17:45:02 +00:00
Homie . setup ( ) ;
2020-10-10 13:50:59 +00:00
Serial . println ( " " ) ;
2020-08-15 17:45:02 +00:00
Serial . println ( " connected " ) ; //wird nicht ausgegeben. keine ahnung warum.
}
void loop ( ) {
Homie . loop ( ) ;
}
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_DHT22
2020-10-02 21:25:33 +00:00
void loop_DHT22_temperature ( )
2020-10-02 17:45:33 +00:00
{
2020-10-02 21:25:33 +00:00
sensordata & d = dataDHT22_temperature ;
bool _changed = false ;
2020-10-02 18:28:14 +00:00
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
2020-10-02 21:25:33 +00:00
value_temperatureDHT = dht . readTemperature ( ) ;
2020-10-03 10:19:44 +00:00
if ( fabs ( d . lastsentvalue - value_temperatureDHT ) > = d . minchange ) {
2020-10-02 18:28:14 +00:00
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
2020-10-02 17:45:33 +00:00
2020-10-02 18:28:14 +00:00
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
2020-10-02 21:25:33 +00:00
Serial . print ( " Sending DHT22_temperature. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
2020-10-02 18:28:14 +00:00
checkESPStatus ( ) ;
2020-10-02 17:45:33 +00:00
2020-10-02 21:25:33 +00:00
if ( ! ( isnan ( value_temperatureDHT ) = = 1 ) ) { //success
2020-10-10 13:50:59 +00:00
# ifndef SENSOR_BMP180
sensorNode . setProperty ( " temperature " ) . send ( String ( value_temperatureDHT ) ) ;
Homie . getLogger ( ) < < " temperature " < < " : " < < value_temperatureDHT < < endl ;
# else
sensorNode . setProperty ( " temperature_dht " ) . send ( String ( value_temperatureDHT ) ) ;
Homie . getLogger ( ) < < " temperature_dht " < < " : " < < value_temperatureDHT < < endl ;
# endif
2020-10-02 21:25:33 +00:00
d . lastsentvalue = value_temperatureDHT ;
2020-10-02 17:45:33 +00:00
}
2020-10-02 18:28:14 +00:00
d . lastsent = millis ( ) ;
}
2020-10-02 21:25:33 +00:00
}
2020-10-02 18:28:14 +00:00
2020-10-02 21:25:33 +00:00
void loop_DHT22_humidity ( )
{
sensordata & d = dataDHT22_humidity ;
bool _changed = false ;
2020-10-02 18:28:14 +00:00
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
2020-10-02 21:25:33 +00:00
value_humidityDHT = dht . readHumidity ( ) ;
2020-10-03 10:19:44 +00:00
if ( fabs ( d . lastsentvalue - value_humidityDHT ) > = d . minchange ) {
2020-10-02 18:28:14 +00:00
_changed = true ;
}
2020-10-02 21:25:33 +00:00
d . lastreadtime = millis ( ) ;
2020-10-02 18:28:14 +00:00
}
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
2020-10-02 21:25:33 +00:00
Serial . print ( " Sending DHT22_humidity. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
2020-10-02 18:28:14 +00:00
checkESPStatus ( ) ;
2020-10-02 21:25:33 +00:00
if ( ! ( isnan ( value_humidityDHT ) = = 1 ) ) { //success
Homie . getLogger ( ) < < " humidity " < < " : " < < value_humidityDHT < < endl ;
sensorNode . setProperty ( " humidity " ) . send ( String ( value_humidityDHT ) ) ;
d . lastsentvalue = value_humidityDHT ;
2020-10-02 17:45:33 +00:00
}
2020-10-02 18:28:14 +00:00
d . lastsent = millis ( ) ;
2020-10-02 17:45:33 +00:00
}
}
# endif
2020-10-10 13:50:59 +00:00
# ifdef SENSOR_BMP180
void loop_BMP180_temperature ( )
{
sensordata & d = dataBMP180_temperature ;
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
value_temperatureBMP = bmp180 . readTemperature ( ) ;
if ( fabs ( d . lastsentvalue - value_temperatureBMP ) > = d . minchange ) {
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
Serial . print ( " Sending BMP180_temperature. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
checkESPStatus ( ) ;
if ( ! ( isnan ( value_temperatureBMP ) = = 1 ) ) { //success
sensorNode . setProperty ( " temperature " ) . send ( String ( value_temperatureBMP ) ) ;
Homie . getLogger ( ) < < " temperature " < < " : " < < value_temperatureBMP < < endl ;
d . lastsentvalue = value_temperatureBMP ;
}
d . lastsent = millis ( ) ;
}
}
void loop_BMP180_pressure ( )
{
sensordata & d = dataBMP180_pressure ;
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
value_pressureBMP = bmp180 . readPressure ( ) / 100.0 ;
if ( fabs ( d . lastsentvalue - value_pressureBMP ) > = d . minchange ) {
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
Serial . print ( " Sending BMP180_pressure. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
checkESPStatus ( ) ;
if ( ! ( isnan ( value_pressureBMP ) = = 1 ) ) { //success
Homie . getLogger ( ) < < " pressure " < < " : " < < value_pressureBMP < < endl ;
sensorNode . setProperty ( " pressure " ) . send ( String ( value_pressureBMP ) ) ;
d . lastsentvalue = value_pressureBMP ;
}
d . lastsent = millis ( ) ;
}
}
# endif
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_BH1750
void loop_BH1750 ( )
{
2020-10-02 21:25:33 +00:00
sensordata & d = dataBH1750 ;
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
value_lightBH1750 = lightMeter . readLightLevel ( ) ; // [lux]
2020-10-03 10:19:44 +00:00
if ( fabs ( d . lastsentvalue - value_lightBH1750 ) > = d . minchange ) {
2020-10-02 21:25:33 +00:00
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
2020-10-02 17:45:33 +00:00
2020-10-02 21:25:33 +00:00
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
Serial . print ( " Sending BH1750. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
checkESPStatus ( ) ;
2020-10-02 17:45:33 +00:00
2020-10-02 21:25:33 +00:00
Homie . getLogger ( ) < < " light " < < " : " < < value_lightBH1750 < < endl ;
sensorNode . setProperty ( " light " ) . send ( String ( value_lightBH1750 ) ) ;
d . lastsentvalue = value_lightBH1750 ;
d . lastsent = millis ( ) ;
2020-10-02 17:45:33 +00:00
}
}
# endif
2020-10-10 13:50:59 +00:00
# ifdef SENSOR_LDR
void loop_LDR ( )
{
sensordata & d = dataLDR ;
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
value_ldr = get_lux ( in_ldr , out_ldr , LDRARRAYSIZE ) / 10.0 ; //read light level in lux
if ( fabs ( d . lastsentvalue - value_ldr ) > = d . minchange ) {
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
Serial . print ( " Sending LDR. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
checkESPStatus ( ) ;
Homie . getLogger ( ) < < " light " < < " : " < < value_ldr < < endl ;
sensorNode . setProperty ( " light " ) . send ( String ( value_ldr ) ) ;
d . lastsentvalue = value_ldr ;
d . lastsent = millis ( ) ;
}
}
# endif
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_PIR
void loop_PIR ( )
{
2020-10-02 21:25:33 +00:00
sensordata & d = dataPIR ;
2020-10-02 18:28:14 +00:00
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
2020-10-02 21:25:33 +00:00
if ( digitalRead ( PIRPIN ) ! = value_PIR ) {
2020-10-02 18:28:14 +00:00
_changed = true ;
2020-08-15 17:45:02 +00:00
}
2020-10-02 18:28:14 +00:00
d . lastreadtime = millis ( ) ;
2020-08-15 17:45:02 +00:00
}
2020-10-02 18:28:14 +00:00
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) { //send current value after some long time
2020-10-02 21:25:33 +00:00
Serial . print ( " Sending motion. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
2020-10-01 20:19:11 +00:00
if ( digitalRead ( PIRPIN ) ) {
2020-10-02 21:25:33 +00:00
Homie . getLogger ( ) < < " motion " < < " : " < < " true " < < endl ;
sensorNode . setProperty ( " motion " ) . send ( String ( " true " ) ) ;
value_PIR = true ;
2020-10-01 20:19:11 +00:00
} else {
2020-10-02 21:25:33 +00:00
Homie . getLogger ( ) < < " motion " < < " : " < < " false " < < endl ;
sensorNode . setProperty ( " motion " ) . send ( String ( " false " ) ) ;
value_PIR = false ;
2020-10-01 20:19:11 +00:00
}
2020-10-02 18:28:14 +00:00
d . lastsent = millis ( ) ;
2020-10-01 20:19:11 +00:00
}
2020-10-02 17:45:33 +00:00
}
# endif
2020-08-15 17:45:02 +00:00
2020-10-14 21:32:25 +00:00
# ifdef SENSOR_MHZ19
void loop_MHZ19 ( )
{
sensordata & d = dataMHZ19 ;
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
mhz19_ready = mhz19 . isReady ( ) ;
2020-10-22 21:00:33 +00:00
//value_co2=mhz19.readValue(); //[ppm]
value_co2 = mhz19_readValue_reimplemented ( & mhz19_swSerial , & mhz19 ) ; //[ppm] reimplemented function to fix no response issue
Homie . getLogger ( ) < < " read co2 " < < " : " < < value_co2 < < " status= " < < mhz19_ready < < endl ;
2020-10-14 21:32:25 +00:00
if ( fabs ( d . lastsentvalue - value_co2 ) > = d . minchange ) {
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
Serial . print ( " Sending MHZ19. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
checkESPStatus ( ) ;
Homie . getLogger ( ) < < " co2 " < < " : " < < value_co2 < < endl ;
if ( mhz19_ready ) { //send no co2 values if not warmed up. can take several miniutes
sensorNode . setProperty ( " co2 " ) . send ( String ( value_co2 ) ) ;
} else {
Homie . getLogger ( ) < < " co2 not ready. didnt sent " < < endl ;
}
d . lastsentvalue = value_co2 ;
d . lastsent = millis ( ) ;
}
}
# endif
2020-10-23 07:14:43 +00:00
# ifdef SENSOR_SDS018
void loop_SDS018_pm25 ( )
{
sensordata & d = dataSDS018_pm25 ;
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
if ( millis ( ) > = ( lastread_sds018 + d . readdelay ) ) {
readSDS018 ( ) ; //reads values into value_pm25 und value_pm10
}
//Homie.getLogger() << "read pm25: " << value_pm25 << ".read pm10: " << value_pm10 << " status=" << dust_ok << endl;
if ( fabs ( d . lastsentvalue - value_pm25 ) > = d . minchange ) {
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
Serial . print ( " Sending SDS018_pm25. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
checkESPStatus ( ) ;
Homie . getLogger ( ) < < " read pm25: " < < value_pm25 < < " status= " < < sds018_dustok < < endl ;
if ( sds018_dustok ) { //send no dust values if sensor not ok
sensorNode . setProperty ( " dust_pm25 " ) . send ( String ( value_pm25 ) ) ;
} else {
Homie . getLogger ( ) < < " sds018 dust not ok. didnt sent " < < endl ;
}
d . lastsentvalue = value_pm25 ;
d . lastsent = millis ( ) ;
}
}
void loop_SDS018_pm10 ( )
{
sensordata & d = dataSDS018_pm10 ;
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
if ( millis ( ) > = ( lastread_sds018 + d . readdelay ) ) {
readSDS018 ( ) ; //reads values into value_pm25 und value_pm10
}
//Homie.getLogger() << "read pm25: " << value_pm25 << ".read pm10: " << value_pm10 << " status=" << dust_ok << endl;
if ( fabs ( d . lastsentvalue - value_pm10 ) > = d . minchange ) {
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
Serial . print ( " Sending SDS018_pm10. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
checkESPStatus ( ) ;
2020-08-15 17:45:02 +00:00
2020-10-23 07:14:43 +00:00
Homie . getLogger ( ) < < " read pm10: " < < value_pm10 < < " status= " < < sds018_dustok < < endl ;
if ( sds018_dustok ) { //send no dust values if sensor not ok
sensorNode . setProperty ( " dust_pm10 " ) . send ( String ( value_pm10 ) ) ;
} else {
Homie . getLogger ( ) < < " sds018 dust not ok. didnt sent " < < endl ;
}
d . lastsentvalue = value_pm10 ;
d . lastsent = millis ( ) ;
}
}
# endif
2020-10-10 13:50:59 +00:00
2020-08-15 17:45:02 +00:00
2020-10-02 17:45:33 +00:00
void loopHandler ( ) {
# ifdef SENSOR_DHT22
2020-10-02 21:25:33 +00:00
loop_DHT22_temperature ( ) ;
loop_DHT22_humidity ( ) ;
2020-10-02 17:45:33 +00:00
# endif
2020-10-10 13:50:59 +00:00
# ifdef SENSOR_BMP180
loop_BMP180_temperature ( ) ;
loop_BMP180_pressure ( ) ;
# endif
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_BH1750
2020-10-02 18:28:14 +00:00
loop_BH1750 ( ) ;
2020-10-02 17:45:33 +00:00
# endif
2020-10-10 13:50:59 +00:00
# ifdef SENSOR_LDR
loop_LDR ( ) ;
# endif
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_PIR
loop_PIR ( ) ;
# endif
2020-08-15 17:45:02 +00:00
2020-10-14 21:32:25 +00:00
# ifdef SENSOR_MHZ19
loop_MHZ19 ( ) ;
# endif
2020-10-23 07:14:43 +00:00
# ifdef SENSOR_SDS018
loop_SDS018_pm25 ( ) ;
loop_SDS018_pm10 ( ) ;
# endif
2020-08-15 17:45:02 +00:00
2020-10-02 17:45:33 +00:00
2020-08-15 17:45:02 +00:00
2020-10-02 17:45:33 +00:00
}
2020-08-15 17:45:02 +00:00
2020-10-02 17:45:33 +00:00
void checkESPStatus ( )
{
if ( WiFi . status ( ) ! = WL_CONNECTED ) //restart if wifi signal loss
{
ESP . reset ( ) ;
2020-08-15 17:45:02 +00:00
}
}
2020-10-10 13:50:59 +00:00
//////////////////////////////////////////////////////////////////////////////
// Calculate lux based on rawADC reading from LDR returns value in lux/10
//////////////////////////////////////////////////////////////////////////////
//quelle: https://groups.google.com/forum/#!topic/souliss/1kMAltPB2ME[1-25]
2020-10-14 21:32:25 +00:00
# ifdef SENSOR_LDR
2020-10-10 13:50:59 +00:00
int get_lux ( const unsigned int * _in , const unsigned int * _out , byte size )
{
// take care the value is within range
// val = constrain(val, _in[0], _in[size-1]);
unsigned int val = analogRead ( LDR_PIN ) ;
# ifdef DEBUG //DEBUG++++++++++++++++
Serial . print ( " LDR RAW=: " ) ;
Serial . println ( val ) ;
# endif
if ( val < = _in [ 0 ] ) return _out [ 0 ] ;
if ( val > = _in [ size - 1 ] ) return _out [ size - 1 ] ;
// search right interval
byte pos = 1 ; // _in[0] allready tested
while ( val > _in [ pos ] ) pos + + ;
// this will handle all exact "points" in the _in array
if ( val = = _in [ pos ] ) return _out [ pos ] ;
// interpolate in the right segment for the rest
return map ( val , _in [ pos - 1 ] , _in [ pos ] , _out [ pos - 1 ] , _out [ pos ] ) ;
2020-10-14 21:32:25 +00:00
}
2020-10-22 21:00:33 +00:00
# endif
# ifdef SENSOR_MHZ19
byte mhz19_getCheckSum ( byte * packet ) {
byte checksum = 0 ;
for ( uint8_t i = 1 ; i < 8 ; i + + ) {
checksum + = packet [ i ] ;
}
checksum = 0xff - checksum ;
checksum + = 1 ;
return checksum ;
}
int mhz19_readValue_reimplemented ( Stream * _streamRef , MHZ19 * _mhz19Ref ) { //same function as in mhz19 library from klevytskyi, but with delay between cmd send and response check
byte CMD_READ [ 9 ] = { 0xFF , 0x01 , 0x86 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x79 } ; // Read command
unsigned int co2 = - 1 ;
unsigned char response [ 9 ] ;
_streamRef - > write ( CMD_READ , 9 ) ;
unsigned long _startwait = millis ( ) ;
while ( millis ( ) - _startwait < 100 ) { //wait for mhz19 to send response
//wait
}
if ( _streamRef - > available ( ) ) {
_streamRef - > readBytes ( response , 9 ) ;
byte crc = mhz19_getCheckSum ( response ) ;
if ( response [ 0 ] = = 0xFF & & response [ 1 ] = = CMD_READ [ 2 ] & & response [ 8 ] = = crc ) {
unsigned int responseHigh = ( unsigned int ) response [ 2 ] ;
unsigned int responseLow = ( unsigned int ) response [ 3 ] ;
unsigned int ppm = ( 256 * responseHigh ) + responseLow ;
co2 = ppm ;
}
}
return co2 ;
}
2020-10-23 07:14:43 +00:00
# endif
# ifdef SENSOR_SDS018
void readSDS018 ( )
{
lastread_sds018 = millis ( ) ;
// https://github.com/crystaldust/sds018/blob/master/sds018.ino
uint8_t mData = 0 ;
uint8_t mPkt [ 10 ] = { 0 } ;
uint8_t mCheck = 0 ;
while ( sds018_swSerial . available ( ) > 0 ) {
//Serial.println("serial available");
for ( int i = 0 ; i < 10 ; + + i ) {
mPkt [ i ] = sds018_swSerial . read ( ) ;
//Serial.println( mPkt[i], HEX );
}
if ( 0xC0 = = mPkt [ 1 ] ) {
Serial . println ( " read density " ) ;
// Read dust density.
// Check
uint8_t sum = 0 ;
for ( int i = 2 ; i < = 7 ; + + i ) {
sum + = mPkt [ i ] ;
}
if ( sum = = mPkt [ 8 ] ) {
uint8_t pm25Low = mPkt [ 2 ] ;
uint8_t pm25High = mPkt [ 3 ] ;
uint8_t pm10Low = mPkt [ 4 ] ;
uint8_t pm10High = mPkt [ 5 ] ;
value_pm25 = ( ( pm25High * 256.0 ) + pm25Low ) / 10.0 ;
value_pm10 = ( ( pm10High * 256.0 ) + pm10Low ) / 10.0 ;
sds018_dustok = true ;
/*Serial.print( "PM2.5: " );
Serial . print ( pm25 ) ;
Serial . print ( " \n PM10 : " ) ;
Serial . print ( pm10 ) ;
Serial . println ( ) ; */
}
}
sds018_swSerial . flush ( ) ;
}
}
2020-10-14 21:32:25 +00:00
# endif