Forum: Mikrocontroller und Digitale Elektronik Funkstecker-Webinterface


von R. B. (dxx255)


Lesenswert?

Hallo
Ich möchte mit meinem Arduino UNO und dem Ethernet Shield ein 
Webinterface basteln, mit dem man Funksteckdosen ein/ausschalten kann. 
Mein Problem ist, dass ich die Stecker nicht mehr ausschalten kann!Wenn 
man direkt die GET-Anfrage im Browser eingibt geht es, allerdings nicht 
über das Webinterface. Ich verwende einen 433 MHz Sender.
Hier mein Code:
1
#include <RCSwitch.h>
2
3
#include <SPI.h>
4
#include <Ethernet.h>
5
6
// MAC address from Ethernet shield sticker under board
7
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
8
IPAddress ip(192, 168, 1, 20); // IP address, may need to change depending on network
9
EthernetServer server(80);  // create a server at port 80
10
RCSwitch mySwitch = RCSwitch();
11
String HTTP_req;          // stores the HTTP request
12
void setup()
13
{
14
    Ethernet.begin(mac, ip);  // initialize Ethernet device
15
    server.begin();           // start to listen for clients
16
    Serial.begin(9600);    // for diagnostics
17
    Serial.print("server is at ");
18
  Serial.println(Ethernet.localIP());
19
    mySwitch.enableTransmit(5);
20
}
21
22
void loop()
23
{
24
    EthernetClient client = server.available();  // try to get client
25
26
    if (client) {  // got client?
27
        boolean currentLineIsBlank = true;
28
        while (client.connected()) {
29
            if (client.available()) {   // client data available to read
30
                char c = client.read(); // read 1 byte (character) from client
31
                HTTP_req += c;  // save the HTTP request 1 char at a time
32
                // last line of client request is blank and ends with \n
33
                // respond to client only after last line received
34
                if (c == '\n' && currentLineIsBlank) {
35
                    // send a standard http response header
36
                    client.println("HTTP/1.1 200 OK");
37
                    client.println("Content-Type: text/html");
38
                    client.println("Connection: close");
39
                    client.println();
40
                    // send web page
41
                    client.println("<!DOCTYPE html>");
42
                    client.println("<html>");
43
                    client.println("<head>");
44
                    client.println("<title>Arduino Homecontrol</title>");
45
                    client.println("</head>");
46
                    client.println("<body>");
47
                    client.println("<h1>SWITCH</h1>");
48
                    client.println("<p>Click to switch on and off.</p>");
49
                    client.println("<form method=\"get\">");
50
                    ProcessCheckbox(client,0);
51
                    client.println("</form>");
52
                    client.println("<form method=\"get\">");
53
                    ProcessCheckbox(client,1);
54
                    client.println("</form>");
55
                    client.println("</body>");
56
                    client.println("</html>");
57
                    //Serial.print(HTTP_req);
58
                    HTTP_req = "";    // finished with request, empty string
59
                    break;
60
                }
61
                // every line of text received from the client ends with \r\n
62
                if (c == '\n') {
63
                    // last character on line of received text
64
                    // starting new line with next character read
65
                    currentLineIsBlank = true;
66
                } 
67
                else if (c != '\r') {
68
                    // a text character was received from client
69
                    currentLineIsBlank = false;
70
                }
71
            } // end if (client.available())
72
        } // end while (client.connected())
73
        delay(1);      // give the web browser time to receive the data
74
        client.stop(); // close the connection
75
    } // end if (client)
76
    
77
}
78
79
int stat[]={0,0};
80
// switch LED and send back HTML for LED checkbox
81
void ProcessCheckbox(EthernetClient cl,int num){
82
   
83
    int sender=0;
84
    String box="s";
85
    box+=num;
86
    box+="=111";
87
    if (HTTP_req.indexOf(box) > -1&&HTTP_req.indexOf(box) <7) {
88
      if(stat[num]){
89
        stat[num]=0;
90
      }else{
91
        stat[num]=1;
92
      }
93
        
94
    }
95
    if (stat[num]) {    // switch LED on
96
      
97
        if(num==0){
98
          mySwitch.send(21,24);
99
        }else{
100
         mySwitch.send(16405,24);
101
        }
102
      
103
        // checkbox is checked
104
        cl.print("<input type=\"checkbox\" name=\"s");
105
        cl.print(num);
106
        cl.print("\" value=\"111\" \onclick=\"submit();\" checked>Switch");
107
        cl.println(num+1);
108
    }
109
    else {              // switch LED off
110
      
111
        if(num==0){
112
          mySwitch.send(20,24);
113
        }else{
114
          mySwitch.send(16404,24);
115
        }
116
      
117
        // checkbox is unchecked
118
        cl.print("<input type=\"checkbox\" name=\"s");
119
        cl.print(num);
120
        cl.print("\" value=\"111\" \onclick=\"submit();\">Switch");
121
        cl.println(num+1);
122
    }
123
}
Bitte um Hilfe

: Bearbeitet durch User
von Conny G. (conny_g)


Lesenswert?

Das ist strukturell falsch.
Bei http habe ich einen Request GET / auf den hin die Formularseite 
ausgeliefert wird.
Und eine POST Request, auf den hin der Formularinhalt ausgewertet wird.
Du hast beides in eins vermischt, das funktioniert nicht.
Gibt's da kein Tutorial für das Ethernet Shield?

: Bearbeitet durch User
von Conny G. (conny_g)


Lesenswert?

Alternativ machst Du's mit <a href> Links, aber auch dann lieferst Du 
bei GET / die Haupseite und reagierst bei GET /on oder GET /off auf den 
geklickten Link.

von Leo H. (Gast)


Lesenswert?

> Und eine POST Request, auf den hin der Formularinhalt ausgewertet wird.

Der Formularinhalt wird auch per GET übermittelt, das gibt der Form-Tag 
im HTML-Quelltext an:
<form method="get"

Die Daten kommen als Teil des Aufrufs:
http 123.123.123.123/script.xyz?eingabe=irgendwas&eingabe_2=wasanderes

Wenn dieser Aufruf direkt über die Adresszeile funktioniert würde ich 
den Fehler im HTML-Teil suchen. Schickt das Formular die Anfrage korrekt 
ab?
Vielleicht funktioniert es wenn du im Formular dein Script als Ziel 
angibtst:
<form action="http 123.123.123.123/script.xyz" method="get"

Wenn das Formular nicht abgeschickt wird erkennt dein Browser 
wahrscheinlich die "submit();"-Funktion nicht. Um das zu testen kannst 
du dir einen Senden-Button einbauen:
<input type="submit" value="Senden"

von R. B. (dxx255)


Lesenswert?

Habs jetzt ganz anders gelöst: ohne checkboxen
1
#include <RCSwitch.h>
2
3
#include <SPI.h>
4
#include <Ethernet.h>
5
6
// MAC address from Ethernet shield sticker under board
7
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
8
IPAddress ip(192, 168, 1, 20); // IP address, may need to change depending on network
9
EthernetServer server(80);  // create a server at port 80
10
RCSwitch mySwitch = RCSwitch();
11
String HTTP_req;          // stores the HTTP request
12
void setup()
13
{
14
    Ethernet.begin(mac, ip);  // initialize Ethernet device
15
    server.begin();           // start to listen for clients
16
    Serial.begin(9600);    // for diagnostics
17
    Serial.print("server is at ");
18
  Serial.println(Ethernet.localIP());
19
    mySwitch.enableTransmit(5);
20
}
21
22
void loop()
23
{
24
    EthernetClient client = server.available();  // try to get client
25
26
    if (client) {  // got client?
27
        boolean currentLineIsBlank = true;
28
        while (client.connected()) {
29
            if (client.available()) {   // client data available to read
30
                char c = client.read(); // read 1 byte (character) from client
31
                HTTP_req += c;  // save the HTTP request 1 char at a time
32
                // last line of client request is blank and ends with \n
33
                // respond to client only after last line received
34
                if (c == '\n' && currentLineIsBlank) {
35
                    ProcessButton();
36
                    // send a standard http response header
37
                    client.println("HTTP/1.1 200 OK");
38
                    client.println("Content-Type: text/html");
39
                    client.println("Connection: close");
40
                    client.println();
41
                    // send web page
42
                    client.println("<!DOCTYPE html>");
43
                    client.println("<html>");
44
                    client.println("<head>");
45
                    client.println("<title>Arduino Homecontrol</title>");
46
                    client.println("</head>");
47
                    client.println("<body>");
48
                    client.println("<h1>SWITCH</h1>");
49
                    client.println("<p>Click to switch on and off.</p>");
50
                    client.println("<form method=\"get\">");
51
                    client.println("<input type=\"submit\" name=\"send1\" value=\"Switch 1\">");
52
                    client.println("<input type=\"hidden\" name=\"s0\" value=\"111\">");
53
                    client.println("</form>");
54
                    client.println("<form method=\"get\">");
55
                    client.println("<input type=\"submit\" name=\"send2\" value=\"Switch 2\">");
56
                    client.println("<input type=\"hidden\" name=\"s1\" value=\"222\">");
57
                    client.println("</form>");
58
                    client.println("</body>");
59
                    client.println("</html>");
60
                    Serial.print(HTTP_req);
61
                    HTTP_req = "";    // finished with request, empty string
62
                    break;
63
                }
64
                // every line of text received from the client ends with \r\n
65
                if (c == '\n') {
66
                    // last character on line of received text
67
                    // starting new line with next character read
68
                    currentLineIsBlank = true;
69
                } 
70
                else if (c != '\r') {
71
                    // a text character was received from client
72
                    currentLineIsBlank = false;
73
                }
74
            } // end if (client.available())
75
        } // end while (client.connected())
76
        delay(1);      // give the web browser time to receive the data
77
        client.stop(); // close the connection
78
    } // end if (client)
79
    
80
}
81
82
int stat[]={0,0};
83
void ProcessButton(){
84
    int num=0;
85
    if (HTTP_req.startsWith("GET /?send1=Switch+1&s0=111")) {
86
      num=0;
87
    }
88
    if (HTTP_req.startsWith("GET /?send2=Switch+2&s1=222")) {
89
      num=1;
90
    }
91
    if (HTTP_req.startsWith("GET /?send1=Switch+1&s0=111")||HTTP_req.startsWith("GET /?send2=Switch+2&s1=222")) {
92
      if(stat[num]){
93
        stat[num]=0;
94
        if(num==0){
95
          mySwitch.send(20,24);
96
        }else{
97
          mySwitch.send(16404,24);
98
        }
99
      }else{
100
        stat[num]=1;
101
        if(num==0){
102
          mySwitch.send(21,24);
103
        }else{
104
         mySwitch.send(16405,24);
105
        }
106
      }
107
        
108
    }
109
}
Danke für eure Hilfe

von Conny G. (conny_g)


Lesenswert?

Da könntest statt submit-Buttons und Form auch einfache Links nehmen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.