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á 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á nel terreno é: <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: