INTRODUCCIÓN
En esta práctica se utilizará memoria FLASH de la chip ESP8266 para el almacenar las medidas realizadas por un sensor de ultrasonidos (HC-SR04).
Desde un navegador WEB, conectado en modo cliente con el ESP8266, podremos iniciar las mediciones de datos indicando la fecha, hora y el intervalo de tiempo con el que se deben realizar. La utilidad práctica será conocer la altura del agua en un depósito a lo largo del tiempo.
Las mediciones realizadas se podrán visualizar a través del navegador. El formato en el que se almacenan será CSV, para que sean fácilmente exportables, por ejemplo a una hoja de cálculo.
Se hará uso de la librería FS.h, (File System) que facilita la gestión del sistema de archivos para dispositivos integrados de almacenamiento FLASH NOR, con bus de comunicaciones SPI (SPIFFS – Serial Peripheral Interface Flash File System).
INSTALACIÓN DE LA LIBRERÍA FS.h
- Descarga el archivo master.ZIP del repositorio GITHUB desde la dirección: https://github.com/pellepl/spiffs/archive/master.zip
- Descomprime el archivo descargado
- Crea la carpeta «tools» dentro de la carpeta de Arduino de tu usuario, si no existe:
- ∼/Arduino/tools
- Mueve la carpeta descomprimida del ZIP a la carpeta «tools» del punto anterior y guarda los ficheros en el subdirectorio ESP8266FS. Debe quedar como:
- ∼/Arduino/tools/ESP8266FS
- Reinicia el IDE de Arduino.
MATERIAL NECESARIO
CONEXIONADO
- Vcc – Vu (El HC-SR04 necesita 5V para funcionar correctamente).
- Echo – D0
- Trig – D1
- Gnd – G (Ground / Tierra)
SKETCH
El sketch de Arduino a subir al chip ESP8266 es el que se muestra a continuación:
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <FS.h> #include <TimeLib.h> #define EchoPin D0 #define TriggerPin D1 #define LedPin D4 static unsigned long last; //-last- Variable para almacenar el tiempo (ms) que lleva el procesador encendido int intervalo; long duracion, alturaCm; File altura; time_t T0; String iniciar = "no", mm, dd, hh, mn, fechaHora; const char *ssid_AP = "ESP8266_AP"; const char *password_AP = "12345678"; ESP8266WebServer server(80); static const char INDEX_HTML[] PROGMEM = R"( <html> <body> <form action='/incio'> Fecha: <input type='datetime-local' name='dateTime' id='idFecha'><br> Formatear memoria Flash: <input type='checkbox' name='format' value='si'><br> Intervalo de medidas (s): <input type="number" name="intervalo" min="10" step="10" value="30"><br><br> <input type="submit" value="Enviar"> </form> <script> var fecha = new Date(); var yyyy = fecha.getFullYear(); var mm = fecha.getMonth()+1; if(mm<10) {mm='0'+mm}; var dd = fecha.getDate(); if(dd<10) {dd='0'+dd}; var hh = fecha.getHours(); if(hh<10) {hh='0'+hh}; var mn = fecha.getMinutes(); if(mn<10) {mn='0'+mn}; var formatoFecha = yyyy+'-'+mm+'-'+dd+'T'+hh+':'+mn; document.getElementById('idFecha').value = formatoFecha; </script> </body> </html> )"; void dateTime_T0(){ String formatoFecha = server.arg("dateTime"); //2018-06-26T23:54 tmElements_t tm; tm.Year = formatoFecha.substring(0,4).toInt()-1970; //2018 tm.Month = formatoFecha.substring(5,7).toInt(); //6 tm.Day = formatoFecha.substring(8,10).toInt(); //26 tm.Hour = formatoFecha.substring(11,13).toInt(); //23 tm.Minute = formatoFecha.substring(14,16).toInt(); //54 T0 = makeTime(tm); //1530057240 26-6-2018 23:54 } void dateTime_toSave(){ dd = day(T0)<10? String("0")+String(day(T0)):String(day(T0)); //26 mm = month(T0)<11? String("0")+String(month(T0)-1):String (month(T0)-1); //06 hh = hour(T0)<10? String("0")+String(hour(T0)):String(hour(T0)); //23 mn = minute(T0)<10? String("0")+String(minute(T0)):String(minute(T0)); //54 fechaHora = (dd+"/"+mm+"/"+String(year(T0))+";"+hh+":"+mn+";"); //26-06-2018 23:54 Serial.print("fechaHora: "); Serial.println(fechaHora); } void format_SPIFFS(){ //Función para formatear la memoria SPIFFS if (server.arg("format") == "si"){ Serial.println("Formateo iniciado..."); digitalWrite(LedPin, LOW); SPIFFS.format(); Serial.println("Formateo finalizado!"); digitalWrite(LedPin, HIGH); } } void read_SPIFFS(){ altura = SPIFFS.open("/altura.txt", "r"); server.streamFile(altura, "text/plain"); altura.close(); } void ping() { digitalWrite(LedPin, LOW); digitalWrite(TriggerPin, LOW); //para generar un pulso limpio ponemos a LOW 4us delayMicroseconds(4); digitalWrite(TriggerPin, HIGH); //generamos Trigger (disparo) de 10us delayMicroseconds(10); digitalWrite(TriggerPin, LOW); duracion = pulseIn(EchoPin, HIGH); //medimos el tiempo entre pulsos, en microsegundos alturaCm = duracion * 10 / 292/ 2; //convertimos a altura, en cm Serial.print("Altura: "); Serial.println(alturaCm); digitalWrite(LedPin, HIGH); } void setup() { Serial.begin(115200); pinMode(LedPin, OUTPUT); digitalWrite(LedPin, HIGH); pinMode(TriggerPin, OUTPUT); pinMode(EchoPin, INPUT); WiFi.mode(WIFI_AP); WiFi.softAP(ssid_AP, password_AP); Serial.println("WiFi inicializada."); Serial.print("AP dirección IP: "); Serial.println(WiFi.softAPIP()); Serial.println(); SPIFFS.begin(); server.on("/", []() { server.send_P(200, "text/html", INDEX_HTML); }); server.on("/incio", [](){ server.send(200, "text/plain", "Inicializado!"); iniciar = "si"; intervalo = server.arg("intervalo").toInt(); Serial.print("Intervalo: "); Serial.println(intervalo); last = millis(); dateTime_T0(); dateTime_toSave(); format_SPIFFS(); altura = SPIFFS.open("/altura.txt", "a+"); altura.println("Fecha;Hora;Altura (cm)"); altura.close(); }); server.on("/altura", [](){ read_SPIFFS(); }); server.begin(); Serial.println("Servidor inicializado."); } void loop() { server.handleClient(); if (iniciar == "si" && abs(millis()-last) > intervalo*1000) { //Cada intervalo de medición se ejecuta T0 = T0 + intervalo; dateTime_toSave(); ping(); altura = SPIFFS.open("/altura.txt", "a+"); altura.print(fechaHora); altura.println(alturaCm); altura.close(); last = millis(); } if (iniciar == "no" && millis()> 900*1000){ //Si lleva 15 minutos sin incializarse se inicializa automáticamente iniciar="si"; T0 = 0; intervalo = 60; altura = SPIFFS.open("/altura.txt", "a+"); altura.println("Fecha;Hora;Altura (cm)"); altura.close(); } }
Una vez que hayamos subido el sketch en el chip ESP8266, podremos ver la dirección asignada por el router a través del puerto serie del IDE de Arduino. Esa será la URL que hay que escribir desde cualquier navegador WEB (Mozzilla, Google Chrome, Safari, Internet Explorer, Microsoft Edge…) de un cliente conectado al AP del ESP8266 (SSID: ESP8266_AP PASSWORD/CLAVE: 12345678), para iniciar la comunicación HTTP que solicitará el formulario al servidor.
Si escribimos la URL/altura obtenemos las mediciones realizadas.
2 Comments
Leave your reply.