Pages: [1] 2 3 4   Go Down
Author Topic: [Help] Domotica con WebServer Arduino  (Read 10414 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Edison Member
*
Karma: 40
Posts: 1957
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sto costruendo un sistema domotico che si basa su schede Arduino Uno con Ethernet Shield.

Il sistema si basa su più Board, dislocate una per stanza, a cui sono collegati diversi sensori più attuatori per luci PWM, relè per Luci, valvole ecc.

Accedendo all'indirizzo IP di ogni singola scheda, esce fuori una pagina HTML residente, buttata su con la direttiva PROGMEM. In questa pagina ci sono pulsanti e led grafici che determinano le azioni di ogni singolo dispositivo in ogni stanza.

Si parte dalla stanza più complessa, quale è la sala, dove c'è una gestione di un sensore di Temperatura e Umidità DHT11, un sensore luce, la gestione dimmerata via PWM di 4 punti luce da gestire come scenari vari, sensori magnetici alle finestre che mi segnalano l'apertura/chiusura, una presa comandata e la gestione di due prese con priorità, ed infine le tapparlle motorizzate.

Invece il bagno, il più semplice, ha solo il controllo luce via PWM (la luce si accende con un fade in, e si spegne con un fade out), il sensore Temperatura & Umidità, quello dei Lux, e la solita tapparella motorizzata up/down.

Tutti gli Arduini mi si collegano, tramite uno Switch, con PoE, ad un computer Touch screen appeso alla parete e ad un router che mi consente l'accesso a Internet, da cui posso operare dall'esterno per aggeggiare su tutti i comandi tramite uno SmartPhone, un iPad o quello che diavolo volete.

La configurazione attuale prevede che sul Touch scree mi tengo aperte 5 o 6 pagine per ogni Arduuino esistente, e fin qua tutto bene.

Ora vorrei passare allo step successivo e scrivere una pagina HTML (con JavaScript o altro) dove posso interagire, non solo leggendo dai WebServer Arduinici, ma anche inviargli dati. Per esempio, tramite questa pagina, lanciare un comando unico che mi tira giù tutte le tapparelle della casa, oppure che me le tira su al mattino, o ancora: che mi spegne tutte le luci della casa con un unico tasto, senza dover schiacciare ogni singolo bottone di ogni singola pagina-Arduino.

1) Spero di essere stato chiaro ed esaustivo per eventuale risposta, nel caso chiedete dettagli che li fornirò.

2) Ora vorrei sfruttare il post, e le vostre mega-menti, per creare questa pagina, più risolvere altri problemi che vi spero di risolvere insieme a voi man mano che ne risolvo uno alla volta.

Questo è il file di ingresso a tutti gli Arduino (ogni pulsante accede all'indirizzo IP di ogni Board):



Questo invece è la pagina HTML residente dentro un Arduino:



Per ora grazie a chi ha voglia di rispondere, ma anche a chi legge interessato!  smiley-lol
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora babbuino ... non ho banane da offrirti ..... però ti posso dire che la tua domanda comporta un cestinamento di quello che hai fatto ora, usare un jquery signica ristrutturare il tuo sketch eliminando il progmem e costruire un client-server  usando ad esempio su js

function data(input)
 {
    var url = "/sendData";
    var dato= input;
    $.ajax({
      type: "POST",
       data: dato,
       dataType: "text",
       cache: false,
       url: url,
       success: function()
      { .............................
............................


guardati tinywebserver oppure leggi il proggetto di kattivik qui  ...

ciao
« Last Edit: November 25, 2011, 04:25:31 pm by pablos71 » Logged

no comment

Offline Offline
Edison Member
*
Karma: 40
Posts: 1957
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie.

La pagina HTML posso tranquillamente resuscitarla dal PROGMEM e stamparla con una serie infinita di client.println();

Non ho nessuna esperienza con jquery, quindi ti sarei grado di essere il meno criptico possibile.

Potresti fare un sempice esempio di codice che, premendo un button, mi spedisce una stringa "BaBBuino" a più indirizzi IP contemporaneamente?

TinyWebserver lo avevo già adocchiato, ma non ricordo perchè, ero passato allo scheletro di un altro esempio, invero molto povero, trovato in rete.

 
Logged

Offline Offline
Edison Member
*
Karma: 40
Posts: 1957
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ancora una cosa: dove trovo l'esempio di Kattivic? Pensavo che il "qui" che hai scritto fosse un link...
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si hai ragione avevo finito la colla smiley) ....ecco incollato

http://arduino.cc/forum/index.php/topic,79908.0.html
Logged

no comment

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Potresti fare un sempice esempio di codice che, premendo un button, mi spedisce una stringa "BaBBuino" a più indirizzi IP contemporaneamente?

no l'esempio tinywebserver è un server e client, finisce li ... si collega con un ip solo invia richieste e riceve risposte. Per inviare dati ad altri ip probabilmente devi specificare  tramite href a chi vuoi mandarlo, però a questo punto tu chiedi un sistema P2P (peer to peer, ciascuna delle parti ha le stesse funzionalità e ognuna di esse puo' iniziare la sessione di comunicazione autonomamente con dei nodi) cosa che non ho mai toccato e direi piuttosto complicato. Sarebbe più semplice utilizzare un dispositivo master e comunicare con gli altri tramite bus. Solo uno deve comandare e gli slave devono controllare e riferire/obbedire al master. Non è impossibile il tuo sistema, ma mooooolto complicato se non hai grandi esperienze informatiche.

ciao
« Last Edit: November 26, 2011, 03:16:00 am by pablos71 » Logged

no comment

Offline Offline
Edison Member
*
Karma: 40
Posts: 1957
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non ci credo! Ma è possibile che non esista un comando o funzione in qualsiasi struttura di linguaggio, JavaScript, HTML, Ajax, ASP o chemminkia ne so, che invia una stringa a più IP?

Una roba del genere:

<html>
<head>Mando stringhe a tutti</head>
<body>

<script language="LinguaggioMiracoloso"></script>

<OnClick.clikkoPulsantone = SpediscString:"BaBBuino" to 192.168.1.1, 192.168.1.2, 192.168.1.3, 192.168.1.4 ecc.  >

</body></html>
Logged

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2294
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-roll
è sufficiente usare un array, e con un ciclo for scorrere tutti gli elementi.
Per poter eseguire le GET (le chiamate) ai nodi in backend, puoi utilizzare ajax.

Ti posto un esempio, grezzo ma funzionante, che alla pressione di un bottone invia agli indirizzi nell'array la url specificata.

Code:
<!DOCTYPE html>
<html>
<head>
   <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<script type="text/javascript">
var babbuini = [ "192.168.0.3", "192.168.0.4", "192.168.0.5", "192.168.0.6"];
$(document).ready(function(){
$("#cmd01").click(
function() {
$.each(babbuini, function() {
$.ajax({
type: "GET",
// url chiamata: http://192.168.0.X/baBBuino?params
url: "http://" + this + "/baBBuino",
data:  "params"
  });
});
});
});
</script>
<input type="button" id="cmd01" value="Invia baBBuino" /><br />
</body>
</html>

Puoi partire da qui.

Risorse utili:
http://api.jquery.com/ (in generale)
http://api.jquery.com/jQuery.get/
« Last Edit: November 25, 2011, 07:20:47 pm by pitusso » Logged

Offline Offline
Edison Member
*
Karma: 40
Posts: 1957
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ottimo! Domani lo implemento in una pagina che sto cominciando a costruire. Se funziona ti regalo una Banana! smiley-grin

Mi viene in mente una cosa: il tuo esempio spara le stringhe alla matrice di IP, ma per far si che i BaBBuini leggano la stringa devo aggiornare le singole pagine Web?  smiley-roll 

Esempio per capire meglio:

Se io apro la pagina HTML dentro un BaBBuino digitando http:\\192.168.0.1\?Luce_1ON si apre con già il comando della luce1 accesa, e non devo clikkare il relativo pulsante. E così via per altri comandi.

Anche quando premo un pulsante "interno" alla pagina, per accendere una luce, il pulsante mi autospara la stringa Luce_2ON e per far si che ci sia la cattura della stringa c'è un autoaggiornamento della pagina.

In questo caso, quello del tuo esempio, manda la stringa, ok, ma per leggerla deve aggiornarsi la pagina oppure in qualche modo, il WebServer dentro il BaBBuino, la intercetta lo stesso?
Logged

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2294
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
In questo caso, quello del tuo esempio, manda la stringa, ok, ma per leggerla deve aggiornarsi la pagina oppure in qualche modo, il WebServer dentro il BaBBuino, la intercetta lo stesso?
..detto semplicisticamente, ajax effettua una chiamata in backend, e il risultato è lo stesso che si otterrebbe digitando quell'indirizzo a manina su un web browser.
Quindi sì, il WebServer riceve cmq la chiamata.
Chiaramente per accendere la luce1, la url che "spari" avrà come params Luce_1ON.
Riporto parte del codice aggiornato su url specifica ( http:\\192.168.0.X\?Luce_1ON)
Code:
$.ajax({
     type: "GET",
     // url chiamata: http://192.168.0.X/?Luce_1ON
     url: "http://" + this,
     data:  "Luce_1ON"
});
Logged

Offline Offline
Edison Member
*
Karma: 40
Posts: 1957
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, sono basito dalla cortesia che hai nell'essere così dettagliato,con tanto di codice pronto all'uso, dote rara in questo ambiente.

Un grazie sentito.

Quindi, se tutto fila liscio, dal paginone Master che sta sul PC Touch Screen, schiaccio un pulsantone e tutte le luci di tutti i BaBBuini si devono spegnare contemporaneamente.

Domani torno per aggiornare la situazione e per porre un altro problema "harware" che non posto per non buttare troppa carnee al fuco e rendere dispersivo il post.

A proposito, se a qualcuno interessa posso postare schetch e schemi connessioni con spiegazioni il più articolate possibile.
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Ok, sono basito dalla cortesia che hai nell'essere così dettagliato,con tanto di codice pronto all'uso, dote rara in questo ambiente.
Trovo di poco rispetto "dote rara in questo ambiente", probabilmente lo conosci poco.
Neanche tu che hai programmato 6 arduini hai messo un pezzetto dei tuoi sketch, visto che rispondi così. Non ci si accontenta di un instradamento ma si vuole il pezzo completo pronto all'uso,  dote molto diffusa in questo ambiente.

Comunque:
Tu hai chiesto anche che i 6 dispositivi dovevano comunicare con gli altri e darti autonomamente tutti gli stati, e sarebbe logico fare così.
 
implementa anche la funzione succes ed error per controllare le risposte nel get di tutti gli arduini. Il criterio che ti ha scitto Pitusso e il mio pezzetto sono  esattamente quello che fa l'esempio tinywebserver con la sola differenza che lavora su un ip solo.
Infatti sempre se osservi l'esempio tiny

Questa parte di codice aggiorna facendo richiesta ogni 400 millisecondi inviando gli stati, perchè in risposta oltre a ottenere un 200 OK, può inviare una sfilza di dati. Non ti pubblico il pezzo modificato pronto e funzionante, ma questo può comunicare con gli altri.

function ledStatus(btn, url) {
    $.ajax({type: "GET",
       cache: false,
       url: url,
       success: function(status) {
                       window.setTimeout(ledStatus, 400, btn, url);


$(document).ready(
    function() {
   var lightBulb = new Button($("#lightbulb"));
   ledStatus(lightBulb, "/ledstatus");
    });
 
Anche se in una casa creare una rete lan per gestire sei stanze lo trovo poco pratico, uno spreco di denaro ed energie per realizzare l'impianto, quando con 2 fili puoi gestire 256 dispositivi senza lan (con un solo arduino master)
ciao
« Last Edit: November 26, 2011, 04:22:15 am by pablos71 » Logged

no comment

Offline Offline
Edison Member
*
Karma: 40
Posts: 1957
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi spiace che ti sia risentito della mia frase ma è così, una constatazione. Puoi osservare come in moltissimi fotum che trattano di programmazione, si principia un post con una domanda, poi c'è un agenerica risposta e poi il nulla. Cade tutto nel vuoto. Non è ne colpa mia ne colpa tua, ma è così.

E i ringraziamenti sono stati veramente sentiti, perchè spesso si danno scontate conoscenze che uno non possiede completamente, quindi, invece di una riga di codice, mettere tutta l'ossatura della funzione, non è cosa da poco e ripeto, dote rara in questo ambiente, checchè se ne pensi.
Quanto al codice, se hai letto bene, sono disposto a metterlo in toto, mica è materiale "Segreto" e sono assolutamente per la condivisione.

Tornado in tema: gli Arduini non devono comunicare tra loro (così mi pare di aver capito che hai scritto), ma semplicemente con il Pc touch screen, che fa un pò da controllore attraverso le pagine HTML che gli arrivano dagli arduini.

Le funzioni per la singola stanza le controllo dalla singola pagina, ma ho questa necessità:

Un solo comando per:
- Tirare giù tutte le tapparelle quando esco di casa
- Tirare su  tutte le tapparelle quando rientro o quando vado a dormire
- Spegnere tutte le luci in una botta sola, senza dover intevnire su ogni singolo pulsante di ogni pagina.

Questi comandi dovrebbero essere implementati in una normale pagina HTML che metto sul PC, e non su alcun Arduino.

Quanto alla scelta della rete Ethernet è per avere tutto in formato UNIVERSALE HTML, così non devo preoccuparmi con quale piattaforma accederò al sistema, anche perchè vorrei usare un Galaxy Tab come "telecomando" per tutta la casa.
Diversamente mi sarei dovuto costruire una applicazione in linguaggio diverso per ogni "coso" che avessi usato per accedere (iPad, iPhone, telefonioni, Apple Pc o quant'altro). Invece con una sola semplice modifica al codice HTML, mi si ripercuote positivamente su ogni sistema di accesso che abbia un WEB Browser. smiley-wink

Inoltre, ogni baBBuino è autonomo e indipendente, e se si scassa non mi ferma il sistema, e nemmeno se mi si guasta o si freeza il Pc "centrale", tutto il resto continua a funzionare.
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Figurati se me la prendo per così poco smiley cmq non hai ancora postato il tuo sketch ... per quello che riguarda il forum hai solo preso e dato niente, soprattutto in un argomento poco trattato o segrettissimo e fai pure commenti su persone che lo fanno gratis e/o per hobbyes...
« Last Edit: November 26, 2011, 08:28:38 am by pablos71 » Logged

no comment

Offline Offline
Edison Member
*
Karma: 40
Posts: 1957
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Abbi pazienza, ma ti sei svegliato male? 
Logged

Pages: [1] 2 3 4   Go Up
Jump to: