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.

Exibições: 1311

Responder esta

Respostas a este tópico

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.

Ca
Carlos procurei e não encontrei estou achando muito estranho não ter um assim configuravel

Comece por AQUI

Abs,

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço