sabato 21 dicembre 2013

Domotica in mezzora: dimmerare un led dall'ipad via wifi (NetIO app) - parte 1

Un piccolo esempio di domotica: voglio controllare l'accensione/spegnimento e luminosità di un led pilotato da Arduino, tramite iPad in rete wifi.
Potrebbe essere l'esempio per un sistema base per il controllo delle luci in un ambiente o per altre periferiche tipiche dei sistemi domotici (porte, finestre, climatizzatore, ecc).
L'esempio è molto semplice e non richiede la programmazione su iPad. Infatti la programmazione in ambiente iOS richieste conoscenze specifiche e l'ambiente XCode. Al di là della difficoltà di approcciare a un ambiente IDE diverso da quello di Arduino, anche presupponendo di saper programmare in objC in ambiente XCode, è richiesto un certificato per sviluppatori per poter installare l'app creata sul proprio device, senza questo è possibile unicamente utilizzare l'emulatore sul Mac.
Per riuscire in mezzora a creare una app utilizzabile da tutti senza scrivere mezza riga di codice, utilizzerò l'app NetIO disponibile in AppStore a questo indirizzo https://itunes.apple.com/it/app/netio/id464924297?mt=8 . Il costo è modesto, meno di 7 euro, e considerato i risultati che permette di ottenere in pochissimi minuti la consiglio caldamente.




L'architettura sarà basata su un piccolo client-server, dove il client è appunto composto dall'app NetIo, in grado di inviare attraverso la rete tcp dei semplici comandi testuali, che vengono ricevuti ed interpretati da un server implementato su Arduino tramite la classe EthernetClient, che rimane in ascolto in questo caso sulla porta 2560.

L'hardware

Le componenti necessarie sono minimali:
una scheda Arduino Ethernet, che può essere facilmente sostituita in alternativa con una Arduino Uno più una ShieldEthernet o scheda alternativa.
Nel mio caso ho usato la Arduino Ethernet per avere un'unica scheda invece del solito "castello" a due schede. Lo svantaggio delle Arduino Ethernet è di non avere a bordo la usb, per cui è necessario applicare un adattatore Serial2Usb per poter deployare lo sketch sulla scheda.
Per la connessione wifi, ho usato un normale router wifi, qui per l'occasione denudato del suo involucro, ma in ogni caso si tratta di un economico Netgear 834G.
Il led da pilotare l'ho collegato alla porta 9, tramite una resistenza da 1K. Per evitare saldature, ho montato tutto su una mini breadboard.


Lo sketch su Arduino

Il loop principale è basato ed interpretazione dei comandi inviati attraverso la rete. Il client inizierà la comunicazione inviando la stringa Local, dopodichè ad ogni controllo sulle interfaccia utente (pulsante, interruttore, slider) verrà associato una stringa relativa a uno specifico comando, che qui interpretato permetterà di accendere/spegnere o dimmerare il led.
La luminosità del led è ovviamente ottenuta modificando il valore pwm dell'uscita arduino.

void iPadInterface() {

  int index = 0;
  char Remote[BUFSIZ];

  EthernetClient client = iPadServer.available();
  if (client) {
    if (client.connected()) {
      while (client.available()) {
        char c = client.read();
        //Serial.print(c);                      // print to the screen
        if (c != '\n' && c != '\r') {           // no linefeed or CR so keep reading
          Remote[index] = c;
          index++;
          if (index >= BUFSIZ) 
            index = BUFSIZ -1;
          continue;
        }
        Remote[index] = '\0';
      }

      Serial.println(Remote);                  // print string sent from iPhone

        if (strstr(Remote, "Local")) {           // initialsend
        client.println("OK");
      }


      if (strstr(Remote, "LED9 status")) {   // set the LED9 switch according the Status
        client.println(Led9status);          // answer with the onText
      }

      if (strstr(Remote, "LED9 on")) {       // set the LED9
        client.println("OK");
        digitalWrite(Led9, HIGH);            // turn the LED9 on (HIGH is the voltage level)
        Led9status = 1;
      }

      if (strstr(Remote, "LED9 off")) {      // set the LED9
        client.println("OK");
        digitalWrite(Led9, LOW);             // turn the LED9 off (LOW is the voltage level)
        Led9status = 0;
      }

      if (strstr(Remote, "set brightness")) {    // is it a slider value
        client.println("OK");
        brightness = ledDimm (Remote);
        analogWrite(Led9, brightness);  
        //delay(30);
      }

      if (strstr(Remote, "get brightness")) {     // set the slider to last brightness value
        client.println(brightness);
      }
    } 
  } 
} 

I comandi possono essere senza parametro come ad esempio LED9 on e LED9 off, oppure contenere un valore come nel caso di set brightness 200
In questo caso l'interpretazione è leggermente più complessa, perchè è necessario ricavare il valore numerico all'interno della stringa. La funzione ledDimm si occupa di interpretare il comando e restituire il valore letto.

int ledDimm(String command)
{
  // Get the Value xx from string set brightness xx
  String substring = command.substring(15, command.length());
  // Create a Char Array to Store the Substring for conversion
  char valueArray[substring.length() + 1];
  // Copy the substring into the array
  substring.toCharArray(valueArray, sizeof(valueArray));
  // Convert char array to an int value
  int value = atoi(valueArray);
  return value;
}

Usare NetIO

La "genialata" di NetIO sta nel fatto di disporre di un un designer di interfaccia online, utilizzabile attraverso un browser. Non è quindi richiesta l'installazione di programmi sul proprio computer, e tutto avviene progettando e salvando direttamente online il proprio progetto. 
Dall'app installata sul vostro devide iOS, è poi sufficiente loggarsi e selezionare il progetto precedentemente creato, per poi trovarselo immediatamente disponibile ed utilizzabile.
Per iniziare a giocarci, andate su http://netio.davideickhoff.de/editor e registratevi altrimenti non avrete la possibilità di salvare il progetto e recuperarlo dal sito.


L'interfaccia può essere disegnata utilizzando dei controlli di 5 tipologie: etichette (label), bottoni, interruttori, slider e webview.
Ogni controllo può mandare un comando a una specifica connessione, configurata a livello di progetto (ogni progetto può tuttavia avere più connessioni).
Come prima cosa andiamo in General->Connections e configuriamo l'ip assegnato ad Arduino. Consiglio per semplicità ed ridurre la probabilità di errori, di usare IP statici per il vostro Arduino. Per l'iPad è indifferente invece la scelta tra ip statico o dinamico.
Posizioniamo i controlli: 2 bottoni, un interruttore e uno slider.
Per ogni bottone definiamo il comando da inviare e le sue proprietà. Nelle figure successive potete vedere le proprietà del bottone di accensione e dello slider. In ogni caso potete scaricare in fondo a questo post il file json che potrà essere uploadato nel designer di NetIO.

Definizione del bottone di accensione
definizione dello slider




1 commento:

  1. Ciao Diego e complimenti per la pagina..
    da ieri mi sono acquistato NetIO per Iphone ed ho provato a smannettare un pò.. Volevo farti una domandina curiosa.. tutto funziona bene con i Sends ed aziono quello che voglio.. ma quando utilizzo il commando Reads, il sistema si disconnette e connette di continuo con una frequenza di circa ogni 2 secondi.. lui invia la stringa contenuta in Reads, ma quando in micro invia la risposta il sistema è già sconnesso.. questo è un grosso problema in quanto non posso ricere l'info dal micro.. non ti è mai capitato? sai darmi una dritta??
    Grazie anticipatamente,
    Oscar

    RispondiElimina