[Help] Domotica con WebServer Arduino

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! XD

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

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.

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

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

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

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

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:

Mando stringhe a tutti

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

:roll_eyes:
è 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.

<!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" />

	</body>
</html>

Puoi partire da qui.

Risorse utili:
http://api.jquery.com/ (in generale)
jQuery.get() | jQuery API Documentation

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

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? :roll_eyes:

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?

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)

$.ajax({
     type: "GET",
     // url chiamata: http://192.168.0.X/?Luce_1ON
     url: "http://" + this,
     data:  "Luce_1ON"
});

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.

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

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. :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.

Figurati se me la prendo per così poco :slight_smile: 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...

Abbi pazienza, ma ti sei svegliato male?

<!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.2", "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:  "b1"
	   					});
					});
				});
			});
		</script>
		<input type="button" id="cmd01" value="Invia baBBuino" />

	</body>
</html>

Questo codice non funziona. La stringa che devo mandare è semplicemente "b1" che mi accende la 1a luce di ogni stanza.

Ho aperto la finestra relativa ad un babbuino a caso (192.168.1.5) ho lanciato questo file di esempio, clikkato sull'unico pulsante "Invia baBBuino" ma non succede assolutamente nulla alla pagina del babbuino. Non si aggiorna, non compare la stringa "b1" ne niente.

Ora cerco di capire l'esempio di Pablo

Mi sorge un dubbio:

Qui c'è un richiamo ad un file jquery-lastest.js. Non è che me lo devo scaricare e mettere nella cartella dove ho il file con il pulsante "Invio Babbuino"?

Il dubbio era corretto.

Mi sono puppato una Guida per JQuery e ho capito che quell'intestazione serve per caricare il motore JQuery.

Ho scaricato la versione jquery-1.7.1.js ver develop, non compressa, e l'ho messa nella cartella del file con il pulsante "Invio BaBBuino"
Ho cambiato l'intestazione con riferimento all'ultima versione scaricata, senza path perchè sono nella stessa cartella:

Ho salvato, ma non funziona ancora un tubo.

Il mio dubbio é come fai a dimmerare una luce a 220v con un Pwm...dalle conoscenze che ho io di elettronica...non credo tu possa farlo... :wink:

Infatti non ne dimmero una ma ben 4!