La possibilità di controllare Arduino da remoto e una delle applicazioni sulla quale ho maggiore interessa. Trovo che Arduino abbia una forte predisposizione alla domotica OpenSource o FaiDaTe ed è per questo motivo che cerco di scrivere degli Sketch orientati sull’aspetto di controllo degli attuatori da remoto.
Se ci inseriamo anche la possibilità di inviare allarmi o notifiche via email o via SMS senza dove per forza comprare un GSM Shield e senza costi aggiuntivi la cosa diventa ancor più allettante e aumenta di molto la tipologia di utilizzo di Arduino.
Rimanendo in ambiente domotica potremmo effettuare un allarme che avvisa con un SMS all’accadere di un determinato evento.
Questo esempio è quello che andrò a spiegare.
Come dicevo in precedenza, l’idea di avere da Arduino delle notifiche via SMS rapidi e veloci mi era sempre piaciuta. Il problema diventava l’acquisto di un GSM Shield. Ero arrivato al punto di smontare un vecchio Nokia 3210 per integrarlo con Arduino … capiraiii 😐 … come se fosse una cosa semplice e banale, come direbbero gli Afterhours 🙂
Lasciato alle spalle il progetto implementazione Nokia 3210 e Arduino mi stavo rassegnando ad utilizzare solo le notifiche via email, che dal mio punto di vista non sono il massimo della rapidità dato che con il mio smartphone faccio un controllo ogni ora e non ho assolutamente voglia di lasciare la connessione UMTS sempre attiva.
Un bel giorno mi venne in mente che il Signor Google mette a disposizione un servizio di notifica via SMS per gli eventi aggiunti sul proprio calendario condiviso. Ero arrivato alla soluzione … dovevo utilizzare Google Calendar
Il problema adesso diveniva il capire come far inserire l’evento di Arduino dentro Google Calendar e qui mi è venuto ad aiutare SalisNet.eu – Aggiungere un evento a Google Calendar che ha scritto un bell’articolo sulla possibilità si inserire eventi tramite un form HTML e PHP … era proprio quello che stavo cercando!!!
Fatti un idea di cosa può fare il progetto
Vedi l’articolo Go Arduino!!!
Iniziamo con la spiegazione pratica e i codici.
Di cosa abbiamo bisogno:
- Buona conoscenza di PHP!!!
- Server WEB (Apache e PHP) MySQL al momento non ci interessa, può essere utile per successive applicazioni.
- 2 Account di Google o l’iscrizione a GoogleAPPS con 2 account di nostra proprietà.
- Saper utilizzare Google Calendar ed aver attivato le notifiche di Google Calendar per il proprio cellulare.
- Arduino + Ethernet Shield
- Interruttore magnetico o altro tipo di attuatore, sensori e altri componenti elettrici vedi (Arduino con controllo remoto via HTTP)
Il codice di Arduino:
Descrizione pratica: Arduino rimane in ascolto di una stringa http che abbia come parte finale ATT=1
quando questo evento si verifica, viene attivato “l’antifurto”. Con “antifurto” attivo, se si verifica un determinato evento sull’interruttore magnetico o qualunque altro attuatore, Arduino invia un GET con tutti i parametri ad una pagina PHP che elabora la richiesta.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
... /* *** controllare un attuatore via web con sensori di temperatura, luce e interruttore magnetico ed invivio di GET per la notifica dello status via SMS con Google Calendar ARDUINO UNO ETHERNET SHIELD by Gianni Favilli - www.giannifavilli.it Readme: https://www.giannifavilli.it/blog/arduino-webcontrol-gcal-sms *** */ ... void loop(){ ... /*inizio lettura switch*/ valSwitch = digitalRead(inSwitch); // legge il valore dell'input switch /*fine clacolo switch*/ /*inizio attuatore led interruttore magnetico*/ // accendo o spengo un led se l'interruttore viene aperto o chiuso if (valSwitch == HIGH) { digitalWrite(ledPinSwitch, HIGH); // accende il LED dell'interruttore magnetico NotifyValSwitch = 1; // attiva il notificatore dell'interruttore magnetico // conta i cicli ad ogni loop per evitare l'invio di 'infiniti' sms // l'sms viene inviato solo quanto ContaCicliNotifica = 1 ovvero solo al primo loop ContaCicliNotifica = ContaCicliNotifica++; } else { // altrimenti digitalWrite(ledPinSwitch, LOW); // spegne il LED dell'interruttore magnetico ContaCicliNotifica = 0; NotifyValSwitch = 0; } /*fine attuatore led interruttore magnetico*/ // abilito il client-server per la lettura in ingresso della stringa http Client client = server.available(); if (client) { boolean currentLineIsBlank. = true; while (client.connected()) { if (client.available()) { char c = client.read(); leggoStringa.concat(c); if (c == '\n' && currentLineIsBlank) { if(leggoStringa.indexOf("ATT=1") > 0) { // controllo se nella stringa http in entrata finisce con ON // se e' ON digitalWrite(outPinRele, HIGH); // attiva rele' digitalWrite(ledPinNotify, HIGH); // attiva led Notifica = true; // attivo la notifica degli sms Serial.println("Notifiche ON"); } else{ // se e' OFF digitalWrite(outPinRele, LOW); // disattiva rele' digitalWrite(ledPinNotify, LOW); // disattiva led Notifica = false; // disabilito la notifica degli sms Serial.println("Notifiche OFF"); } // COSTRUZIONE PAGINA HTML CHE RISPONDE SE LE NOTIFICHE SONO ATTIVE O MENO client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); // inizio HTML client.print("<html><head><title>ARDUINO Controllo Led via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>"); client.println("<h1>STATO NOTIFICHE VIA SMS</h1>"); client.println("<hr />"); // scrivo lo stato di arduino (ON - OFF) if (Notifica) { client.println("<h2 style='color:green'>NOTIFICHE ATTIVE</h2>"); } else { client.println("<h2 style='color:grey'>NOTIFICHE NON ATTIVE</h2>"); } client.println("<hr /><a href='https://www.giannifavilli.it'><em>Visita GianniFavilli.it</em></a>"); client.println("<br /><a href='https://www.giannifavilli.it/blog/arduino-webcontrol-gcal-sms'><em>Leggi l'Articolo Completo</em></a>"); // termino l'html client.println("</body></html>"); // svuoto la stringa per una successiva lettura leggoStringa=""; // fermo il client in ingresso client.stop(); } //if c == /n } // if client available } // while client connesso } // if client // controllo se le notifiche via sms sono attive, //se NotifyValSwitch è = 1 e se ContaCicliNotifica è = 1 if(Notifica == true && NotifyValSwitch == 1 && ContaCicliNotifica == 1){ Serial.println("invio il GET alla pagina PHP"); // abilito il client per l'invio del GET Client client_send(serverphp,80); if (client_send.connect()) { //definisco il GET con i dati da inviare client_send.print("GET /pagina-che-ascolta..php?Board=ArduinoUNO&Location=Roma&"); // invio il valore ContaCicliNotifica fondamentale per inviare gli sms // il php elabora la richiesta SSE Cicli=1 ovvero lavora solo il primo loop client_send.print("Cicli="); ... |
Se ciò non ti sembra giusto sei liberissimo di prendere visione del codice reso disponibile e studiarlo! 😉
Impostare Google Calendar:
Inanzi tutto dobbiamo predisporre di 2 Account di Google o se utilizziamo GoogleAPPS dobbiamo possedere 2 account che possiamo gestire in piena libertà.
L’account principale è quello dove andremo ad attivare le notifiche con SMS. Per farlo andate sulle Impostazioni Calendar.
Una volta attivate sempre dalle impostazioni abilitiamo la notifica via SMS degli Inviti agli Eventi. Per farlo, sempre dalle impostazioni andate su Calendari e cliccate su Notifiche del vostro calendario predefinito.
A questo punto l’account principale è pronto.
L’account secondario è quello con cui invieremo gli inviti ai nuovi eventi.
Per farlo è necessario condividere il nostro calendario con l’account principale, questa operazione può essere fatta dalle Impostazioni Calendar.
Quando create la condivisione del calendario con l’account principale consiglio di abilitare i permessi di modifica degli eventi.
Una volta accettato l’invito della condivisione tra l’account principale e quello secondario siamo pronti per configurare i file PHP.
La parte in PHP:
Come dicevo prima, grazie ad un articolo letto su SalisNet.eu sono riuscito ad inserire i nuovi eventi su GoogleCalendar senza per forza dover accedere tramite browser a Gcal. L’articolo sopra riportato spiega come inserire un nuovo evento su Gcal sutilizzando semplicemente un Form in HTML.
Presi i file necessari messi a disposizione da SalisNet.eu ho dovuto apportare alcune modifiche fondamentali al funzionamento dell’invio dei dati a Google Calendar. Questi sotto riportati sono i file in PHP di cui necessitiamo con la descrizione delle modifiche da fare.
pagina-che-ascolta.php
Il codice che segue deve essere inserito in un file nominato pagina-che-ascolta.php cambiate pure nome ma ricordate di modificare anche lo SKETCH di Arduino quando viene inviato il GET.
Descrizione: Questo file controlla se alla pagina viene inviato un GET in caso affermativo controlla se la variabile Cicli=1 questo controllo è fondamentale per evitare di inviare la notifica ogni volta che il loop viene lavorato. A questo punto viene inviato il report tramite il file GoogleCalendarWrappeNotifier.php che spieghero successivamente.
In caso non ci sia un GET che fa richiesta della pagina, aprendo questa con un browser web abbiamo la possibilità di ATTIVARE o DISATTIVARE le notifiche con l’utilizzo di un FORM HTML ricordate di modificare l’ACTION del form indicando l’indirizzo IP di Arduino.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
<?php // controllo sull'invio da form if(!empty($_GET)) // controllo se ho un GET altrimenti costruisco l'html { // controllo se e' il GET giusto con notifica attiva e ciclo = 1 if($_GET["Cicli"]==".1") { $contenuto = "*** INIZIO RAPPORTO ***\n\n"; foreach ($_GET as $key => $value) ... $contenuto .= "\n*** FINE RAPPORTO ***"; //elaboro ora $dataevento = date("Y-m-d"); $tempoevento = date("H:i:s"); // inclusione del file di classe @require_once("GoogleCalendarWrappeNotifier.php"); // istanza della classe // inserire username e password dell'account di google $gc = new GoogleCalendarWrapper("UserAccountSecondarioGoogle@google.com", "passworddigoogle"); // parametri per l'inserimento $evento = array(); $evento["title."] = filter_var($_GET["Board"], FILTER_SANITIZE_STRING); $evento["content"] = filter_var($contenuto, FILTER_SANITIZE_STRING); $evento["where"] = filter_var($_GET["Location."], FILTER_SANITIZE_STRING); $evento["startDay"] = filter_var($dataevento, FILTER_SANITIZE_STRING); $evento["startTime"] = filter_var($tempoevento, FILTER_SANITIZE_STRING); $evento["endDay"] = filter_var($dataevento, FILTER_SANITIZE_STRING); $evento["endTime"] = filter_var($tempoevento, FILTER_SANITIZE_STRING); // chimata al metodo per l'inserimento if($gc->add_event($evento)){ // notifica in caso di inserimento }else{ // notifica in caso d'insuccesso } } // if get giusto } // if(!empty($_GET)) else { //scrivo l'html per controllare le notifiche di arduino ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta name="author" content="Gianni Favilli" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Arduino WEBCONTROL con GoogleCalendar SMS Notifier by GianniFavilli.it</title> </head> <body> <h1>NOTIFICHE</h1> <form method="get" action="http://indirizzo-o-ip-arduino" name"attivatore"> <label> <input type="radio" name="ATT" id="on" value=".1" /> ATTIVA</label> <label> <input type="radio" name="ATT" id="off" value="0" /> DIATTIVA</label> <input type=submit value="Invia Comando"> </form> <p> </p> <p><a href='https://www.giannifavilli.it'><em>Visita GianniFavilli.it</em></a> o <a href='https://www.giannifavilli.it/blog/https://www.giannifavilli.it/blog/arduino-webcontrol-gcal-sms'><em>Leggi l'Articolo Completo</em></a></p> </body> </html> |
Se ciò non ti sembra giusto, sei liberissimo di prendere visione del codice reso disponibile e studiarlo! 😉
GoogleCalendarWrappeNotifier.php
Per utilizzare questo sistema abbiamo bisogno di 2 classi. La prima è questa che segue, alla quale ho apportato delle modifiche fondamentali all’utilizzo delle notifiche con Arduino.
Questo file deve essere nominato GoogleCalendarWrappeNotifier.php
Attenzione alla Riga 35, dovete modificare il valore tra virgolette, inserendo l’indirizzo email del vostro account primario, quello dove avete attivato le notifiche via SMS quando venite invitati ad un nuovo evento.
MyCurl.php
L’ultima classe da utilizzare è MyCurl.php la potete scaricare da SalisNet.eu modificando l’estensione del file da TXT a PHP.
Attenzione: per far funzionare questa classe sul server PHP deve essere attiva l’estensione php_curl.
Conclusioni:
Per concludere, con qualche conoscenza in PHP ci possiamo sbizzarrire per l’invio di notifiche via email o via SMS se il sensore di movimento percepisce una variazione ambientale, se la temperatura supera una certa soglia, se la luminosità della stanza varia o se qualunque attuatore cambia di stato.
Per far questo basta modificare il GET di Arduino e il file pagina-che-ascolta.php.
Potremmo anche agganciare un DataBase in MySQL per registrare gli eventi e avere delle tabelle che ci permetto di fare operazioni dinamiche in base ai valori inviati dal GET di Arduino.
Per la precisione con MySQL possiamo registrare l’ultimo stato di Arduino, dato che il povero Arduino cambia stato in base alla stringa http che gli arriva. Mentre se avessimo un DB potremmo registrare l’ultimo stato di Arduino.
Qui a sinistra uno screenshot della pagina web per il controllo remoto di Arduino.
Questo è stato possibile grazie all’utilizzo di un database MySQL. E’ possibile farlo anche con un file di testo, ma risulta complicato avere uno storico delle variazioni di stato di Arduino. La pagina-che-ascolta.php oltre a controllare la variazione di stato per l’invio delle notifiche può “parsare” i dati provenienti da Arduino tramite GET ed eseguire un INSERT INTO dentro il database MySQL. Una nuova pagina PHP legge i dati recuperandoli da MySQL ed ecco fatta la pagina web per il controllo remoto di Arduino, come potete vedere qui a fianco.
Comunque le applicazioni sono una moltitudine, dalla possibilità di utilizzare dei JavaScript a quella di implementare le funzioni della pagina-che-ascolta.php … c’è da sbizzarrirsi 😉
Reference:
Il Forum di Arduino ARDUINO Forum in particolare il Topic da me aperto Inviare dati a PHP e ricevere comandi via HTTP in un unica sessione ringraziando lesto e Marco Benini per l’aiuto.
Le classi PHP originali e NON modificate (quindi INUTILIZZABILI per questo progetto) per l’inserimento di Eventi in Google Calendar le potete reperire a questo indirizzo SalisNet.eu – Aggiungere un evento a Google Calendar.
La guida utilizzata per le modifiche al file GoogleCalendarWrappeNotifier.php è quella ufficiale che fornisce GoogleCODE e la potete reperire al seguente link se volete aggiungere opzioni alle vostre notifiche Google Data Protocol – Common Elements: “Kinds”.
Un po’ di consulenza PHP che non fa mai male, PHP: Hypertext Preprocessor.
Come sempre rimango a disposizione per commenti, chiarimenti, informazioni, perplessità, modifiche da voi apportate, problemi o errori.
I commenti sono chiusi.