MINT - Unterricht  mit  Arduino und anderen

Client-Webserver

Dieses Projekt soll veranschaulichen, wie ein klassisches Client-Server-Konzept realisiert werden kann: Mit Hilfe eines Sketches (Client), einer NodeMCU und einem DHT22 sollen Temperatur- und Luftfeuchtewerte ermittelt, über WLAN und Internet an einen Webserver übergeben und mit Hilfe von PHP-Scripten in einer Datenbank gespeichert werden. 

Eine detaillierte Anleitung, wie ein Webserver mit den dazugehörigen Komponenten eingerichtet wird, gibt es hier als Download.

Die nachfolgende Abbildung zeigt die benötigte Hardware zum Ermitteln von Wetterdaten wie Temperatur und Luftfeuchte:

Der Sensor DHT22 wird von einer NodeMCU überwacht. Von links nach rechts betrachtet ist der erste Stift mit 3V, der zweite mit D4 und der rechte mit GND der NodeMCU verbunden. Der dritte Stift bleibt frei. Zudem überbrückt ein 10 Kiloohm Widerstand die ersten beiden Stifte. 

Hier der dazu passende Sketch:

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

#define DHTTYPE DHT22
//#define DHTPIN 13 //DHT22 an Pin 13 des Breakout-Moduls von Adafruit
#define DHTPIN 2 //DHT22 an Pin 4 der Nodemcu

const char* ssid     = "Router-Kennung";
const char* password = "Passwort";
const char* host = "mint-unt.de"; //

DHT dht(DHTPIN, DHT22, 15);

void setup(void) {

  dht.begin();

  Serial.begin(115200);
  delay(10);

  // Verbindung zum WLAN-Netzwerk herstellen

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(WiFi.status());
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {

  Serial.print("connecting to ");
  Serial.println(host);

  // DHT 22 auslesen und Daten im seriellen Monitor anzeigen.

  float h = dht.readHumidity();
  float t = dht.readTemperature();
  delay(2000);

  if (isnan(h) || isnan(t)) {
    Serial.println("Leseversuch vom DHT22 gescheitert!");
  }

  Serial.println();
  Serial.print("Temperatur: ");
  Serial.println(t);
  Serial.print("Luftfeuchte: ");
  Serial.println(h);
  Serial.println("");
  delay(5000);

  // Einen Client erzeugen, der eine Verbindung zum Webserver

  // eines Dienstanbieters herstellen kann.

  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }

  // Einen Identifikator (Uniform Resource dentifiere - URI) erzeugen,
  // um den Zugriff auf die Datenbank zu ermöglichen und die Messwerte zu übergeben.

  String url = "/Wetterstation/insertValues.php";
  url += "?temp=";
  url += (t);
  url += "&hum=";
  url += (h);

  Serial.print("Requesting URL: ");
  Serial.println(url);

  // Auftrag an den Server schicken
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  delay(1000);

  // Alle Antworten des Servers lesen und im seriellen Monitor anzeigen.

  Serial.println("Respond:");
  while (client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");
  delay(60000);
}

Statt des DHT22 kann auch ein BME280 eingesetzt werden, mit dem zusätzlich zur Temperatur und Luftfeuchte der Luftdruck ermittelt werden kann.

Node MCU und der BME280 sind wie folgt verbunden: 3V - VCC, G - GND, D2 - SDA, D1 - SCL.

 

Zum Betreiben des BME280 sind folgende Anpassungen am obigen Code nötig:


#include "Adafruit_BME280.h"     // ersetzt DHT.h 

...

Adafruit_BME20 bme;       // ersetzt DHT dht(DHTPIN, DHT22, 15); 

...

bme.begin();      // ersetzt dht.begin();

...

float p = bme.readPressure() / 100.0F;      // kommt hinzu

float h = bme.readHumidity();           // "bme" ersetzt "dht" 

float t = bme.readTemperature();          // "bme" ersetzt "dht"

...

Serial.print("Luftdruck: ");    // kommt hinzu
Serial.println(p); 

...

url += "?pres=";       // kommt hinzu

url += (p);

url += "&temp=";      // Ein "&" ersetzt das "?" vor "temp"


Sollten sich beim Aufspielen des Progammcodes auf die NodeMCU Schwierigkeiten ergeben, sollten alle Hardware-Komponenten abgezogen und die Programmierung ohne sie wiederholt werden.

 


Statt der NodeMCU kann auch ein Adafruit Huzzah ESP8266 Breakout eingesetzt werden. In der Programmierung muss der Pin angegeben werden, an dem das Signal des DHT-Sensors aufläuft, in dem hier gezeigten Beispiel Pin 13.

Vor den Überspielen des Programms müssen in der Arduino-IDE unter >Board das "Adafruit HUZZAH ESP8266" und der dazugehörige COM-Port eingestellt werden. Danach den Reset- und GPIO0-Knopf auf dem Board betätigen. Leuchtet die rote LED, den Reset-Knopf loslassen. Die zuerst hell leuchtende LED glimmt danach schwach weiter als Zeichen, dass das Board programmierbereit ist. Dann das Programm wie gewohnt hochladen.


 

Mit dem Adafruit Huzzah ESP8266 kann der BME280 ebenfalls genutzt werden.

Anschlüsse BME280 - HUZZAH: GND - GND, VCC - 3V, SDA - #4, SCL - #5.

Nicht vergessen: Vor dem Hochladen des Codes mit Hilfe der Reset- und GPIO0-Tasten die rote LED zum Glimmen bringen (vgl.oben).



 

Den BME280 gibt es hier.