Datalogger, memoria SD y RTC con Arduino – Riego automático!

En esta ocasión, aprenderás a construir un sistema de riego completo, podrás ajustar todos los parámetros para tus propias necesidades. También aprenderás a construir un datalogger; esto es, guardar todos los registros del sensor dentro de una memoria SD. Esto lo harás aplicando dos herramientas: el reloj de tiempo real (RTC) y el controlador de memoria SD. Te explicaré todo con este básico ejemplo.

Reloj de tiempo real (RTC)

El reloj de tiempo real (RTC, por sus siglas en inglés), es un módulo que es capaz de guardar la fecha y la hora, para poder ser utilizada como referencia. Seguramente te has preguntado: ¿cómo puedo hacer que mi lámpara encienda (o se apague) a cierta hora? Recuerda que el Arduino no es capaz por si solo de saber qué hora es, solo sabe de retardos o pausas, cada vez que se está ejecutando el código.

El RTC entonces podrá conservar la misma hora para siempre, bueno casi. El RTC necesita entonces una pequeña batería para que conserve la configuración de la fecha y la hora.

Existen en el mercado distintas maneras de utilizar el módulo de RTC. Básicamente existen dos opciones: el modulo RTC individual y la versión integrada en un shield en conjunto con el módulo de tarjetas SD (o microSD).

Si quieres saber más sobre los shields, descarga la guía de inicio en Arduino completamente GRATIS

¿Te está gustando este artículo?

Te invito a descargar totalmente gratis la Guía de Inicio en Arduino

Encontrarás mucha información extra, conceptos y sobre todo podrás llevarla contigo en todo momento

Módulo reloj de tiempo real (RTC)
Módulo reloj de tiempo real (RTC)
Shield Datalogger.
Shield Datalogger.

El funcionamiento en ambas versiones es prácticamente el mismo. La diferencia es que en la versión en shield, el RTC ya tiene cableados los pines de comunicación con la placa.

¿Cómo se conecta el RTC con Arduino UNO?

Para realizar la comunicación entre el Arduino (o cualquier otra plataforma) es necesario implementar el protocolo de comunicación I2C, pero no te preocupes, como siempre utilizaremos una librería para realizar la comunicación.

El RTC realmente es un circuito integrado, los módulos que compramos ya traen el circuito integrado y toda la circuitería necesaria para utilizarlo. Es importante que consideres comprar una batería CR2032 o CR1220 para alimentar el módulo. La primera es para las versiones independientes o la segunda para la versión de shield. Aunque esto puede variar, es recomendable que siempre revises la versión que estás comprando, ya que pueden existir más.

Las versiones de los circuitos integrados RTC es importante, ya que una es mejor que la otra. Si puedes elegir, te recomiendo que compres la versión DS3231, ya que la versión DS1307 suele sufrir retrasos en la sincronización del tiempo.

Para realizar la comunicación del RTC con la placa Arduino UNO, son necesarios al menos cuatro pines.

TABLA

Pin del módulo Pin Arduino UNO
SCLSCL (A5)
SDASDA (A4)
VCC5 V
GNDGND

Recuerda que en la placa Arduino UNO tenemos un puerto I2C, que solamente necesita dos pines de comunicación, el SDA y el SCL. Internamente se encuentran conectados a los pines A4 y A5 correspondientemente. En algunas placas también están en los pines hasta arriba del pin 13.

Para los ejemplos que te mostraré a partir de este punto, utilizaré el shield Datalogger. Esta placa ya trae conectados internamente los pines desde el circuito integrado hasta el puerto I2C de la placa Arduino UNO. Entonces no tendrás que preocuparte, solamente ten en cuenta que estos dos pines (A4 y A5) no los deberás utilizar para otra cosa.

Las funciones y el código de ejemplo lo veremos más adelante en este mismo artículo.

Módulo de tarjetas SD en Arduino UNO

Para guardar datos en tarjetas de tipo SD o microSD, existe de igual manera dos posibilidades. La primera es con un módulo independiente de lectura/escritura de tarjetas SD independiente, y la segunda opción es mediante el shield Datalogger que incluye este módulo de manera integrada.

Módulo lector de SD.
Módulo lector de SD.
Shield Datalogger.
Shield Datalogger.

