Dal mio nuovo server su Arduino (che lascerò attivo qualche giorno), non solo puoi vedere lo stato delle mie luci e la temperatura di camera mia, ma puoi anche comandare tre pin che per ora sono collegati a tre led colorati, ma che domani potrei associare tramite relè a qualsiasi apparecchio elettrico.
Tutto questo grazie alla libreria WebServer.h, che aggiunge funzionalità molto interessati e facili da programmare anche per un ignorante come me (che si diverte come un bambino).
Come sempre, critiche consigli e suggerimenti sono bene accetti.
Come sempre, il codice è dopo il salto.
/* Web_Demo.pde -- sample code for Webduino server library */ /* * To use this demo, enter one of the following USLs into your browser. * Replace "host" with the IP address assigned to the Arduino. * * http://host/ * http://host/json * * This URL brings up a display of the values READ on digital pins 0-9 * and analog pins 0-5. This is done with a call to defaultCmd. * * * http://host/form * * This URL also brings up a display of the values READ on digital pins 0-9 * and analog pins 0-5. But it's done as a form, by the "formCmd" function, * and the digital pins are shown as radio buttons you can change. * When you click the "Submit" button, it does a POST that sets the * digital pins, re-reads them, and re-displays the form. * */ #include "SPI.h" #include "Ethernet.h" #include "WebServer.h" int lPin = 1; // Light sensor pin int tPin = 3; // Temperature sensor pin int luce = 0; // light in Lux float temp = 0.0; // Temperature in C° String lstatus; // no-cost stream operator as described at // http://sundial.org/arduino/?page_id=119 template<class T> inline Print &operator <<(Print &obj, T arg) { obj.print(arg); return obj; } // CHANGE THIS TO YOUR OWN UNIQUE VALUE static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // CHANGE THIS TO MATCH YOUR HOST NETWORK static uint8_t ip[] = { 192, 168, XXX, XXX }; #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 server void jsonCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) { if (type == WebServer::POST) { server.httpFail(); return; } //server.httpSuccess(false, "application/json"); server.httpSuccess("application/json"); if (type == WebServer::HEAD) return; int i; server << "{ "; for (i = 0; i <= 9; ++i) { // ignore the pins we use to talk to the Ethernet chip int val = digitalRead(i); server << "\"d" << i << "\": " << val << ", "; } for (i = 0; i <= 5; ++i) { int val = analogRead(i); server << "\"a" << i << "\": " << val; if (i != 5) server << ", "; } server << " }"; } void outputPins(WebServer &server, WebServer::ConnectionType type, bool addControls = false) { P(htmlHead) = "<html>" "<head>" "<title>Arduinogaspar Web Server</title>" "<style type=\"text/css\">" "BODY { font-family: sans-serif }" "H1 { font-size: 14pt; text-decoration: underline }" "P { font-size: 10pt; }" "</style>" "</head>" "<body>" "<p>Digital Pin 5: green light<br>" "Digital Pin 4: yellow light<br>" "Digital Pin 3: red light<br>" "Values can be changed from the /form page<br>" "and can be exported from the /json page.<br>" "</p>"; int i; server.httpSuccess(); server.printP(htmlHead); if (addControls) server << "<form action='" PREFIX "/form' method='post'>"; server << "<h1>Digital Pins</h1><p>"; for (i = 0; i <= 9; ++i) { // ignore the pins we use to talk to the Ethernet chip int val = digitalRead(i); server << "Digital " << i << ": "; if (addControls) { char pinName[4]; pinName[0] = 'd'; itoa(i, pinName + 1, 10); server.radioButton(pinName, "1", "On", val); server << " "; server.radioButton(pinName, "0", "Off", !val); } else server << (val ? "HIGH" : "LOW"); server << "<br/>"; } server << "</p><h1>Analog Pins</h1><p>"; for (i = 0; i <= 5; ++i) { int val = analogRead(i); server << "Analog " << i << ": " << val << "<br/>"; } server << "</p>"; server << "Temperature:" << temp << "°C<br/>"; server << "Light is " << lstatus << "</p>"; if (addControls) server << "<input type='submit' value='Submit'/></form>"; server << "</body></html>"; } void formCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) { if (type == WebServer::POST) { bool repeat; char name[16], value[16]; do { repeat = server.readPOSTparam(name, 16, value, 16); if (name[0] == 'd') { int pin = strtoul(name + 1, NULL, 10); int val = strtoul(value, NULL, 10); digitalWrite(pin, val); } } while (repeat); server.httpSeeOther(PREFIX "/form"); } else outputPins(server, type, true); } void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) { outputPins(server, type, false); } void setup() { // set pins 0-8 for digital input for (int i = 0; i <= 9; ++i) pinMode(i, INPUT); pinMode(9, OUTPUT); Ethernet.begin(mac, ip); webserver.begin(); webserver.setDefaultCommand(&defaultCmd); webserver.addCommand("json", &jsonCmd); webserver.addCommand("form", &formCmd); } void loop() { temp = ( 5.0 * analogRead(tPin) * 100.0) / 1024.0; // Conversione voltaggio sensore in temperatura luce = (analogRead(lPin) * 10000.0) / 1024.0; //Conversione voltaggio sensore in Lux if (luce < 201) { lstatus = "OFF"; } else { lstatus = "ON"; } // process incoming connections one at a time forever webserver.processConnection(); // if you wanted to do other work based on a connecton, it would go here }