- /*
-
- DHT MODULE
-
- Copyright (C) 2016-2017 by Xose Pérez <xose dot perez at gmail dot com>
-
- */
-
- #if DHT_SUPPORT
-
- #include <DHT.h>
- #include <Adafruit_Sensor.h>
-
- DHT dht(DHT_PIN, DHT_TYPE, DHT_TIMING);
-
- double _dhtTemperature = 0;
- unsigned int _dhtHumidity = 0;
-
- // -----------------------------------------------------------------------------
- // Values
- // -----------------------------------------------------------------------------
-
- double getDHTTemperature() {
- return _dhtTemperature;
- }
-
- unsigned int getDHTHumidity() {
- return _dhtHumidity;
- }
-
- void dhtSetup() {
-
- dht.begin();
-
- #if WEB_SUPPORT
- apiRegister(DHT_TEMPERATURE_TOPIC, DHT_TEMPERATURE_TOPIC, [](char * buffer, size_t len) {
- dtostrf(_dhtTemperature, len-1, 1, buffer);
- });
- apiRegister(DHT_HUMIDITY_TOPIC, DHT_HUMIDITY_TOPIC, [](char * buffer, size_t len) {
- snprintf_P(buffer, len, PSTR("%d"), _dhtHumidity);
- });
- #endif
-
- }
-
- void dhtLoop() {
-
- // Check if we should read new data
- static unsigned long last_update = 0;
- if ((millis() - last_update > DHT_UPDATE_INTERVAL) || (last_update == 0)) {
- last_update = millis();
-
- unsigned char tmpUnits = getSetting("tmpUnits", TMP_UNITS).toInt();
-
- // Read sensor data
- double h = dht.readHumidity();
- double t = dht.readTemperature(tmpUnits == TMP_FAHRENHEIT);
-
- // Check if readings are valid
- if (isnan(h) || isnan(t)) {
-
- DEBUG_MSG_P(PSTR("[DHT] Error reading sensor\n"));
-
- } else {
-
- _dhtTemperature = t;
- _dhtHumidity = h;
-
- char temperature[6];
- char humidity[6];
- dtostrf(t, 4, 1, temperature);
- itoa((unsigned int) h, humidity, 10);
-
- DEBUG_MSG_P(PSTR("[DHT] Temperature: %s%s\n"), temperature, (tmpUnits == TMP_CELSIUS) ? "ºC" : "ºF");
- DEBUG_MSG_P(PSTR("[DHT] Humidity: %s\n"), humidity);
-
- // Send MQTT messages
- mqttSend(getSetting("dhtTmpTopic", DHT_TEMPERATURE_TOPIC).c_str(), temperature);
- mqttSend(getSetting("dhtHumTopic", DHT_HUMIDITY_TOPIC).c_str(), humidity);
-
- // Send to Domoticz
- #if DOMOTICZ_SUPPORT
- {
- domoticzSend("dczTmpIdx", 0, temperature);
- int status;
- if (h > 70) {
- status = HUMIDITY_WET;
- } else if (h > 45) {
- status = HUMIDITY_COMFORTABLE;
- } else if (h > 30) {
- status = HUMIDITY_NORMAL;
- } else {
- status = HUMIDITY_DRY;
- }
- char buffer[2];
- snprintf_P(buffer, sizeof(buffer), PSTR("%d"), status);
- domoticzSend("dczHumIdx", humidity, buffer);
- }
- #endif
-
- #if INFLUXDB_SUPPORT
- influxDBSend(getSetting("dhtTmpTopic", DHT_TEMPERATURE_TOPIC).c_str(), temperature);
- influxDBSend(getSetting("dhtHumTopic", DHT_HUMIDITY_TOPIC).c_str(), humidity);
- #endif
-
- // Update websocket clients
- #if WEB_SUPPORT
- char buffer[100];
- snprintf_P(buffer, sizeof(buffer), PSTR("{\"dhtVisible\": 1, \"dhtTmp\": %s, \"dhtHum\": %s, \"tmpUnits\": %d}"), temperature, humidity, tmpUnits);
- wsSend(buffer);
- #endif
-
- }
-
- }
-
- }
-
- #endif
|