Search

Programar horario de guardado automático en arduino

¿Estás interesado en hacer un control de riego automático o algo similar?

Si tu respuesta es sí, no dudes en detenerte a leer este artículo ya que solo te llevará unos minutos.

Por lo tanto, si estás interesado en llevar un control de las medidas que van recogiendo tus sensores y no quieres estar pendiente de ellos, solo necesitarás:

Solamente con esto, ya podrías tener tu control rutinario de medidas, para así luego implementar un control de riego o cualquier otra cosa.

La manera de la que se ha creado el código para el guardado automático, es mediante la memoria EEPROM.

Pero, ¿Qué es la memoria EEPROM?

Conocemos como EEPROM  a la memoria interna de Arduino, es decir, todo lo que se guarde aquí se quedará almacenado a no ser que se sobrescriba, por lo tanto, aunque nuestro Arduino se reiniciara no se borraría nada.

Hablando coloquialmente, la memoria EEPROM de Arduino UNO (Es el que se utiliza en nuestro código), sería como un armario, el cual tendría 1024 cajones, cada cajón será una posición para ocupar, depende del tipo de placa la memoria EEPROM será de mayor o menor capacidad.

En el siguiente post, podremos ver como hacer esto mismo, pero en vez de guardar en la memoria EEPROM de Arduino, lo guardaremos en un módulo SD, ya que nos puede ser de mayor utilidad.

El siguiente código muestra como se haría una grabación a las 12:00:00 y otra a las 18:00:00:

 

#include <EEPROM.h>
#include <OneWire.h> 
#include <DallasTemperature.h>
#include <Time.h>
#include <DS1307RTC.h>

OneWire ourWire(2); // Definimos como salida para el sensor de temperaturas Dallas DS18B20 el pin 4.
DallasTemperature sensors(&ourWire);

//Ahora empezamos a declarar las variables que las iremos viendo a lo largo del código:

int contador = 2; // Aquí empezará a guardar los datos del sensor de temperatura
int comprobacion = 1; //Esta va a ser la posición 1 de la memoria EEPROM, donde se gurdará la posición por donde va contador para así tener constancia y que no se pise las grabaciones.
bool escritura = 0; //Nos ayudará a que no hayan varias grabaciones en un mismo segundo.

 
void setup ()
  {
    /* 
     *  Iniciamos nuestro sensor de temperatura:
     */
    sensors.begin();
    sensors.requestTemperatures();
      
  }

void loop ()
   {
 
     /*
      * Ahora lo que tendremos que hacer es inicializar el reloj DS1307 para poder utilizarlo
      * posteriormente.
      */
      
  tmElements_t tm;
  if (RTC.read(tm)) {}
 
 
  /*
   * Ya podemos ir a la parte importante, y es la de hacer nuestro guardado automático.
   * En primer lugar hacemos cuatro comparaciones de modo que si se cumplen entrarán dentro de
   * nuestro if.
   * Por lo tanto, sí son las 12:00:00 y escritura es igual a 0 (Escritura será igual a 0 porque 
   * está definida al inicio del sketch). De esta manera hará lo que hay dentro del if que explicaré 
   * a continuación.
   */
 
 
    
  if ((tm.Hour==12) && (tm.Minute==0) && (tm.Second==0) && (escritura==0))
 { 
       if(contador != EEPROM.read(comprobacion)) // Si cuando alimentamos arduino contador(Posicion 2 de memoria EEPROM) es diferente al valor de comprobación(posición 1 de memoria EEPROM).
        {
          contador= EEPROM.read(comprobacion)+1; //Entonces igualará la variable contador a comprobación y sumarará 1 para que así no pise lo que se ha ido guardando anteriormente.
          EEPROM.write(contador, 1111); // Después en la posición actual de contador pondrá 1111 para nosotros saber que ahí hemos tenido un error y así tener constancia.
          contador++; //Contador sumará 1
          EEPROM.write(comprobacion, contador); // Por último en comprobación escribirá la posición que ahora hay en contador.
        }
        
     
    
           
           EEPROM.write(contador, sensors.getTempCByIndex(0)); // En la posición contador guardará el valor del sensor
           contador++;//Aumentará 1 el contador, para que la siguiente grabación sea por la posición que vendría a continuación.
           EEPROM.write(comprobacion, contador);// Guardamos en comprobación (Posición 1 de la memoria EEPROM) la posición por la que va contador,
           //  de esta manera cuando haya una pérdida de corriente, podremos averiguarlo.
           
           escritura=1;//Ahora igualaremos escritura a 1 para evitar que en el segundo que se hace el guardado automático guarde varios datos.
    
    
 
 if (contador == 1024)//Si la variable contador llega a 1024 posiciones:
   {
    contador = 1010;// Contador se igualará a 1010 para que no se pisen las últimas grabaciones.
   }
 }
   if ((tm.Hour==12) && (tm.Minute==1) && (tm.Second==0)) //Cuando pase un minutos entrarará aqui y hará lo siguiente:
    { 
     escritura=0; // Volverá a igualar escritura a 0, de tal manera que cuando lleguen las 18:00:00 que es cuando queremos que haga la siguiente grabación, puede hacerlo con normalidad.
    }

     
  if ((tm.Hour==18) && (tm.Minute==0) && (tm.Second==0) && (escritura==0)) // Aquí hará exactamente lo mismo que antes pero a las 18:00:00.
  {
      if(contador != EEPROM.read(comprobacion)) // Si cuando alimentamos arduino contador(Posicion 2 de memoria EEPROM) es diferente al valor de comprobación(posición 1 de memoria EEPROM).
        {
          contador= EEPROM.read(comprobacion)+1; //Entonces igualará la variable contador a comprobación y sumarará 1 para que así no pise lo que se ha ido guardando anteriormente.
          EEPROM.write(contador, 1111);// Después en la posición actual de contador pondrá 1111 para nosotros saber que ahí hemos tenido un error y así tener constancia.
          contador++; //Contador sumará 1
          EEPROM.write(comprobacion, contador); // Por último en comprobación escribirá la posición que ahora hay en contador.
        }
        
     
    
           
           EEPROM.write(contador, sensors.getTempCByIndex(0));
           contador++;          
           EEPROM.write(comprobacion, contador);   
           
           escritura=1;//Ahora igualaremos escritura a 1 para evitar que en el segundo que se hace el guardado automático guarde varios datos.
    
              
           EEPROM.write(contador, sensors.getTempCByIndex(0)); // En la posición contador guardará el valor del sensor
           contador++;//Aumentará 1 el contador, para que la siguiente grabación sea por la posición que vendría a continuación.
           EEPROM.write(comprobacion, contador);// Guardamos en comprobación (Posición 1 de la memoria EEPROM) la posición por la que va contador,
           //  de esta manera cuando haya una pérdida de corriente, podremos averiguarlo.
           
           escritura=1;//Ahora igualaremos escritura a 1 para evitar que en el segundo que se hace el guardado automático guarde varios datos.
    
    
 
 
    if (contador == 1024)//Si la variable contador llega a 1024 posiciones:
   {
    contador = 1010;// Contador se igualará a 1010 para que no se pisen las últimas grabaciones.
   }
 }
   if ((tm.Hour==12) && (tm.Minute==1) && (tm.Second==0)) //Cuando pase un minutos entrarará aqui y hará lo siguiente:
    { 
     escritura=0; // Volverá a igualar escritura a 0, de tal manera que cuando lleguen las 18:00:00 que es cuando queremos que haga la siguiente grabación, puede hacerlo con normalidad.
    }

   }

Para terminar este artículo me gustaría adjuntar un esquema de conexiones por si os sirve de ayuda, y es el siguiente:

 

esquema

 



Técnico medio y superior en telecomunicaciones e informática.