sensoresp/src/sensor_dht22.cpp

151 lines
3.9 KiB
C++

// Digital pin connected to the DHT sensor. // dht pins: 1=power, 2=data, 3=NC, 4=GND. 10k from data to power needed
#ifndef Adafruit_Sensor_H
#include <Adafruit_Sensor.h> //required for dht library
#define Adafruit_Sensor_H
#endif
#include <DHT.h>
#ifndef SENSORDATA_H
#include "sensordata.h"
#define SENSORDATA_H
#endif
#ifndef HOMIE_H
#include <Homie.h>
#define HOMIE_H
#endif
class Sensor_DHT22
{
private:
DHT *dht;
HomieNode *sensorNode; //reference to HomieNode
struct sensordata dataDHT22_temperature; //struct values are changed in setup()
struct sensordata dataDHT22_humidity; //struct values are changed in setup()
void loop_DHT22_temperature();
void loop_DHT22_humidity();
public:
Sensor_DHT22(int pin);
void init();
void setSettings_Temperature(float minchange, unsigned long senddelaymax, unsigned long readdelay);
void setSettings_Humidity(float minchange, unsigned long senddelaymax, unsigned long readdelay);
void advertise(HomieNode& p_sensorNode);
void loop();
};
Sensor_DHT22::Sensor_DHT22(int pin)
{
dht = new DHT(pin,DHT22,11); //default:11
}
void Sensor_DHT22::init() //Things to be done during setup()
{
Serial.println("initializing dht");
dht->begin();
}
//Also called during setup()
void Sensor_DHT22::setSettings_Temperature(float minchange, unsigned long senddelaymax, unsigned long readdelay)
{
dataDHT22_temperature.minchange=minchange;
dataDHT22_temperature.senddelaymax=senddelaymax;
dataDHT22_temperature.readdelay=readdelay;
}
//Also called during setup()
void Sensor_DHT22::setSettings_Humidity(float minchange, unsigned long senddelaymax, unsigned long readdelay)
{
dataDHT22_humidity.minchange=minchange;
dataDHT22_humidity.senddelaymax=senddelaymax;
dataDHT22_humidity.readdelay=readdelay;
}
//Called during setup
void Sensor_DHT22::advertise(HomieNode& p_sensorNode)
{
sensorNode = &p_sensorNode;
#ifndef SENSOR_BMP180
sensorNode->advertise("temperature");
#else
sensorNode->advertise("temperature_dht");
#endif
sensorNode->advertise("humidity");
}
void Sensor_DHT22::loop()
{
loop_DHT22_temperature();
loop_DHT22_humidity();
}
void Sensor_DHT22::loop_DHT22_temperature()
{
sensordata &d=dataDHT22_temperature;
bool _changed=false;
if (millis() >= (d.lastreadtime+d.readdelay)) {
d.value = dht->readTemperature();
if (fabs(d.lastsentvalue-d.value)>=d.minchange){
_changed=true;
}
d.lastreadtime=millis();
}
if (_changed || millis() >= (d.lastsent+d.senddelaymax)) {
Serial.print("Sending DHT22_temperature. reason=");
if (_changed) Serial.println("change"); else Serial.println("time");
if (!(isnan(d.value) == 1)){ //success
#ifndef SENSOR_BMP180
sensorNode->setProperty("temperature").send(String(d.value));
Homie.getLogger() << "temperature " << ": " << d.vlaue << endl;
#else
sensorNode->setProperty("temperature_dht").send(String(d.value));
Homie.getLogger() << "temperature_dht " << ": " << d.value << endl;
#endif
d.lastsentvalue=d.value;
}
d.lastsent=millis();
}
}
void Sensor_DHT22::loop_DHT22_humidity()
{
sensordata &d=dataDHT22_humidity;
bool _changed=false;
if (millis() >= (d.lastreadtime+d.readdelay)) {
d.value = dht->readHumidity();
if (fabs(d.lastsentvalue-d.value)>=d.minchange){
_changed=true;
}
d.lastreadtime=millis();
}
if (_changed || millis() >= (d.lastsent+d.senddelaymax)) {
Serial.print("Sending DHT22_humidity. reason=");
if (_changed) Serial.println("change"); else Serial.println("time");
if (!(isnan(d.value) == 1)){ //success
Homie.getLogger() << "humidity " << ": " << d.value << endl;
sensorNode->setProperty("humidity").send(String(d.value));
d.lastsentvalue=d.value;
}
d.lastsent=millis();
}
}