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>
2020-10-23 21:09:01 +00:00
bool bmp180init_ok = false ;
2020-10-10 13:50:59 +00:00
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-29 17:53:05 +00:00
# ifdef SENSOR_HS1101
struct sensordata dataHS1101 ;
float value_humidityHS1101 = 0 ;
# define HUMARRAYSIZE 11
//from HS1101 datasheet https://www.parallax.com/sites/default/files/downloads/27920-Humidity-Sensor-Datasheet.pdf
static const unsigned int out_humidity [ ] = { 1000 , 900 , 800 , 700 , 600 , 500 , 400 , 300 , 200 , 100 , 0 } ; //*10, gets later devided by 10
static const unsigned int in_hs1101frequency [ ] = { 6033 , 6186 , 6330 , 6468 , 6600 , 6728 , 6853 , 6976 , 7100 , 7224 , 7351 } ;
float getHumidity_HS1101 ( int pin ) ;
int get_mapped ( const unsigned int * _in , const unsigned int * _out , byte size , int val ) ;
# endif
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-23 21:09:01 +00:00
bool bh1750init_ok = false ;
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-10-30 08:23:05 +00:00
# ifdef SENSOR_ML8511
//ML8511 UV Sensor outputs an analog voltage. ML8511PIN needs to be an ADC pin
sensordata dataML8511 ;
float getUV_ML8511 ( int pin ) ;
float mapfloat ( float x , float in_min , float in_max , float out_min , float out_max ) ;
2020-10-30 16:51:03 +00:00
float value_uvML8511 = 0 ; //uvIntensity (mW/cm^2)
2020-10-30 08:23:05 +00:00
# endif
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-23 21:09:01 +00:00
# ifdef SENSOR_TCS34725
# include "Adafruit_TCS34725.h"
2020-10-29 17:53:05 +00:00
//Connect SCL to D1, SDA to D2, GND and 3v3
2020-10-23 21:09:01 +00:00
Adafruit_TCS34725 tcs = Adafruit_TCS34725 ( TCS34725_INTEGRATIONTIME_700MS , TCS34725_GAIN_1X ) ;
bool tcs34725init_ok = false ;
struct sensordata dataTCS34725_lux ;
struct sensordata dataTCS34725_colortemp ;
uint16_t value_colortemp , value_tcs_lux , value_tcs_r , value_tcs_g , value_tcs_b , value_tcs_c ;
unsigned long lastread_tcs34725 = 0 ;
# endif
2020-10-30 16:51:03 +00:00
# ifdef SENSOR_ANEMOMETER
// ## ANEMOMETER ##
sensordata dataAnemometer ;
//unsigned long anemometer_timeLastReset=0;
unsigned long anemometer_lasttimereset = 0 ;
uint16_t anemometer_pulsecounter = 0 ; //counted pulses since last reset
//boolean anemometer_update_flag=false;
//unsigned long anemometer_lastPulse=0; //time for max calculation
//uint16_t anemometer_mintime=65535; //minimum time for this minute
//#define ANEMOMETER_MINTIMES_SIZE 4
//uint8_t anemometer_mintimepos=0;
//uint16_t anemometer_mintimes[ANEMOMETER_MINTIMES_SIZE];
# define ANEMOMETER_PPMtoMPS 0.0208640462;
float value_anemometer = 0 ; // [m/s]
void ICACHE_RAM_ATTR interrupt_anemometer ( ) ;
void updateAnemometer ( ) ;
# 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
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 " ) ;
2020-10-23 21:09:01 +00:00
} else {
bmp180init_ok = true ; //stays false if init failed, sensor will not be read in loop
2020-10-10 13:50:59 +00:00
}
# 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-29 17:53:05 +00:00
# ifdef SENSOR_HS1101
Serial . println ( " initializing hs1101 " ) ;
# ifdef dataHS1101_minchange
dataHS1101 . minchange = dataHS1101_minchange ;
# endif
# endif
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 " ) ) ;
2020-10-23 21:09:01 +00:00
bh1750init_ok = true ;
2020-10-02 17:45:33 +00:00
} 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
2020-10-30 08:23:05 +00:00
# ifdef SENSOR_ML8511
Serial . println ( " initializing ml8511 " ) ;
pinMode ( ML8511PIN , INPUT ) ;
# ifdef dataML8511_minchange
dataML8511 . minchange = dataML8511_minchange ;
# endif
# endif
2020-10-02 17:45:33 +00:00
# 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-10-23 21:09:01 +00:00
# ifdef SENSOR_TCS34725
Serial . println ( " initializing tcs34725 " ) ;
if ( ! tcs . begin ( ) ) {
Serial . println ( " No TCS34725 found! " ) ;
} else {
tcs34725init_ok = true ;
}
# ifdef dataTCS34725_lux_minchange
dataTCS34725_lux . minchange = dataTCS34725_lux_minchange ;
# endif
# ifdef dataTCS34725_colortemp_minchange
dataTCS34725_colortemp . minchange = dataTCS34725_colortemp_minchange ;
# endif
# endif
2020-10-30 16:51:03 +00:00
# ifdef SENSOR_ANEMOMETER
pinMode ( ANEMOMETERPIN , INPUT_PULLUP ) ;
attachInterrupt ( digitalPinToInterrupt ( ANEMOMETERPIN ) , interrupt_anemometer , CHANGE ) ; //anemometer interrupt
# ifdef dataAnemometer_minchange
dataAnemometer . minchange = dataAnemometer_minchange ;
# endif
# ifdef dataAnemometer_readdelay
dataAnemometer . readdelay = dataAnemometer_readdelay ;
# endif
# ifdef dataAnemometer_senddelaymax
dataAnemometer . senddelaymax = dataAnemometer_senddelaymax ;
# 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
2020-10-29 17:53:05 +00:00
# ifdef SENSOR_HS1101
# if defined(SENSOR_DHT22)
sensorNode . advertise ( " humidity_hs1101 " ) ;
# else
sensorNode . advertise ( " humidity " ) ;
# endif
# endif
2020-10-02 17:45:33 +00:00
# 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-30 08:23:05 +00:00
# ifdef SENSOR_ML8511
sensorNode . advertise ( " uv " ) ;
analogRead ( ML8511PIN ) ; //first read adc. just to avoid problems
# 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-10-23 21:09:01 +00:00
# ifdef SENSOR_TCS34725
# if defined(SENSOR_LDR) || defined(SENSOR_BH1750)
sensorNode . advertise ( " light_tcs " ) ;
# else
sensorNode . advertise ( " light " ) ;
# endif
sensorNode . advertise ( " colortemp " ) ;
# endif
2020-10-30 16:51:03 +00:00
# ifdef SENSOR_ANEMOMETER
sensorNode . advertise ( " windspeed " ) ;
# 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-29 17:53:05 +00:00
# ifdef SENSOR_HS1101
void loop_HS1101 ( ) {
sensordata & d = dataHS1101 ;
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
value_humidityHS1101 = getHumidity_HS1101 ( HS1101PIN ) ; //hum %
if ( fabs ( d . lastsentvalue - value_humidityHS1101 ) > = d . minchange ) {
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
Serial . print ( " Sending HS1101. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
checkESPStatus ( ) ;
# if defined(SENSOR_DHT22)
Homie . getLogger ( ) < < " humidity hs1101 " < < " : " < < value_humidityHS1101 < < endl ;
sensorNode . setProperty ( " humidity_hs1101 " ) . send ( String ( value_humidityHS1101 ) ) ;
# else
Homie . getLogger ( ) < < " humidity " < < " : " < < value_humidityHS1101 < < endl ;
sensorNode . setProperty ( " humidity " ) . send ( String ( value_humidityHS1101 ) ) ;
# endif
d . lastsentvalue = value_humidityHS1101 ;
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-30 08:23:05 +00:00
# ifdef SENSOR_ML8511
void loop_ML8511 ( )
{
sensordata & d = dataML8511 ;
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
Serial . print ( " analogRead= " ) ; Serial . println ( analogRead ( ML8511PIN ) ) ;
value_uvML8511 = getUV_ML8511 ( ML8511PIN ) ; //uvIntensity (mW/cm^2)
if ( fabs ( d . lastsentvalue - value_uvML8511 ) > = d . minchange ) {
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
Serial . print ( " Sending uv ML8511. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
checkESPStatus ( ) ;
Homie . getLogger ( ) < < " uv " < < " : " < < value_uvML8511 < < endl ;
sensorNode . setProperty ( " uv " ) . send ( String ( value_uvML8511 ) ) ;
d . lastsentvalue = value_uvML8511 ;
d . lastsent = millis ( ) ;
}
}
# 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-10-23 21:09:01 +00:00
# ifdef SENSOR_TCS34725
void loop_TCS34725_lux ( )
{
sensordata & d = dataTCS34725_lux ;
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
if ( millis ( ) > = ( lastread_tcs34725 + d . readdelay ) ) {
tcs . getRawData ( & value_tcs_r , & value_tcs_g , & value_tcs_b , & value_tcs_c ) ;
}
value_tcs_lux = tcs . calculateLux ( value_tcs_r , value_tcs_g , value_tcs_b ) ;
if ( abs ( ( int ) d . lastsentvalue - value_tcs_lux ) > = d . minchange ) { //int abs
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
Serial . print ( " Sending TCS Lux. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
checkESPStatus ( ) ;
Homie . getLogger ( ) < < " light tcs " < < " : " < < value_tcs_lux < < endl ;
# if defined(SENSOR_LDR) || defined(SENSOR_BH1750)
sensorNode . setProperty ( " light_tcs " ) . send ( String ( value_tcs_lux ) ) ;
# else
sensorNode . setProperty ( " light " ) . send ( String ( value_tcs_lux ) ) ;
# endif
d . lastsentvalue = value_tcs_lux ;
d . lastsent = millis ( ) ;
}
}
void loop_TCS34725_colortemp ( )
{
sensordata & d = dataTCS34725_colortemp ;
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
if ( millis ( ) > = ( lastread_tcs34725 + d . readdelay ) ) {
tcs . getRawData ( & value_tcs_r , & value_tcs_g , & value_tcs_b , & value_tcs_c ) ;
}
// colorTemp = tcs.calculateColorTemperature(r, g, b);
value_colortemp = tcs . calculateColorTemperature_dn40 ( value_tcs_r , value_tcs_g , value_tcs_b , value_tcs_c ) ;
if ( abs ( ( int ) d . lastsentvalue - value_colortemp ) > = d . minchange ) { //int abs
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
Serial . print ( " Sending TCS colortemp. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
checkESPStatus ( ) ;
Homie . getLogger ( ) < < " colortemp tcs " < < " : " < < value_colortemp < < endl ;
sensorNode . setProperty ( " colortemp " ) . send ( String ( value_colortemp ) ) ;
d . lastsentvalue = value_colortemp ;
d . lastsent = millis ( ) ;
}
}
# endif
2020-10-10 13:50:59 +00:00
2020-10-30 16:51:03 +00:00
# ifdef SENSOR_ANEMOMETER
void loop_anemometer ( )
{
/*
if ( anemometer_update_flag ) {
anemometer_update_flag = false ;
//anemometer_mintime=0;
for ( int i = 0 ; i < ANEMOMETER_MINTIMES_SIZE ; i + + ) {
if ( anemometer_mintime < anemometer_mintimes [ i ] & & anemometer_mintimes [ i ] ! = 0 ) { //use longest time (=slowest speed) in array as max speed, reduces false readings. =0 -> initial value, ignore (not enough roations counted)
anemometer_mintime = anemometer_mintimes [ i ] ;
}
}
} */
sensordata & d = dataAnemometer ;
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
uint16_t _anepulsesPerMinute = anemometer_pulsecounter / ( ( millis ( ) - anemometer_lasttimereset ) / 60000.0 ) ;
value_anemometer = _anepulsesPerMinute * ANEMOMETER_PPMtoMPS ;
if ( abs ( ( int ) d . lastsentvalue - value_anemometer ) > = d . minchange ) { //int abs
_changed = true ;
}
d . lastreadtime = millis ( ) ;
}
if ( _changed | | millis ( ) > = ( d . lastsent + d . senddelaymax ) ) {
Serial . print ( " Sending windspeed. reason= " ) ;
if ( _changed ) Serial . println ( " change " ) ; else Serial . println ( " time " ) ;
checkESPStatus ( ) ;
Homie . getLogger ( ) < < " windspeed tcs " < < " : " < < value_anemometer < < endl ;
sensorNode . setProperty ( " windspeed " ) . send ( String ( value_anemometer ) ) ;
//reset when sent. makes it more accurate but keeps fast response
anemometer_pulsecounter = 0 ; //reset counter
anemometer_lasttimereset = millis ( ) ;
d . lastreadtime = millis ( ) ; //also set lastread time to avoid having 1 count with a low time = high windspeed
d . lastsentvalue = value_anemometer ;
d . lastsent = millis ( ) ;
}
}
# endif
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
2020-10-23 21:09:01 +00:00
if ( bmp180init_ok ) {
loop_BMP180_temperature ( ) ;
loop_BMP180_pressure ( ) ;
}
2020-10-10 13:50:59 +00:00
# endif
2020-10-29 17:53:05 +00:00
# ifdef SENSOR_HS1101
loop_HS1101 ( ) ;
# endif
2020-10-02 17:45:33 +00:00
# ifdef SENSOR_BH1750
2020-10-23 21:09:01 +00:00
if ( bh1750init_ok ) {
loop_BH1750 ( ) ;
}
2020-10-02 17:45:33 +00:00
# endif
2020-10-30 08:23:05 +00:00
# ifdef SENSOR_ML8511
loop_ML8511 ( ) ;
# 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-23 21:09:01 +00:00
# ifdef SENSOR_TCS34725
if ( tcs34725init_ok ) {
loop_TCS34725_lux ( ) ;
loop_TCS34725_colortemp ( ) ;
}
# endif
2020-10-30 16:51:03 +00:00
# ifdef SENSOR_ANEMOMETER
loop_anemometer ( ) ;
# 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
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-29 17:53:05 +00:00
# endif
# ifdef SENSOR_HS1101
float getHumidity_HS1101 ( int pin ) {
# define HS1101_SAMPLES 512
double freq = 0 ;
//for(unsigned int j=0; j<SAMPLES; j++) freq+= 500000/pulseIn(pin, LOW, 1000);
for ( unsigned int j = 0 ; j < HS1101_SAMPLES ; j + + ) freq + = 1000000 / ( pulseIn ( pin , HIGH , 1000 ) + pulseIn ( pin , LOW , 1000 ) ) ; //both high and low because signal has not 50% duty cycle
freq = freq / HS1101_SAMPLES ;
if ( freq > 2000 & & freq < 10000 ) { //in roughly valid range
return get_mapped ( in_hs1101frequency , out_humidity , HUMARRAYSIZE , freq ) / 10.0 ;
} else { //error
return - 1 ;
}
}
2020-10-30 08:23:05 +00:00
# endif
# ifdef SENSOR_ML8511
float getUV_ML8511 ( int pin ) {
float uvadc = 3.06 / 1023 * analogRead ( pin ) ; //assumes 1023 = 3.069V (10-bit adc on esp8266)
return max ( mapfloat ( uvadc , 0.99 , 2.8 , 0.0 , 15.0 ) , 0.0F ) ; //uvIntensity (mW/cm^2)
}
# endif
2020-10-29 17:53:05 +00:00
2020-10-30 16:51:03 +00:00
# ifdef SENSOR_ANEMOMETER
void ICACHE_RAM_ATTR interrupt_anemometer ( )
{
anemometer_pulsecounter + + ;
}
# endif
2020-10-30 08:23:05 +00:00
/*##################################
* # # # # # # # # HELPER FUNCTIONS # # # # # # # #
*/
2020-10-29 17:53:05 +00:00
//quelle: https://groups.google.com/forum/#!topic/souliss/1kMAltPB2ME[1-25]
int get_mapped ( const unsigned int * _in , const unsigned int * _out , byte size , int val ) //map with constrain
{
// take care the value is within range
// val = constrain(val, _in[0], _in[size-1]);
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-30 08:23:05 +00:00
//The Arduino Map function but for floats
//From: http://forum.arduino.cc/index.php?topic=3922.0
float mapfloat ( float x , float in_min , float in_max , float out_min , float out_max )
{
return ( x - in_min ) * ( out_max - out_min ) / ( in_max - in_min ) + out_min ;
}