Buenos días a todos,
después de unos años programando en arduino y haciendo varias aplicaciones siempre llegaba a lo mismo: cada nueva aplicación me obligaba a hacer un nuevo programa pues unas veces no quería pantalla LCD, otras no necesitaba almacenar en SD y cosas similares.
De ahí que juntado códigos que ya existen y dándoles un toque personal he llegado al siguiente programa en el que puedes utilizar o no:
almacenamiento en memoria SD
reloj tiempo real SD1307
pantalla LCD , serie o por paralelo 4 bits
puerto serie para monitorizar valores
tal y como está estructurado, solo te tienes que preocupar de crear la parte de programa específica para tu aplicación y la parte de grabación, visualización o demás ya está hecha.
Para ser versátil, se parametrizan los tiempos de modo independiente para visualizar, temporizar, grabar,...
Espero que os sea útil.
Hasta el momento solo he encontrado un problema: si el tiempo para grabar a SD lo pongo a 3600 segundos (1 hora), no graba a SD. Para evitarlos pongo tiempos como máximo de 30 minutos.
Adjunto el programa y las liberías necesarias.
Yo lo tengo montado dentro de una caja con unas baterías LIPO, de modo que lo puedo dejar registrando varios días seguidos sin necesidad de alimentación externa. La pantalla LCD la tengo sin retroiluminación para que consuma menos.
He mirado tu código y ya que tomas muestras cada 30 minutos te voy a aconsejar algo que extenderá sustancialmente la duracción de las baterías.
Debes poner el arduino en sleep. Lo pones a dormir 29:30 min y luego lo despiertas, tomas las muestras, lo grabas en la SD y lo vuelves a dormir.
Buenas a todos,
ahora añado el mismo programa, solo que le he implementado la lectura y almacenaje de las mediciones obtenidas de sondas de temperatura y humedad DHT11 y DHT22. Las sondas DHT11 no las recomiendo. Empecé con ellas porque eran muy baratas, pero en temperatura tienen poca precisión (error de +-1 ó 2 ºC) y en humedad muy mal (error de más de un 20%).
Y que pasó paco, porque veo que por un comentario del quadcoptero daría la sensación que sigues con el problema
Si es asi veré tu código para corregirlo.
Espero tu respuesta.
ya he implementado la función Sleep, pero no lo cuelgo mientras no compruebe la diferencia de consumos y compruebe que realmente funciona todo correctamente. el ahorro de consumo no se cuanto será pues al tener la SD, el TIME y la LCD, no se cuanto pesa el arduino solito. El mayor ahorro de consumo lo conseguí pudiendo apagar la luz del LCD.
El problema de que no grabe con tiempos de una hora, no le he dado más vueltas. Uso tiempos máximos de 30 minutos y solucionado.
Eureka. Ya está arreglado el problema de almacenar datos tiempos más allá de los 30 minutos. Ahora se puede hacer almacenamiento desde un segundo hasta cada 24 horas.
También he implementado la función sleep para que consuma menos. haciendo periodos de dormir de 500 mseg, consigo bajar el consumo total (arduino- sensores- reloj -LCD- SD de 35 mA cuando trabaja a 22 mA cuando duerme, que un 80% del tiempo.
Se podría hacer que duerma más tiempo, pero de momento lo dejo así porque el programa es más flexible y puede hacer "cosas" en tiempos inferiores a 1 segundo.
Espero que os sea util
Ahi voy:
en el programa principal, como en todos los casos primero se cargan las librerías necesarias y se defines las variables globales.
En la parte de "#define" es donde indicas si hay o no SD, relol, LCD,...
En los siguientes "#define" configuras los intevalos entre lecturas de sondas, visualización LCD, almacenaje a la SD,... Estos son configurables al gusto. Los he puesto de modo de que los primeros deberían ser más cortos que los últimos (por ejemplo no tiene sentido que actualices la pantalla LCD más rápido de lo que lees la sonda pues los valores no van a cambiar).
char buf[80] es el texto de la cabecera del archivo que va a grabar a la DS
char name[] es el nombre del archivo que grabas a la SD. en modo automático busca que no exista, aumentando el número secuencial XXX del final del nombre. Empieza en 000 y termina en 999. Cuando llegue aquí entrará en fallo.
sleepTime=500 es el tiempo que duerme. Así al menos actualiza el reloj en menos de 1000 mseg y se que no me pierdo ningún segundo de reloj.
He hecho un cambio en el código típico de escritura a SD. Generalmente si hay un fallo de escritura a SD el programa se para. Yo he preferido que el programa siga corriendo para poder ver los valores de la sonda en la pantalla LCD y al mismo tiempo que de un aviso de "fallo SD", pero que no pare.
Lo que hay dentro del LOOP es poco. He preferido crear casi todo con funciones para que interpretar el LOOP sea más fácil. Se conmprueba el tiempo que ha pasado desde la última ejecución y cuando se pasa por encima del timer, se ejecutan las funciones correspondientes.
Archivo DHT11: son las funciones necesarias para leer las sondas DHT11. No hay que modificar nada en este archivo
Archivo Func_Temp_Rocio: son las funciones necesarias para calcular la temperatura de rocio. No hay que modificar nada en este archivo.
Archivo LCD: Es donde escribes y configuras lo que sale en la pantalla LCD. Están programados 3 pantallazos diferentes, el principal que se muestra siempre, uno que se muestra cada 8 segundos e indica la hora y otro que se muestra solo si hay fallos en la SD y que aparece también cada 8 segundos.
Archivo Varios_SD: son funciones para que funcione la SD. Solo hay que escribier en la parte que pone
--//-- Codigo añadido específico primera ventana --//--
En esta parte es donde dices que valores se graban en la SD
Archivo Varios: Nada, solo texto explicando los cambios entre versiones.