DHT22 - Wet­ter­sta­ti­on Anzei­ge im Internetbrowser

Lese­zeit: 7 Minu­ten
Navi­ga­ti­on

Die mit dem Tem­pe­ra­tur­sen­sor DHT22 gemes­se­nen Wer­te sol­len über LAN in einem Inter­net­brow­ser ange­zeigt werden.

So sieht es aus:

Der Sen­sor DHT22 misst die Tem­pe­ra­tur und die Luft­feuch­tig­keit. Das hier ver­wen­de­te Bau­teil besitzt drei Anschlüs­se.
Die Ver­si­on mit vier Pins muss in der Rei­hen­fol­ge 5V → Daten (Pin) → leer → GND geschal­tet werden.

Für die­se Auf­ga­be benö­tigst du ein soge­nann­tes „Shield“, eine Pla­ti­ne, die ein­fach auf den Ardui­no auf­ge­steckt wird. Auf ihr befin­det sich ein LAN-Anschluss (RJ45).

Benö­tig­te Bauteile:

  • Tem­pe­ra­tur­sen­sor DHT22
  • Ethernet-Shield
  • RTC-Modul DS 3231
  • Lei­tungs­dräh­te

Baue die Schal­tung auf
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Für das Pro­gramm brauchst du eine freie IP-Adresse und eine freie MAC-Adresse in dei­nem loka­len Netzwerk.

Bei­des kannst du mit dem Pro­gramm arp her­aus­fin­den:
Unter Win­dows musst du zuerst eine Ein­ga­be­auf­for­de­rung öffnen.

Auch Linux kennt den Befehl arp. 

(arp -n = nur IP-Nummern anzei­gen, eine voll­stän­di­ge Lis­te mit den Namen der Gerä­te erhältst du mit arp -a)
Zunächst musst du eine Kon­so­le öffnen.

Mit dem Befehl arp -a kannst du die IP-Adressen und die MAC-Adressen aller in dei­nem Netz­werk vor­han­de­nen Gerä­te herausfinden.

Auch Linux kennt den Befehl arp. (arp -n = nur IP-Nummern anzei­gen, eine voll­stän­di­ge Lis­te mit den Namen der Gerä­te erhältst du mit arp -a)
Zunächst musst du eine Kon­so­le öffnen.

Im Regel­fall befin­det sich in einem loka­len Netz­werk ein DHCP-Server, der jedem Gerät im Netz­werk auto­ma­tisch eine IP-Adresse zuteilt. 

Wenn die Tem­pe­ra­tur­mes­sung über einen län­ge­ren Zeit­raum (meh­re­re Tage) ein­ge­setzt wer­den soll, emp­fiehlt sich die Ver­ga­be einer fes­ten IP-Adresse, weil nach der soge­nann­ten „lea­se­time“ die IP wie­der neu ver­ge­ben wird.
Wei­te­re Informationen

Die MAC-Adresse ist die Hardware-Adresse jeder ein­zel­nen Netz­werk­schnitt­stel­le (LAN oder WLAN), mit der jedes Gerät im Netz­werk ein­deu­tig iden­ti­fi­ziert wer­den kann.

Sie besteht aus sechs Bytes in hexa­de­zi­ma­ler Schreib­wei­se, die durch „:“ oder „-“ getrennt werden.

Du kannst die im Pro­gramm ver­wen­de­te „erfun­de­ne“ MAC-Adresse über­neh­men: Die Gefahr, dass sich ein Gerät mit der glei­chen MAC-Adresse im Netz­werk befin­det, ist äußerst gering.

Benö­tig­te Biblio­the­ken:
Sketch → Biblio­thek ein­bin­den → Biblio­the­ken verwalten

Bin­de die benö­tig­ten Biblio­the­ken ein:

# include <SPI.h> 
# include <Ethernet.h> 
# include <SimpleDHT.h> 
# include <RTClib.h>

Lege die Varia­blen für das RTC-Modul und den Tem­pe­ra­tur­sen­sor fest:

// Name des RTC-Moduls 
RTC_DS3231 rtc; 

// Array der Wochentage char daysOfTheWeek[7][12] = {"Sonntag", "Montag", "Dienstag", "Mittwoch","Donnerstag", "Freitag", "Samstag"}; 
int SENSOR_DHT22 = 8; 

// Namen des Sensors (dht22) 
SimpleDHT22 dht22(SENSOR_DHT22);

Stel­le fest, wel­che IP in dei­nem loka­len Netz­werk frei ist und star­te den Server:

// MAC-Adresse im hexadezimal-System 
// jedem Wert wird 0x vorangestellt 
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; 

// IP-Adresse festlegen 
IPAddress ip(192, 168, 1, 10); 

// Ethernet-Server Bibliothek starten 
// Standard-Port 80 
EthernetServer server(80);

Der setup-Teil star­tet das RTC-Modul und for­dert über DHCP eine IP an oder legt manu­ell eine fest:

// DHCP
Ethernet.begin(mac);  

