/* xsns_58_dht12.ino - DHT12 I2C temperature and humidity sensor support for Tasmota Copyright (C) 2019 Stefan Oskamp and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifdef USE_I2C #ifdef USE_DHT12 /*********************************************************************************************\ * DHT12 - Temperature and Humidity * * I2C Address: 0x5C \*********************************************************************************************/ #define XSNS_58 58 #define XI2C_41 41 // See I2CDEVICES.md #define DHT12_ADDR 0x5C struct DHT12 { float temperature = NAN; float humidity = NAN; uint8_t valid = 0; uint8_t count = 0; char name[6] = "DHT12"; } Dht12; bool Dht12Read(void) { if (Dht12.valid) { Dht12.valid--; } Wire.beginTransmission(DHT12_ADDR); Wire.write(0); if (Wire.endTransmission() != 0) { return false; } delay(50); Wire.requestFrom(DHT12_ADDR, 5); delay(5); uint8_t humidity = Wire.read(); uint8_t humidityTenth = Wire.read(); uint8_t temp = Wire.read(); uint8_t tempTenth = Wire.read(); uint8_t checksum = Wire.read(); Dht12.humidity = ConvertHumidity( (float) humidity + (float) humidityTenth/(float) 10.0 ); Dht12.temperature = ConvertTemp( (float) temp + (float) tempTenth/(float) 10.0 ); if (isnan(Dht12.temperature) || isnan(Dht12.humidity)) { return false; } Dht12.valid = SENSOR_MAX_MISS; return true; } /********************************************************************************************/ void Dht12Detect(void) { if (I2cActive(DHT12_ADDR)) { return; } if (Dht12Read()) { I2cSetActiveFound(DHT12_ADDR, Dht12.name); Dht12.count = 1; } } void Dht12EverySecond(void) { if (uptime &1) { // DHT12: 55mS if (!Dht12Read()) { AddLogMissed(Dht12.name, Dht12.valid); } } } void Dht12Show(bool json) { if (Dht12.valid) { char temperature[33]; dtostrfd(Dht12.temperature, Settings.flag2.temperature_resolution, temperature); char humidity[33]; dtostrfd(Dht12.humidity, Settings.flag2.humidity_resolution, humidity); if (json) { ResponseAppend_P(JSON_SNS_TEMPHUM, Dht12.name, temperature, humidity); #ifdef USE_DOMOTICZ if ((0 == tele_period)) { DomoticzTempHumSensor(temperature, humidity); } #endif // USE_DOMOTICZ #ifdef USE_KNX if (0 == tele_period) { KnxSensor(KNX_TEMPERATURE, Dht12.temperature); KnxSensor(KNX_HUMIDITY, Dht12.humidity); } #endif // USE_KNX #ifdef USE_WEBSERVER } else { WSContentSend_PD(HTTP_SNS_TEMP, Dht12.name, temperature, TempUnit()); WSContentSend_PD(HTTP_SNS_HUM, Dht12.name, humidity); #endif // USE_WEBSERVER } } } /*********************************************************************************************\ * Interface \*********************************************************************************************/ bool Xsns58(uint8_t function) { if (!I2cEnabled(XI2C_41)) { return false; } bool result = false; if (FUNC_INIT == function) { Dht12Detect(); } else if (Dht12.count) { switch (function) { case FUNC_EVERY_SECOND: Dht12EverySecond(); break; case FUNC_JSON_APPEND: Dht12Show(1); break; #ifdef USE_WEBSERVER case FUNC_WEB_SENSOR: Dht12Show(0); break; #endif // USE_WEBSERVER } } return result; } #endif // USE_DHT12 #endif // USE_I2C