Para poder utilizar este tipo de memorias, es importante que la tarjeta esté formateada en un sistema de archivos FAT16 o FAT32. Una vez que la tengamos lista, utilizarla es muy sencillo.

Ten en cuenta que nuestro programa que cargaremos al Arduino, ocupará un poco más de espacio que de manera habitual, y esto es porque el uso de este tipo de módulos consume más espacio en memoria, así que utilízalo solo en las aplicaciones que de verdad las necesites.

Para las aplicaciones de datalogger, necesitaremos guardar información que proviene de sensores en un archivo que normalmente es de tipo .txt

Por lo que la cantidad de espacio que necesitaremos será realmente muy poca, así que con una memoria de capacidad baja (unos 4 gb) tendremos mucho más que suficiente para unos cuantos años de almacenamiento. Claro, dependerá de que tan «seguido» estés guardando información.

¿Cómo se conecta el lector de tarjetas SD con Arduino UNO?

Para realizar la comunicación entre el módulo de tarjetas SD con la placa Arduino UNO es mediante el protocolo de comunicación SPI.

Las placas Arduino ya incluyen, de la misma manera, pines dedicados para este puerto de comunicación. Para la placa Arduino UNO, corresponden a los pines 11, 12 y 13. Si estás utilizando otra placa, consulta el patillaje. Por lo que no podremos utilizar estos pines digitales como salidas o entradas para nuestra aplicación, los tendremos que reservar para la tarjeta SD.

Entonces, necesitamos conectar los siguientes pines:

Pin del módulo Pin Arduino UNO
VCC5 V
CSTu lo eliges (normalmente se utiliza el 10)
MOSI11
SCK13
MISO12
GNDGND

El pin CS (Chip Select), normalmente tu lo vas a elegir. En nuestro caso que utilizaremos el shield datalogger, el fabricante nos dice que reservemos el pin digital 10 para esta conexión, ya que la placa así la trae internamente conectada. Más adelante en el código verás como le asignamos este pin. El resto de los pines, ya los trae conectados directamente.

Ejemplo de sistema de riego con reloj de tiempo real y memoria SD

Ahora que ya vimos como se conectan los módulos, manos a la obra!

En nuestro caso, que tenemos el shield datalogger, solamente tenemos que empotrarlo sobre la placa Arduino UNO, ya que embona directamente. Sobre este shield, realizaremos las conexiones restantes de nuestro circuito como se muestra a continuación.

Diagrama de conexiones para el sistema de riego.
Diagrama de conexiones para el sistema de riego.

Observa que tenemos montado el shield sobre la placa Arduino UNO. La imagen del motor de CD, representa la bomba de agua que utilizaremos, para fines prácticos es lo mismo. La bomba de agua que utilizaremos funciona con 5 VCD y es sumergible.

¡¡¡Ten en cuenta lo siguiente!!!

Siempre revisa cuanta corriente consume tu bomba (o motor), ya que la placa Arduino UNO no puede suministrar mucha corriente, por lo que te recomiendo que utilices un relevador (como en este caso) para alimentar la bomba utilizando una fuente de alimentación externa, como de unas baterías o de un eliminador de corriente, dependiendo del tipo de bomba que tengas a la mano.

En mi caso, estoy utilizando como alimentación para la bomba el pin Vin de la placa Arduino UNO. Este pin está conectado directamente a la fuente de voltaje que se esté utilzando, ya que yo estaré utilizando como alimentación 5 VCD a través de un cable USB conectado a la PARED que me entrega 1 A (aunque para este caso en específico, la corriente que otorga mi PC si conecto directamente el USB es suficiente para la bomba que estoy utilizando)

La conexión del sensor de temperatura del suelo, lo realizamos justo como lo vimos en este capítulo.

Código del sistema de riego completo

¡Muy bien! Una vez realizadas las conexiones y que ya te aseguraste de los niveles de voltaje y corriente necesarios para tu proyecto, vamos a cargar el siguiente código.

Si te fijas en la primera parte, las librerías que agregamos son:

SD.h y SPI.h son para controlar la memoria SD mediante el protocolo SPI; la librería Wire.h es para el protocolo I2C y la librería RTClib.h es para el control del RTC.

Lo primero que tenemos que asegurarnos es de indicarle el pin de chipSelect para la comunicación con la SD const int chipSelect = 10;

Posteriormente creamos todas las variables que necesitaremos como el pin para la lectura del sensor (A0), el pin digital para controlar el encendido y apagado del relevador (Salida = 8) y las variables donde almacenaremos todos los datos de humedad, la fecha, la hora, etc.

También tenemos que crear un objeto llamado RTC RTC_DS1307 RTC; este se utilizará para controlar el RTC 😄

En la función de configuración, decalaramos el pin de Salida como tipo OUTPUT e inicializaremos el puerto serie a 9600.

Configurar el RTC en Arduino

Para el RTC, primero necesitamos inicializarlo mediante RTC.begin();

Enseguida tenemos que verificar si el RTC se inició o no. Normalmente la primera vez que le colocamos la pila y lo echamos a andar, el RTC está desconfigurado y es necesario indicarle la fecha y la hora. Esto lo hacemos así:

Si el RTC no está corriendo, entonces además de imprimir el mensaje de que el RTC no está corriendo, es necesario descomentar la línea RTC.adjust(DateTime(__DATE__, __TIME__)); Esto hará que cuando entre a este if, le asigne al RTC la fecha y la hora en la que fue compilado el código. Por lo que te sugiero que la primera vez siempre realices esta configuración. Y posteriormente vuelvas a comentar la línea y cargues de nuevo el código.

Con esto, ya tendrás sincronizado el RTC y mientras no le quites la batería, siempre estará sincronizado a esa configuración. De vez en cuando (cada mes o depende como observes con el tiempo el desfase), realices un nuevo ajuste de fecha y hora, ya que con el tiempo esto cambia.

¡Con lo anterior ya tienes configurado el RTC! ¿Fácil no?

Configurar la SD en Arduino

Para configurar la memoria SD, es muy sencillo. Tienes que verificar lo siguiente:

Primero siempre suelo imprimir un mensaje para ver en el puerto Serie que estoy en este paso.

Verificamos si la SD no inició mediante la función SD.begin(chipSelect) Pero aprovechamos que si el resultado de esta función fue false, entonces que salga el mensaje de "No se pudo inicializar la SD, o no está conectada" Si te fijas, esto lo hacemos dentro del if, para que en caso de que no se inició, el programa se quede en un ciclo infinito con el while(1), esto hará que el programa se quede ahí trabado, pero yo se lo comento para que el programa continúe, pero observando el mensaje de error en el puerto Serie.

Si en este paso la memoria no se inicializa, puede deberse a varias cosas:

  • La memoria no está insertada o bien colocada.
  • La memoria está bloqueada.
  • No tiene el formato correcto.
  • Alguna conexión (sobre todo si es un módulo independiente), está mal realizada.
  • Está dañada.

Si todo sale bien, observamos el mensaje de SD inicializada.

Programa principal

En el loop principal, estaremos tomando una nueva medición cada cierto tiempo. Esto dependerá de ti, yo lo dejé cada 15 minutos (900,000 ms).

Lo que haremos en cada ejecución del loop es primero obtener una nueva medición del sensor de humedad humedad = analogRead(SensorPin); y la guardamos en la variable humedad.

Te recomiendo en este paso ir al artículo del sensor de humedad y regreses, por si tienes dudas en cómo funciona.

Recuerda que el sensor de humedad indica 1024 para totalmente seco, y un valor pequeño para totalmente húmedo. Te sugiero que realices una prueba con agua o con la tierra donde insertarás el sensor para que sepas cuáles son los valores que te arroja el sensor para ambos casos.

Después, mediante la función map(), guardé en la variable humedad_pc un valor de humedad expresado en porcentaje (%). Si te fijas, yo mapeé como 100% humedad un valor de 300 y como 0% humedad un valor de 1024 humedad_pc = map(humedad, 300, 1024, 100, 0);

Ahora obtenemos del RTC la fecha y hora actual mediante DateTime now = RTC.now(); y separamos la información en distintas variables:

Todas las variables son de tipo String, por lo que almacenarán cadenas de caracteres. Tenemos entonces en distintas variables, el año, mes, día, las horas, minutos y segundos. En la variable Fecha tenemos el año/mes/día y en la variable Hora tenemos horas:minutos:segundos

Posteriormente creamos el nombre que le daremos al archivo .txt mediante la siguiente cadena: Nombrearchivo = ano + mes + dia + ".txt";

Este nombre tu lo puedes configurar a tu antojo, a mí me gusta verlos ordenados por añomesdía.txt

Ahora verificaremos la lectura de humedad, esto tú lo eliges dependiendo como quieres realizar tus riegos. Yo elegí que si la humedad es igual o mayor que una lectura de 750 que se riegue por 5 segundos. Mi bomba, según el fabricante, es de 5 l/h, entonces con 5 segundos me alcanza para mi maceta 🤣

Recuerda que para encender el relevador, se tiene que enviar un cero a la salida. En la variable Imprimir, almaceno la fecha, la hora, el valor de humedad, el valor de humedad en porcentaje y si el control está en ON o el OFF. Esto último, dependerá de si la humedad es mayor o igual a 750 escribiendo ON; en caso contrario, se escribirá que el control está en OFF

El código anterior realiza toda la operación para regar por 5 segundos. Observando las funciones lo que se tiene que hacer es mediante la función SD.open(), le indicamos que con ese nombre de archivo se envíe la instrucción de abrir. En este punto te comento que si el archivo no existe, se crea uno nuevo; si el archivo ya existe, simplemente se abre. El resultado de esta función se almacena en dataFile.

Si dataFile es true, quiere decir que el archivo está correctamente abierto, entonces podremos escribir dentro de el, para esto utilizamos dataFile.println(Imprimir); posteriormente cerramos el archivo. Siempre se tiene que cerrar luego de terminar de escribir en el. Si te fijas, utilizamos println para que agregue un salto de línea al final de imprimir en el archivo, como cuando utilizamos el puerto Serie.

Después de los 5 segundos, apagamos el relevador para que deje de regar.

Para el caso de que el sensor no sea mayor o igual que 750, escribimos en la memoria lo mismo, pero cambiando el Control: OFF. Este nos servirá para cuando consultemos el archivo, saber si se envió la orden de encender o apagar la bomba.

¿Cómo abrir los datos de una SD en excel?

Ya que tenemos en funcionamiento nuestro sistema, es muy útil analizar los resultados obtenidos en la memoria SD. Yo suelo abrir los datos con Microsoft Excel, pero puedes utilizar cualquier programa.

Solamente ten en cuenta que si quitas la memoria SD, y el Arduino sigue en función, seguirá haciendo el control (ON-OFF) pero no guardará los datos nuevos en la memoria —algo obvio no?

Yo te recomiendo que siempre que vuelvas a colocar la memoria en tu shield, reinicies el Arduino. Acuérdate que tiene un botoncito para esto.

Al colocar tu memoria SD en la computadora, observarás algo como esto:

Listado de archivos.
Listado de archivos.

Para mi caso, dejé el sistema un poco más de un día, por lo que tengo dos archivos.txt

¿Recuerdas que le dimos espacios cuando almacenamos los datos en la variable Imprimir? Esto nos servirá para lo siguiente.

En Excel, le daremos click en Archivo→Importar y en la ventana seleccionamos Archivo CSV, y le damos click en Importar.

Menú importar.
Menú importar.

Luego, seleccionamos el primer archivo .txt y click en Obtener datos

Seleccionar el archivo de texto.
Seleccionar el archivo de texto.

Seleccionamos Delimitados y click en Siguiente >

Delimitar datos.
Delimitar datos.

Seleccionar Espacio, click en Siguiente >

Seleccionar espacio.
Seleccionar espacio.

Después seleccionas General y click en Finalizar.

Formato general.
Formato general.

Ahora seleccionamos donde queremos insertar los datos, por default te muestra el lugar donde se encontraba el cursor, pero puedes cambiar el lugar. Luego le damos Aceptar.

Aceptar importación.
Aceptar importación.

Y veremos algo como esto:

Datos insertados.
Datos insertados.

Puedes insertar el otro archivo debajo de esta tabla para tener un orden consecutivo, y después crear gráficas o lo que necesites.

Gráfica de datos.
Gráfica de datos.

¿Qué te ha parecido este proyecto? ¡Déjame todos los comentarios y preguntas qué quieras!! Platícame en qué otro tipo de proyectos se te ocurre aplicar estos conocimientos.

¡Hasta la próxima!

Recuerda visitar nuestras redes sociales

Deja un comentario