I explained how to connect and program the Wemos D1 in the tutorial WEMOS D1 – Arduino UNO compatible board with ESP8266 chip . In this tutorial I would like to connect a DHT11 sensor and display these values on a web page.
Step 1 – The structure
The structure is relatively simple, because the DHT11 sensor has 3 or 4 pins (depending on the model).
The circuit would look like this:
Step 2 – The source code
The following source code is based on the tutorial WEMOS D1 – Arduino UNO compatible board with ESP8266 chip where I have already written a small website for the Wemos D1 R2. The page is refreshed with a reload (F5 in the browser).
#include <ESP8266WiFi.h>
#include "DHT.h"
const char* ssid = ""; //SSID aus dem Router
const char* password = ""; //Passwort für den Zugang zum WLAN
int ledPin = D5; //digitaler PIN 5 des Wemos D1 an welchem die LED angeschlossen ist.
int ledStatus = LOW; //aktueller Status der LED (default / start -> AUS)
WiFiServer server(80); //Port auf welchem der Server laufen soll.
#define DHT11PIN 2
#define DHT11TYPE DHT11
DHT dht11(DHT11PIN, DHT11TYPE);
void setup() {
Serial.begin(115200); //Baudrate für die Serielle Geschwindigkeit.
delay(10); //10ms. Warten damit die Seriele Kommunikation aufgebaut wurde.
pinMode(ledPin, OUTPUT); //Den LEDPin als ausgang setzen.
digitalWrite(ledPin, ledStatus); //Die LED initial auf den Status "AUS" setzen.
Serial.print("Aufbau der Verbindung zu: "); //Ausgabe der SSID auf der Seriellen Schnittstelle.
Serial.println(ssid);
WiFi.begin(ssid, password); //Initialisieren der Wifi Verbindung.
while (WiFi.status() != WL_CONNECTED) { //Warten bis die Verbindung aufgebaut wurde.
delay(500);
//Einen Punkt auf der Seriellen Schnittstelle ausgeben so das der Benutzer erkennt dass, das Sketch noch läuft.
Serial.print(".");
}
//Bei erfolgreicher Verbindung wird der folgende Text ausgeben.
Serial.print("Mit ");
Serial.print(ssid);
Serial.print("erfolgreich verbunden!");
dht11.begin();
server.begin(); // Starten des Servers.
Serial.println("Server gestartet"); //Ausgabe auf der Seriellen Schnittstelle das der Server gestartet wurde.
// Ausgabe der IP Adresse
Serial.print("Adresse : http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
/**
* Die Funktion gibt den HTML Kopf auf dem Client aus.
* Dieses wird für jeden Respond verwendet.
**/
void writeResponse(WiFiClient client, float tempValue, float humidityValue){
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("");
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head>");
client.println("<script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>");
client.println("<script type='text/javascript' src='http://progs.draeger-it.blog/wemosd1/dht11/gauges.js'></script>");
client.println("<link rel='stylesheet' href='http://progs.draeger-it.blog/wemosd1/dht11/styles.css'/>");
client.println("</head>");
client.println("<body>");
client.println("<div id='tempChart' class='chartContainer'></div>");
client.println("<div id='pressChart' class='chartContainer'></div>");
client.println("<script>");
client.println("google.charts.load('current', {'packages':['gauge']});");
client.println("google.charts.setOnLoadCallback(drawCharts);");
client.println("function drawCharts() {");
client.print("drawTempChart(");
client.print(tempValue);
client.print(");");
client.print("drawPressChart(");
client.print(humidityValue);
client.print(");");
client.println("}");
client.println("</script>");
client.println("</body>");
client.println("</html>");
}
void loop() {
//Prüfen ob sich ein Client verbunden hat, wenn nicht die Loop "verlassen"
WiFiClient client = server.available();
if (!client) {
return;
}
// Wenn sich ein Client verbunden hat solange warten bis Daten gesendet werden.
Serial.println("Neuer Client verbunden.");
while(!client.available()){
delay(1);
}
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
float tempValue = dht11.readTemperature(); //Temperatur vom Sensor DHT11 lesen
float humidityValue = dht11.readHumidity(); //relative Luftfeuchtigkeit vom Sensor DHT11 lesen
if (isnan(tempValue) || isnan(humidityValue)) {
Serial.println("DHT11 konnte nicht ausgelesen werden");
tempValue = 0;
humidityValue = 0;
}
writeResponse(client, tempValue, humidityValue);
delay(1); //1ms. Pause
}
#include "DHT.h"
#define DHTPIN D1
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println(F("DHTxx test!"));
dht.begin();
}
void loop() {
delay(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
float hif = dht.computeHeatIndex(f, h);
float hic = dht.computeHeatIndex(t, h, false);
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F(" C "));
Serial.print(f);
Serial.print(F(" F Heat index: "));
Serial.print(hic);
Serial.print(F(" C "));
Serial.print(hif);
Serial.println(F(" F"));
}
int analogPin = A0;
int Relay1 = D0;
int val = 0;
void setup() {
Serial.begin(115200);
pinMode(Relay1, OUTPUT);
digitalWrite(Relay1, HIGH);
}
void loop() {
val = analogRead(analogPin);
Serial.print("val = ");
Serial.println(val);
if (val > 1000) {
digitalWrite(Relay1, LOW);
}
else {
digitalWrite(Relay1, HIGH);
}
delay(1000);
}