Savignano sul Rubicone
Offline
Newbie
Karma: 0
Posts: 6
|
 |
« on: March 06, 2011, 10:34:14 am » |
Questo post solo per condividere il mio primo e forse unico progetto con una arduino + ethernet shields. L'ho comprata solo per questo. Si tratta di un sistema apriporta pilotabile da un qualunque apparato in grado di connettersi via wireless alla rete domestica. Nulla di nuovo quindi. Infatti il tutto si basa su codice già disponibile in rete. Non ho fatto altro che adattarlo alle mie esigenze personali. /* Arduino Data Web Server Hari Wiguna, g33k.blogspot.com created Sept 17, 2010 Personalizzato come apriporta da Davide Pedrelli pobox.davide AT gmail DOT com Febbraio 2011 */
#include <SPI.h> #include <Ethernet.h> #include <string.h>
byte mac[] = {0x00, 0x1E, 0x2A, 0x77, 0x24, 0x02 }; byte ip[] = { 192,168,1,222 }; byte subnet[] = {255,255,255,0};
Server server(80); //-- Porta 80 http.
char homepage[20]; char porta[20]; char pwd[20]; int nPorta;
//-- Parametri personalizzabili char *path[]={"apritisesamo"}; //-- Path per la pagina web default ( es.: http://192.168.1.222/PATH_PERSONALIZZATO ) char *password[]={"123"}; //-- chiave segreta ( solo numerica, senza limiti di lunghezza ) char *tasti[]={"Cancello", "Ingresso", "Tasto 3", "Tasto 4", "", ""}; //-- Descrizioni bottoni interfaccia di controllo
//-- Designazione uscite digitali su Arduino e stato iniziale void SetupPorte() { for (int pin = 3; pin < 9; pin++) { //-- uso i pin digitali da 3 a 8 pinMode(pin,OUTPUT); digitalWrite(pin,LOW); } }
void setup() { Serial.begin(9600); SetupPorte(); Ethernet.begin(mac, ip, subnet); server.begin(); }
#define bufferMax 128 int bufferSize; char buffer[bufferMax];
void loop() { Client client = server.available(); if (client) { WaitForRequest(client); ParseReceivedRequest(); PerformRequestedCommands(); client.stop(); } }
void WaitForRequest(Client client) { bufferSize = 0;
while (client.connected()) { if (client.available()) { char c = client.read(); if (c == '\n') break; else if (bufferSize < bufferMax) buffer[bufferSize++] = c; else break; } } PrintNumber("bufferSize", bufferSize); }
void ParseReceivedRequest() { Serial.println("in ParseReceivedRequest"); Serial.println(buffer); /* La richiesta di pagina default va inoltrata verso Arduino nel seguente modo: http://192.168.1.222/PATH_PERSONALIZZATO ---------------------- In caso di richesta pagina default, buffer conterrà "GET /PATH_PERSONALIZZATO HTTP/1.1" In caso di click sui bottoni apriporta, buffer conterrà "GET /PATH_PERSONALIZZATO?6=DESCRIZIONE_TASTO HTTP/1.1". */ char* slash; char* uguale; char* commerciale;
slash = strstr(buffer, "/") + 1; //-- "PATH_PERSONALIZZATO?p=PASSWORD&6=DESCRIZIONE_TASTO HTTP/1.1" oppure "apritisesamo HTTP/1.1" uguale = strstr(buffer, "=") + 1; //-- "PASSWORD&6=DESCRIZIONE_TASTO HTTP/1.1" commerciale = strstr(buffer, "&") + 1; //-- "6=DESCRIZIONE_TASTO HTTP/1.1" homepage[0] = 0; pwd[0] = 0; porta[0] = 0;
strncat(homepage, slash, strlen(path[0])); //-- Isola il path della richiesta HTTP strncat(pwd, uguale, commerciale-uguale-1); //-- Isola la chiave di accesso inserita da validare strncat(porta, commerciale, 1); //-- Isola il numero di porta da aprite (es.: "6")
nPorta = porta[0] - '0'; //-- Numero pin digitale da attivate
PrintString("Homepage",homepage); PrintString("Password",pwd); PrintString("Nr. porta da aprire",porta); }
void PerformRequestedCommands() { if ( strcmp(homepage, path[0]) == 0 and nPorta > 2 and nPorta < 9 and strcmp(pwd, password[0]) == 0 ) RemoteDigitalWrite(); //-- Contronta path, porta e chiave if ( strcmp(homepage, path[0]) == 0 ) DefaultWebPage(); }
void DefaultWebPage() { //-- Invio pagine web server.print("<html><head><meta content='text/html; charset=utf-8' http-equiv='content-type' /><title>Apriti Sesamo</title>"); if (nPorta > 2 and nPorta < 9 and strcmp(pwd, password[0]) == 0) { //-- Se porta e chiave sono validi, redirect pagina web entro 2 secondi server.print("<META HTTP-EQUIV='refresh' CONTENT='2;URL="); server.print(path[0]); server.print("'>"); } //-- Foglio di stile + javascript per gestione tastiera virtuale. server.print("<style type='text/css'>"); server.print("body{background:#0259A1;text-align:center;margin-top:20px;font-family:sans-serif;font-size:70px;font-weight:bold;color:#FFF;}"); server.print("input{padding:20px 15px;width:47%;margin:15px 1%;font-family:sans-serif;font-size:70px;font-weight:bold;color:#000;}"); server.print("</style>"); server.print("<script type='text/javascript'>function accoda(b){b.form.p.value+=b.value}</script>"); server.print("</head><body>");
if (nPorta > 2 and nPorta < 9 and strcmp(pwd, password[0]) == 0) { //-- Se porta e chiave sono validi, notifica avvenuta apertura Serial.println("*** Apertura ***"); //-- Debug in seriale server.print("<div>"); server.print("Attivato"); server.print("</div>"); server.print("<div style='font-size:50px;'>Pin digitale "); server.print(nPorta, DEC); server.print("</div>"); } else { //-- Pagina web default Serial.println("*** DefaultWebPage ***"); //-- Debug in seriale server.print("<form name='apriporte' action='' enctype='text/plain' method='get'>"); server.print("<input style='background:#000;width:50%;color:#FFF;text-align:center;border:2px solid #57AEF6;' type='text' name='p'>"); server.print("<br /><div style='height:15px;'></div>"); //-- Crea i bottoni di apertura for (int conta = 0; conta < 6; conta++) { if (tasti[conta] != "") { //-- Crea solo i bottoni a cui è associata una descrizione ( vedi array: tasti[] ) server.print("<input type='submit' name='"); server.print(conta + 3); server.print("' value='"); server.print(tasti[conta]); server.print("'>"); } } server.print("<br /><div style='height:30px;'></div>"); //-- crea la tastiera numerica for (int conta = 0; conta < 10; conta++) { server.print("<input style='width:24%;margin:3px;background:#000;color:#FFF;' type='button' value='"); server.print(conta); server.print("' onclick='accoda(this)'>"); } server.print("<input style='width:48.5%;margin:3px;background:#8F0000;color:FFF;' type='reset' value='Canc'>"); server.print("</form>"); }
server.print("</body></html>"); }
void RemoteDigitalWrite() { digitalWrite(nPorta, HIGH); //-- Attivo l'uscita digitale delay(500); digitalWrite(nPorta, LOW); Serial.println("RemoteDigitalWrite"); PrintNumber("Porta", nPorta); }
void PrintString(char* label, char* str) { Serial.print(label); Serial.print("="); Serial.println(str); }
void PrintNumber(char* label, int number) { Serial.print(label); Serial.print("="); Serial.println(number, DEC); } Perdonate la pessima qualità dell'immagine http://uielinuxcafe.blogspot.com/2011/03/alla-fine-ce-entrato.html
|
|
|
|
|
Logged
|
|
|
|
|
Milano, Italy
Offline
Faraday Member
Karma: 10
Posts: 3080
Sideralis Arduino!
|
 |
« Reply #1 on: March 06, 2011, 11:31:11 am » |
Quindi sostanzialmente quando arrivi nei pressi di casa, il tuo telefono prende la rete wifi di casa e da li puoi pilotare i rele' collegati al tuo arduino, corretto? Il codice mi pare ben commentato! Mi piacerebbe avere un cancello solo per fare questo progetto  F
|
|
|
|
|
Logged
|
|
|
|
|
Italy
Offline
Sr. Member
Karma: 0
Posts: 273
|
 |
« Reply #2 on: March 06, 2011, 03:20:20 pm » |
Veramente Complimenti!!! Un lavoro ben fatto, domani se ho un po di tempo lo provo, sembra molto interessante.
P.S. Provato con il pc ed è fenomenale. Molto Bravo, dallo smartphone android invece non riesco a farlo andare, con il browser di default e dolphin HD da Impossibile comunicare con questo server.. Sia con il WIFI, che con l'umts tramite indirizzamento con dns dinamico. Magari sarà un problema mio... Anche se con la mia webinterface comunica... Tu lo hai testato da smartphone?
|
|
|
|
« Last Edit: March 07, 2011, 03:47:15 am by dr4gone »
|
Logged
|
|
|
|
|
Savignano sul Rubicone
Offline
Newbie
Karma: 0
Posts: 6
|
 |
« Reply #3 on: March 07, 2011, 07:12:37 am » |
L'ho provato solo con, iPod e iPhone, quindi browser Safari. In effetti mi sarebbe molto utile avere feedback sul funzionamento con altri smartphone. Per chi volesse accedere via interner al mio, questo è il link diretto: http://pedrelli.dyndns.org/apritisesamoE' tutto montato, compresa la scheda relays, ma ovviamente è ancora sulla mia scrivania per testarlo a fondo prima di metterlo al lavoro.
|
|
|
|
|
Logged
|
|
|
|
|
Savignano sul Rubicone
Offline
Newbie
Karma: 0
Posts: 6
|
 |
« Reply #4 on: March 07, 2011, 07:59:33 am » |
Dimenticavo. La chiave di accesso è 123
|
|
|
|
|
Logged
|
|
|
|
|
Italy
Offline
Sr. Member
Karma: 0
Posts: 273
|
 |
« Reply #5 on: March 07, 2011, 08:02:23 am » |
Confermo che anche con il tuo arduino da il medesimo problema in Android. Sia con il browser di default che con DolphinHD, a breve installerò altri browser e testerò con quelli.
Sarebbe interessante sapere se altri che hanno android riscontrano gli stessi inconvenienti .
Comunque da wifi e in LAN funziona benissimo
|
|
|
|
|
Logged
|
|
|
|
|
Milan, Italy
Offline
Newbie
Karma: 0
Posts: 3
|
 |
« Reply #6 on: March 10, 2011, 05:14:00 am » |
Ciao, complimenti per il progetto  Potresti dirmi che componenti hai usato (oltre all'Arduino, Ethernet Shield e Alimentatore) hai usato? Dalla foto non riesco a capire?!? Grazie mille
|
|
|
|
|
Logged
|
|
|
|
|
|
|
Milan, Italy
Offline
Newbie
Karma: 0
Posts: 3
|
 |
« Reply #8 on: March 10, 2011, 05:44:45 am » |
Grazie mille per la celere risposta  Avevo intuito che c'era di mezzo una scheda di controllo con relè, sembrerebbe anche facile da assemblare dal link che mi hai mandato! Esistono, se le conoscete, altre schede di quel tipo ma con la possibilità di controllare più relè con Arduino?
|
|
|
|
|
Logged
|
|
|
|
|
Italy
Offline
Sr. Member
Karma: 0
Posts: 273
|
 |
« Reply #9 on: March 10, 2011, 05:56:15 am » |
Puoi autocostruirteli con quello schema.. E' semplicissimo, anche se non sei pratico.. Basta solo replicarli, Io ho messo un connettore per l'alimentatore, ma si possono alimentare con arduino stesso. Il mio è questo .. (ne manca uno nel mezzo che si era bruciato  ) 
|
|
|
|
|
Logged
|
|
|
|
|
Bari
Offline
Full Member
Karma: 0
Posts: 108
Arduino rocks
|
 |
« Reply #10 on: March 11, 2011, 06:29:05 am » |
Non c'entra assolutamente niente con il topic però volevo ringraziare dr4gone per il link e la foto che mi hanno semplificato un problema di interfacciamento con i relè 
|
|
|
|
|
Logged
|
|
|
|
|
Italy
Offline
Sr. Member
Karma: 0
Posts: 273
|
 |
« Reply #11 on: March 11, 2011, 06:42:05 am » |
volendo puoi migliorare il tutto, unendo l'alimentazione Vcc +5v e GND in comune per tutte l'entrate dei relè, e poi usare degli altri morsetti per collegare solo i segnali provenienti da rduino in entrata al relay.
|
|
|
|
|
Logged
|
|
|
|
|
Bari
Offline
Full Member
Karma: 0
Posts: 108
Arduino rocks
|
 |
« Reply #12 on: March 11, 2011, 07:57:27 am » |
Si, infatti. Mi è piaciuto soprattutto il pdf che si trova al link da te segnalato che spiega tutto in maniera dettagliata.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 11
Arduino rocks
|
 |
« Reply #13 on: March 12, 2011, 05:25:45 pm » |
Spero di fare cosa gradita, ho modificato leggermente il codice per utilizzarlo con il mio Blackberry e con IExplorer. Complimenti per il lavoro Nicola S. /* Arduino Data Web Server Hari Wiguna, g33k.blogspot.com created Sept 17, 2010 Personalizzato come apriporta da Davide Pedrelli pobox.davide AT gmail DOT com Febbraio 2011 Adattato per IExplorer e BlackBerry da Nicola S. */
#include <SPI.h> #include <Ethernet.h> #include <string.h>
byte mac[] = {0x00, 0x1E, 0x2A, 0x77, 0x24, 0x02 }; byte ip[] = { 192,168,0,101 }; byte subnet[] = {255,255,255,0};
Server server(80); //-- Porta 80 http.
char homepage[20]; char porta[20]; char pwd[20]; int nPorta;
//-- Parametri personalizzabili char *path[]={"stc"}; //-- Path per la pagina web default ( es.: http://192.168.1.222/PATH_PERSONALIZZATO ) char *password[]={"123"}; //-- chiave segreta ( solo numerica, senza limiti di lunghezza ) char *tasti[]={"Cancellino", "Basculante", "Cancello", "Apri", "Stop", "Chiudi"}; //-- Descrizioni bottoni interfaccia di controllo
//-- Designazione uscite digitali su Arduino e stato iniziale void SetupPorte() { for (int pin = 3; pin < 9; pin++) { //-- uso i pin digitali da 3 a 8 pinMode(pin,OUTPUT); digitalWrite(pin,LOW); } }
void setup() { Serial.begin(9600); SetupPorte(); Ethernet.begin(mac, ip, subnet); server.begin(); }
#define bufferMax 128 int bufferSize; char buffer[bufferMax];
void loop() { Client client = server.available(); if (client) { WaitForRequest(client); ParseReceivedRequest(); PerformRequestedCommands(); client.stop(); } }
void WaitForRequest(Client client) { bufferSize = 0; while (client.connected()) { if (client.available()) { char c = client.read(); if (c == '\n') break; else if (bufferSize < bufferMax) buffer[bufferSize++] = c; else break; } } PrintNumber("bufferSize", bufferSize); } void ParseReceivedRequest() { Serial.println("in ParseReceivedRequest"); Serial.println(buffer); /* La richiesta di pagina default va inoltrata verso Arduino nel seguente modo: http://192.168.1.222/PATH_PERSONALIZZATO ---------------------- In caso di richesta pagina default, buffer conterrà "GET /PATH_PERSONALIZZATO HTTP/1.1" In caso di click sui bottoni apriporta, buffer conterrà "GET /PATH_PERSONALIZZATO?6=DESCRIZIONE_TASTO HTTP/1.1". */ char* slash; char* uguale; char* commerciale;
slash = strstr(buffer, "/") + 1; //-- "PATH_PERSONALIZZATO?p=PASSWORD&6=DESCRIZIONE_TASTO HTTP/1.1" oppure "apritisesamo HTTP/1.1" uguale = strstr(buffer, "=") + 1; //-- "PASSWORD&6=DESCRIZIONE_TASTO HTTP/1.1" commerciale = strstr(buffer, "&") + 1; //-- "6=DESCRIZIONE_TASTO HTTP/1.1" homepage[0] = 0; pwd[0] = 0; porta[0] = 0;
strncat(homepage, slash, strlen(path[0])); //-- Isola il path della richiesta HTTP strncat(pwd, uguale, commerciale-uguale-1); //-- Isola la chiave di accesso inserita da validare strncat(porta, commerciale, 1); //-- Isola il numero di porta da aprite (es.: "6")
nPorta = porta[0] - '0'; //-- Numero pin digitale da attivate
PrintString("Homepage",homepage); PrintString("Password",pwd); PrintString("Nr. porta da aprire",porta); } void PerformRequestedCommands() { if ( strcmp(homepage, path[0]) == 0 and nPorta > 2 and nPorta < 9 and strcmp(pwd, password[0]) == 0 ) RemoteDigitalWrite(); //-- Contronta path, porta e chiave if ( strcmp(homepage, path[0]) == 0 ) DefaultWebPage(); } void DefaultWebPage() { //-- Invio pagine web server.println("HTTP/1.1 200 OK"); server.println("Content-Type: text/html"); server.println(); server.print("<html>"); server.print("<head>"); server.print("<meta content=text/html"); server.print("charset=utf-8 http-equiv=content-type />"); server.print("<title>Domotica STC</title>"); if (nPorta > 2 and nPorta < 9 and strcmp(pwd, password[0]) == 0) { //-- Se porta e chiave sono validi, redirect pagina web entro 2 secondi server.print("<META HTTP-EQUIV=refresh CONTENT=2;URL="); server.print(path[0]); server.print(">"); } //-- Foglio di stile + javascript per gestione tastiera virtuale.
server.print("<style type=text/css>"); server.print("body{background:#0259A1;text-align:center;margin-top:20px;font-family:sans-serif;font-size:70px;font-weight:bold;color:#FFF;}"); server.print("input{padding:20px 15px;width:47%;margin:15px 1%;font-family:sans-serif;font-size:70px;font-weight:bold;color:#000;}"); server.print("</style>"); server.print("<script type=text/javascript>function accoda(b){b.form.p.value+=b.value}</script>"); server.print("</head>"); server.print("<body>"); if (nPorta > 2 and nPorta < 9 and strcmp(pwd, password[0]) == 0) { //-- Se porta e chiave sono validi, notifica avvenuta apertura Serial.println("*** Apertura ***"); //-- Debug in seriale server.print("<div>"); server.print("Attivato"); server.print("</div>"); server.print("<div style=font-size:50px;>Pin digitale "); server.print(nPorta, DEC); server.print("</div>"); } else { //-- Pagina web default Serial.println("*** DefaultWebPage ***"); //-- Debug in seriale server.print("<form method=GET>"); // server.print("<form name='apriporte' action='' enctype='text/plain' method='get'>"); // non si aggiorna automaticamente server.print("<input style=background:#000;width:50%;color:#FFF;text-align:center;border:2px solid #57AEF6; type=tex' name=p>"); server.print("<br /><div style=height:15px;></div>"); //-- Crea i bottoni di apertura for (int conta = 0; conta < 6; conta++) { if (tasti[conta] != "") { //-- Crea solo i bottoni a cui è associata una descrizione ( vedi array: tasti[] ) server.print("<input type=submit name="); server.print(conta + 3); server.print(" value="); server.print(tasti[conta]); server.print(">"); }} server.print("<br /><div style=height:30px;></div>"); //-- crea la tastiera numerica for (int conta = 0; conta < 10; conta++) { server.print("<input style=width:24%;margin:3px;background:#000;color:#FFF;' type=button value="); server.print(conta); server.print(" onclick=accoda(this)>"); } server.print("<input style=width:48.5%;margin:3px;background:#8F0000;color:FFF; type=reset value=Canc>"); server.print("</form>"); } server.print("</body></html>"); } void RemoteDigitalWrite() { digitalWrite(nPorta, HIGH); //-- Attivo l'uscita digitale delay(500); digitalWrite(nPorta, LOW); Serial.println("RemoteDigitalWrite"); PrintNumber("Porta", nPorta); } void PrintString(char* label, char* str) { Serial.print(label); Serial.print("="); Serial.println(str); } void PrintNumber(char* label, int number) { Serial.print(label); Serial.print("="); Serial.println(number, DEC); }
|
|
|
|
|
Logged
|
|
|
|
|
Milan, Italy
Offline
Newbie
Karma: 0
Posts: 3
|
 |
« Reply #14 on: March 18, 2011, 02:59:18 pm » |
Ragazzi un aiuto  Faccio una faticaccia a trovare il relè che ha utilizzato nella foto dr4gone  Conoscete per favore delle alternative da consigliarmi? Grazie
|
|
|
|
|
Logged
|
|
|
|
|
|