desktop

Arduino UNO + RTC

Hola a todos:

Estoy trabajando con un Arduino UNO y su Real Time Clock (RTC) el reloj me funciona bien pero la impresión de la hora no me sale como esperaba con los 0 cuando es por ejemplo las 09:06:07

PROBLEMA: La hora debería salir como 09:06:07 pero en vez de eso me sale 9:6:7
Trate de modificar el programa en el:

rtc.adjust(DateTime(2015,2,24,09,06,07)); (para ajustar la hora)

Pero me sigue saliendo los valores como 9:6:7



Estos es lo que tengo:

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

void setup() {
Serial.begin(115200);
#ifdef AVR
Wire.begin();
#else
Wire1.begin();
#endif
rtc.begin();

if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
rtc.adjust(DateTime(__DATE__, __TIME__));
}
}

void loop () {

DateTime now = rtc.now();

Serial.print(now.day(), DEC);
Serial.print('/');
//Imprimimos el mes
Serial.print(now.month(), DEC);
Serial.print('/');
//Imprimimos el año
Serial.print(now.year(), DEC);
Serial.print(' ');
//Imprimimos la hora
Serial.print(now.hour(), DEC);
Serial.print('0:');
//Imprimimos los minutos
Serial.print(now.minute(), DEC);
Serial.print('0:');
//Imprimimos los segundos
Serial.print(now.second(), DEC);
Serial.println('0');

Serial.println();
delay(1000);
}

Bueno aqui les dejo el link de las librerias que use:

www github com/adafruit/RTClib(le ponen los puntos en los espacios ya que por mi rango no puedo postear links :( )

Las cuales son:
datecalc
ds1307
ds1307SqwPin
ds1307nvram

Gracias de antemano
 
Hola, compañeros del foro. Quiero desarrollar un proyecto tipo reloj, con el arduino uno, el Tiny_RTC DS1307 y un LCD 16x2. Básicamente necesito que me orienten en:

1. Que librería usar, pues he visto muchas

2. Como puedo configurar la hora del RTC tal como lo haria en un reloj digital mediante tres pulsadores, uno aumenta la hora de 00 a 23 y vuelve otra vez, el otro los minutos de 00 a 59 y vuelve otra vez y el tercer botón confirma que ya hicimos la respectiva configuración.

3. Configurar una alarmas fija todos los días del rtc tal como configuramos la hora del punto 2. Los mismos tres pulsadores y todo lo mismo.

Adjunto el código que llevo, gracias de antemano por sus valiosos aportes.

Código:
#include <LiquidCrystal.h>
#define SSR 2
#define MENU 3
#define BOTON_1 4
#define BOTON_2 5
#define BOTON_3 6
#define ENTER 7
int flag_MENU, flag_BOTON_1, flag_BOTON_2, flag_BOTON_3, flag_ENTER, tamano;
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

void setup()
{
  pinMode(MENU, INPUT_PULLUP);
  pinMode(BOTON_1, INPUT_PULLUP);
  pinMode(BOTON_2, INPUT_PULLUP);
  pinMode(BOTON_3, INPUT_PULLUP);
  pinMode(ENTER, INPUT_PULLUP);
  lcd.begin(16, 2);
}

void loop ()
{
  lcd.setCursor(1, 0);
  lcd.print("HORA ACT: HH:MM"); // Aqui hora actual del RTC
  if (digitalRead(MENU)==LOW)   // Si entro al menu
  {
    delay (200);
    flag_MENU=0;
    lcd.clear();
    while(flag_MENU==0)
    {
      lcd.setCursor(0, 0);
      lcd.print("1.Hora 2.Tamano");
      lcd.setCursor(0, 1);
      lcd.print("3.Porcion");
      if (digitalRead(BOTON_1)==LOW)
      {
        delay (200);
        flag_BOTON_1=0;
        lcd.clear();
        while(flag_BOTON_1==0)
        {
          // Aqui debo configurar la hora mediante los botones
          // BOTON_1 (Aumenta hora) BOTON_2 (Aumenta minutos)
          if (digitalRead(ENTER)==LOW) // Si preiono Enter es porque ya la configure la hora
          {
            delay (200);
            flag_BOTON_1=1;
            flag_MENU==1; // Salgo a la primera pantalla
            lcd.clear();
          }
        }
      }
      if (digitalRead(BOTON_2)==LOW)
      {
        delay (200);
        flag_BOTON_2=0;
        lcd.clear();
        while(flag_BOTON_2==0)
        {
          lcd.setCursor(0, 0);
          lcd.print("1.Pequeno 2.Med");
          lcd.setCursor(0, 1);
          lcd.print("3.Grande");
          if (digitalRead(BOTON_1)==LOW)
          {
            delay (200);
            tamano=1;
            flag_BOTON_2=1;
            flag_MENU=1;
            lcd.clear();
          }
          if (digitalRead(BOTON_2)==LOW)
          {
            delay (200);
            tamano=2;
            flag_BOTON_2=1;
            flag_MENU=1;
            lcd.clear();
          }
          if (digitalRead(BOTON_3)==LOW)
          {
            delay (200);
            tamano=3;
            flag_BOTON_2=1;
            flag_MENU=1;
            lcd.clear();
          }
        }
      }
      if (digitalRead(BOTON_3)==LOW)
        {
        delay (200);
        flag_BOTON_3=0;
        lcd.clear();
        lcd.print("AGREGAR ALARMA: HH:MM");
        while(flag_BOTON_3==0)
        {
        // aqui configuraria mi alarma que se repite siempre a dicha hora
        // BOTON_1 sube horas, BOTON_2 sube minutos
        // boton enter confima la hora
        }
        }
      if (digitalRead(MENU)==LOW) {
        delay (200);
        flag_MENU=1;
        lcd.clear();
      }  
    }
  }
}
 
hijoles es el problema de buscar una libreria funcional, la misma hoja de datos dice que comandos sirven para cargar los datos al reloj e incluso usar los bancos de RAM que posee.

lo que yo haria seria

hacer el programa principar que cargue y cambie los datos sean horas, minutos y segundos dentro de una variable que use el microcontrolador.

cuando estemos seguros de que la hora es la que queremos ahora si ese registro va directo al DS1307.
 
2. ¿Cómo puedo configurar la hora del RTC tal como lo haría en un reloj digital mediante tres pulsadores?
Uno aumenta la hora de 00 a 23 y vuelve otra vez, el otro los minutos de 00 a 59 y vuelve otra vez y el tercer botón confirma que ya hicimos la respectiva configuración.
Yo lo hice con tres pulsadores pero con PIC y en C de CCS.

La base del programa te puede servir:
PHP:
      if(!input(pin_sel))
      {
         selec++;
         flag_sel = 1;
         
         if(selec > 7) selec = 1;
         printf(lcd_putc,"\fOPCION No. %02u",selec);
         
         switch (selec)
         {
            case 1:
               lcd_gotoxy(1,2);
               lcd_putc("HORAS");
               break;
            case 2:
               lcd_gotoxy(1,2);
               lcd_putc("MINUTOS");
               break;
            case 3:
               lcd_gotoxy(1,2);
               lcd_putc("SEGUNDOS");
               break;
            case 4:
               lcd_gotoxy(1,2);
               lcd_putc("DIA DE LA SEMANA");
               break;
            case 5:
               lcd_gotoxy(1,2);
               lcd_putc("DIA DEL MES");
               break;
            case 6:
               lcd_gotoxy(1,2);
               lcd_putc("MES");
               break;
            case 7:
               lcd_gotoxy(1,2);
               lcd_putc("AÑO");
         }
         
         while(!input(pin_sel));
         delay_ms(100);
         lcd_putc("\f");
         flag_sel = 0;
      }
         
      switch (selec)
      {
         case 1:  // Modificar las horas.
            if(!input(pin_dec))
            {  // Decremento de las horas.
               hrs--;
               delay_ms(250);
               if(hrs > 23) hrs = 23; 
               escribir_ds1307();
               leer_ds1307();
            }
            
            if(!input(pin_inc))
            {  // Incremento de las horas.
               hrs++;
               delay_ms(250);
               if(hrs > 23) hrs = 0; 
               escribir_ds1307();
               leer_ds1307();
            }
               break;
         case 2:  // Modificar los minutos.
            if(!input(pin_dec))
            {  // Decremento de los minutos.
               min--;
               delay_ms(250);
               if(min > 59) min = 59; 
               escribir_ds1307();
               leer_ds1307();
            }

            if(!input(pin_inc))
            {  // Incremento de los minutos.
               min++;
               delay_ms(250);
               if(min > 59) min = 0; 
               escribir_ds1307();
               leer_ds1307();
            }
            break;
         case 3:  // Modificar los segundos:
            if(!input(pin_dec) || !input(pin_inc))
            {  // Cualquiera de esos pulsadores pondrá los segundos en 0.
               sec = 0;
               escribir_ds1307();
               leer_ds1307();
            }
            break;
         case 4:  // Modificar el día de la semana.
            if(!input(pin_dec))
            {  // Decremento del día de la semana.
               dow--;
               delay_ms(250);
               if(dow > 6) dow = 6; 
               escribir_ds1307();
               leer_ds1307();
            }

            if(!input(pin_inc))
            {  // Incremento del día de la semana.
               dow++;
               delay_ms(250);
               if(dow > 6) dow = 0; 
               escribir_ds1307();
               leer_ds1307();
            }
            break;
         case 5:  // Modificar el día del mes.
            if(!input(pin_dec))
            {  // Decremento del día del mes.
               day--;
               delay_ms(250);
               if(day < 1) day = 31; 
               escribir_ds1307();
               leer_ds1307();
            }

            if(!input(pin_inc))
            {  // Incremento del día del mes.
               day++;
               delay_ms(250);
               if(day > 31) day = 1; 
               escribir_ds1307();
               leer_ds1307();
            }
            break;
         case 6:  // Modificar el mes.
            if(!input(pin_dec))
            {  // Decremento del mes.
               month--;
               delay_ms(250);
               if(month < 1) month = 12; 
               escribir_ds1307();
               leer_ds1307();
            }

            if(!input(pin_inc))
            {  // Incremento del mes.
               month++;
               delay_ms(250);
               if(month > 12) month = 1; 
               escribir_ds1307();
               leer_ds1307();
            }
            break;
         case 7:  // Modificar el año.
            if(!input(pin_dec))
            {  // Decremento del año.
               year--;
               delay_ms(250);
               if(year > 100) year = 100; 
               escribir_ds1307();
               leer_ds1307();
            }

            if(!input(pin_inc))
            {  // Incremento del año.
               year++;
               delay_ms(250);
               if(year > 100) year = 0; 
               escribir_ds1307();
               leer_ds1307();
            }
      }
Usa retardos por simplicidad, pero como el RTC está basado en un DS1307, tiene su propio reloj, y el muestreo está basado en una interrupción externa, el uso de retardos para antirrebote, no afecta para nada.

PD: También usé el módulo; Tyny RTC I2C
Y aprovechando el tema, lo tuve que modificar porque no funcionaba el oscilador.
Coloqué 1 capacitor de 22 pF. al cristal de 32,768 Hz. en cada pin y hacia tierra.

La letra "Ñ" no se muestra como debe de ser en el display, pero se repara por código de carácter personalizado.
 
Atrás
Arriba