In jedem Browser LED schalten oder die Temperatur auslesen

Damit von einem Smartphone, Tablet, Desktop etc. über den Browser eine Lampe geschaltet oder einem zB. Temperatur-Sensor etwas ausgelesen wird werden kann, benötigt man einen Microcontroller mit Wifi.

In diesem kleinen Projekt wird gezeigt, wie ein ESP8266 (NodeMCU) die Werte eines DHT22 ausliest und im lokalen Netzwerk einen kleinen Webserver bereitstellt der diese Werte anzeigt und wie die Onboard LED (bei mir Blau) im Browser geschaltet wird.

Um einen DHT22-Sensor (PCB-Version) mit einem Arduino zu verwenden, müssen Sie den Sensor an das Arduino-Board anschließen und die erforderlichen Bibliotheken installieren. Der DHT22-Sensor kann über seine Pins mit dem Arduino-Board verbunden werden. Pin 1 des DHT22 sollte mit dem 3,3 oder auch 5V-Pin am Arduino verbunden werden, Pin 2 sollte mit einem digitalen Pin am Arduino (zum Beispiel Pin D1) verbunden werden und Pin 3 sollte mit dem GND-Pin am Arduino verbunden werden.

Sie müssen auch die DHT-Sensor-Bibliothek und die Adafruit Unified Sensor Driver-Bibliothek installieren. Diese Bibliotheken können über den Bibliotheksmanager in der Arduino-IDE installiert werden.
Des weiteren wird auch die Bibliothek „ESP8266WiFi“ benötigt.

Hardware:

NodeMCU ESP8266
Temperatursensor DHT22

Verdrahtung:

Quellcode:

#include <ESP8266WiFi.h>
#include "DHT.h"

#define DHTPIN 5     // NodeMCU/DHT22Data Pin D1 = GPIO 5
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
const char* ssid = "AP-Name";    //  Your Wi-Fi Name
const char* password = "password";   // Wi-Fi Password

WiFiServer server(80);
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  dht.begin();
  // prepare LED
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 0);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print(F("Connecting to "));
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
  }
  Serial.println();
  Serial.println(F("WiFi connected"));

  // Start the server
  server.begin();
  Serial.println(F("Server started"));

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.accept();
  if (!client) { return; }
  Serial.println(F("Neuer Browser User"));

  client.setTimeout(5000);  // default is 1000


  // Reading temperature or humidity takes about 250 milliseconds!
  // 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(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  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"));
  String req = client.readStringUntil('\r');
  Serial.println(F("request: "));
  Serial.println(req);

  // Match the request
  int val;
  if (req.indexOf(F("/gpio/0")) != -1) {
    val = 0;
  } else if (req.indexOf(F("/gpio/1")) != -1) {
    val = 1;
  } else {
    Serial.println(F("invalid request"));
    val = digitalRead(LED_BUILTIN);
  }

  // Set LED according to the request
  digitalWrite(LED_BUILTIN, val);

  // read/ignore the rest of the request
  // do not client.flush(): it is for output only, see below
  while (client.available()) {
    // byte by byte is not very efficient
    client.read();
  }

  // Send the response to the client
  // it is OK for multiple small client.print/write,
  // because nagle algorithm will group them into one single packet
  client.print(F("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nLED schalten und Raumtemperatur ausgeben "));
  client.print(F("<br><br>GPIO ist derzeit "));
  client.print((val) ? F("low") : F("high"));
  client.print(F("<br><br>Klick <a href='http://"));
  client.print(WiFi.localIP());
  client.print(F("/gpio/1'>hier</a> um Onboard LED auszuschalten, oder <a href='http://"));
  client.print(WiFi.localIP());
  client.print(F("/gpio/0'>hier</a> um Onboard LED einzuschalten.</html>"));
  client.print(F("<br><br>Temperatur im Raum ist "));
  client.print(t);
  client.print(F("<br><br>Luftfeuchtigkeit im Raum ist "));
  client.print(h);


  // The client will actually be *flushed* then disconnected
  // when the function returns and 'client' object is destroyed (out-of-scope)
  // flush = ensure written data are received by the other side
  Serial.println(F("Disconnecting from client"));
}
, , ,