En aquest cas el microcontrolador funciona com a client i es comunica amb dues taules de Google. En una de les taules es van guardant periòdicament els valors reals de temperatura i humitat. En l'altra s'hi guarda la temperatura de consigna i el mode de funcionament triat. El programa del microcontrolador és el següent:
#include <SPI.h> #include <WiFiNINA.h> #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT22 #include <Adafruit_NeoPixel.h>
const char idXarxa[] = "xarxa-wifi"; // Nom del punt d'accés const char contrasenya[] = "contrasenya-wifi"; // Contrasenya de connexió const char formulari[] = "1FAIpQLScD6RU2aSCCVDn6B7myYl3A4NmqKo1DMiTEIj-moDFjsR8J4Q"; const char adrePost[] = "/forms/d/e/1FAIpQLScD6RU2aSCCVDn6B7myYl3A4NmqKo1DMiTEIj-moDFjsR8J4Q/formResponse"; char server[] = "docs.google.com"; char pagina[] = "/spreadsheets/d/1sYC_082KCrNROOBlMXoNmngyIRQ5bx-nyCz4OzNnjXk/export?format=csv"; String camp1 = "entry.1767992783"; String camp2 = "entry.1499112241"; String length(); unsigned long darreraConnexio = 0; const unsigned long periodeConnexio = 10000UL; bool pendent; String Tinf; String peticio = ""; // Aquí guardarem una línia de la petició del client String peticioAux = ""; // i la petició anterior (també ho farem servir de reserva) bool llegir; String hum, temp; String data; int status = WL_IDLE_STATUS; Adafruit_NeoPixel cadena = Adafruit_NeoPixel(3, 1, NEO_GRB + NEO_KHZ800); WiFiSSLClient client; DHT dht(DHTPIN, DHTTYPE);
void setup() { // Inicialització
Serial.begin(9600); // Monitor sèrie
dht.begin();
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
}
llegir = true;
dht.begin();
Serial.begin(9600);
cadena.begin();
cadena.setPixelColor(0, 55,0, 0);
cadena.show();
}
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");
}
}
data = "";
hum = dht.readHumidity();
temp = dht.readTemperature();
data += camp1;
data += "=";
data += temp;
data += "&";
data += camp2;
data += "=";
data += hum;
data += "&submit=Submit";
if (llegir == true){
while (client.available()) {
char c = client.read(); // Rebem caràcters del servidor
if (c == '\n') { // Mirem si és un salt de línia
peticioAux = peticio; // Guardem la petició anterior
peticio = ""; // Ens preparem per a la línia següent
pendent = true; // Preparat per escriure-ho
} else {
peticio += c; // Afegim el caràcter rebut
}
}
llegir = false;
}
if (llegir == false){
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 T = ");
Serial.print(temp);
Serial.print(" H = ");
Serial.println(hum);
}
llegir = true;
}
delay(1000);
if (pendent) {
pendent = false;
if (peticio == ""){ // Si està buit
peticio = peticioAux; // Agafem l'anterior
}
Serial.println();
Serial.println(peticio);
peticio = peticio.substring(peticio.indexOf(",") +1);
Tinf = peticio.substring(0, peticio.indexOf(","));
if (Tinf.length() == 1){
Tinf = '0'+Tinf ;
}
Serial.print("Tinf =");
Serial.println(Tinf);
}
if (millis() - darreraConnexio > periodeConnexio) {
client.stop();
if (client.connect(server, 443)) {
Serial.println("S'ha fet la connexió al servidor");
client.print("GET ");
client.print(pagina);
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(server);
client.println("Connection: close");
client.println();
// Guardem quan hem fet la connexió
darreraConnexio = millis();
} else {
Serial.println("connection failed");
}
}
if (temp < Tinf ) {
cadena.setPixelColor(0, 0, 55, 0); // fiquem el valor
cadena.show(); // Actualitza
}
if (temp > Tinf + 1 ) {
cadena.setPixelColor(0, 55,0, 0);
cadena.show(); // Actualitza
}
if (!client.connected()) {
Serial.println();
Serial.println("Desconnectant");
client.stop();
}
delay(10000);
}
Aquest grup va fer una aplicació amb App Inventor que constava de dues pantalles.
En el cas de la primera pantalla, la disposició d'elements és com es mostra a les tres imatges següents:


El programa d'aquesta pantalla és el següent:







La disposició d'elements de la segona pantalla és la següent:

El programa de la segona pantalla és el següent:




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