I'm having an issue with an IoT air conditioner, where it's DHT11 sensor is failing.
I am using a NodeMCU.
The problem changes based on the library I use.
Some libraries cause it to report a very long number. Others return negative 999.
Here's my code:
#include <DHT.h>
#include <Adafruit_Sensor.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#define DHTTYPE DHT11
const char* ssid = "**************";
const char* password = "****************";
int setTemp;
int temp;
int ledPin = 5; // GPIO13
DHT tempsens;
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
tempsens.setup(4);
Serial.println("");
Serial.println("WiFi connected");
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.print("Use this URL to connect: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {
setTemp = map(analogRead(A0),0,1024,50,100);
delay(tempsens.getMinimumSamplingPeriod()); /* Delay of amount equal to sampling period */
temp = tempsens.getTemperature(); /* Get temperature value */
Serial.print(tempsens.getStatusString()); /* Print status of communication */
Serial.print("\t");
Serial.print("\t\t");
Serial.print(temp, 1);
Serial.print("\t\t");
Serial.println(tempsens.toFahrenheit(temp), 1);
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}
// Wait until the client sends some data
Serial.println("new client");
// Read the first line of the request
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Match the request
int mde = 1;
if (request.indexOf("/SYSTEM=FAN") != -1) {
digitalWrite(ledPin, HIGH);
mde = 1;
}
if (request.indexOf("/SYSTEM=AUTO") != -1) {
mde = 2;
}
if (request.indexOf("/SYSTEM=OFF") != -1) {
digitalWrite(ledPin, LOW);
mde = 3;
}
if (mde == 2) {
if (temp >= setTemp) {
digitalWrite(ledPin, LOW);
} else {
digitalWrite(ledPin, LOW);
}
}
// Set ledPin according to the request
//digitalWrite(ledPin, value);
// Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // do not forget this one
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head><title>Server</title><script>function refresh(refreshPeriod) {setTimeout('location.reload(true)', refreshPeriod);};window.onload = refresh(15000);</script></head>");
client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n");
client.println("body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n");
client.println("p {font-size: 24px;color: #444444;margin-bottom: 10px;}</style></head>\n");
client.print("Status: ");
if(mde == 1) {
client.print("Fan on");
} else if (mde == 2){
client.print("Auto");
} else {
client.print("Off");
}
client.println("<br><br>");
client.println("<p>Current temperature: ");
client.println(String(tempsens.toFahrenheit(temp)));
client.println("</p><br>");
client.println("<p>Set temperature: ");
client.println(String(setTemp));
client.println("</p><br><br><br>");
client.println("<a href=\"/SYSTEM=FAN\"\"><button>On</button></a>");
client.println("<br>");
client.println("<a href=\"/SYSTEM=AUTO\"\"><button>Auto</button></a><br />");
client.println("<a href=\"/SYSTEM=OFF\"\"><button>Off</button></a><br />");
client.println("");
client.println("</html>");
delay(1);
Serial.println("Client disonnected");
}
String SendHTML(float Temperaturestat){
String ptr = "<!DOCTYPE html> <html>\n";
ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
ptr +="<title>Server</title><script>function refresh(refreshPeriod) {setTimeout('location.reload(true)', refreshPeriod);};window.onload = refresh(15000);</script>\n";
ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
ptr +="</style>\n";
ptr +="</head>\n";
ptr +="<body>\n";
ptr +="<div id=\"webpage\">\n";
ptr +="<h1>ESP8266 NodeMCU Weather Report</h1>\n";
ptr +="<p>Temperature: ";
ptr +=(int)Temperaturestat;
ptr +="°C</p>";
ptr +="%</p>";
ptr +="</div>\n";
ptr +="</body>\n";
ptr +="</html>\n";
return ptr;
}
Of course, the WiFi and password are replaced by my actual WiFi and password.
My wiring is correct, as I double-checked.
The NodeMCU is driving an optocoupler, which in turn is driving a relay controlling the air conditioner.
The control system works, since I can turn on and off the air conditioner manually, but the reported temperature is way off.
With the code I posted above, the returned value is 3865470720.00 C.
I'm absolutely sure that I'm not inside the Sun, so this value is very wrong.