Advertisement
Macus

Fuente sensor + sqlite + Websocket

Jul 11th, 2019
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //librerias para sensor de temperatura y humedad
  2. #include <DHT.h>
  3. #include <DHT_U.h>
  4.  
  5. #include "WiFi.h"
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <sqlite3.h>
  9. #include <SPI.h>
  10. #include <FS.h>
  11. #include "SPIFFS.h"
  12. #include <TimeLib.h>
  13. #include "ArduinoJson.h"
  14. #include "ESPAsyncWebServer.h"
  15.  
  16. #define LED 2
  17. #define SENSORHUMO 15
  18. #define TEMPHUMEDAD 13
  19. #define ESTADOPUERTA 36
  20.  
  21. #define DELAY 1000
  22. #define MAXHUMO 1000
  23. #define MAX_MINUTOS_SENSOR 2  //TIEMPO MAXMIMO EN MINUTOS -- CUANDO PASAN LOS 5 MINUTOS SE VUELVE A ESCRIBIR EN LA BASE DE DATOS
  24.  
  25. #define DHTTYPE DHT11
  26. DHT dht(TEMPHUMEDAD, DHTTYPE);
  27.  
  28. //VARIABLES PARA MANEJO DE TIEMPO
  29. time_t timeEventoHumo;
  30. time_t timeEventoPuerta;
  31. time_t timeEventoHumedad;
  32. time_t timeEventoTemperatura;
  33. time_t tiempo;
  34. String horaEvento;
  35.  
  36. String sensorBaseDato;
  37. /*******************************/
  38. //    VARIABLES PARA EL BUZZER
  39. int canal = 0;
  40. int freq = 2000;
  41. int resolucion = 8;
  42. int dutyCycle = 2755;
  43.  
  44. int valorSensor = 0;
  45. int valorHumo = 0;
  46. int tiempoAlarma;
  47. char *zErrMsg = 0;
  48. //
  49. const char* ssid = "casa";
  50. const char* password =  "MC.28_envyl";
  51.  
  52. AsyncWebServer server(80);
  53. AsyncWebSocket ws("/ws");
  54.  
  55. AsyncWebSocketClient * globalClient = NULL;
  56. String enviarDatos = "{\"temp\" : \"30°\", \"hum\" : \"45%\", \"humo\" : \"450\", \"puerta\" : \"Cerrada\"}";
  57.  
  58. //VARIABLES DE BASE DE DATOS
  59. sqlite3 *baseDatos;
  60. int rc;
  61. //bool escribirDB = true;
  62.  
  63. const char* data = "Callback function called";
  64.  
  65. //FUNCION CALLBACK
  66. static int callback(void *data, int argc, char **argv, char **azColName) {
  67.    int i;
  68.    Serial.printf("%s: ", (const char*)data);
  69.    for (i = 0; i<argc; i++){
  70.        Serial.printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  71.    }
  72.    Serial.printf("\n");
  73.    return 0;
  74. }
  75. int db_open(const char *filename, sqlite3 **db) {
  76.    int rc = sqlite3_open(filename, db);
  77.    if (rc) {
  78.        Serial.printf("Can't open database: %s\n", sqlite3_errmsg(*db));
  79.        return rc;
  80.    } else {
  81.        Serial.printf("Opened database successfully\n");
  82.    }
  83.    return rc;
  84. }
  85. int db_exec(sqlite3 *db, const char *sql) {
  86.    Serial.println(sql);
  87.    long start = micros();
  88.    int rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
  89.    if (rc != SQLITE_OK) {
  90.        Serial.printf("SQL error: %s\n", zErrMsg);
  91.        sqlite3_free(zErrMsg);
  92.    } else {
  93.        Serial.printf("Operation done successfully\n");
  94.    }
  95.    Serial.print(F("Time taken:"));
  96.    Serial.println(micros()-start);
  97.    return rc;
  98. }
  99. int abrirSPIFFS(){
  100.   if(!SPIFFS.begin()){
  101.     Serial.println("Se ha producido un error al montar el sistema de archivos.");
  102.     return 0;
  103.   }else{
  104.     Serial.println("El sistema de archivos se ha montado correctamente.");
  105.     return 1;
  106.   }
  107. }
  108.  
  109. void setup() {
  110.   Serial.begin(115200);
  111.   delay(3000);
  112.   pinMode(LED, OUTPUT);
  113.   pinMode(ESTADOPUERTA, INPUT);  
  114.   abrirSPIFFS();
  115.   Serial.println("Programa Iniciando");
  116.   dht.begin(); //----> inicia el objeto de la clase dth (sensor temperatura humedad)
  117.   ledcSetup(canal, freq, resolucion);
  118.   ledcAttachPin(0, canal);
  119.   //AJUSTAR LA HORA Y FECHA DEL ESP32 PARA PODER CONTROLAR EL TIMPO DE SENSADO
  120.   setTime(2,16,0,18,06,2018);
  121.  
  122.   WiFi.begin(ssid, password);
  123.   while (WiFi.status() != WL_CONNECTED) {
  124.     delay(1000);
  125.     Serial.println("Connecting to WiFi..");
  126.   }
  127.   Serial.println(WiFi.localIP());
  128.   ws.onEvent(onWsEvent);
  129.   server.addHandler(&ws);
  130.   server.on("/html", HTTP_GET, [](AsyncWebServerRequest *request){
  131.     request->send(SPIFFS, "/ws.html", "text/html");
  132.   });
  133.   server.on("/script.js", HTTP_GET, [](AsyncWebServerRequest *request){
  134.     request->send(SPIFFS, "/script.js", "text/js");
  135.   });
  136.   server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){
  137.     request->send(SPIFFS, "/style.css", "text/css");
  138.   });
  139.   server.begin();
  140. }
  141.  
  142. void loop() {
  143.  
  144.   delay(DELAY);
  145.  
  146.   //sensorHumo(); //----> ESTADO SENSOR HUMO
  147.  
  148.   //estadoHumedad();  //--->ESTADO SENSOR HUMEDAD
  149.  
  150.   //estadoTemperatura(); //---> ESTADO SENSOR TEMPERATURA
  151.  
  152.   //estadoPuerta();  //---> ESTADO SENSOR MAGNETICO PUERTA
  153.   //int valorHumo = sensorHumo();
  154.   Serial.println("Valor de Humo: "+ sensorHumo());
  155.   //////////////////
  156.   /*enviarDatos = "{\"temp\" : \""+String(estadoTemperatura())+"°\", \"hum\" : \""+String(estadoHumedad())+"%\", \"humo\" : \""+String(sensorHumo())+"\", \"puerta\" : \"Cerrada\"}";
  157.   if(globalClient != NULL && globalClient->status() == WS_CONNECTED){
  158.       String randomNumber = String(random(0,20));
  159.       globalClient->text(enviarDatos);
  160.    }*/  
  161.   //////////////////
  162. }
  163. float estadoHumedad(){
  164.   float valorHumedad = dht.readHumidity();
  165.   if(isnan(valorHumedad)){
  166.     Serial.println("Error al intentar leer el Sensor de Humedad");
  167.     valorHumedad = 0;    
  168.   }else if(valorHumedad > 80) {
  169.     //alarma(1500);
  170.     if((now() - timeEventoHumedad) > 120) {
  171.       timeEventoHumedad = now();
  172.       horaEvento = getHora();
  173.       Serial.println("ESTADO PUERTA: han pasado 2 minutos");
  174.     //escribirBaseDato("HUMEDAD", (String)valorHumedad, (String)horaEvento);
  175.     }  
  176.   }
  177.   return valorHumedad;
  178. }
  179. float estadoTemperatura(){
  180.   float temperatura = dht.readTemperature(); //----> Por default lee la temperatura en grados Celsius
  181.   if(isnan(temperatura)){
  182.     Serial.println("Error al intentar leer el Sensor de Temperatura");
  183.     temperatura = 0;    
  184.   }else if(temperatura > 40){
  185.     if((now() - timeEventoTemperatura) > 120){
  186.       timeEventoTemperatura = now();
  187.       horaEvento = getHora();
  188.       Serial.println("ESTADO TEMPERATURA: has pasado 2 munutos");
  189.       escribirBaseDato("TEMPERATURA", (String)temperatura, (String)horaEvento);
  190.     }
  191.   }
  192.   return temperatura;
  193. }
  194. void estadoPuerta(){
  195.   if(digitalRead(ESTADOPUERTA) > 0){
  196.     Serial.print("La puerta se ha abierto: ");
  197.     Serial.println(digitalRead(ESTADOPUERTA));
  198.     //alarma(3005);
  199.     if((now() - timeEventoPuerta) > 120 ){  //---> REGISTRAR EL TIEMPO EN EL QUE SE DISPARA EL EVENTO
  200.       timeEventoPuerta = now();
  201.       horaEvento = getHora();
  202.       Serial.println("ESTADO PUERTA: han pasado 2 minutos");
  203.       //escribirBaseDato("PUERTA", (String)digitalRead(ESTADOPUERTA), (String)horaEvento);
  204.     }
  205.     //Serial.print("Hora de apertura de la Puerta: ");
  206.     //Serial.println(timeEventoPuerta);
  207.   }else{
  208.     //alarma(0);
  209.   }
  210. }
  211.  
  212. void escribirBaseDato(String sensor, String valorSensor, String hora){
  213.   if(sensor != sensorBaseDato){
  214.     if(abrirSPIFFS()){
  215.       sqlite3_initialize();
  216.       db_open("/spiffs/basedato.db", &baseDatos);
  217.       String cadenaSql = "INSERT INTO registros_sensor(sensor, valor_registro, fecha, hora) VALUES ('"+ sensor +"', '" + valorSensor + "', '14-06-19', '" + horaEvento + "');";
  218.       //CONVERTIR LA SENSTENCIA DE TIPO STRING A CONST CHAR
  219.       const char * sentencia = cadenaSql.c_str();
  220.       //EJECUTO LA SENSTENCIA
  221.       rc = db_exec(baseDatos, sentencia);
  222.       if (rc != SQLITE_OK) {
  223.         sqlite3_close(baseDatos);
  224.         Serial.println("SE REALIZO UNA ESCRITURA EN LA BASE DE DATOS");
  225.       }
  226.     }
  227.   }
  228.   sensorBaseDato = sensor;
  229. }
  230. int sensorHumo(){
  231.   //valorSensor = analogRead(SENSORHUMO);
  232.   valorHumo =analogRead(SENSORHUMO);
  233.   Serial.print("Valor Humo: ");
  234.   Serial.println(valorHumo);
  235.   if( valorHumo > MAXHUMO) {
  236.     digitalWrite(LED, HIGH);
  237.     //SUENA EL BUZZER
  238.     //alarma(2755);
  239.     //CONTROL DEL TIEMPO PARA ESCRITURA EN LA BASE DE DATOS
  240.     if ((now() - timeEventoHumo ) > 120){
  241.       //CADENA QUE CONTIENE LA SENTENCIA SQL
  242.       horaEvento = getHora();
  243.       //escribirBaseDato("HUMO", (String)valorHumo, horaEvento ); //----> escribo en la base de datos el valor del sensor
  244.       Serial.println("Humo detectado");
  245.       Serial.println("ESTADO HUMO: han pasado 2 minutos");
  246.       //tomar lectura de la tempetarua
  247. //--->      //float temperatura = dht.readTemperature();
  248.       //escribirBaseDato("Temperatura", (String)temperatura, horaEvento); //---> escribo en la DB la temperatura
  249.       //TOMO EL TIEMPO EN EL QUE SE DISPARA EL SENSOR
  250.       timeEventoHumo = now();
  251.     }
  252.   }else{
  253.     digitalWrite(LED, LOW);
  254.     ledcWrite(canal, 0);
  255.     //escribirDB = true;
  256.   }
  257.   return valorHumo;
  258. }
  259. void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){
  260.  
  261.   if(type == WS_EVT_CONNECT){
  262.  
  263.     Serial.println("Websocket client connection received");
  264.     globalClient = client;
  265.   } else if(type == WS_EVT_DISCONNECT){
  266.     Serial.println("Websocket client connection finished");
  267.     globalClient = NULL;
  268.   }
  269. }
  270.  
  271. void alarma(int encender){
  272.   ledcWrite(canal, encender);
  273. }
  274. String getHora(){
  275.   tiempo = now();
  276.   horaEvento = "";
  277.   horaEvento.concat(hour(tiempo));
  278.   horaEvento.concat(":");
  279.   horaEvento.concat(minute(tiempo));
  280.   horaEvento.concat(":");
  281.   horaEvento.concat(second(tiempo));
  282.   return horaEvento;
  283. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement