Das ist ein Projekt was bei mir bestimmt schon 2 Jahre rumliegt. Vielleicht wird es auch noch erweitert.
Hardware
Einen Arduino bekommt man für knapp 25€ bei diversen Shops im Internet, im Laden hab ich sie bis jetzt nur überteuert als Paket bei Conrad gesehen. Das Ethernet Shield bekommt man auch für ~$10 bei ebay. Den LM35DZ Temperatursensor hab ich für ca. 4€ bei Conrad gekauft. Der Rest (Lötsachen, Kabel, Schrumpfschläuche) ist Zubehör, das hier so rumlag.
Gemäss dem Datenblatt habe ich den Temperatursensor über ein paar angelötete Kabel an das Breadboard aufgesteckt. Die Beinchen habe ich mit Schrumpfschläuchen versehen, damit sie nicht aus versehen gegeneinander kommen können. Ich überlege gerade noch es mit Heisskleber abzudichten, so dass der Sensor nach draussen kann.
Software
Ich setze ein bisschen Grundwissen der Programmierung voraus. Vor allem, wer C kann, sollte hier keine Schwierigkeiten haben. Ist auch nicht schwer. Es gibt 2 Funktionen, setup() und loop(), die entsprechend ihrem Namen genau das tun. Für fast alles hat schonmal jemand eine library geschrieben, man muss quasi nur noch den Bastelkasten nehmen und zusammenstecken. Für das Ethernet Shield gibt es natürlich eine library, die das im Grunde recht simpel macht. Man bindet einfach die libraries dafür ein:
#include <Ethernet.h> #include <SPI.h>
und kann dann global mit
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; byte ip[] = { 192,168,1,5 }; byte gateway[] = { 192, 168, 1, 1}; byte dns[] = { 192, 168, 1, 1}; byte subnet[] = { 255, 255, 255, 0 };
die entsprechenden Optionen setzen. Am besten die IP-Adresse so wählen, dass man nicht mit dem DHCP Server korreliert. Dann kommt noch eine kurze Initialisierung:
Server server(80);
Nebenbei habe ich den input pin für die Temperatur gesetzt und eine globale Variabale dafür angelegt:
const int apin = A3; float temperature;
In setup() wird dann mit folgenden Befehlen der Webserver gestartet:
Ethernet.begin(mac, ip, dns, gateway); server.begin();
Hier setze ich die serielle Verbindung auf 9600 Baud und definiere den oben spezifierten Pin als INPUT:
Serial.begin(9600); pinMode(apin,INPUT);
Als nächstes kommt loop(). Hier definier ich eine Variable in die der rohe Input gespeichert wird. Die rechnet man dann gemäß einer Formel um, die ich im Internet gefunden hab. Zum Test habe ich eine Ausgabe auf der seriellen Console eingestellt. Die findest man in der Arduino IDE unter Tools. Jenachdem ob man ihn an 3.3V oder an 5.0V anschliesst, ist die Formel natürlich anders.
int input = analogRead(apin); temperature = (5.0 * input * 100.0)/1024.0; Serial.print( "Temperature: "); Serial.print(temperature); Serial.print("\n"); delay(1000);
Damit der Code da jetzt ein bisschen übersichtlich bleibt habe ich eine Funktion namens listenForClients() geschrieben. Ich denke aus den Kommentare sollte klar werden, was hier passiert:
void listenForClients() { // Initialize client Client client = server.available(); if (client) { // Message for debugging // Serial.println("Got a client"); boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); if (c == '\n' && currentLineIsBlank) { // Tell the client the receiving data is HTML client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); // This is the actual temperature value // $deg; is the little round degree sign client.print("Temperature: "); client.print(temperature); client.print(" °C"); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // Give the web browser time to receive the data delay(1); // Close the connection: client.stop(); }
Der Code ist überwiegend Copy-Pasta aus File/Examples/Ethernet/Webserver.
Hier gibts nochmal den Quelltext zum downloaden.
Fotos
(click to enlarge)
Links