Internet de les coses amb ESP32 i ESP8266

Exemples Referència Plaques   Recursos CITCEA
Projectes Programació Perifèrics   Inici

Sensor de llum

Projecte del grup 1

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);
}

 

 

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