OUI – Programmi laboratorio Seminare Codici: “Arduino MKR1000 e IoT”

Gli esercizi con Arduino MKR1000 proposti nel workshop “SEMINIAMO CODICI” ne sfruttano la connettività WiFi.
Il primo farà una scansione delle reti wifi disponibili riportandone SSID, RSSI e Protocollo, mentre il secondo ci farà capire come connettersi alla rete wifi, conoscendone i dati di accesso, per poter realizzare progetti IoT.

  • Scansione Reti WiFi disponibili

/*
 Questo programma fornisce un primo approccio all'utilizzo
 della scheda WiFi di Arduino MKR1000.
 Ogni 10s effettua una scansione delle connessioni wifi disponibili
 riportandone l'SSID, la potenza del segnale e il protocollo di criptografia.
*/

#include <WiFi101.h>

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // attende la apertura del Monitor Seriale
  }
}

void loop() {
  // fa la scansione delle reti esistenti:
  Serial.println("Scansione reti disponibili...");
  listNetworks();   // stampa l'elenco delle reti
  delay(10000);
}

void listNetworks() {
  // scansione delle reti disponibili:
  int numSsid = WiFi.scanNetworks();
  if (numSsid == -1)
  {
    Serial.println("Non ci sono creti disponibili");
    while (true);
  }
  // stampo l'elenco delle reti:
  Serial.print("Numero di reti wifi disponibili: ");
  Serial.println(numSsid);
  for (int thisNet = 0; thisNet < numSsid; thisNet++) {
    Serial.print(thisNet);
    Serial.print(") ");
    Serial.print(WiFi.SSID(thisNet));
    Serial.print("\tSignal: ");
    Serial.print(WiFi.RSSI(thisNet));
    Serial.print(" dBm");
    Serial.print("\tEncryption: ");
    printEncryptionType(WiFi.encryptionType(thisNet));
    Serial.flush();
  }
  Serial.print("\n");
}

void printEncryptionType(int thisType) {
  switch (thisType) {
    case ENC_TYPE_WEP:
      Serial.println("WEP");
      break;
    case ENC_TYPE_TKIP:
      Serial.println("WPA");
      break;
    case ENC_TYPE_CCMP:
      Serial.println("WPA2");
      break;
    case ENC_TYPE_NONE:
      Serial.println("None");
      break;
    case ENC_TYPE_AUTO:
      Serial.println("Auto");
      break;
  }
}

 

  • Connessione Rete WiFi

 /*
 Questo sketch realizza una connessione alla rete WiFi
 e ne stampa i dati sul Monitor Seriale
 */
 
#include <WiFi101.h>

char ssid[] = "Orti_Urbani_Intelligenti";        
char pass[] = "OUI-seminarecodici";  
const int pinLED_CONNECTION = 6;           

int status = WL_IDLE_STATUS;

void setup() {    
  pinMode(pinLED_CONNECTION, OUTPUT); 
  digitalWrite(pinLED_CONNECTION, LOW);
  Serial.begin(9600);    
  while (!Serial) {
    ; // attende la apertura del Monitor Seriale
  }
  // attende il collegamento alla rete WiFi:
  while ( status != WL_CONNECTED) {
    Serial.print("In attesa del collegamento alla rete WiFi: ");
    Serial.println(ssid);                   //stampa a Monitor Seriale l'SSID di rete
    status = WiFi.begin(ssid, pass);        // connette alla rete WiFi con protocollo WPA/WPA2
    delay(10000);                           // attende 10 secondi che la connessione si realizzi
  }
  digitalWrite(pinLED_CONNECTION, HIGH);
  printWiFiStatus();                        // stampa lo stato della connessione sul Monitor Seriale
}

void loop() {
  ;
}

