Nr. 19b – Das Ethernet Shield als Webserver

Aufgabe : Mit dem Temperatursensor TMP36 möchten wir die Raumtemperatur auslesen und per Ethernet Shield an eine Website im Heimnetz ausgeben.

Material : Mikrocontroller / Breadboard / Kabel / Temperatursensor TMP36 / Ethernet Shield (Materialbeschaffung www.funduinoshop.com)

Der Aufbau dieser Anleitung orientiert sich an der Anleitung Nr. 10 –  Temperaturen messen .

Da für diesen Sketch ein Ethernet Shield verwendet wird, muss eben dieses zuerst auf das Mikrocontroller-Board gesteckt werden. Bitte beachten Sie, dass durch das Ethernet Shield die digitalen Pins 10, 11, 12 und 13 belegt und somit für Erweitungen des Aufbaus nicht verwendet werden können. Im Anschluss muss eine Verbindung zwischen dem heimischen Router und dem Shield hergestellt werden. Schließen Sie dazu ein Ende des LAN-Kabels an Ihr Ethernet Shield und das andere Ende an den Router an. Nachdem die Verbindung hergestellt wurde, können Sie den Temperatursensor TMP36 wie folgt mit dem Shield verbinden. Bitte verwenden Sie eine externe Stromversorgung (9V Netzteil oder 9V Batterie), da dies die Sensorgenauigkeit wesentlich verbessert.



Damit das Ethernet Shield als Webserver verwendet werden kann, muss der unten stehende Sketch modifiziert werden. Dabei ist zu beachten, dass die MAC-Adresse im Netzwerk lediglich ein einziges Mal vorkommen darf (hier: 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED). Zudem muss die verwendete IP-Adresse Teil der jeweiligen Netzklasse sein.  Die bereits belegten IP-Adresse des Heimnetzes, sowie die Adresse der Standardgateway können Sie über die sogenannte DOSBox auslesen.

Klicken Sie auf „Start“ und geben Sie unter „Ausführen“ den Befehl „CMD“ ein. Im Anschluss öffnet sich die DOSBox. Geben Sie nun den Befehl „ipconfig“ ein. Es erscheint eine Auflistung aller bereits verwendeten IP-Adressen.


Der Sketch funktioniert wie folgt :

Zuerst wird der Port für die Ausgabe des Messwertes über HTML definiert. Anschließend wird der EthernetServer initialisiert und für den Aufruf durch den Client vorbereitet. Der Sensorwert wird anschließend ausgelesen und per „map-Befehl“ in den auszugebenden Temperaturwert umgewandelt (siehe Anleitung Nr. 10). Erfolgt ein Seitenaufruf durch den Client, wird dieser Temperaturwert über das HTML-Protokoll mit dem Befehl „server.print“ nach einem kurzen „delay“ ausgegeben. Abschließend wird die Verbindung mit dem Befehl „client.stop()“ getrennt.

#include <Wire.h>        // Laden der notwendigen libraries
#include <SPI.h>
#include <Ethernet.h>

int TMP36 = A3;       // Deklaration der Variablen
int sensorwert;
int temperatur = 0;

byte mac[] = {
 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  // MAC Adresse des Arduino Boards  !WICHTIG! MAC Adresse darf nur einmal im Heimnetz vorkommen

byte ip[] = {
 192, 168, 2, 177 };      // IP Adresse des Arduino Boards  !WICHTIG! IP Adresse muss manuell im Netzwerk vergeben werden, i.d.R. 192.168.x.xxx 

byte gateway[] = {
 192, 168,2, 1 };       // Gateway Fritzbox !WICHTIG! Auszulesen über Start -> "cmd" -> "ipconfig" -> Standardgateway
byte subnet[] = { 
 255, 255, 255, 0 };      // Subnet Maske (optional)

 
EthernetServer server(80);    // Port Einstellung (Standard für HTML : 80)

void setup() {
    Wire.begin();       // I2C als Master-BUS
    Ethernet.begin(mac, ip);    // Ethernet initialisieren
    server.begin();     // Auf Clients warten
}


void loop() {
  
   sensorwert=analogRead(TMP36);  //Auslesen des Sensorwertes an PIN A3                                                           
   temperatur= map(sensorwert, 0, 410, -50, 150); // Umwandeln des Sensorwertes mit Hilfe des "map" Befehls
   delay(500);
   
   EthernetClient client = server.available(); //Prüfen, ob Client Seite aufruft                                             
      if (client) {     // Seitenaufruf durch User                                                                      
// Ausgabe in HTML
server.print("HTTP/1.0 200 OK\r\nServer: arduino\r\nContent-Type: text/html\r\n\r\n");
server.print("<HTML><HEAD><TITLE>");
server.print("Funduino Thermometer");
server.print("</TITLE>");
server.print("</HEAD><BODY>");
server.print("<h2 align=center><font size=7><b>Funduino Thermometer </b></font></h2>");
server.print("<center><font size=5><b>Die Temperatur betr&aumlgt </font>");
server.print(temperatur);           // Ausgabe der Temperatur                                                          
server.print("<font size=5> Grad Celsius. </font");
  
       delay(500);      // Kurzer Delay, um Daten zu senden                                                                             
       client.stop();              // Verbindung mit dem Client trennen                                                         
 }

}

 

Gibt man nun im Webbrowser (Internet Explorer, Google Chrome, Mozilla Firefox…) die IP-Adresse des Ethernet Shields ein (in unserem Fall 192.168.2.177), erscheint die folgende Seite mit der erfassten Temperatur :