I need assistance, I'm new to Arduino and I'm running a DHT11 sensor on NodeMCU 1.0 board, I find on many trends that this sensor is inaccurate mostly on the humidity readings, which brings me to my question, I want to add/subtract a percentage from the reading that comes from the sensor that displays on the HTML page. Could anyone assist, please?
PS I attached the code im using.
include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include "DHT.h"
// Uncomment one of the lines below for whatever DHT sensor type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
MDNSResponder mdns;
// Replace with your network details
const char* ssid = "Temperature_Server";
const char* password = "vishaworld.com";
ESP8266WebServer server(80);
String webPage = "";
// DHT Sensor
const int DHTPin = 4;
DHT dht(DHTPin, DHTTYPE);
static char celsiusTemp[7];
static char fahrenheitTemp[7];
static char humidityTemp[7];
float h, t, f;
void setup(void) {
IPAddress Ip(10, 10, 10, 10);
IPAddress NMask(255, 255, 255, 0);
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(Ip, Ip, NMask);
WiFi.softAP(ssid, password);
delay(1000);
Serial.begin(9600);
Serial.println("");
// Wait for connection
delay(5000);
Serial.println("");
Serial.print("SoftAP IP address: ");
Serial.println(WiFi.localIP());
dht.begin();
if (mdns.begin("esp8266", WiFi.localIP())) {
Serial.println("MDNS responder started");
}
server.on("/", []() {
webPage = "";
webPage += "<!DOCTYPE HTML>";
webPage += "<html>";
webPage += "<head></head><body><h1>Temperature and Humidity</h1><h3>Temperature in Celsius: ";
webPage += "<meta http-equiv=\"refresh\" content=\"6\">" ;
webPage += celsiusTemp;
webPage += "*C</h3><h3>Temperature in Fahrenheit: ";
webPage += fahrenheitTemp;
webPage += "*F</h3><h3>Humidity: ";
webPage += humidityTemp;
webPage += "%</h3><h3>";
webPage += "</body></html>";
server.send(200, "text/html", webPage);
});
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
server.handleClient();
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
strcpy(celsiusTemp, "Failed");
strcpy(fahrenheitTemp, "Failed");
strcpy(humidityTemp, "Failed");
}
else {
// Computes temperature values in Celsius + Fahrenheit and Humidity
float hic = dht.computeHeatIndex(t, h, false);
dtostrf(hic, 6, 2, celsiusTemp);
float hif = dht.computeHeatIndex(f, h);
dtostrf(hif, 6, 2, fahrenheitTemp);
dtostrf(h, 6, 2, humidityTemp);
}
delay(2000);
}
I would probably put the code to modify the humidity reading after it is read from the sensor. That way the reading of the humidity from the sensor along with the correction are in the same location hence easy to find.
A snippet from your code:
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// modify the humidity reading to provide a correction to the value
h = h + h * humidityCorrectionPercentage;
Then near the top of the file where the humidity sensor define is located I would make a change something like the following:
// Uncomment one of the lines below for whatever DHT sensor type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
// humidity sensor reading modification to modify the reading to more accurate value
// percentage in decimal form so 10% is 0.10 or 25% is 0.25
// use positive vale to increase the reading and a negative value to decrease the reading.
// specify a value of zero if no modification of the reading is needed.
const float humidityCorrectionPercentage = .10;