void printWiFiStatus() {
  // il MAC è un Array di valori
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC: ");
  Serial.print(mac[5], HEX);
  Serial.print(":");
  Serial.print(mac[4], HEX);
  Serial.print(":");
  Serial.print(mac[3], HEX);
  Serial.print(":");
  Serial.print(mac[2], HEX);
  Serial.print(":");
  Serial.print(mac[1], HEX);
  Serial.print(":");
  Serial.println(mac[0], HEX);
  // stampo l'SSID della rete a cui sono collegato:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  // stampo l'IP Address assegnato alla scheda wifi:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  // stampo la potenza del segnale wifi:
  long rssi = WiFi.RSSI();
  Serial.print("Potenza segnale (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

 

Il sensore utilizzato nei seguenti esercizi è l’YL69 che fornisce un’uscita Digitale On/Off (D0) ed una Analogica (A0), della quale ci serviremo.
Il valore analogico fornito è inversamente proporzionale al valore di Umidità del terreno:

Collegato il sensore come da schema, è possibile visualizzarne il valore di lettura da WebApp o attraverso Messaggi Telegram

  • Lettura Umidità relativa del terreno da WebApp (locale)

 /*
 WiFi Web Server per la Visualizzazione della acquisizione

 Questo sketch realizza un semplice Web Server con MKR1000.
 Il programma dopo la connessione wifi stampa sul Monitor Seriale
 l'IP Address dell'Arduino in rete. Inserendo questo IP nel browser
 è possibile visualizzare il valore di acquisito dall'Arduino.
 Il sensore di Umidità utilizzato è HC-38 + YL-69.
 L'uscita analogica (0-3,3v) del sensore viene acquisita in A0 (0-1023).
 Il Sensore fornisce 3,3v per Umidità=0, ed il suo valore decresce all'aumentare dell'H.
 Immergendolo in H2o la sua uscita vale circa 1,6v (495->100%H).
 */
 
#include <WiFi101.h>

char ssid[] = "Orti_Urbani_Intelligenti";        
char pass[] = "OUI-seminarecodici";      
const int pinLED_CONNECTION = 6;  
const int pinHS = A6;       

int status = WL_IDLE_STATUS;
WiFiServer server(80);

void setup() {
  pinMode(pinLED_CONNECTION, OUTPUT); 
  digitalWrite(pinLED_CONNECTION, LOW);   
  Serial.begin(9600);    
  while (!Serial) {
    ; // attende la apertura del Monitor Seriale
  }
  // attende il collegamento alla rete WiFi:
  while ( status != WL_CONNECTED) {
    Serial.print("In attesa del collegamento alla rete WiFi: ");
    Serial.println(ssid);                   //stampa a Monitor Seriale l'SSID di rete
    status = WiFi.begin(ssid, pass);        // connette alla rete WiFi con protocollo WPA/WPA2
    delay(10000);                           // attende 10 secondi che la connessione si realizzi
  }
  server.begin();                           // inizializza il web Server 
  digitalWrite(pinLED_CONNECTION, HIGH);
  printWiFiStatus();                        // stampa lo stato della connessione sul Monitor Seriale
}

void loop() {
  int acqHS = analogRead(pinHS);            // leggo il valore del sensore 
  int Humidity = map(acqHS,495,1023,100,0); // riporto a 100% (0-100) il valore d'acquisizione (1023-495)
  
  WiFiClient client = server.available();   // crea il client ed attende la loro connessione in rete

  if (client) {                             // se c'è richiesta da parte di un client
    Serial.println();  
    Serial.println("----------------------------------------------");  
    Serial.println("nuovo client");          
    String currentLine = "";                // creo una Stringa dove memorizzare i dati del client connesso
    while (client.connected()) {            // entro in un ciclo while dal quale usciremo solo a termine connessione del client
      if (client.available()) {             // se ci sono dati in arrivo (richieste del client)
        char c = client.read();             // leggo un byte
        Serial.write(c);                    // lo stampo sul Monitor Seriale
        if (c == '\n') {                    // se il byte è "nuova linea" significa che sono terminati i dati del client
          
          // essendo finita la HTTP request del client, invio una risposta html:
          if (currentLine.length() == 0) {
            client.println("<!DOCTYPE html>");
            client.println("<html>");
            client.println("<head>");
            client.println("<meta http-equiv='refresh' content='1'>");
            client.println("<title>Lettura Umidit&aacute; terreno con Arduino MKR1000</title>");
            client.println("</head>");
            client.println();
            client.println("<body>");
            client.println("<table width='100%' border='0' cellspacing='0' cellpadding='0' align='center'>");
            client.println("<tr height='200'><td></td><td></td><td></td></tr>");
            client.print("<tr><td></td><td align='center'>");
            client.print("Il valore dell'Umidit&aacute; nel terreno &eacute;: <strong>");
            client.print(Humidity);
            client.print("%</strong>");
            client.println("</td><td></td></tr>");
            client.println("</table>");
            client.println("</body>");
            client.println("</html>");
            client.println();
            break;                          // essendo terminata la trasmissione della pagina Html esco dal while
          }
          else {                            // se il byte è una "nuova linea" resetto la Stringa
            currentLine = "";               
          }
        }
        else if (c != '\r') {               // se la risposta è il carattere di Ritorno a capo (e non Nuova linea),
          currentLine += c;                 // lo aggiungo in coda alla stringa
        }
      }
    }
    client.stop();                          //chiudo la connessione
    Serial.println("client disconnesso");
  }
}

void printWiFiStatus() {
  // stampo l'SSID della rete a cui sono collegato:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  // stampo l'IP Address assegnato alla scheda wifi:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  // stampo la potenza del segnale wifi:
  long rssi = WiFi.RSSI();
  Serial.print("Potenza segnale (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
  // stampo l'indirizzo da copiare/incollare nel browser per visualizzare la pagina:
  Serial.print("Per visualizzare la pagina web in azione inserire nel browser il seguente indirizzo: http://");
  Serial.println(ip);
}
  • Lettura Umidità relativa del terreno da Telegram

/*
 * Questo programma collega Arduino MKR1000 con il Telegram Bot attraverso 
 * il Token Bot e resta in attesa di messaggi.
 * Se il messaggio è "Umidità terreno" risponde su telegram inviando il
 * valore dell'Umidità relativa del terreno.
 * Il sensore di Umidità utilizzato è HC-38 + YL-69.  
 * L'uscita analogica (0-3,3v) del sensore viene acquisita in A6 (0-1023)
 * e successivamente convertita in % (0-100) e trasformata in Stringa.
 */

#include <WiFi101.h> 
#include <TelegramBot.h>
#include "floatToString.h"

char ssid[] = "Orti_Urbani_Intelligenti";        
char pass[] = "OUI-seminarecodici";

const char BotToken[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // Token Bot

int status = WL_IDLE_STATUS;

WiFiSSLClient clientBot;  
TelegramBot bot(BotToken,clientBot);

// vars sensore H 
float acq_H = 0.00;
float h_value = 0.00;
char h_char[5];
String h_string;

const int ledPinConnection = 6;     

void setup() 
{        
 NetworkConnection();               // setta la connessione wifi
 bot.begin();                       // inizializza il bot
 pinMode(ledPinConnection, OUTPUT);  
}  

void loop() 
{  
 // acq analogica Umidità
 acq_H = analogRead(A6);              // H
 h_value = map(acq_H,495,1023,100,0); // riporto a 100% (0-100) il valore d'acquisizione (1023-495) in %H 
 floatToString(h_char, h_value, 2);
 h_string = h_char;
  
 message m = bot.getUpdates();      // Legge un nuovo messaggio  
 if (m.text.equals("H terreno")) 
 {  
   bot.sendMessage(m.chat_id, "Umidità terreno = "+h_string+"%");  
 }   
}  

// connessione alla rete WIFI
void NetworkConnection() {
// attesa per la connessione Wifi
  while ( status != WL_CONNECTED) {
    status = WiFi.begin(ssid, pass);
    // ritardo di 10 sec per permettere la connessione iniziale alla rete Wifi:
    delay(10000);
  }
  digitalWrite(ledPinConnection, HIGH);
}

Link correlati: