Arduino MKR 1010 è una basetta di prototipazione molto interessante e versatile, basata su ESP32. Accompagnata dallo IoT Carrier, uno shield custom ricco di funzionalità e sensori, e la piattaforma Cloud di Arduino, diventa un fantastico strumento per la didattica STEM o STEAM da presentare in classe. Vediamo un’applicazione in cui un server su tale basetta risponda con una pagina web se interrogata da un client, che, a sua volta, potrà pilotare un led sullo shield con due semplici bottoni html/css/js che tornano al server una primitiva REST.
Per questo esperimento non ci occorre particolare materiale da maker. Ci affidiamo all’ottimo kit all-in-one Arduino Explore IoT Kit, realizzato da Arduino e distribuito da Campustore, il noto negozio online fornitissimo per quanto concerne la didattica STEAM. Lo trovate qui. Il pezzo forte del kit è lo shield dotato di diversi sensori, batteria di alimentazione e dei versatilissimi led. Come nell’intro di questo articolo, vogliamo creare un piccolo web server sul nostro Arduino MKR 1010, una versione molto sofisticata di ESP32, già trattato sulle pagine di questo sito. Il kit ha a disposizione un account sul cloud di Arduino ma per questo esperimento evitiamo di utilizzarlo e ricorriamo al buon vecchio fidato IDE offline. Mentre scriviamo siamo alla versione 1.8.12 (scarica qui) sperimentata su Linux Ubuntu 20.
Procuriamoci però tutte le librerie necessarie alla nostra applicazione. Assicuriamoci di andare nella voce di menù [Strumenti]->[Gestione Librerie]. Nella voce di ricerca, cerchiamo ed installiamo Wifinina, SD, MCHPTouch, MKRIoTCarrier. Le due librerie SD ed MCHPTouch, in realtà, non ci servono esattamente per questa lezione. Servono più che altro a consentire la compilazione del codice sorgente.

Il codice completo lo trovate qui ed in allegato.
#include <SPI.h>
#include <WiFiNINA.h>
#include <Arduino_MCHPTouch.h>
#include <Arduino_MKRIoTCarrier.h>
char ssid[] = "********"; // SSID della tua rete WiFi domestica
char pass[] = "********"; // la password del tuo WiFi
int status = WL_IDLE_STATUS;
MKRIoTCarrier carrier;
WiFiClient client;
WiFiServer server(80);
//Colori
uint32_t colorRed = carrier.leds.Color(0, 255, 0); //RED
uint32_t colorGreen = carrier.leds.Color(255, 0, 0); //GREEN
uint32_t colorBlue = carrier.leds.Color(0, 0, 255); //BLUE
void setup() {
status = WiFi.begin(ssid, pass);
if ( status != WL_CONNECTED)
{
Serial.println("Errore nella connessione WiFi");
while(true);
}
else
{
Serial.println("Connesso al wifi");
}
IPAddress ip(192, 168, 1, 200);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
WiFi.config(ip, gateway, subnet);
carrier.begin();
server.begin();
}
void loop() {
String req;
//Serial.println("Server online");
//gestiamo le azione passate col GET nell'url
WiFiClient client = server.available();
if (client.connected() && client.available())
{
// creo una pagina standard
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println("Refresh: 5"); // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head>");
client.println("<style>");
client.println(".button {");
client.println(" background-color: #4CAF50;");
client.println(" border: none;");
client.println(" color: white;");
client.println(" padding: 15px 32px;");
client.println(" text-align: center;");
client.println(" text-decoration: none;");
client.println(" display: inline-block;");
client.println(" font-size: 16px;");
client.println(" margin: 4px 2px;");
client.println(" cursor: pointer;");
client.println(" width: 10em;");
client.println("}");
client.println(".button1 {background-color: green;} ");
client.println(".button2 {background-color: red;} ");
client.println("</style> ");
client.println("</head> ");
client.println("<body> ");
client.println("<h1>WiFi Server con Arduino MKR 1010 e MKR IoT Carrier</h1>");
client.println("<h3>#arduinoexploreiotkit #arduinoeducation #campustore</h3>");
client.println("<button class=\"button button1\" onclick=\"location.href='/ledon';\" >Accendi</button><br>");
client.println("<button class=\"button button2\" onclick=\"location.href='/ledoff';\" >Spegni</button>");
client.println("</body> ");
client.println("</html>");
req = client.readStringUntil('\r'); //torna nella forma "GET /ledon http 1.1"
if (req.indexOf("/ledoff") != -1)
{
Serial.println("Spegni");
carrier.leds.setPixelColor(0, 0);
carrier.leds.show();
}
if (req.indexOf("/ledon") != -1)
{
Serial.println("Accendi");
carrier.leds.setPixelColor(0, colorRed);
carrier.leds.show();
}
}
delay(200);
client.stop();
//Serial.println("client disconnesso");
}
Ultima modifica 18 Gennaio 2022