Invio comandi da Altervista verso Arduino

Si mi sono pure iscritto e sta sera mi guarderó tutto per bene il discorso paraimpu.
Già che sei così gentile vorrei capire cosa devo sapere per realizzare quello che voglio fare tramite altervisa. Leggendo e documentandomi ho trovato molti "indizi" ma non so ancora bene quello che mi serve per riuscire a comandare arduino da altervista.
Ti ringrazio ancora!

ciao domoino,
supponendo che tu abbia una tabella con diversi bottoni, al click di uno di questi crei il json con i dati da inviare come una richiesta ajax (ti consiglio jquery) a paraimpu.
La richiesta che devi fare è simile a questa: $.post("http://paraimpu.crs4.it/thing/UUID_actuator", { "D3": "L"});
dove UUID_actuator è l'UUID associato al tuo attuatore, il tuo arduino, mentre {"D3", "L"} sono i dati inviati che in questo caso significano mettere a LOW il pin D3.
Per maggiori dettagli/codice chiedimi pure, in quanto questo è solo un abbozzo.

Ciao

Facendo prove su paraimpu sono riuscito ad estrarne questo (mettendo arduino in actuators):

Data type used: application/json
To get data: an HTTP GET or POST request to http://paraimpu.crs4.it/use?token=46d86e7e-8b70-4525-b928-be9708a4912e

dovrei mettere dietro al bottone del comando nella pagina html (php) questo:

$.post("http://paraimpu.crs4.it/thing/46d86e7e-8b70-4525-b928-be9708a4912e ", { "D3": "L"});

e questo mi setterebbe l'uscita digitale 3 a LOW?

Spero di non aver detto troppe cazzate :cold_sweat:

x iscrizione

ciao domoino,
premetto subito che ti avevo scritto una cavolata perché non avevo più utilizzato l'app che avevo fatto.
Allora ho ripreso in mano paraimpu e quello che devi fare è creare un sensore, ossia un qualcosa che ti crea dei dati, nel tuo caso la tua pagina html, un attuatore, ossia quello che consuma i dati, nel tuo caso arduino e collegarli assieme.
Il sensore da creare è uno generico (Generic Sensor) che come content-type accetta application/json, l'attuatore sarà il tuo arduino e poi quando li connetti inserisci i mapping e i filter che ti servono.
Ora il flusso è il seguente: tu devi produrre i dati, ossia cliccare su un bottone della pagina web, e quindi fare una richiesta in post al tuo Generic Sensor, la connessione filtrerà e mapperà i dati verso il tuo attuatore che metterà a LOW o a HIGH il pin specificato nella richiesta.
Sostanzialmente tu devi solo interagire con il sensore (e sulla pagina di questo ci sono tutte le info per creare nuovi dati), non con l'attuatore.
Ti allego la pagina HTML che ho utilizzato per fare i test. Un paio di cose: il 'token' che vedi è associato al mio sensore generico, AndroidPhone, la parte 'data' è arbitraria a me servivano quel tipo di informazioni quando filtro e mappo, ma tu puoi mettere quello che vuoi. Ultima cosa la creazione ritorna con codice http 201 quindi non è uno status propriamente ok ma non ci sono problemi: per verificare se la risorsa è stata creata fai un refresh sulla pagina del sensore.

Chiedimi pure, perché forse non sono stato molto chiaro.

Ciao

test_paraimpu.html (1.53 KB)

Critical sei veramente gentilissimo!
Ho letto per bene la pagina da te realizzata, ti chiedo solo una cosa (dato che non sono pratico di json e molto poco di paraimpu), vorrei capire cosa devo mettere nel "pulsante" posto all'interno della pagina html per far si che Arduino riceva i comandi.
Mi va bene sia la soluzione di passare tramite paraimpu che no.

Ho capito tutto quello che mi hai detto e i vari meccanismi (paraimpu permettere di fare cose veramente belle!), ti sei spiegato perfettamente!
Il mio problema è appunto capire cosa mettere "dietro" i pulsanti con cui invio i comandi, quelli che ora son questi per capirci meglio:

"<tr>"
         "<th><em><strong>Led</strong></em></th>"
         "<td><a href=”192.168.1.161:333/c1”> Accendi </a></td>"
         "<td><a href=”192.168.1.161:333/c2”> Spegni </a></td>"
"</tr>"

e successivamente come far capire ad arduino i comandi ricevuti, quello che ora è questo:

if(msg.indexOf("c1")>0)
                  {
                       digitalWrite(5, HIGH);
                  }
else if(msg.indexOf("c2")>0)
                  {
                       digitalWrite(5, LOW);
                  }

Grazie di nuovo!

Secondo me dovresti capire che strada intraprendere, perché le cose da fare sono un po' diverse a seconda della soluzione che intendi adottare. Se usi paraimpu, lato arduino non devi fare nulla: devi solo caricare lo sketch che ti danno loro e sei ok (a meno di modifiche che tu vuoi fare allo sketch), mentre devi curare l'aspetto html, ajax e configurare paraimpu come più ti piace (non è per niente difficile).
Se intraprendi la strada di non usare paraimpu devi "smazzarti" la lettura delle richieste http nello sketch e in questo caso non sono molto pratico in quanto non ho ancora un ethernet shield :disappointed_relieved:!
Posso darti una mano lato html e ajax per entrambe le soluzione mentre per quanto riguarda la strada non paraimpu ti consiglio di vedere il post che ti avevo già linkato (WebServer SD - #13 by system - Generale - Arduino Forum) che leggeva i valori che venivano passati dal form della pagina html ad arduino.
Per quanto riguarda lato HTML i bottoni si comportano come il mio div che sulla pagina html di test era cliccabile: gli assegni un ID e poi tramite la funzione ready di javascript gli associ l'evento di click. Ad esempio dato questo bottone: <input id="mioBottone" name="d12" type="button" value="on"/> tra il tag head dopo aver incluso jquery in un tag script, apri un altro tag script

$(document).ready(function(){
    $("#mioBottone").click(function(event){
       doSomething
    )}

in questo modo al click sul bottone verrà eseguito il codice 'doSomething'. Ora quel 'doSomething' dipende dalla strada che vuoi fare. Per paraimpu va bene il codice che c'era sulla mia pagina di test (con i dovuti cambiamenti per adattarlo alle tue esigenze), per l'altra strada secondo me va devi fare sempre una richiesta ajax verso però l'ethernet shield e come parametri qualcosa che decidi tu. Ad esempio il 'doSomething' potrebbe essere qualcosa del genere:

$.ajax({
	type: "GET",
	url: "ip_shield",
	data: {d12:"on"},
	complete: function(jqXHR, textStatus) {
	'gestione della response'
        }
});

Fai attenzione che data è arbitrario, ci puoi mettere quello che ti serve (in questo caso è il name e il value del bottone che con jquery puoi ricavarti usando le proprietà dell'oggetto) e che questa volta non è un json ma sono i parametri della richiesta in get che saranno nella forma '?d12=on' (mentre per paraimpu il data dev'essere un json). Lato arduino dovrai parsati la richiesta sopra come hanno fatto nel post che ti ho detto prima.
Fai alcune prove per vedere cosa arriva ad Arduino con il secondo caso.

Ciao

Ciao Critical e grazie mille perchè sei sempre chiarissimo!

Ho risolto il problema in modo molto semplice(non ci avevo pensato) senza sfruttare jQuery, Ajax, ecc.
Ho usato uno "scamuffo" ma per le prove che voglio fare va più che bene.

Se ti può servire o ti può interessare ti posterò parti del codice senza problemi :wink:

Buona domenica!

ciao domoino,
si si mi interessa. Che scamuffo hai fatto? :astonished:

Uno scamuffo da sistemare :stuck_out_tongue:
Ti posto il codice così capisci meglio, starei più tempo a spiegare che a mostrarti :slight_smile:

• Codice su Arduino:

    pc_client.print("<html>");
                    pc_client.print("<head>");
                    
                    pc_client.print("<meta HTTP-EQUIV='refresh' content='0; url=http://InserirePaginaSuCuiEseguireRedirect'/>");
                    pc_client.print("</head>");
                    
                    pc_client.print("</html>");
                      
                      
                  if(msg.indexOf("c1")>0)      //C1, c2 sono per il cicalino
                  {
                        digitalWrite(2, HIGH);
                  }
                  else if(msg.indexOf("c2")>0)
                  {
                        digitalWrite(2, LOW);
                  }
                  else if(msg.indexOf("c3")>0)  //c3, c4 sono per il primo Led
                  {
                       digitalWrite(5, HIGH);
                  }
                  else if(msg.indexOf("c4")>0)
                  {
                       digitalWrite(5, LOW);
                  }   
                  else if(msg.indexOf("c5")>0)  //c5, c6 sono per il secondo Led
                  {
                       digitalWrite(9, HIGH);
                  }
                  else if(msg.indexOf("c6")>0)
                  {
                       digitalWrite(9, LOW);
                  }

• Esempio parte di una Pagina del sito (invio dei comandi):

<tr>
			<td>LED1</td>
			<td>

			<form action=http://192.168.1.161:333/c3>  <!--Indirizzo Ip Ethernet Shield Arduino(Locale) con relativo comando
 			<input name="Accendi" type="image" src="ONgrigio.png" alt="Accendi" title="Accendi" width="70" height="70">  
			</form> 			

			<form action=http://192.168.1.161:333/c4>
 			<input name="Spegni" type="image" src="OFFgrigio.png" alt="Spegni" title="Spegni" width="70" height="70"> 
			</form>

			</td>
		</tr>

• Ora devo capire come fare il redirect automatico alla pagina da cui si arriva ad Arduino (tramite l'indirizzo IP) cambiando questa riga:

                    pc_client.print("<meta HTTP-EQUIV='refresh' content='0; url=http://InserirePaginaSuCuiEseguireRedirect'/>");

Oppure usando jSon.

Funziona sia da locale che da remoto (settando un "virtual server" sul router).

Ora devo perfezionare la sicurezza!

Ma se non ho capito male in questo modo tu ti connetti alla pagina di arduino e questa fa il redirect al sito di altervista, giusto? Io avevo capito che avevi un sito esterno e che volevi farlo interagire con arduino.
Comunque:

<tr>
		<td>LED1</td>
		<td>

		<form action=http://192.168.1.161:333/c3>  <!--Indirizzo Ip Ethernet Shield Arduino(Locale) con relativo comando
		<input name="Accendi" type="image" src="ONgrigio.png" alt="Accendi" title="Accendi" width="70" height="70">  
		</form> 			

		<form action=http://192.168.1.161:333/c4>
		<input name="Spegni" type="image" src="OFFgrigio.png" alt="Spegni" title="Spegni" width="70" height="70"> 
		</form>

		</td>
	</tr>

è la stessa cosa del mio codice solo che invece di usare chiamate ajax fai submit di un form e ricarichi tutta la pagina :).

<tr>
			<td>LED1</td>
			<td>

			<form action=http://192.168.1.161:333/c3>  <!--Indirizzo Ip Ethernet Shield Arduino(Locale) con relativo comando
 			<input name="Accendi" type="image" src="ONgrigio.png" alt="Accendi" title="Accendi" width="70" height="70">  
			</form> 			

			<form action=http://192.168.1.161:333/c4>
 			<input name="Spegni" type="image" src="OFFgrigio.png" alt="Spegni" title="Spegni" width="70" height="70"> 
			</form>

			</td>
		</tr>

Questa parte si trova su Altervista, Arduino riceve i comandi da qui e una volta ricevuti rimanda su una pagine di altervista.
Se era come il tuo esempio scusami ma forse avevo frainteso! :blush: :sweat_smile:

Il primo accesso avviene da una pagina presente il Altervista comunque.
Poi dalle varie pagine invio i comandi ad Arduino :slight_smile:

Se era come il tuo esempio scusami ma forse avevo frainteso!

tranquillo, figurati nessun problema.
Ma alla fine avevi provato la mia soluzione?

Si ho provato paraimpu, bel progetto che merita approfondimento (almeno da parte mia). Non sono riuscito a realizzare il mio progetto sfruttandolo perchè devo studiarlo bene ancora. Vorrei implementare la parte che mi permette di mandare notifiche a twitter tramite arduino, quindi vedró come realizzare questo con paraimpu (per il momento).

Bene bene :)! Ma la parte ajax avevi provato ad inserirla? Perché forse con ajax nn ti serve neanche gestire "manualmente" il ritorno dalla pagine web di arduino a quello di altervista.

È esattamente quello che volevo verificare, devo capire come funziona prima :sweat_smile:

Scrivi pure se hai problemi domoino. In quello che posso ti do una mano io e per il resto ci affidiamo al forum :slight_smile:
Ciao

Grazie mille critical!
In questi giorni approfondiró la mia conoscenza di Ajax per evitare di dire fesserie :slight_smile:
Nel caso ti chiederó aiuto vista la tua gentilezza!

Rieccomi tornato all'opera.
Allora mi son letto un pò di Ajax e jSon ma dato che sono immerso in altre faccende non ho avuto molto tempo per eseguire prove purtroppo.
Ho migliorato un pò il progetto esistente (in linea generale) ma vorrei mi aiutaste (grazie critical :wink: ) riguardo a come gestire Ajax, o jSon, per poter inviare i comandi al mio Arduino.
Ho seguito alcuni topic nel forum e alcune spiegazioni nel web come queste:
http://api.jquery.com/jQuery.getJSON/
http://www.tizag.com/ajaxTutorial/ajaxxmlhttprequest.php