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 2

En aquest cas s'ha dissenyat un sistema d'avís per al cas de deixar-se oberta la porta de la nevera. En el moment d'obrir la porta del frigorífic, s'encén un llum LED de color verd durant trenta segons. En el cas que, passat aquest temps, segueixi oberta, el llum LED canvia a color taronja i, paral·lelament, s'activa el brunzidor amb un senyal suau. Tot seguit, quan passen trenta segons addicionals, el llum LED passa a ser de color vermell i s'acompanya amb un senyal acústic més estrident. El senyal lluminós s'estén fins al tancament de la porta, mentre que el brunzidor deixarà de sonar quan la nevera porti dos minuts oberta. Finalment, passats dos minuts des de l'obertura de la nevera, el sistema envia un correu electrònic per notificar de l'incident. El correu s'envia a tots els destinataris que hi ha en un full de càlcul.

Funcionament

El programa del microcontrolador és el següent:

#include <SPI.h>    // Carreguem la biblioteca SPI
#include <WiFiNINA.h>    // Carreguem la biblioteca WiFiNINA
#define LDRpin A3
#define server_len 50
#define pag_len 400
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(1, 1, NEO_GRB + NEO_KHZ800);
int lectura;
int temps_inicial;
bool hasrun;
byte color;
const char idXarxa[] = "xarxa-wifi";    // Nom del punt d'accés 
const char contrasenya[] = "contrasenya-wifi";    // Contrasenya de connexió 
const String server0 = "script.google.com";
String pagina0 = "";
const String pagina_base = "/macros/s/^^fycbwTXtd3oD3FMhA3MDN-BbldCsHcn4ZXySfxAnqvqTnkr0uBESx6KS5Wf5b8D9hXrURt/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;
float temps;
String data;
String peticio = "";    // Aquí guardarem una línia de la petició del client
String peticioAux = "";    // i la petició anterior (també ho farem servir de reserva)
int status = WL_IDLE_STATUS;
WiFiSSLClient client;
void setup() {    // Inicialització
  Serial.begin(9600);
  cadena.begin();  // Inicialitza els NeoPixels        
  cadena.show();
  pinMode(3, OUTPUT);    // 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(); 
  redir = false;
}
void loop() {    // Programa que es repeteix indefinidament
  // El bucle principal té tres parts: 
  //     1. Gestió dels caràcters que arriben
  //     2. Tractament de les dades rebudes
  //     3. Nova petició quan ha passat el temps
  while (client.available()) {
    // Gestió dels caràcters que arriben
    // Aquest bucle va guardant els caràcters rebuts
    // i espera al moment en que arriba un salt de línia
    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
      completa = true;    // Preparat per escriure-ho
    } else {
      peticio += c;    // Afegim el caràcter rebut
    }
    // Quan ha arribat un salt de línia, hem de mirar què ha arribat
    if (completa){  // Ha arribat una línia completa
      if (peticioAux.startsWith("HTTP/1.1 200")){    // Resposta bona
        pendent = true;
      }
      if (peticioAux.startsWith("HTTP/1.1 302")){    // Redireccionament
        redir = true;
      }
      if (redir && (peticioAux.startsWith("Location:"))){
        // Si hi ha redireccionament, hem de buscar l'adreça
        // i extreure'n el servidor i la pàgina
        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;
    }
  }
  // Hi ha una resposta per processar
  // Però ignorarem les dades que ens envia l'script
  if (pendent) {
    pendent = false;
  }
  lectura = analogRead(LDRpin);
  if(lectura<1000){
    cadena.setPixelColor(0, 0, 255, 0);
    cadena.show();
    hasrun=false;
    temps_inicial=millis();
    Serial.print("temps1 = ");
    Serial.println(temps_inicial);
    while (analogRead(LDRpin)<1000){
      if(10000<(millis()-temps_inicial) and (millis()-temps_inicial)<20000 ){
        cadena.setPixelColor(0,255,69,0);
        cadena.show(); // Actualitza
        tone(3, 1109, 750);
        delay(2000);
      }
      if(20000<(millis()-temps_inicial) and (millis()-temps_inicial)<30000 ){
        cadena.setPixelColor(0,255,0,0);
        cadena.show(); // Actualitza
        tone(3, 1109, 750);
        delay(1000);
      }
      if ((millis()-temps_inicial)>30000 and hasrun==false ){
        hasrun=true;
        if (ara || ((millis() - darreraConnexio > periodeConnexio))) {
          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();
            // Guardem quan hem fet la connexió
            darreraConnexio = millis();
            Serial.print("Enviat: ");
            Serial.println(data);
          } else {
            Serial.println("connection failed");
          }
          ara = false;
        }
      }
    }
    cadena.setPixelColor(0, 0, 0, 0);
    cadena.show();
  }
}

El programa de l'script és el següent:

function doGet(e) {
  var fullcalcul = SpreadsheetApp.getActiveSpreadsheet();
  var fullactiu = fullcalcul.getActiveSheet();
  var lletraColumna = 'A';
  var rangColumna = fullactiu.getRange(lletraColumna + '1:' + lletraColumna + fullactiu.getLastRow());
  var valorsColumna = rangColumna.getValues();
  var titol = "Alerta! Nevera oberta!";
  var text = "Atenció! ";
  text = text + "\n"; 
  text = text + "La nevera porta oberta des de les "+ horaob  ;
  var Temps = e.parameter.t
  var ara = new Date();
  var Hora = ara.getHours();
  var Minut = ara.getMinutes()-2
  if (Minut<0) {
    Hora=Hora-1
    Minut=60+Minut
  }
  horaob=Hora+':'+ Minut
  if (Minut<10) {
    horaob=Hora+':0'+ Minut
  }
  for (var i = 0; i < valorsColumna.length; i++) {
    var destinatari = valorsColumna[i][0];
    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.