En aquest cas s'ha dissenyat un sistema per a optimitzar els conreus en un hort o hivernacle. El sistema emmagatzema els valors de la llum ambient en un full de càlcul i fara un gràfic diari. A més, quan es detecta que hi ha una lluminositat inferior a la desitjada s'avisa localment a l'usuari (amb el LED i el brunzidor) i se li envia un correu electrònic per si no es troba a prop. El programa del microcontrolador és el següent:
#include <SPI.h> #include <WiFiNINA.h> #include <Adafruit_NeoPixel.h> #define server_len 50 #define pag_len 400
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(3, 1, NEO_GRB + NEO_KHZ800); const char idXarxa[] = "xarxa-wifi"; const char contrasenya[] = "contrasenya-wifi"; const String server0 = "script.google.com"; String pagina0 = ""; const String pagina_base = "/macros/s/^^fycbzstNfpSTrVqE8Kr68s0mvInfMrFhf2QBlA0RTgSBOepc4r_lyB0q4kqTg9KgvfBAeyAA/exec"; char server[server_len]; char pagina[pag_len]; unsigned long darreraConnexio = 0; const unsigned long periodeConnexio = 10000UL; bool pendent, completa, redir; bool ara = false; bool rebut= true; float llum, minsec, poscoix; String data; String hora="9.99"; String horaconh; String hora_ant; String peticio = ""; String peticioAux = ""; int status = WL_IDLE_STATUS; WiFiSSLClient client; int brunzidor = 3; int sensor = A3; int lectura;
void setup() {
cadena.begin();
cadena.show();
Serial.begin(9600);
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("No s'ha trobat el dispositiu Wi-Fi");
while (true)
;
}
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(2500);
}
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();
redir = false;
}
void loop() {
int lectura = analogRead(sensor);
if (lectura < 250 || lectura > 1000) {
cadena.setPixelColor(0, 255, 0, 0);
cadena.show();
tone(brunzidor, 1000);
} else {
cadena.setPixelColor(0, 0, 0, 0);
cadena.show();
noTone(brunzidor);
}
while (client.available()) {
char c = client.read();
if (c == '\n') {
Serial.print("Txt = [");
Serial.print(peticio);
Serial.println("]");
peticioAux = peticio;
peticio = "";
completa = true;
} else {
peticio += c;
}
if (completa){
if (peticioAux.startsWith("HTTP/1.1 200")){
pendent = true;
}
if (peticioAux.startsWith("HTTP/1.1 302")){
redir = true;
}
if (peticioAux.startsWith("h=")){
horaconh = peticioAux;
rebut= true;
poscoix=horaconh.indexOf("]");
hora=horaconh.substring(2, poscoix);
Serial.print("-->");
Serial.print(hora.length());
Serial.println("<");
hora_ant = hora;
}
if (redir && (peticioAux.startsWith("Location:"))){
String adre = peticioAux.substring(peticioAux.indexOf("//") +2);
String server1 = adre.substring(0, adre.indexOf(".com") +4);
String pagina1 = adre.substring(adre.indexOf(".com") +4);
server1.toCharArray(server, 50);
pagina1.toCharArray(pagina, 400);
ara = true;
}
completa = false;
}
}
if (ara || ((millis() - darreraConnexio > periodeConnexio))) {
if((!ara)&&(rebut)) {
lectura = analogRead(sensor);
Serial.print("Lectura = ");
Serial.println(lectura);
delay(5000);
data = "?";
data += "t=";
data += hora_ant;
data += "&h=";
data += lectura;
rebut= false;
}
if (redir){
redir = false;
} else {
pagina0 = pagina_base + data;
server0.toCharArray(server, server_len);
pagina0.toCharArray(pagina, pag_len);
}
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();
darreraConnexio = millis();
Serial.print("Enviat: ");
Serial.println(data);
Serial.println(pagina);
} else {
Serial.println("connection failed");
}
ara = false;
}
}
El programa de l'script és el següent:
var IdFull = "^^7XZ-aggah-Mgv08dFBa9O4I1a2TWjq6TotThCEjzc";
var numFull = 0;
var sh = SpreadsheetApp.openById(IdFull);
var sheet = sh.getSheets();
var full = sheet[numFull].getDataRange().getValues();
var ara = new Date();
var Sec = ara.getSeconds();
var Minut = ara.getMinutes();
var tiempo = "h=" + Minut + ";" + Sec + "]";
var mitjana = full[1][4];
var max = full[2][4];
var min = full[3][4];
var sensedades = full[4][4];
var usuari = full[6][4]; //Es pot editar des del full de càlcul
var ndades = full[7][4];
var horaant = full[8][4];
function doGet(e) {
var resultat = '';
var camps = new Array(2);
var Minsec = e.parameter.t;
var Llum = e.parameter.h;
var Grafic = e.parameter.g;
if ((Grafic == "t")){
var Pagina = crearPagina();
return HtmlService.createHtmlOutput(Pagina);
} else if(Minsec != horaant) {
if ((Minsec == undefined) || (Llum == undefined)){
resultat = 'Falten paràmetres';
} else {
camps[0] = Minsec;
camps[1] = Llum;
var sh = SpreadsheetApp.openById(IdFull);
var sheet = sh.getSheets();
sheet[numFull].appendRow(camps);
resultat = tiempo;
if ((Llum>1000)||(Llum<250)){
mail()
}
}
return ContentService.createTextOutput(resultat);
}
}
function crearPagina() {
var pagina = "<!DOCTYPE HTML>" + "\n";
pagina = pagina + "<html>" + "\n";
pagina = pagina + "<head>" + "\n";
pagina = pagina + "<meta charset='UTF-8'>" + "\n";
pagina = pagina + "</head>" + "\n";
pagina = pagina + "<body>" + "\n";
pagina = pagina + "<h1>Dades lumíniques</h1>" + "\n";
pagina = pagina + "<p>Mitjana = " + mitjana + "\n";
pagina = pagina + "<p>Número de dades = " + ndades + "\n";
pagina = pagina + "<p>Valor màxim = " + max + "\n";
pagina = pagina + "<p>Valor mínim = " + min + "\n";
pagina = pagina + "<p>Hora de la darrera mesura: " + horaant + "\n";
pagina = pagina + "<p>A continuació es mostra el gràfic interactiu. Posa el ratolí ";
pagina = pagina + "a sobre d'un punt per veure més dades.</p>" + "\n";
pagina = pagina + '<iframe width="600" height="371" seamless frameborder="0" scrolling="no" ';
pagina = pagina + 'src="https://docs.google.com/spreadsheets/d/e/';
pagina = pagina + '^^ACX-1vRCF9NYXplh6RAdWJBSAqy2DPvjjar3ANF_F3UoXK_aa-iRDB7P7P_FBl-baLzNlwabwGYzth6otgCw';
pagina = pagina + '/pubchart?oid=1044618387&format=interactive"></iframe>' + "\n";
pagina = pagina + "</body>" + "\n";
pagina = pagina + "</html>" + "\n";
return pagina;
}
function mail(){
var Hora = ara.getHours();
var horaActual = Hora + "." + Minut + " h";
var destinatari = usuari;
var titol = "Anomalia lumínica";
var text = "Avui a les " + horaActual + " s'ha detectat una anomalia lumínica";
text = text + " que ha provocat l'enviament d'aquest correu electrònic.";
text = text + "\n\n";
text = text + "Es recomana revisar la zona afectada.";
MailApp.sendEmail(destinatari, titol, text);
}

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