Cada tiempo Rnd, Firebase o la Epromm cambian los datos - [SOLUCIONADO] - Code

UPDATE! : El Codigo completo funcionando con todo esta en el POST #10

Gracias!

Hola! Buenas! Si bien uso muuuucho el foro para consultas y juego un poco con los arduinos, nunca habia posteado consultas porque habia podido solucionar mis problemas en base a investigacion y deduccion…

No soy buen programador, chapuceo, asi que este post tiene en verdad 2 intenciones:

  1. Solucionar el problema
  2. Que me ayuden a emprolijarlo. Estoy mas que convencido de que esta bastante desprolijo.

DESCRIPCION DEL PROYECTO:

Lo que esta actualmente funcionando (y que presenta el fallo) es un sistema de ventilacion para 3 baños. En cada baño hay un Sensor de luz tipo LDR. Al encenderse la luz del baño se activa un Relay que comanda un extractor instalado en el ducto principal. De esa forma, los 3 baños comandan al mismo extractor.

Al usar un LOLIN R1, el cual dispone de 1 solo ADC, utilice una multiplexacion sencilla de las entradas para leer los 3 ldr con ese unico ADC.

Como soy un tipo jodido (y coloque el circuito en un lugar poco accesible) Todos los parametros de configuracion se graban en la Epromm pero se sincronizan con FIREBASE, de esa forma, cuando calibre los sensores y los tiempos de funcionamiento, lo hice desde la laptop / celular.

Por la misma razon utilice las librerias de OTA para poder camviar el programa sin desmontarlo, dado que aun no implemente el control por humedad del ducto (para monitorear el vapor de las duchas). El sensor esta actualmente instalado y esta monitoreado.

El programa asimismo cada (n) tiempo, prende el extractor un (t) tiempo para mantener ventilado asi los baños no se utilicen, dado que son todos internos sin ventilacion natural.

PROBLEMA!!!:
Aca vamos. Describo la secuencia normal de funcionamiento:

  1. al arrancar se cargan de la EPROM los valores de configuracion y todo arranca.
  2. cada 1 segundo miro en Firebase si hay orden de actualizar datos. Si no hay orden, no hacemos nada
  3. Si hay que actualizar cargo los valores de Firebase (Todos ellos)
  4. Actualizo en Firebase el FLag de actualizacion
  5. Y lGrabo los datos actualizados en la Eprom

Asi de sencillo… que sucede?

ALEATORIAMENTE se pierde un valo cualquiera de configuracion, hoy por ejemplo el valor de tiempo de autoactivacion que estaba en 5400 segundos por defecto, se puso solo en 40, con lo cual el extractor no paraba de funcionar y el timer de apagado de emergencia se disparaba como loco…

Bueno, ese es el inconveniente. Se acepta la ayuda de los que saben! JAJAJA

Aca abajo va el codigo completo! Por la extension va en atachement pq no me permite el largo del post.

No adjunto Schematics pq esta todo andando bien, no es un problema de electronica.
Asimismo solo busque info en los ejemplos de las librerias, no hay codigo copiado de ningun lado…

Espero cualquier sugerencia!

Saludos!

Iniciando23-3.ino (17 KB)

Para seguir un programa como el tuyo hace falta asegurarse que todas las librerías involucradas coinciden

Mira esto

#include <Firebase.h>
#include <FirebaseArduino.h>
#include <FirebaseCloudMessaging.h>
#include <FirebaseError.h>
#include <FirebaseHttpClient.h>
#include <FirebaseObject.h>
#include <DHT.h>
#include <EEPROM.h>
#include <ArduinoOTA.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <DHT.h>
#include <Time.h>
#include <TimeLib.h>

Tal vez nunca me has leído pero siempre pido lo mismo, información como comentario de donde se ha descargado la librería y si se trata del Gestor de librerías entonces indicar la versión que esta en uso para que la reproducción de tu problema sea exacta.

Quedo a la espera para considerar mi prueba de tu código. De lo contrario al menos yo no podré ayudarte.

Es totalmente entendible la observacion que me haces. No lo aclaré porque como el programa compila y esta actualmente funcionando no supuse que era un problema de Librerias. En la ultima semana solo fallo una vez al momento de un corte de suministro electrico (producido cuando con tension estaba instalando un sistema RGB por Blynk y un ESP-01 en una luminaria... jajaja).

