Arduino Ethernet Server & Client
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
adresse
beispiel
button
byte
celsius
code
datum
ergebnis
grad
high
host
http
monitor
page
server
temperatur
test
verbindung
warten
wartezeit
-
Hej ( :
Ich habe vor mit einem Arduino + Ethernet Shield einen Webserver zu hosten und gleichzeitig Daten vom Arduino an ein seperaten Webserver zu schicken.
Ich wollte erstmal wissen ob es überhaupt möglich ist einen Webserver und Client gleichzeitig zu hosten. Ich habe das schonmal gegoogled und bin auf ein Script gestoßen
//zoomkat 12-08-11, combined client and server //simple button GET with iframe code //for use with IDE 1.0 //open serial monitor and send an g to test client and //see what the arduino client/server receives //web page buttons make pin 4 high/low //use the \ slash to escape the " in the html //address will look like http://192.168.1.102:84 when submited //for use with W5100 based ethernet shields #include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address IPAddress ip(192,168,1,102); // ip in lan IPAddress myserver(208,104,2,86); // zoomkat web page EthernetServer server(84); //server port EthernetClient client; String readString; ////////////////////// void setup(){ pinMode(4, OUTPUT); //pin selected to control Ethernet.begin(mac, ip); server.begin(); Serial.begin(9600); Serial.println("server/client 1.0 test 12/08/11"); // keep track of what is loaded Serial.println("Send an g in serial monitor to test client"); // what to do to test client } void loop(){ // check for serial input if (Serial.available() > 0) { byte inChar; inChar = Serial.read(); if(inChar == 'g') { sendGET(); // call sendGET function } } 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 += c; //Serial.print(c); } //if HTTP request has ended if (c == '\n') { /////////////// Serial.println(readString); //print to serial monitor for debuging //now output HTML data header if(readString.indexOf('?') >=0) { //don't send new page client.println("HTTP/1.1 204 Zoomkat"); client.println(); client.println(); } else { client.println("HTTP/1.1 200 OK"); //send new page client.println("Content-Type: text/html"); client.println(); client.println("<HTML>"); client.println("<HEAD>"); client.println("<TITLE>Arduino GET test page</TITLE>"); client.println("</HEAD>"); client.println("<BODY>"); client.println("<H1>Zoomkat's simple Arduino 1.0 button</H1>"); client.println("<a href=\"/?on\" target=\"inlineframe\">ON</a>"); client.println("<a href=\"/?off\" target=\"inlineframe\">OFF</a>"); //client.println("<IFRAME name=inlineframe src=\"res://D:/WINDOWS/dnserror.htm\" width=1 height=1\">"); client.println("<IFRAME name=inlineframe style=\"display:none\" >"); client.println("</IFRAME>"); client.println("</BODY>"); client.println("</HTML>"); } delay(1); //stopping client client.stop(); ///////////////////// control arduino pin if(readString.indexOf("on") >0)//checks for on { digitalWrite(4, HIGH); // set pin 4 high Serial.println("Led On"); } if(readString.indexOf("off") >0)//checks for off { digitalWrite(4, LOW); // set pin 4 low Serial.println("Led Off"); } //clearing string for next read readString=""; } } } } } ////////////////////////// void sendGET() //client function to send/receie GET request data. { if (client.connect(myserver, 80)) { Serial.println("connected"); client.println("GET /~shb/arduino.txt HTTP/1.0"); client.println(); } else { Serial.println("connection failed"); Serial.println(); } while(client.connected() && !client.available()) delay(1); //waits for data while (client.connected() || client.available()) { //connected or data available char c = client.read(); Serial.print(c); } Serial.println(); Serial.println("disconnecting."); Serial.println("=================="); Serial.println(); client.stop(); }
Das ist jetzt mein jetztiger Quellcode:
/*-------------------------Bindet Librarys ein-------------------------*/ #include <Ethernet.h> #include <SPI.h> #include <math.h> /*---------------------------------------------------------------------*/ /*----------------------Deklarierung vom Ethernet----------------------*/ byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x1C, 0xFA }; // MAC-ADRESSE eingeben! byte ip[] = { 192, 168, 178, 102 }; // IP-Adresse eingeben! byte server[] = {192,168,178,23}; // IP des Servers eingeben EthernetClient client; char host[] = "dreamworkindustries.tk"; // DOMAIN eingeben! char url[] = "/dreamworkindustries/arduino_push_data.php"; // Pfad zur PHP-Datei eingeben char key[] = "***"; // Kennwort aus arduino_push_data.php -Datei eingeben char c; /*---------------------------------------------------------------------*/ int wartezeit =10000; // Wartezeit zwischen messungen, IMMER 1 sec weniger angeben (59 für 60 usw...) float temperatur =0; //Variable zum Zwischenspeichern der Temperatur float TEMP; /*--------------------------------Setup--------------------------------*/ void setup() { Serial.begin(9600); // für Debug-Ausgaben Serial.println("Programm gestartet..."); Ethernet.begin(mac, ip); delay(5000); // warten, bis LAN gestartet } /*--------------------------------Loop---------------------------------*/ void loop() { /*---------------------------Temperatur--------------------------------*/ temperatur = temp(analogRead(0)); Serial.println(temperatur); delay(1000); /*---------------------------------------------------------------------*/ /*---------------------Verbindung zum Internet-------------------------*/ Sensor_lesen(); Daten_senden(); delay(900); if (client.available()) { char c = client.read(); Serial.print(c); } delay(wartezeit); // Upload alle 60 sec. immer 1 sec weniger eintragen! client.stop(); client.flush(); } /*---------------------------------------------------------------------*/ /*----------------------------Sensor Lesen-----------------------------*/ void Sensor_lesen() { TEMP = temperatur; } /*---------------------------Daten senden---------------------------*/ void Daten_senden() { if(client.connect(server, 80)>0) // Verbindung zum Server aufbauen { Serial.print("Verbunden...sende Daten..."); client.print("GET "); client.print(url); //ab hier meine sachen client.print("?TEMP="); client.print(TEMP); client.print("&key="); client.print(key); client.println(" HTTP/1.1"); client.print("Host: "); client.println(host); client.println(); Serial.println("fertig!"); } else { Serial.println(" ***** VERBINDUNGSAUFBAU NICHT MOEGLICH *****"); } } /*---------------------------------------------------------------------*/ /*-------------------------Temperatur berechnen-------------------------*/ float temp(int rawadc) // Hilfsfunktion zur Umrechnung auf Grad Celsius { int r1 = 47000; // Wert des Festen Wiederstandes des sabbungsteiler int r2 = 47000; // Wiederstand des Thermristors bei 25grad int b = 4473; // Fixwert aus Datenblatt float r_akt; // Aktueller Wiederstand float temp; //Temporäre Variable float ergebnis; // float tn = 25; //Basistemperatur in Grad Celsius // Wiederstand Therm ausrechnen //Widerstand auf Temperatur umrechnen tn = tn+273.15; // Basitemperatur auf Kelvin umrechnen r_akt = ((4.64/(4.64/1023*rawadc))*r1)-r2; //Aktuellen Widerstand ermitteln temp = b*tn/(b+log10((r_akt/r2))*tn); temp = temp - 273.15; //Ergebnis in Grad Celsius umwandeln ergebnis =temp; return ergebnis; } /*---------------------------------------------------------------------*/
Das ist mein jetztiger Script. Der ließt die Temperatur aus einen Temperatursensor aus und schickt ihn an meinen Webserver. Kann ich jetzt dazu noch einen Webserver hosten, mitden ich z.B. LEDs durch Buttons aus und an mache ?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Da ich mir nicht sicher bin ob es eine einfache Prozedur gibt die Daten von Servern herunterläd, würde ich dir empfehlen die Buttons so zu gestalten, dass bei einem Klick die Werte in einer neuen PHP geändert werden.
Beispiel:
button.php --> hier deine buttons einbinden
leds.php --> 3 zeilen mit werten von 0 bis eins für Led (Zeile) an/aus
und die php lädst du runter und verarbeitest sie so, dass du die daten die du kriegst an die LED bringst...
leider kann ich dir keinen guten Quelltext liefern, da ich mit C noch nie so etwas gemacht, habe... -
Am Beispiel von "zoomkat" kannst du sehen, dass es grundsätzlich möglich ist, Server und Client gleichzeitig laufen zu lassen, insbesondere wenn der Client du gelegentlich sich verbindet, weil in genau dem Moment der Server nicht funktioniert.
Daher ein Tipp: Nimm die "delay"s raus:
delay... if (client.available())
ersetzen durch "while(!client.available)" , also warten bis der client verfügbar ist, sodass du auch wirklich nur solange wartest, wie es auch erforderlich ist. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage