En aquest cas s'ha dissenyat un sonòmetre per a una biblioteca que té establerts tres nivells de soroll. El microcontrolador treballa com a client i envia periòdicament les dades a un full de càlcul de Google i, a més, canvia el color del LED. Un applet d'IFTTT publica a un compte específic de Twitter la informació que es va penjant al full de càlcul. Addicionalment, hi ha una aplicació per a mòbils que permet consultar la informació. El programa del microcontrolador és el següent:
#include <SPI.h> // Carreguem la biblioteca SPI #include <WiFiNINA.h> // Carreguem la biblioteca WiFiNINA #include <Adafruit_NeoPixel.h> // pota on hem connectat el LED #define MICpin A6 #define numMost 500 #define llindar1 4 #define llindar2 13 #define LED 1
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(1, LED, NEO_GRB + NEO_KHZ800); WiFiSSLClient client; const char idXarxa[] = "xarxa"; // Nom del punt d'accés const char contrasenya[] = "contrasenya"; // Contrasenya de connexió const char formulari[] = "1FAIpQLSdYL27gjcTvKyE8Z6ucHTwhCqaPrIobfEaHjJEG4t5p7cZ1eQ"; const char adrePost[] = "/forms/u/0/d/e/1FAIpQLSdYL27gjcTvKyE8Z6ucHTwhCqaPrIobfEaHjJEG4t5p7cZ1eQ/formResponse"; String camp = "entry.250467936"; char server[] = "docs.google.com"; String data; String estat; int status = WL_IDLE_STATUS; int lectures[numMost]; int lectura, maxim, minim, suma; float rms, lecCorr, mitjana;
void setup() { // Inicialització
Serial.begin(9600); // Monitor sèrie
cadena.begin(); // Inicialitza els NeoPixels
cadena.show();
while (!Serial) {
; // Esperem que l'usuari obri el monitor sèrie
}
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
}
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();
}
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");
}
}
maxim = 0;
minim = 1024;
suma = 0;
for (int i = 0; i < numMost; i++){
lectura = analogRead(MICpin);
suma = suma + lectura;
if(lectura > maxim){
maxim = lectura;
}
if(lectura < minim){
minim = lectura;
}
lectures[i] = lectura;
}
mitjana = float(suma) / numMost;
rms = 0;
for (int i = 0; i < numMost; i++){
lecCorr = float(lectures[i]) - mitjana;
rms = rms + lecCorr * lecCorr;
}
rms = sqrt(rms / numMost);
if (rms<llindar1){
cadena.setPixelColor(0, 0, 255, 0); // Pixel 0 verd
cadena.show(); // Actualitza
estat="LOW";
} else if ((llindar1<rms) && (rms<llindar2)){
cadena.setPixelColor(0,255, 111, 0); // Pixel 0 taronja
cadena.show(); // Actualitza
estat="MEDIUM";
} else if (rms>llindar2){
cadena.setPixelColor(0, 255, 0, 0); // Pixel 0 vermell
cadena.show();
estat="HIGH";
} // Actualitza
data = "";
data += camp;
data += "=";
data += estat;
data += "&submit=Submit";
if (client.connect(server, 443)) {
Serial.println("Connectat");
client.print("POST ");
client.print(adrePost);
client.print("?formkey=");
client.print(formulari);
client.println("&ifq HTTP/1.1");
client.print("Host: ");
client.println(server);
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Connection: close");
client.print("Content-Length: ");
client.println(data.length());
client.println();
client.print(data);
client.println();
Serial.print("Enviat So = ");
Serial.println(estat);
}
delay(1000);
if (!client.connected()) {
Serial.println();
Serial.println("Desconnectant");
client.stop();
}
client.stop();
delay(1800000); // 30 minuts
}
L'aplicació feta amb App Inventor té quatre pantalles. La disposició d'elements a la primera pantalla és:

El programa és el següent:






El programa és el següent:





El programa és el següent:



El programa és el següent:


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