Esta é a simulação usando 0 Proteus, de um programa para implementar um despertador baseado em um Arduíno UNO e um RTC DS1307.
Possui duas linhas if para determinar os horários de alarmes desejados.
Compartilhei documentação e programa no meu Google Drive para todos os que se interessarem.
Link vídeo:
https://www.youtube.com/watch?v=uBk6ES9nbkg&feature=youtu.be
Link para baixar o programa e documentação:
https://drive.google.com/file/d/0B71RPmv45vX6Ny1SMkhBZkRVQ0E/view?u...
Abs.
Tags:
Boa noite Argel!
Fiz a mudança mas não está modificando no LCD
/* Programa: Relogio Tempo Real com alarme.
Hardware: Arduino Uno Shield RTC Grove.
Preaparado para display 20X4 mas pode ser usado com display 16X2
Criado por Eng. Carlos kwiek - Rio de Janeiro - RJ - Brasil
02 de Agosto de 2015 - e-mail carloskwiek1@hotmail.com
O codigo é livre para uso e modificação, seguindo as diretivas de
software open source.
Use por sua conta e risco.
*/
#include "Wire.h"
#include <LiquidCrystal.h>
#define DS1307_ADDRESS 0x68
// Inicializa o LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
byte zero = 0x00;
int buzzer = 13;
void setup()
{
pinMode (buzzer, OUTPUT);
// Define o LCD com 16 colunas e 2 linhas
lcd.begin(16, 4);
Wire.begin();
Serial.begin(9600);
// A linha abaixo pode ser retirada apos setar a data e hora
// SelecionaDataeHora();
}
void loop()
{
Mostrarelogio();
delay(1000);
}
void SelecionaDataeHora() // Seta a data e a hora do DS1307
{
byte segundos = 01; // Valores de 0 a 59
byte minutos = 30; // Valores de 0 a 59
byte horas = 19; // Valores de 0 a 23
byte diadasemana = 0; // Valores de 0 a 6 (0=Domingo, 1 = Segunda...)
byte diadomes = 22; // Valores de 1 a 31
byte mes = 11; // Valores de 1 a 12
byte ano = 15; // Valores de 0 a 99
Wire.beginTransmission(DS1307_ADDRESS);
// Stop no CI para que o mesmo possa receber os dados
Wire.write(zero);
// As linhas abaixo escrevem no CI os valores de
// data e hora que foram colocados nas variaveis acima
Wire.write(ConverteParaBCD(segundos));
Wire.write(ConverteParaBCD(minutos));
Wire.write(ConverteParaBCD(horas));
Wire.write(ConverteParaBCD(diadasemana));
Wire.write(ConverteParaBCD(diadomes));
Wire.write(ConverteParaBCD(mes));
Wire.write(ConverteParaBCD(ano));
Wire.write(zero); //Start no CI
Wire.endTransmission();
}
byte ConverteParaBCD(byte val)
{
// Converte o número de decimal para BCD
return ( (val/10*16) + (val%10) );
}
byte ConverteparaDecimal(byte val)
{
// Converte de BCD para decimal
return ( (val/16*10) + (val%16) );
}
void Mostrarelogio()
{
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int segundos = ConverteparaDecimal(Wire.read());
int minutos = ConverteparaDecimal(Wire.read());
int horas = ConverteparaDecimal(Wire.read() & 0b111111);
//int diadasemana = ConverteparaDecimal(Wire.read());
int diadomes = ConverteparaDecimal(Wire.read());
int mes = ConverteparaDecimal(Wire.read());
int ano = ConverteparaDecimal(Wire.read());
// Imprime mensagem na primeira linha do display
lcd.setCursor(0,0);
lcd.print("DATA: ");
// Mostra a hora atual no display
lcd.setCursor(6, 1);
if (horas < 10)
{
lcd.print("0");
}
lcd.print(horas);
lcd.print(":");
if (minutos < 10)
{
lcd.print("0");
}
lcd.print(minutos);
lcd.print(":");
if (segundos < 10)
{
lcd.print("0");
}
lcd.print(segundos);
// Mostra a HORA atual no display
lcd.setCursor(0,1);
lcd.print("HORA: ");
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(6,0);
if (diadomes < 10)
{
lcd.print("0");
}
lcd.print(diadomes);
lcd.print(".");
if (mes < 10)
{
lcd.print("0");
}
lcd.print(mes);
lcd.print(".");
lcd.print(ano);
// Definicao do alarme.
if (horas == 06 && minutos == 00 && segundos == 0)//Define a hora de tocar o alarme por 1o segundos
{
digitalWrite (buzzer, HIGH);// Eleva tensao pino 13 para 5V
delay (10000);// Atrasa 50ms
}
{
digitalWrite (buzzer, LOW); //Abaixa tensao pino 13 para 0V
}
if (horas == 18 && minutos == 00 && segundos == 00)//Define a hora de tocar o alarme por 10 segundos
{
digitalWrite (buzzer, HIGH);// Eleva tensao pino 13 para 5V
delay (10000);// Atrasa 50ms
}
{
digitalWrite (buzzer, LOW); //Abaixa tensao pino 13 para 0V
}
}
Por que esta sendo usado #define DS1307_ADDRESS 0x68 e não a biblioteca?
No seu projeto, você usou o DS1307 ou ds3231? no meu caso estou com o ds3231, e ele não muda a data e nem o horário:
DATA: 01/01/01
HORA: 01:28:37
Qualquer um dos dois funciona, basta ter as bibliotecas certas para cada RTC.
Abs.
E outra, tenho que mudar o pino io 8 pq estou usando um modula lcd que ja usa esse pino.
Mude os pinos do LCD para por exemplo 12, 11, 5,4,3,2 e mude no código para os mesmos pinos.
Abs.
Olá,
a hora não vai modificar no LCD, a hora que o LCD mostra é a atual, que precisa ser ajustada uma vez somente, sempre que sua pilha do RTC esteja com tensão suficiente para manter a hora preservada, se você mudar a hora como o colega Argel indicou, a hora no display vai ser a atual, mas na hora, minutos, e segundos que você determinou, vai tocar um buzzer a acender um Led, de acordo a o que você tenha colocado na porta, veja no video que a hora coincide com o relógio do meu laptop, sem mudar nada, apenas mudo a hora despertar.
Estou em Angra dos Reis, moro no RJ, volto somente amanha a noite e não estou muito dedicado a internet aqui, note que é um exemplo didático apenas, modifique como melhor lhe convir se quiser, espero ter ajudado.
Veja este video no meu canal https://www.youtube.com/watch?v=uBk6ES9nbkg
Abs.
carlos boa noite
e possível colocar essa programação de hora e dia da semana de em forma de menu no display se e possível como que eu faço.
Guilherme,
Sim é possível, mas não tenho o tempo suficiente para fazer isso, procure aqui ou no Google, deve ter vários exemplos.
Boa sorte!
Abs.
Comece por AQUI
Abs,
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por