En aquest cas el microcontrolador funciona com a servidor en mode estació i es pot accedir a consultar la temperatura i la humitat des d'un navegador web o des d'una aplicació. El programa del microcontrolador és el següent:
#include <SPI.h> // Carreguem la biblioteca SPI #include <WiFiNINA.h> // Carreguem la biblioteca WiFiNINA #include "DHT.h" #define DHTPIN 2 #define LED 6 #define DHTTYPE DHT22
const char idXarxa[] = "xarxa-wifi"; // Nom del punt d'accés const char contrasenya[] = "contrasenya-wifi"; // Contrasenya de connexió float hum, temp; bool estat = LOW; // Variable que recorda l'estat del LED bool enviar = false; String temperatura, humitat; bool enviar1 = false ; int status = WL_IDLE_STATUS; DHT dht(DHTPIN, DHTTYPE); WiFiServer server(80); // Creem un objecte de comunicació amb el port 80
void setup() { // Inicialització
Serial.begin(9600); // Monitor sèrie
dht.begin();
pinMode(LED, OUTPUT); // La pota del LED és sortida
digitalWrite(LED, LOW);
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
// Ens han demanat una lectura, anem-la a fer
hum = dht.readHumidity();
temp = dht.readTemperature();
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;
if (!(isnan(hum) || isnan(temp))) { // Tenim valors correctes de temperatura i humitat?
temperatura = String(temp);
humitat = String(hum);
temperatura.replace('.', ',');
humitat.replace('.', ',');
// 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>");
client.println("<h1>Temperatura i humitat actuals</h1>");
client.println("<p></p>");
client.println("<p></p>");
client.print("<p>T = ");
client.print(temperatura);
client.println(" C</p>");
client.println("<p></p>");
client.print("<p>H = ");
client.print(humitat);
client.println(" %</p>");
client.println("</html>");
}
delay(1);
enviar = false;
}
client.stop(); // Tanquem la connexió
Serial.println("Fi de la connexió amb el client");
}
}
Aquest grup va fer una aplicació amb App Inventor que permetia consultar els valors actuals de temperatura i humitat. La disposició d'elements a la pantalla és:

El programa és el següent:






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