Relógio LCD com CI DS1307

TELA1_apresentacao_lcd

Este projeto vem mostrar como fazer um relógio digital a partir do CI DS1307. É usado um LCD para mostrar as horas e o dia e também alguns botões de pressão onde podemos ajustar a data e hora.

O CI DS1307 é um Real Time Clock, ou seja, um RTC é um dispositivo que dá horas contando o tempo! Todos nós os temos em casa, quer seja nos relógios digitais, na motherboard dos nossos computadores, nos telemoveis, etc.

 

Comunica com base na interface i2c e convém ser usado também com uma pequena bateria de 3V para o manter a funcionar quando o Arduino não o está a alimentar.

Material:

1 CI DS1307;
1 pilha/bateria CR2032 de 3V;
6 resistências de 10k;
3 botões de pressão;
1 trimpot de 10k;
1 Display LCD 16×2;
1 cristal de 32,286 kHz;

Montagem:

Relogio-RTC-DS1307

O circuito possui três botões de pressão, onde um ajusta o que vai ser modificado no relógio (dia, mês, ano, hora, minuto ou segundo) e os outros dois servem para aumentar ou diminuir o valor selecionado.

Código Arduino:

#include <LiquidCrystal.h>
#include <DS1307RTC.h>
#include <Wire.h>
#include <Timel.h>

#define clockSet 7
#define clockUp 9
#define clockDown 8

#define stClockRunning 0
#define stSetDay 1
#define stSetMonth 2
#define stSetYear 3
#define stSetHour 4
#define stSetMinute 5
#define stSetSecond 6

int stat = stClockRunning;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void Print(int number) {
lcd.print(number/10);
lcd.print(number%10);
}

void printTime() {
lcd.SetCursor(4,1); Print(hour());
lcd.print(“:”); Print(minute());
lcd.print(“:”); Print(second());
lcd.SetCursor(3,0); Print(day());
lcd.print(“/”); Print(month());
lcd.print(“/”); Print(year());
lcd.SetCursor(0,0);
lcd.noCursor();
lcd.noBlink();

if (stat != stClockRunning)
lcd.print(“*”);
else
lcd.print(” “);
simbolorelogio();
lcd.setCursor(1,1);
lcd.write(3);
switch(stat)
{
case stSetDay:
lcd.setCursor(1,0);
lcd.print(“d “);
lcd.setCursor(4,0);
lcd.cursor();
lcd.blink();
break;
case stSetMonth:
lcd.setCursor(1,0);
lcd.print(“m “);
lcd.setCursor(7,0);
lcd.cursor();
lcd.blink();
break;
case stSetYear:
lcd.setCursor(1,0);
lcd.print(“a “);
lcd.setCursor(12,0);
lcd.cursor();
lcd.blink();
break;
case stSetHour:
lcd.setCursor(1,0);
lcd.print(“h “);
lcd.setCursor(5,1);
lcd.cursor();
lcd.blink();
break;
case stSetMinute:
lcd.setCursor(1,0);
lcd.print(“M “);
lcd.setCursor(8,1);
lcd.cursor();
lcd.blink();
break;
case stSetSecond:
lcd.setCursor(1,0);
lcd.print(“s “);
lcd.setCursor(11,1);
lcd.cursor();
lcd.blink();
break;
}
}

int readPinSwitch(int pin, int threshold)
{
if (digitalRead(pin))
{
unsigned long tt = millis();
while (digitalRead(pin));
if ((millis() – tt) > threshold)
return 1;
else
return 0;
}
else
return 0;
}

int readPin(int pin, int threshold)
{
if (digitalRead(pin))
{
unsigned long tt = millis();
while ((digitalRead(pin) && (millis() – tt) <= threshold));
if (digitalRead(pin))
return 1;
else
return 0;
}
else
return 0;
}

int getStat()
{
if (readPinSwitch(clockSet,300))
if (stat == stSetSecond)
return stClockRunning;
else
return stat+1;
else
return stat;
}

void setRTCTime(int hour, int minute, int second, int day, int month, int year)
{
setTime(hour,minute,second,day,month,year);
time_t t = now();
RTC.set(t);
}

void simbolorelogio()
{
byte relogio[8] = {
B00000,
B01110,
B10101,
B10111,
B10001,
B01110,
B00000,
B00000};
lcd.createChar(3, relogio);
}

void setup()
{
pinMode(clockUp,INPUT);
pinMode(clockDown,INPUT);
pinMode(clockSet,INPUT);

lcd.begin(16, 2);
setSyncProvider(RTC.get);

if(timeStatus()!= timeSet)
{
lcd.setCursor(0,0);
lcd.print(“Erro do RTC:”);
lcd.setCursor(0,1);
lcd.print(“Ajuste o Relogio”);
delay(3000);
lcd.clear();
}
}

int oldStat = stat;
unsigned long t=millis();

void loop()
{
int value = 0;
printTime();
delay(100);
stat=getStat();
if (stat != oldStat)
{
t=millis();
oldStat = stat;
}
else
if ((stat != stClockRunning) && ((millis() – t) > 30000)) //tempo em milisegundos que o ajuste do relógio ficará disponível para ser alterado
stat=stClockRunning;
switch(stat)
{
case stClockRunning:
break;
case stSetDay:
value=day();

while(readPin(clockUp,200))
{
value++;
if (value > 31)
value=1;
setRTCTime(hour(),minute(),second(),value,month(),year());
printTime();
}

while(readPin(clockDown,200))
{
value–;
if (value < 1)
value=31;
setRTCTime(hour(),minute(),second(),value,month(),year());
printTime();
}
break;

case stSetMonth:
value=month();
while(readPin(clockUp,200))
{
value++;
if (value > 12)
value=1;
setRTCTime(hour(),minute(),second(),day(),value,year());
printTime();
}
while(readPin(clockDown,200))
{
value–;
if (value < 1)
value=12;
setRTCTime(hour(),minute(),second(),day(),value,year());
printTime();
}
break;
case stSetYear:
value=year();
while(readPin(clockUp,200))
{
value++;
if (value > 2050)
value=2000;
setRTCTime(hour(),minute(),second(),day(),month(),value);
printTime();
}

while(readPin(clockDown,200))
{
value–;
if (value < 2000)
value=2050;
setRTCTime(hour(),minute(),second(),day(),month(),value);
printTime();
}
break;
case stSetHour:
value=hour();
while(readPin(clockUp,200))
{
value++;
if (value > 23)

value=0;
setRTCTime(value,minute(),second(),day(),month(),year());
printTime();
}
while(readPin(clockDown,200))
{
value–;
if (value < 1)
value=24;
setRTCTime(value,minute(),second(),day(),month(),year());
printTime();
}

break;

case stSetMinute:
value=minute();

while(readPin(clockUp,200))
{
value++;
if (value > 59)
value=0;
setRTCTime(hour(),value,second(),day(),month(),year());
printTime();
}
while(readPin(clockDown,200))

{

value–;
if (value < 0)
value=59;
setRTCTime(hour(),value,second(),day(),month(),year());
printTime();
}
break;
case stSetSecond:
value=minute();
while(readPin(clockUp,200))
{

value++;

if (value > 59)
value=0;
setRTCTime(hour(),minute(),value,day(),month(),year());
printTime();

}
while(readPin(clockDown,200))

{
value–;
if (value < 0)
value=59;
setRTCTime(hour(),minute(),value,day(),month(),year());
printTime();

}
}
}

Agora pessoal, é só pegar no vosso arduino, dar uma vista de olhos a este tutorial e começar a desenvolver o vosso projecto! Se ainda não tiveres o material necessário para o projecto, encontra-o aqui na nossa loja Boxelectronica.

 

Comentários no Facebook