Fernsteuerung von RC-Dosen per Browser[/caption]
Nachdem ich gestern von den Funksteckdosen gesprochen habe, wollte ich etwas nachforschen, wie ich den Arduino Ethernet über das Internet fernsteuern kann.
Erstes Augenmerk lag auf dem WebServer-Script (in der Arduino IDE unter „Netzwerk“ bei den Beispielen zu finden), über das ich zumindest den Arduino in einen sehr einfachen WebServer verwandeln kann.
Aber wie kann ich z.B. über einen Form-Button in der HTML-Seite eine bestimmte Funktion im Arduino-Code ausführen? Die Lösung…
…ist relativ simpel 🙂 Ich habe mich eines Scripts von Poldi bedient, dass eigentlich genau das umsetzt, was ich im Sinn hatte: Eine einfache Oberfläche zum Schalten von X.
Mir gefiel jedoch die Optik und der Aufbau nicht, sodass ich das Script etwas angepasst und erweitert habe.
Passend zu meinem vorherigen Artikel (Mit Arduino Funksteckdosen ansteuern) und das Funksteckdosen-Set von Elro können damit 4 RC-Steckdosen gesteuert werden.
Als Gimmick, von Poldi übernommen, wird auch der Status der Steckdosen (An oder Aus) angezeigt. Ich habe mit dem Script bisher etwas versucht und getestet – es ist also keineswegs als „Fertig“ anzusehen und mit Sicherheit nicht „optimiert“ – aber vielleicht hilft es dem ein oder anderen beim basteln.
Als Besonderheit schreibt das Script allen HTML-Output in den Flash statt in den RAM, da die 2kb des Arduino Uno einfach zu gering sind. Spätestens beim Anklicken der zweiten Steckdose (An/Aus) hängt sich der Ardu komplett auf. Ihr benötigt zusätzlich die Bibliothek Flash (für das Speichern im Flash statt SRAM) und FreeMemory (für die Anzeige des freien Arbeitsspeichers).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
/* Original Version by Poldi modified by Katsu modified by Basti */ #include <RCSwitch.h> // Steckdosen-Controlling #include <SPI.h> #include <Ethernet.h> // Netzwerk-Bibliothek #include <Flash.h> // Für Speichern der HTML-Daten im Flash statt RAM #include <MemoryFree.h> // Freien RAM auslesen byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 }; // entspricht einer MAC von 84.85.88.16.0.36 byte ip[] = { 192, 168, 0, 5 }; // IP-Adresse byte gateway[] = { 192, 168, 0, 1 }; // Gateway byte subnet[] = { 255, 255, 255, 0 }; EthernetServer server(80); String readString = String(100); // string for fetching data from address boolean RC1 = false; // Status flag boolean RC2 = false; boolean RC3 = false; boolean RC4 = false; RCSwitch rcControl = RCSwitch(); void setup(){ Ethernet.begin(mac, ip, gateway, subnet); server.begin(); // Transmitter is connected to Arduino Pin #10 rcControl.enableTransmit(2); Serial.begin(9600); } void loop(){ // Create a client connection EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); //read char by char HTTP request if (readString.length() < 100) { //store characters to string readString = readString + c; } Serial.print(c); //output chars to serial port if (c == 'n') { //if HTTP request has ended //---------------------Schaltprofile-------------------- // indexOf locates a character or String within another String. if(readString.indexOf("rc1=An") > -1) { rcControl.switchOn('a', 1, 1); Serial.println("Steckdose 1 eingeschaltet!"); RC1 = true; } if(readString.indexOf("rc1=Aus") > -1){ rcControl.switchOff('a', 1, 1); Serial.println("Steckdose 1 ausgeschaltet!"); RC1 = false; } if(readString.indexOf("rc2=An") > -1) { rcControl.switchOn('a', 1, 1); Serial.println("Steckdose 2 eingeschaltet!"); RC2 = true; } if(readString.indexOf("rc2=Aus") > -1){ rcControl.switchOff('a', 1, 1); Serial.println("Steckdose 2 ausgeschaltet!"); RC2 = false; } if(readString.indexOf("rc3=An") > -1) { rcControl.switchOn('a', 1, 3); Serial.println("Steckdose 3 eingeschaltet!"); RC3 = true; } if(readString.indexOf("rc3=Aus") > -1){ rcControl.switchOff('a', 1, 3); Serial.println("Steckdose 3 ausgeschaltet!"); RC3 = false; } if(readString.indexOf("rc4=An") > -1) { rcControl.switchOn('a', 1, 4); Serial.println("Steckdose 4 eingeschaltet!"); RC4 = true; } if(readString.indexOf("rc4=Aus") > -1){ rcControl.switchOff('a', 1, 4); Serial.println("Steckdose 4 ausgeschaltet!"); RC4 = false; } if(readString.indexOf("alloff=Alle+ausschalten") > -1){ rcControl.switchOff('a', 1, 1); rcControl.switchOff('a', 1, 2); rcControl.switchOff('a', 1, 3); rcControl.switchOff('a', 1, 4); Serial.println("Alles ausgeschaltet"); RC1 = false; RC2 = false; RC3 = false; RC4 = false; } //--------------------------HTML------------------------ client << F("HTTP/1.1 200 OKn"); client << F("Content-Type: text/htmlnn"); client << F(""); client << F("<html>"); client << F("<head><title>Arduino Webserver - basti</title></head>n"); client << F("<body margin=0 padding=0 style='font-family:Verdana; background-color:#ccc;'>n"); //---Tabellen-Header client << F("<table style='border-collapse:collapse;'>"); client << F("<tr style='font-weight:bold; border-bottom:2px solid #000;'><td>Steckdose</td><td colspan=2>Aktion</td><td>Status</td></tr>"); //---Steckdose 1 client << F("<tr>"); client << F("<td>Steckdose 1</td>"); client << F("<td><form method=get><input type=submit name=rc1 value='An'></form></td>"); client << F("<td><form method=get><input type=submit name=rc1 value='Aus'></form></td>"); if (RC1) client << F("<td><span style='color:green;'>AN</span></td>"); else client << F("<td><span style='color:red;'>AUS</span></td>"); client << F("</tr>"); //---Steckdose 2 client << F("<tr>"); client << F("<td>Steckdose 2</td>"); client << F("<td><form method=get><input type=submit name=rc2 value='An'></form></td>"); client << F("<td><form method=get><input type=submit name=rc2 value='Aus'></form></td>"); if (RC2) client << F("<td><span style='color:green;'>AN</span></td>"); else client << F("<td><span style='color:red;'>AUS</span></td>"); client << F("</tr>"); //---Steckdose 3 client << F("<tr>"); client << F("<td>Steckdose 3</td>"); client << F("<td><form method=get><input type=submit name=rc3 value='An'></form></td>"); client << F("<td><form method=get><input type=submit name=rc3 value='Aus'></form></td>"); if (RC3) client << F("<td><span style='color:green;'>AN</span></td>"); else client << F("<td><span style='color:red;'>AUS</span></td>"); client << F("</tr>"); //---Steckdose 4 client << F("<tr>"); client << F("<td>Steckdose 4</td>"); client << F("<td><form method=get><input type=submit name=rc4 value='An'></form></td>"); client << F("<td><form method=get><input type=submit name=rc4 value='Aus'></form></td>"); if (RC4) client << F("<td><span style='color:green;'>AN</span></td>"); else client << F("<td><span style='color:red;'>AUS</span></td>"); client << F("</tr>"); //---Alle Steckdosen ausschalten client << F("<tr><td colspan=4><form method=get><input type=submit name=alloff value='Alle ausschalten'></form></td></tr>"); //---System-Infos client << F("<tr><td colspan=4><br><br><span style='font-size:8px;'>Freier RAM:&nbsp;"); client.println(freeMemory()); client << F("Byte</span></td></tr>"); client << F("<tr><td colspan=4><span style='font-size:8px;'>Arduino Laufzeit:&nbsp;"); client.println(millis()/1000/60); client << F("Minuten</span></td></tr>"); //---Tabellen-Footer client << F("<table>"); //---HTML Ende client << F("</body></html>"); //clearing string for next read readString=""; //stopping client client.stop(); } } } } } |
[…] Post navigation ← Vorheriger […]
The paagron of understanding these issues is right here!
Hallo Bastian,
bin Neuling in der Arduino-Welt und möchte per Internet un Lan mit einem Uno + Ethernet Shield vier Ausgänge des Uno schalten. Deine Weboberfläche mit Rückmeldung ist genau das was ich gesucht habe. Ich habe aber kaum Ahnung (weil ja Anfänger) von der Programmierung. Könntest Du mir dazu bitte den kompletten Code schicken? Ich kann dann besser selbst probieren wenn ich erst mal ein funktionierendes Beispiel habe. Welche Arduino IDE nutzt man dazu am besten? Einige Codes aus dem Netz scheinen m.E. nach nur mit bestimmten IDE‘ s zu gehen.
Vorab ein großes Danke
Peter
Hallo,
was genau fehlt dir den „für den kompletten Code“? Obiges ist halt nur ein Beispiel… ich muss dir auch gestehen, dass ich schon längere Zeit nichts mehr mit Arduino’s & Co. gemacht habe…
Als IDE bietet sich natürlich immer die offizielle Arduino-IDE in der aktuellen Version an 🙂 Ggf. gibt es bei manchen Libraries Kompatibilitätsprobleme, soviel ich weiß ist die aktuelle Arduino IDE noch nicht sooo lange veröffentlicht – dann bietet sich an, einfach eine Version älter zu nehmen 🙂
Hallo Bastian,
ist vielleicht etwas blöd beschrieben: Ich möchte gern die Weboberfläche haben wie in deinem Beispiel, also mit AN, AUS, STATUS. Da du rcswitch nutzt bräuchte ich ein Beispiel zum Setzen eines Ausgangs ohne rcswitch. Ich habe viele Varianten gefunden, die mich eigentlich nur verwirrt haben. Dann glaube ich gelesen zu haben, das man den Flash „nur“ x-mal beschreiben kann. Dann wäre die Sache ja vorbei …. Auf die Ausgaben „Steckdose ist ausgeschaltet könnte ich auch verzichten. Ich weiß halt nicht was ich wie ersetzen bzw. weglassen muss um ans Ziel zu kommen.
Grüße
Peter
hi i have a problem .. i copy your code and when i start to upload in arduino its a error „FILENAME“ or can you help me how to fix this please ?