Por otra parte es totalmente real. La version de Firebase solo funciona si compilo el programa con la version de placas Version de ESP Board 2.5.1 (Cosa que no se como elegir en el compilador... para hacerlo "borro" las otras versiones de la carpeta de Boards. Hay alguna manera de indicarle al compilador que version de placa usar que no sea por medio de la linea de comando?) Y esta instalada desde el gestor externo y desde "http://arduino.esp8266.com/stable/package_esp8266com_index.json"

Bueno:

FIREBASE: Instalada desde el Gestor de Librerias. Ver. 2.8.7 Json (que la pide Firebase): Instalada desde el Gestor de Librerias. Ver. 5.13.2 DHT: Instalada desde el Gestor de Librerias. Ver. 1.3.8 Time y TimeLib: Instalada desde el Gestor de Librerias. Ver. 1.6.0 EEPROM: No recuerdo haberla instalado de ninguna forma particular... puede ser que venga "por default"? ArduinoOTA : Use https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA

Noto que dejé dos veces la libreria DHT... ya elimine una en mi codigo. Y tomo la recomendacion, para la proxima dejo comentado cada libreria, me parecio algo muy util.

Creo que esta era la info que solicitabas. Saludos!

Lo que me extraña es que te funcione algo ,guardando Int y Floats en una sola celda de la Eeprom,que si funciona igual que la de arduino,solo puedes guardar valores byte de 0 a 255...

Que estas viendo que yo no veo? jajaja

En la eeprom solo grabo Ints... justamente cuando quiero grabar un Float hago esto (tiene 1 solo decimal...)...

...
CAS1_temp = CAS1*10;
 EEPROM.write(6, CAS1_temp);
...

Y firebase con el comando

 Firebase.setFloat("Settings/CAS1", CAS1);

Me permite grabar Floats como te muestro en la imajen que adjunto.

Te referias a eso o a otra cosa?

(Uso el Firebase como opcion para ajustar los parametros de funcionamiento y la eeprom para guardar los valores por si no hay Internet y cargo los valores... obviamente el programa no esta terminado aun... Pero ya me llego de DHS11 de repuesto y sigo adelante.

¿y cuantos bytes tiene un int?

Sigo sin saber adonde apuntas…

4 bytes, 2^32… que me estoy perdiendo? Xd

Pues es bien facil ,en cada posicion de la eeprom SOLO puedes guardar un valor tipo byte es decir un valor que va de 0 a 255.Una variable int OCUPA 2 bytes ,osea DOS posiciones de la eeprom.Si te funciona medio bien es porque los valores que guardas son menores que 255 y el byte que estas machacando no afecta al valor,pero fijate que tu mismo comentas que el valor que te dio problemas es el de Tventeo cuyo valor,curiosamente es de 5400....

Existen funciones para float, int etc y se llaman EEPROM.put(direccion, variable) y EEPROM.get(direccion, variable) Buscalas en el playground para saber mas de ellas.

en tu caso una variable float , otra int y otra float se guardarían así

address = 0;
float f1 = 344.3;
EEPROM.put(address, f1); // esto guarda f en la posición 0 y ocupa 4 bytes
address = sizeof(float);   // sumo los bytes que ocupa un float
int dato = 34;
EEPROM.put(address, dato); // guarda un entero o sea 2 bytes empezando en la posicion 4 
address += sizeof(int);         // a direccion le sumo los 2 bytes que ocupé
float f2 = 1234.6;                       
EEPROM.put(address, f2)     // y esto guarda f2 en la posicion 6

Para leerlos usar EEPROM.get(direccion, variable) pero mantener el orden de las direccion donde se guardaron f1, dato y f2.

Tan elemental y basico que averguenza.... XD

Pruebo, corrijo y comento.

Gracias!

A Priori todo funcionando!

3 Sensores de Luz en los Baños con sensibilidad y Disparo para detectar uso ---- OK!
Sensor de Humedad y Temperatura para deteccion de Ducha ------------------------------ OK!
Disparo por lapsos de tiempo para mantener ventilado ------------------------------------- OK!
Apagado de Emergencia por Exceso de tiempo de Prendido (si dejan la luz prendida) — OK!
Actualizacion Remota del programa por OTA ----------------------------------------------- OK!
Actualizacion de parametros de funcionamiento y muestra por Firebase ------------------ OK!
Presentacion de Datos de Humedad y Temperatura en ThingSpeak para calibrar Ducha – OK!

Gracias a ambos que me avisparon!

Queda (no se si lo voy a tocar pq ya tengo que encarar otro proyecto) sacar los Delays.

Dejo en un atach el Codigo completo por si le sirve a alguien algo. Saludos!

Ventilaciones-EN-FUNCIONAMIENTO.ino (23.6 KB)