Netzdose – Teil 2
Bei der Verkabelung hat sich zum ersten Teil nicht viel getan. Es wurde lediglich das Ethernetshield auf den Arduino aufgesteckt und die Leitungen vom Parallelkabel wie zuvor an das Ethernetshield angeschlossen.
Der Großteil der Arbeit lag hier beim Programmieren der kleinen Serversoftware. Das Ergebnis sieht zwar nicht sehr spektakulär aus, ich habe trotzdem ein Weilchen daran rum gebastelt. ![]()
Um einfacher die POST bzw. GET Variablen des Formulars auszuwerten habe ich eine ziemlich hilfreiche Bibliothek “webduino” verwendet. Zu finden ist diese auf Google Code: http://code.google.com/p/webduino/
Hier ein kurzes Demo Video:
Es funktionieren natürlich alle Ports, nicht nur die 4 gezeigten in Video. Das ganze funktioniert auch einwandfrei auf dem iPhone!
Nächste Schritte sind den Code zu verbessern, alles in ein passendes Gehäuse zu packen und ein Parallelbuchsen-Shield zu bauen.
Hier der Code. Ich habe zum Verständnis die Kommentare des Webduino drin gelassen. Entschuldigt das deutsch/englisch durcheinander.
/* Netzdose 0.2.2 Benjamin Börzel blog.börzel.de benjamin.boerzel@gmail.com Arduino über Parallelkabel an "Bluebox" angeschlossen. Ethernetshield aufgesteckt und Serversoftware mit "Webduino" Bibliothek erstellt. http://code.google.com/p/webduino/ Portbelegung Arduino | LPT | Farbe | Funktion 2 digital | 2 | rot | Kanal 1 3 digital | 3 | rot /weiß | Kanal 2 4 digital | 4 | orange | Kanal 3 5 digital | 5 | orange /rot | Kanal 4 6 digital | 6 | rosa | Kanal 5 7 digital | 7 | rosa /rot | Kanal 6 8 digital | 8 | gelb | Kanal 7 9 digital | 9 | gelb / rot | Kanal 8 10 digital | x | x | Ethernetshield 11 digital | x | x | Ethernetshield 12 digital | x | x | Ethernetshield 13 digital | x | x | Ethernetshield GND | 25 | grau /schwarz | Masse */ #include "Ethernet.h" #include "WebServer.h" //IP und MAC Adresse festlegen static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; static uint8_t ip[] = { 192, 166, 66, 100 }; // Variablen für Portstatus bool b_kanal1 ; bool b_kanal2 ; bool b_kanal3 ; bool b_kanal4 ; bool b_kanal5 ; bool b_kanal6 ; bool b_kanal7 ; bool b_kanal8 ; // Variablen für Pinbelegung int kanal1 = 2; int kanal2 = 3; int kanal3 = 4; int kanal4 = 5; int kanal5 = 6; int kanal6 = 7; int kanal7 = 8; int kanal8 = 9; /* This creates an instance of the webserver. By specifying a prefix * of "/", all pages will be at the root of the server. */ #define PREFIX "/" WebServer webserver(PREFIX, 80); /* commands are functions that get called by the webserver framework * they can read any posted data from client, and they output to the * server to send data back to the web browser. */ void helloCmd(WebServer &server, WebServer::ConnectionType type, char *, bool) { /* this line sends the standard "we're all OK" headers back to the browser */ server.httpSuccess(); /* if we're handling a GET or POST, we can output our data here. For a HEAD request, we just stop after outputting headers. */ if (type != WebServer::HEAD) { /* this defines some HTML text in read-only memory aka PROGMEM. * This is needed to avoid having the string copied to our limited * amount of RAM. */ P(seiteanfang) = "<b>Netzdose 0.2</b><form method='post'>"; P(kanal1name) = "<b>Kanal 1</b>"; P(kanal1an1) = "<input type='radio' name='kanal1' value='1' onChange='submit();'"; P(kanal1an2) = "> an"; P(kanal1aus1) = "<input type='radio' name='kanal1' value='0' onChange='submit();'"; P(kanal1aus2) = "> aus"; P(br) = "<br>"; P(kanal2name) = "<b>Kanal 2</b>"; P(kanal2an1) = "<input type='radio' name='kanal2' value='1' onChange='submit();'"; P(kanal2an2) = "> an"; P(kanal2aus1) = "<input type='radio' name='kanal2' value='0' onChange='submit();'"; P(kanal2aus2) = "> aus"; P(kanal3name) = "<b>Kanal 3</b>"; P(kanal3an1) = "<input type='radio' name='kanal3' value='1' onChange='submit();'"; P(kanal3an2) = "> an"; P(kanal3aus1) = "<input type='radio' name='kanal3' value='0' onChange='submit();'"; P(kanal3aus2) = "> aus"; P(kanal4name) = "<b>Kanal 4</b>"; P(kanal4an1) = "<input type='radio' name='kanal4' value='1' onChange='submit();'"; P(kanal4an2) = "> an"; P(kanal4aus1) = "<input type='radio' name='kanal4' value='0' onChange='submit();'"; P(kanal4aus2) = "> aus"; P(kanal5name) = "<b>Kanal 5</b>"; P(kanal5an1) = "<input type='radio' name='kanal5' value='1' onChange='submit();'"; P(kanal5an2) = "> an"; P(kanal5aus1) = "<input type='radio' name='kanal5' value='0' onChange='submit();'"; P(kanal5aus2) = "> aus"; P(kanal6name) = "<b>Kanal 6</b>"; P(kanal6an1) = "<input type='radio' name='kanal6' value='1' onChange='submit();'"; P(kanal6an2) = "> an"; P(kanal6aus1) = "<input type='radio' name='kanal6' value='0' onChange='submit();'"; P(kanal6aus2) = "> aus"; P(kanal7name) = "<b>Kanal 7</b>"; P(kanal7an1) = "<input type='radio' name='kanal7' value='1' onChange='submit();'"; P(kanal7an2) = "> an"; P(kanal7aus1) = "<input type='radio' name='kanal7' value='0' onChange='submit();'"; P(kanal7aus2) = "> aus"; P(kanal8name) = "<b>Kanal 8</b>"; P(kanal8an1) = "<input type='radio' name='kanal8' value='1' onChange='submit();'"; P(kanal8an2) = "> an"; P(kanal8aus1) = "<input type='radio' name='kanal8' value='0' onChange='submit();'"; P(kanal8aus2) = "> aus"; P(seiteende) = "</form>"; // Abfragen ob POST Variablen enthalten sind if (type == WebServer::POST) { bool repeat; char name[8], value[8]; // POST Variablen auswerten do { repeat = server.readPOSTparam(name, 8, value, 8); if (strcmp(name,"kanal1")==0) { if (strcmp(value,"1")==0) { b_kanal1 = true; } else { b_kanal1 = false; } } if (strcmp(name,"kanal2")==0) { if (strcmp(value,"1")==0) { b_kanal2 = true; } else { b_kanal2 = false; } } if (strcmp(name,"kanal3")==0) { if (strcmp(value,"1")==0) { b_kanal3 = true; } else { b_kanal3 = false; } } if (strcmp(name,"kanal4")==0) { if (strcmp(value,"1")==0) { b_kanal4 = true; } else { b_kanal4 = false; } } if (strcmp(name,"kanal5")==0) { if (strcmp(value,"1")==0) { b_kanal5 = true; } else { b_kanal5 = false; } } if (strcmp(name,"kanal6")==0) { if (strcmp(value,"1")==0) { b_kanal6 = true; } else { b_kanal6 = false; } } if (strcmp(name,"kanal7")==0) { if (strcmp(value,"1")==0) { b_kanal7 = true; } else { b_kanal7 = false; } } if (strcmp(name,"kanal8")==0) { if (strcmp(value,"1")==0) { b_kanal8 = true; } else { b_kanal8 = false; } } } while (repeat); } //Seite, Formular anzeigen server.printP(seiteanfang); /******* Kanal 1 ******/ server.printP(kanal1name); server.printP(kanal1an1); if(b_kanal1 == true) { server.print("checked"); } server.printP(kanal1an2); server.printP(kanal1aus1); if(b_kanal1 == false) { server.print("checked"); } server.printP(kanal1aus2); server.printP(br); /******* Kanal 2 ******/ server.printP(kanal2name); server.printP(kanal2an1); if(b_kanal2 == true) { server.print("checked"); } server.printP(kanal2an2); server.printP(kanal2aus1); if(b_kanal2 == false) { server.print("checked"); } server.printP(kanal2aus2); server.printP(br); /******* Kanal 3 ******/ server.printP(kanal3name); server.printP(kanal3an1); if(b_kanal3 == true) { server.print("checked"); } server.printP(kanal3an2); server.printP(kanal3aus1); if(b_kanal3 == false) { server.print("checked"); } server.printP(kanal3aus2); server.printP(br); /******* Kanal 4 ******/ server.printP(kanal4name); server.printP(kanal4an1); if(b_kanal4 == true) { server.print("checked"); } server.printP(kanal4an2); server.printP(kanal4aus1); if(b_kanal4 == false) { server.print("checked"); } server.printP(kanal4aus2); server.printP(br); /******* Kanal 5 ******/ server.printP(kanal5name); server.printP(kanal5an1); if(b_kanal5 == true) { server.print("checked"); } server.printP(kanal5an2); server.printP(kanal5aus1); if(b_kanal5 == false) { server.print("checked"); } server.printP(kanal5aus2); server.printP(br); /******* Kanal 6 ******/ server.printP(kanal6name); server.printP(kanal6an1); if(b_kanal6 == true) { server.print("checked"); } server.printP(kanal6an2); server.printP(kanal6aus1); if(b_kanal6 == false) { server.print("checked"); } server.printP(kanal6aus2); server.printP(br); /******* Kanal 7 ******/ server.printP(kanal7name); server.printP(kanal7an1); if(b_kanal7 == true) { server.print("checked"); } server.printP(kanal7an2); server.printP(kanal7aus1); if(b_kanal7 == false) { server.print("checked"); } server.printP(kanal7aus2); server.printP(br); /******* Kanal 8 ******/ server.printP(kanal8name); server.printP(kanal8an1); if(b_kanal8 == true) { server.print("checked"); } server.printP(kanal8an2); server.printP(kanal8aus1); if(b_kanal8 == false) { server.print("checked"); } server.printP(kanal8aus2); server.printP(br); server.printP(seiteende); //Kanäle ein/ausschalten setPorts(); } } void setPorts(){ if(b_kanal1){ digitalWrite(kanal1, HIGH); }else{ digitalWrite(kanal1, LOW); } if(b_kanal2){ digitalWrite(kanal2, HIGH); }else{ digitalWrite(kanal2, LOW); } if(b_kanal3){ digitalWrite(kanal3, HIGH); }else{ digitalWrite(kanal3, LOW); } if(b_kanal4){ digitalWrite(kanal4, HIGH); }else{ digitalWrite(kanal4, LOW); } if(b_kanal5){ digitalWrite(kanal5, HIGH); }else{ digitalWrite(kanal5, LOW); } if(b_kanal6){ digitalWrite(kanal6, HIGH); }else{ digitalWrite(kanal6, LOW); } if(b_kanal7){ digitalWrite(kanal7, HIGH); }else{ digitalWrite(kanal7, LOW); } if(b_kanal8){ digitalWrite(kanal8, HIGH); }else{ digitalWrite(kanal8, LOW); } } void setup() { /* Kanäle als Output definieren */ pinMode(kanal1,OUTPUT); pinMode(kanal2,OUTPUT); pinMode(kanal3,OUTPUT); pinMode(kanal4,OUTPUT); pinMode(kanal5,OUTPUT); pinMode(kanal6,OUTPUT); pinMode(kanal7,OUTPUT); pinMode(kanal8,OUTPUT); /* Kanäle ausschalten*/ digitalWrite(kanal1, LOW); digitalWrite(kanal2, LOW); digitalWrite(kanal3, LOW); digitalWrite(kanal4, LOW); digitalWrite(kanal5, LOW); digitalWrite(kanal6, LOW); digitalWrite(kanal7, LOW); digitalWrite(kanal8, LOW); /* initialize the Ethernet adapter */ Ethernet.begin(mac, ip); /* setup our default command that will be run when the user accesses * the root page on the server */ webserver.setDefaultCommand(&helloCmd); /* start the webserver */ webserver.begin(); } void loop() { char buff[64]; int len = 64; /* process incoming connections one at a time forever */ webserver.processConnection(buff, &len); }





Hallo,
tolle Sache Deine Netzdose! Ich plane derzeit eine per Webseite gesteuerte Bewässerugnsanlage für den Garten. U.a. müssen verschiedene Pumpen an und aus geschaltet werden. Dafür ist Deine Netzdose ja optimal. Könntest Du mir mal genauere Infos zu Deiner “Bluebox” geben, mit der Du die 230V schaltest (Aufbau u. event. Teile und Stückliste)? Dank Dir und Gruß!