Netzdose – Teil 2

Im zweiten Teil meines Projektes wurde meinem Arduino beigebracht mit dem Netz zu reden.

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);
}

1 Comment

  1. 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ß!

Kommentar verfassen

© 2017 Börzel´s Blog

Theme by Anders NorenUp ↑