En aquest cas el nostre microcontrolador es connectarà a una xarxa existent, com un dispositiu més. En qualsevol dispositiu connectat a la mateixa subxarxa podrem posar l'adreça IP del microcontrolador i veure la pàgina web que ens permet controlar el LED. En aquest programa considerem que el LED està connectat a la pota 7, tal com mostra la figura següent:

Si no teniu cap LED disponible podeu emprar el LED de la placa, que està a la pota 6.
La pàgina que veurà l'usuari tindrà el següent contingut (vegeu les etiquetes del llenguatge html).
<!DOCTYPE HTML> <meta charset='UTF-8'> <html> <h1>El LED està apagat</h1> <p></p> <a href='/?LED=1'>Encén</a> <p></p> <a href='/?LED=0'>Apaga</a> </html>
Que ens donarà una pàgina similar a aquesta:

El programa connecta el microcontrolador a un punt d'accés existent (del que hem de saber l'identificador i la contrasenya), escriu al monitor sèrie la seva adreça IP i es queda a l'espera que algun usuari s'hi connecti. Quan ho fa, li envia la pàgina html en la que l'estat del LED es personalitza segons com estigui en aquell moment. Quan es prem un enllaç es torna a carregar la pàgina afegint el paràmetre corresponent. A continuació hi ha les tres versions possibles de l'adreça: consulta, encendre i apagar (vegeu les comandes http). Atès que ara no sabem l'adreça IP fins que s'ha fet la connexió, hem posat lletres per representar els quatre nombres (aaa.bbb.ccc.ddd). Podeu consultar també les funcions de la biblioteca WiFiNINA que fem servir.
aaa.bbb.ccc.ddd/ aaa.bbb.ccc.ddd/?LED=0 aaa.bbb.ccc.ddd/?LED=1
En l'exemple del punt d'accés hem fet servir botons per encendre i apagar el LED. En aquest cas hem fet servir enllaços per anar veient diferents formes de fer-ho. Tota la part del loop és igual en els dos exemples excepte les línies que envien els enllaços o els botons. El programa que fem servir per provar-ho és el següent, en el que hem destacat les úniques línies que són diferents.
// Aquest programa està parcialment basat en els exemples de la pàgina // https://www.arduino.cc/en/Tutorial/LibraryExamples#wifi1010 #include <SPI.h> // Carreguem la biblioteca SPI #include <WiFiNINA.h> // Carreguem la biblioteca WiFiNINA #define LED 7 // pota on hem connectat el LED
const char idXarxa[] = "xarxa-wifi"; // Nom del punt d'accés
const char contrasenya[] = "contrasenya-wifi"; // Contrasenya de connexió
bool estat = LOW; // Variable que recorda l'estat del LED
bool enviar = false;
int status = WL_IDLE_STATUS;
WiFiServer server(80); // Creem un objecte de comunicació amb el port 80
// El port 80 és el de defecte per a http
void setup() { // Inicialització
Serial.begin(9600); // Monitor sèrie
pinMode(LED, OUTPUT); // La pota del LED és sortida
digitalWrite(LED, LOW); // Comencem amb el LED apagat
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("No s'ha trobat el dispositiu Wi-Fi");
while (true); // Bloquegem el programa
}
String versio = WiFi.firmwareVersion();
if (versio < "1.0.0") {
Serial.println("Convindria actualitzar el firmware");
}
while (status != WL_CONNECTED) {
Serial.print("Connectant a la xarxa ");
Serial.println(idXarxa);
status = WiFi.begin(idXarxa, contrasenya);
delay(10000); // Ho tornarem a intentar passats 10 s
}
server.begin(); // Posem en marxa el servidor
Serial.print("Connectat a ");
Serial.println(WiFi.SSID());
Serial.print("Estat de la connexió: ");
Serial.println(WiFi.status());
Serial.print("Adreça IP del dispositiu: ");
Serial.println(WiFi.localIP());
Serial.print("Intensitat del senyal: ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
Serial.println();
Serial.print("Ja pots fer la teva connexió al dispositiu ");
Serial.println(WiFi.localIP());
}
void loop() { // Programa que es repeteix indefinidament
if (status != WiFi.status()) { // Mirem si ha canviat l'estat de la connexió
status = WiFi.status();
if (status == WL_AP_CONNECTED) {
Serial.println("Dispositiu connectat al punt d'accés");
} else {
Serial.println("El dispositiu s'ha desconnectat del punt d'accés");
}
}
WiFiClient client = server.available(); // Mirem si hi ha clients
if (client) { // Si hi ha un client...
Serial.println("Nou client");
String peticio = ""; // Aquí guardarem una línia de la petició del client
while (client.connected()) { // Mentre el client estigui connectat
if (client.available()) { // Si hi ha dades disponibles
char c = client.read(); // Llegim un byte
Serial.write(c);
if (c == '\n') { // Mirem si és un salt de línia
// Si hem rebut una línia buida vol dir que tenim dos salts de línia seguits
// vol dir que ha acabat la petició del client i enviem la resposta:
if (peticio.length() == 0) {
enviar = true; // Llestos per enviar la resposta
break; // Sortim del while
} else { // Si hem rebut un salt de línia
// Ha acabat una línia de la petició, anem a veure si és la que ens interessa
// Rebrem un munt de línies però només hem d'analitzar la que comença per GET
if (peticio.indexOf("GET") != -1) { // Si no ho troba torna -1
// Ara cal comprovar si s'ha demanat una acció sobre el LED
if (peticio.indexOf("LED=1") != -1) { // Si no ho troba torna -1
estat = HIGH; // Si ho troba encendrem el LED
digitalWrite(LED, estat); // Enviem el nou estat al LED
}
if (peticio.indexOf("LED=0") != -1){
estat = LOW; // Si ho troba apagarem el LED
digitalWrite(LED, estat); // Enviem el nou estat al LED
}
}
peticio = ""; // Comencem línia amb una línia buida
}
} else if (c != '\r') { // Si el caràcter no és un retorn
peticio += c; // Afegim el caràcter rebut
}
}
}
if (enviar) {
// Resposta al client
client.println("HTTP/1.1 200 OK");
client.println(); // Imprescindible línia en blanc
client.println("<!DOCTYPE HTML>");
client.println("<meta charset='UTF-8'>");
client.println("<html>");
// En el títol l'estat del LED
client.print("<h1>El LED està ");
if(estat == HIGH) {
client.print("encès");
} else {
client.print("apagat");
}
client.println("</h1>");
// Enllaços per canviar l'estat del LED
client.println("<p></p>");
client.println("<p></p>");
client.println("<a href='/?LED=1'>Encén</a>");
client.println("<p></p>");
client.println("<p></p>");
client.println("<a href='/?LED=0'>Apaga</a>");
client.println("</html>");
delay(1);
enviar = false;
}
client.stop(); // Tanquem la connexió
Serial.println("Fi de la connexió amb el client");
}
}
Per provar-ho, cal editar el programa per posar-hi l'identificador de xarxa i la contrasenya per fer la connexió i enviar el programa al microcontrolador. Tingueu present que la xarxa eduroam que fem servir habitualment a la UPC no serveix, ja que té un sistema de connexió diferent. Un cop connectat el microcontrolador a la xarxa podrem veure la seva adreça IP consultant el monitor sèrie de l'entorn de programació. Llavors, podem agafar un dispositiu mòbil i connectar-nos a la mateixa xarxa Wi-Fi. Un cop connectats a la xarxa podem obrir un navegador i posar l'adreça IP del microcontrolador a la barra d'adreces. Llavors ens hauria de mostrar la pàgina que em vist més amunt i picant els botons podem encendre i apagar el LED.
En aquest exemple hem posat un enllaç per encendre i un altre per apagar. També podíem haver posat un únic enllaç que segons l'estat del LED ens permetés passar-lo a l'estat contrari. Això es pot fer que el destí de l'enllaç i el text corresponent siguin diferents segons l'estat del LED.
El nostre programa de prova escriu unes quantes coses al monitor sèrie (instruccions Serial.print i Serial.println). Quan ja tinguem clar que el programa funciona, les podem eliminar quasi totes i probablement anirà una mica més ràpid.

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.