// manuelle IP 
Ethernet.begin(mac, ip);

Der setup-Teil. Beach­te die Kommentare.

void setup() 
{ 
  // RTC-Modul starten 
  rtc.begin();  
  /*  
    wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen     
    Jahr, Monat, Tag, Stunde, Minute, Sekunde  
    keine führende 0 setzen   
    Beispiel: 
    rtc.adjust(DateTime(2018, 10, 25, 7, 2, 30)); 
  */  

  Serial.begin(9600);  

  /*
    entweder ...   
    Verbindung mit MAC-Adresse und IP über DHCP starten  
    oder ...
    wenn der Versuch misslingt -> mit fester IP starten 
  */
  if (Ethernet.begin(mac) == 0)   
  {  
    Ethernet.begin(mac, ip);
  } 
  // ... oder mit fester IP starten 
  // Ethernet.begin(mac, ip);      

  // Server starten 
  server.begin(); 

  // IP im Seriellen Monitor anzeigen 
  Serial.print("IP des Servers: "); 
  Serial.println(Ethernet.localIP()); 
}

Der loop-Teil. Beach­te die Kommentare.

void loop() 
{ 
  DateTime aktuell = rtc.now(); 
  float Temperatur; 
  float Luftfeuchtigkeit;  

  // auf Clienten warten ... 
  EthernetClient client = server.available(); 

  // neue Anfrage  
  if (client) 
  {    
    // solange der Client verbunden ist ...   
    while (client.connected())  
    {  
      if (client.available())  
      {   
        char Zeichen = client.read();     
        // \n = Seite vom Clienten vollständig geladen   
        if (Zeichen == '\n')    
        {      
          Serial.print("Anfrage von: ");          
          Serial.println(client.remoteIP());       
    
          // HTTP-Anforderung senden
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");    

          // Leerzeile zwingend erforderlich
          client.println();
          /* 
            HTML-Seite aufbauen
            die folgenden Anweisungen müssen mit 
            print oder println gesendet werden    
            println "verschönert" den Quelltext
            " muss mit \" maskiert werden 
          */
          client.println("<!doctype html>"); 
          client.println("<html>");
          client.println("<body>");  

          // alle 60 Sekunden aktualisieren
          client.println("<meta http-equiv=\"refresh\" content=\"60\">");
          client.println("<h1> Temperatur und Luftfeuchtigkeit messen</h1>");
          client.println("<hr />"); 
          client.print("<h2>Letzte Messung: ");
          client.print(daysOfTheWeek[aktuell.dayOfTheWeek()]);
          client.print(" ");
          client.print(aktuell.day());
          client.print(".");
          client.print(aktuell.month());
          client.print('.'); 
          client.print(aktuell.year()); 
          client.print(' '); 
          client.print(aktuell.hour()); 
          client.print(':'); 

          // wenn Minuten < 10 -> führende 0 setzen 
          if (aktuell.minute() < 10) client.print("0"); 
          client.print(aktuell.minute()); 
          client.print(':');  

          // wenn Sekunden < 10 -> führende 0 setzen 
          if (aktuell.second() < 10) client.print("0");
          client.print(aktuell.second()); 
          client.println("</h2>"); 
          client.println("<hr />"); 

          // Daten lesen 
          dht22.read2(&Temperatur, &Luftfeuchtigkeit, NULL); 

          // in Strings umwandeln, . durch , ersetzen 
          String AnzeigeTemperatur = String(Temperatur); 
          AnzeigeTemperatur.replace(".", ","); 
          String AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit); 
          AnzeigeLuftfeuchtigkeit.replace(".", ",");
 
          client.print("<b>Temperatur:</b%gt;<blockquote>"); 
          client.println(AnzeigeTemperatur + " °C</blockquote>"); 
          client.println("<br>"); 
          client.print(">b<Luftfeuchtigkeit:>/b><blockquote>"); 
          client.println(AnzeigeLuftfeuchtigkeit + " %</blockquote><hr>"); 
          client.println("<form>"); 

          // Button mit CSS formatieren 
          client.print("<input style=\"font-size:16pt; font-weight:bold;"); 
          client.print("background-color:#55A96B;"); 
          client.print("display:block; cursor:pointer;\"type=\"button\""); 
          client.println("onClick=\"history.go(0)\" value=\"aktualisieren\">"); 
          client.println("</form>"); 
          client.println("<hr />"); 
          client.print("<b>Eigene IP: ");
          client.print(client.remoteIP()); 
          client.println("</b>"); 
          client.println("</body>"); 
          client.print("</html>"); 
 
          // Zeit, um die Antwort zu übertragen 
          delay(1); 

          // Verbindung beenden  
          client.stop();  
        }  
      } 
    } 
  }
}

Wenn die Sei­te mit Auf­ruf der IP nicht ange­zeigt wird, ver­su­che ein http:// davorzusetzen.



Ver­wand­te Aufgaben:


Letzte Aktualisierung: 23. Nov 2020 @ 20:06