webserver

Programmiamo Arduino Nano 33 IoT per utilizzarlo come Access point e controllare un LED

Tra le tante funzionalità di Arduino Nano 33 IoT troviamo quella di access point. Creeremo un punto di accesso Wi-Fi,  a cui collegarci da un qualsiasi device, e sfruttare la connessione senza fili per gestire l’accensione e lo spegnimento di un LED. Se non avete ancora mai lavorato con una Arduino Nano 33 IoT e non sapete come configurarlo, andate a leggere la nostra guida a questo LINK.

Codice

Nel codice di esempio che andiamo a scrivere non sarà necessario utilizzare sensori o attuatori esterni, anzi utilizzeremo semplicemente il led integrato nella scheda (connesso al pin 13), spegnendolo ed accendendolo. Per poter scaricare il nostro codice, utilizzate questo LINK.



Iniziamo sempre dalle librerie da inserire: la libreria SPI è già inclusa nella IDE e si occuperà della comunicazione con modulo Wi-Fi u-blox NINA-W102, mentre la seconda libreria, la WiFiNINA.h, è la libreria della gestione del modulo Wi-Fi, che possiamo installare direttamente dal Gestione Librerie della IDE di Arduino.


#include <SPI.h>
#include <WiFiNINA.h>

Procediamo creando il nome del nostro punto di accesso, la password per accedervi (mi raccomando, che non sia troppo corta o vi darà errore), e dichiariamo anche il pin a cui è connesso il led, lo status iniziale della connessione e la porta HTTP per la connessione al nostro AP.


char ssid[] = "NANO_AP";
char pass[] = "fattelodasolo";

int led = 13;
int status = WL_IDLE_STATUS;
WiFiServer server(80);

Nel VOID SETUP avviamo il monitor seriale e poi indichiamo la direzione del pin a cui è connesso il led.


Serial.begin(9600);
while (!Serial);

pinMode(led, OUTPUT);

Andiamo poi a verificare che il modulo Wi-Fi risponda e non abbia problemi. Nel caso contrario, ci risponderà con un errore.


if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Il modulo Wi-Fi non risponde.");
while (true);
}

Impostiamo, adesso, un ip al nostro AP. Badate bene che questa riga non è necessaria e che di default viene assegnato lo stesso indirizzo da noi utilizzato. Potete, comunque, modificarlo a vostro piacimento.


WiFi.config(IPAddress(192, 168, 4, 1));

Verifichiamo che la configurazione per l’AP sia corretta e poniamo la scheda in ascolto, per ricevere le richieste dei client. Se ci sono errori, la creazione fallirà e dovremmo rivedere i nostri parametri.


status = WiFi.beginAP(ssid, pass);
if (status != WL_AP_LISTENING) {
Serial.println("Creazione AP fallita!");
while (true);
}

Concludiamo il VOID SETUP avviando il server e stampando su seriale sia l’SSID del nostro access point che il relativo indirizzo IP.


server.begin();

Serial.print("SSID: ");
Serial.println(WiFi.SSID());

IPAddress ip = WiFi.localIP();
Serial.print("IP: ");
Serial.println(ip);



Entrando nel VOID LOOP, verifichiamo se un client si connetta o si disconnetta del nostro Access Point, stampando un messaggio su monitor seriale. Ci poniamo poi in attesa di dati dal client.


if (status != WiFi.status()) {
status = WiFi.status();

if (status == WL_AP_CONNECTED) {
Serial.println("Dispositivo connesso all'AP");
} else {
Serial.println("Dispositivo disconnesso dall'AP");
}
}

WiFiClient client = server.available(); // In attesa del client

Quando il client sarà connesso, creeremo una stringa vuota (CurrentLine) per depositarci dentro i dati inviati dal client stesso. Mentre il client è connesso, leggiamo che non ci siano dati inviati e li stampo su seriale.


if (client) { // Se c'è un client,
Serial.println("new client");
String currentLine = "";
while (client.connected()) {
delayMicroseconds(10);
if (client.available()) {
char c = client.read();
Serial.write(c);

Se i dati che otteniamo sono un carattere di nuova riga e una riga vuota, ciò indica la fine della richiesta del client. L’access point invierà una risposta con il protocollo HTTP, mostrando due righe sul browser per poter spegnere o accendere il led. Puliamo poi la stringa creata poco prima.


if (c == '\n') { // se il byte è il carattere di nuova riga

// se la riga corrente è vuota, hai due caratteri di nuova riga di seguito.
// questa è la fine della richiesta HTTP del client, quindi invia una risposta:
if (currentLine.length() == 0) {


client.println("HTTP/1.1 200 OK"); // Le intestazioni HTTP iniziano sempre con un codice di risposta
client.println("Content-type:text/html"); // e un Content-type in modo che il client sappia cosa sta arrivando, quindi una riga vuota:
client.println();

// il contenuto della risposta HTTP segue l'intestazione:
client.print("Clicca <a href=\"/H\">QUI</a> per accendere il LED<br>");
client.print("Clicca <a href=\"/L\">QUI</a> per spegnere il LED<br>");

// La risposta HTTP termina con un'altra riga vuota:
client.println();
// interrompo il ciclo while:
break;
}
else { // se si ha una nuova riga, pulisco currentLine:
currentLine = "";
}
}
else if (c != '\r') { // se non si riceve il carattere di Ritorno Carrello,
currentLine += c; // lo si aggiunge a currentLine
}

Le due risposte dell’access point saranno le seguenti. Possiamo quindi accendere e spegnere il led integrato.


if (currentLine.endsWith("GET /H")) {
digitalWrite(led, HIGH);
}
if (currentLine.endsWith("GET /L")) {
digitalWrite(led, LOW);
}

Terminiamo chiudendo la connessione.


client.stop();
Serial.println("client disconnesso!");



Carichiamo il codice sul nostro Arduino Nano 33 IoT e prendiamo il nostro smartphone. Dalle impostazioni della rete Wi-Fi connettiamoci alla rete che abbiamo creato, collegandoci al nostro AP. A connessione stabilita, apriamo il browser e inseriamo l’indirizzo IP. Appariranno le righe per spegnere ed accendere il led. Premendole vedremo il led integrato spegnerci o accendersi.

Access Point