O projeto utiliza a biblioteca Time, LCD por I2C e botões para alterar data e hora.

Vamos ao circuito:

Os botões servem para incrementar a hora, minuto, dia, mês e ano. O potenciômetro controla o contraste do LCD 16x2. 

A programação TimeSerial foi modificada e está mostrada abaixo:


#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits
#define TIME_REQUEST 7 // ASCII bell character requests a time sync message
LiquidCrystal_I2C lcd(56,16,2);   //If 
long previousmillis=0;
int hr=0;
int minut=0;
int dia=0;
int mes=0;
int ano=0;
int count=0;

void setup() {
lcd.init();
lcd.backlight();
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600);
Serial.println("Waiting for sync message");
lcd.print("Waiting");
lcd.setCursor(0,1);
lcd.print("for sync message");
setTime(0,0,0,1,1,0);
}

void loop(){

if(Serial.available() )
{
processSyncMessage();
}


if((digitalRead(7)==HIGH))     //Change button
{
count=count+1;
Serial.println("OK");
if(count>1)
{
count=0;
}
}
if((digitalRead(3)==HIGH) && count==1)  //Hour button
{
hr=3600;
adjustTime(hr);
}
if((digitalRead(2)==HIGH) && count==1)   //Minute button
{
minut=60;
adjustTime(minut);
}
if((digitalRead(6)==HIGH) && count==1)   //Day Button
{
dia++;
if(dia+day()>31)
{
dia=1-day();
}
}
if((digitalRead(5)==HIGH) && count==1)   //Month button
{
mes++;
if(mes+month()>12)
{
mes=1-month();
}
}
if((digitalRead(4)==HIGH) && count==1)    //Year Button
{
ano++;

}

if(timeStatus()!= timeNotSet)
{
digitalWrite(13,timeStatus() == timeSet); // on if synced, off if needs refresh
digitalClockDisplay();
}
delay(1000);

}

void digitalClockDisplay(){
// digital clock display of the time
lcd.clear();
lcd.print("Hora: ");
lcd.print(hour());
Serial.print(hour());
printDigits(minute());
printDigits(second());
lcd.setCursor(0,1);
Serial.print(" ");
Serial.print(dia+day());
lcd.print("Data: ");
lcd.print(dia+day());
lcd.print(".");
Serial.print(" ");
Serial.print(mes+month());
lcd.print(mes+month());
lcd.print(".");
Serial.print(" ");
Serial.print(ano+year());
lcd.print(ano+year());
Serial.println();
}

void printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
Serial.print(":");
lcd.print(":");
if(digits < 10){
Serial.print('0');
lcd.print("0");
}
Serial.print(digits);
lcd.print(digits);
}

void processSyncMessage() {
// if time sync available from serial port, update time and return true
while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits
char c = Serial.read() ;
Serial.print(c);
if( c == TIME_HEADER ) {
time_t pctime = 0;
for(int i=0; i < TIME_MSG_LEN -1; i++){
c = Serial.read();
if( c >= '0' && c <= '9'){
pctime = (10 * pctime) + (c - '0') ; // convert digits to a number
}
}
setTime(pctime); // Sync Arduino clock to the time received on the serial port
}
}
}

time_t requestSync()
{
Serial.write(TIME_REQUEST);
return 0; // the time will be sent later in response to serial mesg
}

Adicionamos os botões e a biblioteca LCD 16x2 por I2C. Para alterar a hora, por exemplo, é necessário apertar o botão de mudança (localizado no pino digital 7). E depois apertar o botão da hora (localizado no pino digital 3). Ao apertar o botão, incrementará a hora.

Cuidado! Neste projeto não estamos utilizando o RTC (Real Time Clock)! Se o Arduino desligar, a configuração será perdida!

E é isso!! Esperamos que tenha gostado!! Caso tenha dúvidas, poste aqui neste blog! Para sugestões de tutoriais, clique aqui! Para ver outros tutoriais e projetos desenvolvidos pela equipe LdG e por outros garagistas, clique aqui e aqui, respectivamente! Até a próxima!

Referências:

http://arduino.cc/playground/Code/Time

http://arduino.cc/en/Tutorial/Button

http://arduino.cc/playground/Code/LCDi2c

http://labdegaragem.com/profiles/blogs/tutorial-sobre-pcf8574-e-com...

Exibições: 67016

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Allisson Henrique em 21 novembro 2012 às 10:07

amigo estou utilizando seu projeto acima, e ocorreu uma falha pois estou utilizando um lcd 20x4 dmc20481 controlados hd44780 mas sai tudo embaralhado.. sera que poderia me ajudar!!

meu projeto e diferente.. estou fazendo um contador com reset atravez do horario determinado e estou uzando o pcf8574P, coloquei o display 1602a e ele funcionou mas e muito pequeno para mostrar todas as infomaçoes que preciso.

acho que pode ser algum problema com a biblioteca lcdliquid_I2C

alguem pode me ajudar???

Comentário de jorge rocha em 25 julho 2012 às 17:29
Comentário de Marcos Vinicius candido em 24 julho 2012 às 19:09
Teria como me mandar a lista de componentes?marvinicandido@gmail.com
Comentário de Murilo Fujita em 24 julho 2012 às 13:52

Galera,

queria discutir como modificar para atender o seguinte propósito:com a intenção de saber quanto tempo dedico-me a uma certa atividade, eu gostaria de um contador de tempo. Ao apertar um botão inicia uma contagem crescente. Ao apertar o botão (pode ser o mesmo ou outro) pára a contagem em caso de uma interrupção na minha tarefa. Ao apertar o botão, a contagem continua de onde parou. Quem topa? Abraços!

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço