Algorítimo para relógio com Atmega328 (ARDUÍNO) Atualizado 08/11/2018
//calendario e relogio do sistema com Atmega328
//pedroluand@gmail.com
//versão: 1.5 //usando millis
//versao: 1.4 //salvando clock na eeprom
//versao: 27/08/2018
//versao: 1.3
//versao: 291217
#include <Wire.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0X3F,2,1,0,4,5,6,7,3,POSITIVE);
//configuracoes do relogio e do calendario
long previousMillis = 0;
long interval = 1000;
int hh = 18;
int mm = 0;
int ss = 0;
int dd = 8;
int ms = 11;
int aa = 2018;
int se = 5; // dia da semana 1 = domingo
int bissexto = 2020; //proximo ano bisexto
int set = 0;
//configuracoes horario de verao, modificar com atenção
int hv = 0; //set hv 1= hv ligado 0= hv desligado
int hvh = 23;
int hvm = 59;
int hvdi = 4; //dia hv
int hvmsi = 11; //mes hv
int hvai = 2018; //ano hv
int hvdf = 16; //dia hv
int hvmsf = 2; //mes hv
int hvaf = 2019; //ano hv
//configuracao do alarme
int ha = 0;
int ma = 0;
int al = 0; //1= alarme ligado, 0= alarme desligado
int bp = 0; //1= beep ligado, 0= beep desligado
//configuracoes globais
int memoria = 0; //memoria eeprom clock
int cki; //valor referencia do ajuste de clock interno eeprom
int ck = 872; //nao modificar clock interno usado pelo sistema
int p = 100; //pausa do pulso clock externo
int d = 900; //duracao do pulso clock externo
#define adj2 13 //ajuste clock-
#define ext 12 //entrada clock externo 12
#define adj1 11 //ajuste clock+
#define botao1 10 //ajusta dia da semana e ano
#define botao2 9 //ajuste de minutos e minutos alarme e mes
#define botao3 8 //ajuste de horas e horas alarme e dia
#define beep 7 //buzzer
#define mode 2 //mode relogio e alarme
#define alarme tone(7,1000,200); //beep de hora certa e alarme
void setup(){
pinMode(mode,INPUT_PULLUP);
pinMode(botao1,INPUT_PULLUP);
pinMode(botao2,INPUT_PULLUP);
pinMode(botao3,INPUT_PULLUP);
pinMode(ext,INPUT_PULLUP);
pinMode(beep,OUTPUT);
pinMode(adj1,OUTPUT);
pinMode(adj2,OUTPUT);
lcd.begin(20,4);
cki=EEPROM.read(memoria); //lê o valor para ck na eeprom
}
void loop(){
//clock usando millis
unsigned long currentMillis = millis();
//Intervalo de 1 segundo
if (currentMillis - previousMillis > interval){
previousMillis = currentMillis;
ss++;
int valor2=digitalRead(botao1);
if(valor2==LOW)
{
// noTone();
}
int valor3=digitalRead(mode);
if(valor3==LOW)
{
set+=1;
}
if(set==0) //tela inicial
{
display();
}
if(set==1) //menu semana
{
adjsemana();
}
if(set==2) //menu dia calendario
{
adjdia();
}
if(set==3) //menu dia calendario
{
adjmes();
}
if(set==4) //menu ano calendario
{
adjano();
}
if(set==5) //menu hora
{
adjhora();
}
if(set==6) //menu minuto
{
adjminuto();
}
if(set==7) //menu beep
{
beeps();
}
if(set==8) //menu hora alarme
{
adjhoraal();
}
if(set==9) //menu menu alarme
{
adjminutoal();
}
if(set==10) //menu beep alarme
{
beepal();
}
if(set==11) //menu inicio hv
{
iniciohv();
}
if(set==12) //menu fim hv
{
fimhv();
}
if(set==13) //menu ajustes extras
{
extras();
}
if(set==14) //menu ajustes clock
{
adjck();
}
if(set==15) //loop do menu
{
set=0;
display();
}
if(hh==ha && mm==ma && ss>=0) //horario do alarme
{
if(al==1)
{
alarme;
}}
if(dd==hvdi && ms==hvmsi && aa==hvai && hh==hvh && mm==hvm && ss>=59 && hv==1) //inicio hv
{
hh+=1;
hv=0;
}
if(dd==hvdf && ms==hvmsf && aa==hvaf && hh==hvh && mm==hvm && ss>=59 && hv==0) //fim hv
{
hh-=1;
// dd-=1;
// se-=1;
hv=1;
}
if(bp==2) //liga/desliga beep
{
bp=0;
//
}
if(al==2) //liga/desliga alarme
{
al=0;
//
}
if (ha == 24) //zera o contador de hora alarme
{
ha=0;
//
}
if (ma == 60) //zera o contador de minutos alarme
{
ma=0;
//
}
if (hvmsf== 13) //zera o contador de hvmsf
{
hvmsf=1;
//
}
if (hvmsi == 13) //zera o contador de hvmsi
{
hvmsi=1;
//
}
if (ss == 60) //zera o contador de segundos
{
ss=0;
//
mm+=1;
}
if (mm == 60) //zera o contador de minutos
{
mm=0;
//
hh+=1;
}
if (hh == 25) //correcao horario de verao
{
hh=1;
dd+=1;
se+=1;
}
if (hh == 24) //formato de 24 horas
{
hh=0;
dd+=1;
se+=1;
}
if(ms==0) //ms decrescente
{
ms=12;
}
if(ha==-1) //hora alarme decrescente
{
ha=23;
}
if(ma==-1) //minuto alarme decrescente
{
ma=59;
}
if(mm==-1) //minuto decrescente
{
mm=59;
}
if(hh==-1) //hora decrescente
{
hh=23;
}
if (se == 8) //zera o contador de dias da semana
{
se=1;
//
}
if (dd == 32 && ms == 1) //zera o contador de dias de janeiro
{
dd=1;
//
ms+=1;
}
if(dd==0 && ms==1) //janeiro decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 1) //zera o contador de dias de janeiro hvdi
{
hvdi=1;
//
}
if (hvdf == 32 && hvmsf == 1) //zera o contador de dias de janeiro hvdf
{
hvdf=1;
//
}
if(aa == bissexto && ms == 3 && dd ==1) //calcula o proximo ano bissexto no dia 1 de marco
{
bissexto+=4;
//
}
if(aa == bissexto && dd == 30 && ms == 2) //zera o contador de dias de fevereiro bissexto
{
dd=1;
ms+=1;
}
if(aa == bissexto && dd==0 && ms==2) //fevereiro bissexto decrescente
{
dd=29;
}
if(dd==31 && ms==2)
{
dd=29;
}
if(aa != bissexto && dd == 29 && ms == 2) //zera o contador de dias de fevereiro normal
{
dd=1;
ms+=1;
}
if(dd==0 && ms==2) //fevereiro normal decrescente
{
dd=28;
}
if (hvdi == 29 && hvmsi == 2) //zera o contador de dias de fevereiro hvdi
{
hvdi=1;
}
if (hvdf == 29 && hvmsf == 2) //zera o contador de dias de fevereiro hvdf
{
hvdf=1;
}
if (hvdi == 30 && hvmsi == 2) //zera o contador de dias de fevereiro bissexto hvdi
{
hvdi=1;
}
if (hvdf == 30 && hvmsf == 2) //zera o contador de dias de fevereiro bissexto hvdf
{
hvdf=1;
}
if (dd == 32 && ms == 3) //zera o contador de dias de marco
{
dd=1;
ms+=1;
}
if(dd==0 && ms==3) //marco decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 3) //zera o contador de dias de marco hvdi
{
hvdi=1;
}
if (hvdf == 32 && hvmsf == 3) //zera o contador de dias de marco hvdf
{
hvdf=1;
}
if (dd == 31 && ms == 4) //zera o contador de dias de abril
{
dd=1;
ms+=1;
}
if(dd==0 && ms==4) //abril decrescente
{
dd=30;
}
if (hvdi == 31 && hvmsi == 4) //zera o contador de dias de abril hvdi
{
hvdi=1;
}
if (hvdf == 31 && hvmsf == 4) //zera o contador de dias de abril hvdf
{
hvdf=1;
}
if (dd == 32 && ms == 5) //zera o contador de dias de maio
{
dd=1;
ms+=1;
}
if(dd==0 && ms==5) //maio decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 5) //zera o contador de dias de maio hvdi
{
hvdi=1;
}
if (hvdf == 32 && hvmsf == 5) //zera o contador de dias de maio hvdf
{
hvdf=1;
}
if (dd == 31 && ms == 6) //zera o contador de dias de junho
{
dd=1;
ms+=1;
}
if(dd==0 && ms==6) //junho decrescente
{
dd=30;
}
if (hvdi == 31 && hvmsi == 6) //zera o contador de dias de junho hvdi
{
hvdi=1;
}
if (hvdf == 31 && hvmsf == 6) //zera o contador de dias de junho hvdf
{
hvdf=1;
}
if (dd == 32 && ms == 7) //zera o contador de dias de julho
{
dd=1;
ms+=1;
}
if(dd==0 && ms==7) //julho decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 7) //zera o contador de dias de julho hvdi
{
hvdi=1;
}
if (hvdf == 32 && hvmsf == 7) //zera o contador de dias de julho hvdf
{
hvdf=1;
}
if (dd == 32 && ms == 8) //zera o contador de dias de agosto
{
dd=1;
ms+=1;
}
if(dd==0 && ms==8) //agosto decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 8) //zera o contador de dias de agosto hvdi
{
hvdi=1;
}
if (hvdf == 32 && hvmsf == 8) //zera o contador de dias de agoso hvdf
{
hvdf=1;
}
if (dd == 31 && ms == 9) //zera o contador de dias de setembro
{
dd=1;
ms+=1;
}
if(dd==0 && ms==9) //setembro decrescente
{
dd=30;
}
if (hvdi == 31 && hvmsi == 9) //zera o contador de dias de setembro hvdi
{
hvdi=1;
}
if (hvdf == 31 && hvmsf == 9) //zera o contador de dias de setembro hvdf
{
hvdf=1;
}
if (dd == 32 && ms == 10) //zera o contador de dias de outubro
{
dd=1;
ms+=1;
}
if(dd==0 && ms==10) //outubro decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 10) //zera o contador de dias de outubro hvdi
{
hvdi=1;
}
if (hvdf == 32 && hvmsf == 10) //zera o contador de dias de outubro hvdf
{
hvdf=1;
}
if (dd == 31 && ms == 11) //zera o contador de dias de novembro
{
dd=1;
ms+=1;
}
if(dd==0 && ms==11) //novembro decrescente
{
dd=30;
}
if (hvdi == 31 && hvmsi == 11) //zera o contador de dias de novembro hvdi
{
hvdi=1;
}
if (hvdf == 31 && hvmsf == 11) //zera o contador de dias de novembro hvdf
{
hvdf=1;
}
if (dd == 32 && ms == 12) //zera o contador de dias de dezembro
{
dd=1;
ms+=1;
}
if(dd==0 && ms==12) //dezembro decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 12) //zera o contador de dias de dezembro hvdi
{
hvdi=1;
}
if (hvdf == 32 && hvmsf == 12) //zera o contador de dias de dezembro hvdf
{
hvdf=1;
}
if (ms == 13) //zera o contador de mes
{
ms=1;
aa+=1;
}
if(mm == 0) //beep hora certa
{
{
if(bp==1 && ss==0)
{
alarme;
}
}}}}
//fim do loop
void adjck(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE CK ");
lcd.print(ck+cki);
lcd.print("ms ");
lcd.print(ss);
lcd.setCursor(0,1);
lcd.print("1= +clock ");
lcd.setCursor(0,2);
lcd.print("2= -clock ");
int valor2=digitalRead(botao2);
if(valor2==LOW)
{
cki-=1;
EEPROM.write(memoria,cki);
digitalWrite(adj1,HIGH);
//delay(d);
digitalWrite(adj1,LOW);
// delay(p);
}
int valor3=digitalRead(botao3);
if(valor3==LOW)
{
cki+=1;
EEPROM.write(memoria,cki);
digitalWrite(adj2,HIGH);
// delay(d);
digitalWrite(adj2,LOW);
// delay(p);
}
lcd.setCursor(0,3);
lcd.print("3= zerar segundos ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
ss=0;
}
}
void beeps(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE BEEP ");
lcd.setCursor(0,1);
lcd.print("1= beep ");
// lcd.print(bp);
if(bp==1)
{
lcd.print("ligado");
}
if(bp==0)
{
lcd.print("desligado");
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && dd!=0)
if(valor3==LOW)
{
alarme;
bp+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void beepal(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE BEEP ALARME ");
lcd.setCursor(0,1);
lcd.print("1= beep ");
// lcd.print(al);
if(al==1)
{
//alarme;
lcd.print("ligado");
}
if(al==0)
{
lcd.print("desligado");
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && dd!=0)
if(valor3==LOW)
{
alarme;
al+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void extras(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTES EXTRAS");
lcd.setCursor(0,1);
lcd.print("1=h. ver. 2=bissexto");
lcd.setCursor(0,2);
lcd.print("h. verao ativo: ");
if(hv==1)
{
lcd.print("SIM");
}
if(hv==0)
{
lcd.print("NAO");
}
int valor3=digitalRead(botao3);
if(valor3==LOW)
{
hv+=1;
alarme;
}
if(hv==2)
{
hv=0;
}
lcd.setCursor(0,3);
lcd.print("prox. bissexto: ");
lcd.print(bissexto);
int valor2=digitalRead(botao2);
if(valor2==LOW)
{
bissexto+=4;
}
// lcd.setCursor(0,3);
// lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void fimhv(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("FIM HORARIO VERAO");
lcd.setCursor(6,1);
lcd.print(hvdf);
lcd.print("/");
lcd.print(hvmsf);
lcd.print("/");
lcd.print(hvaf);
int valor2=digitalRead(botao2);
// if(valor2==LOW && dd!=0)
if(valor2==LOW)
{
hvmsf+=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && dd!=0)
if(valor3==LOW)
{
hvdf+=1;
}
int valor1=digitalRead(botao1);
// if(valor3==LOW && dd!=0)
if(valor1==LOW)
{
hvaf+=1;
}
}
void iniciohv(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("INICIO HORARIO VERAO");
lcd.setCursor(6,1);
lcd.print(hvdi);
lcd.print("/");
lcd.print(hvmsi);
lcd.print("/");
lcd.print(hvai);
int valor2=digitalRead(botao2);
// if(valor2==LOW && dd!=0)
if(valor2==LOW)
{
hvmsi+=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && dd!=0)
if(valor3==LOW)
{
hvdi+=1;
}
int valor1=digitalRead(botao1);
// if(valor3==LOW && dd!=0)
if(valor1==LOW)
{
hvai+=1;
}
lcd.setCursor(0,3);
if(hv==1){
lcd.print("auto ativado");
}
if(hv==0){
lcd.print("auto desativado");
}
}
void adjsemana(){
lcd.clear();
lcd.setCursor(5,0);
lcd.print("DIA SEMANA");
lcd.setCursor(0,1);
lcd.print("1= +semana: ");
if(se==1){
lcd.print("DOMINGO");
}
if(se==2){
lcd.print("SEGUNDA");
}
if(se==3){
lcd.print("TERCA ");
}
if(se==4){
lcd.print("QUARTA");
}
if(se==5){
lcd.print("QUINTA");
}
if(se==6){
lcd.print("SEXTA ");
}
if(se==7){
lcd.print("SABADO");
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
int valor3=digitalRead(botao3);
if(valor3==LOW)
{
se+=1;
}
}
void adjdia(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE DIA ");
lcd.print(dd);
lcd.setCursor(0,1);
lcd.print("1= +dia ");
// lcd.print(dd);
lcd.setCursor(0,2);
lcd.print("2= -dia ");
// lcd.print(dd);
int valor2=digitalRead(botao2);
// if(valor2==LOW && dd!=0)
if(valor2==LOW)
{
dd-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && dd!=0)
if(valor3==LOW)
{
dd+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void adjmes(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE MES ");
lcd.print(ms);
lcd.setCursor(0,1);
lcd.print("1= +mes ");
// lcd.print(ms);
lcd.setCursor(0,2);
lcd.print("2= -mes ");
// lcd.print(ms);
int valor2=digitalRead(botao2);
// if(valor2==LOW && ms!=0)
if(valor2==LOW)
{
ms-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && ms!=0)
if(valor3==LOW)
{
ms+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void adjano(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE ANO ");
lcd.print(aa);
lcd.setCursor(0,1);
lcd.print("1= +ano ");
// lcd.print(aa);
lcd.setCursor(0,2);
lcd.print("2= -ano ");
// lcd.print(aa);
int valor2=digitalRead(botao2);
// if(valor2==LOW && aa!=0)
if(valor2==LOW)
{
aa-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && aa!=0)
if(valor3==LOW)
{
aa+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void adjhora(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE HORAS ");
lcd.print(hh);
lcd.setCursor(0,1);
lcd.print("1= +hora ");
// lcd.print(hh);
lcd.setCursor(0,2);
lcd.print("2= -hora ");
// lcd.print(hh);
int valor2=digitalRead(botao2);
// if(valor2==LOW && hh!=0)
if(valor2==LOW)
{
hh-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && hh!=0)
if(valor3==LOW)
{
hh+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void adjminuto(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE MINUTOS ");
lcd.print(mm);
lcd.setCursor(0,1);
lcd.print("1= +minuto ");
// lcd.print(hh);
lcd.setCursor(0,2);
lcd.print("2= -minuto ");
// lcd.print(hh);
int valor2=digitalRead(botao2);
// if(valor2==LOW && mm!=0)
if(valor2==LOW)
{
mm-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && mm!=0)
if(valor3==LOW)
{
mm+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void adjhoraal(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE H. ALARME ");
lcd.print(ha);
lcd.setCursor(0,1);
lcd.print("1= +hora ");
// lcd.print(ha);
lcd.setCursor(0,2);
lcd.print("2= -hora ");
// lcd.print(ha);
int valor2=digitalRead(botao2);
// if(valor2==LOW && ha!=0)
if(valor2==LOW)
{
ha-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && ha!=0)
if(valor3==LOW)
{
ha+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void adjminutoal(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE M. ALARME ");
lcd.print(ma);
lcd.setCursor(0,1);
lcd.print("1= +minuto ");
// lcd.print(ma);
lcd.setCursor(0,2);
lcd.print("2= -minuto ");
// lcd.print(ma);
int valor2=digitalRead(botao2);
// if(valor2==LOW && ma!=0)
if(valor2==LOW)
{
ma-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && ma!=0)
if(valor3==LOW)
{
ma+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void display(){
lcd.clear();
lcd.setCursor(1,0);
if(se==1)
{
lcd.print("DOMINGO ");
}
if(se==2)
{
lcd.print("SEGUNDA ");
}
if(se==3)
{
lcd.print("TERCA ");
}
if(se==4)
{
lcd.print("QUARTA ");
}
if(se==5)
{
lcd.print("QUINTA ");
}
if(se==6)
{
lcd.print("SEXTA ");
}
if(se==7)
{
lcd.print("SABADO ");
}
lcd.setCursor(6,1);
if(hh<10)
{
lcd.print("0");
}
lcd.print(hh);
if(mm<10)
{
lcd.print(":0");
}
if(mm>=10)
{
lcd.print(":");
}
lcd.print(mm);
if(ss<10)
{
lcd.print(":0");
}
if(ss>=10)
{
lcd.print(":");
}
lcd.print(ss );
lcd.setCursor(9,0);
if(dd<10)
{
lcd.print("0");
lcd.print(dd);
}
if(dd>=10)
{
lcd.print(dd);
}
if(ms<10)
{
lcd.print("/0");
lcd.print(ms);
}
if(ms>=10)
{
lcd.print("/");
lcd.print(ms);
}
lcd.print("/");
lcd.print(aa );
lcd.setCursor(0,3);
if(al==1)
{
lcd.print("(al: ");
if(ha<10)
{
lcd.print("0");
}
lcd.print(ha);
if(ma<10)
{
lcd.print(":0");
}
if(ma>=10)
{
lcd.print(":");
}
lcd.print(ma);
lcd.print(") ");
if(bp==1)
{
lcd.setCursor(14,3);
lcd.print("(beep)");
}
}
//pedroluand@gmail.com
//versão: 1.5 //usando millis
//versao: 1.4 //salvando clock na eeprom
//versao: 27/08/2018
//versao: 1.3
//versao: 291217
#include <Wire.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0X3F,2,1,0,4,5,6,7,3,POSITIVE);
//configuracoes do relogio e do calendario
long previousMillis = 0;
long interval = 1000;
int hh = 18;
int mm = 0;
int ss = 0;
int dd = 8;
int ms = 11;
int aa = 2018;
int se = 5; // dia da semana 1 = domingo
int bissexto = 2020; //proximo ano bisexto
int set = 0;
//configuracoes horario de verao, modificar com atenção
int hv = 0; //set hv 1= hv ligado 0= hv desligado
int hvh = 23;
int hvm = 59;
int hvdi = 4; //dia hv
int hvmsi = 11; //mes hv
int hvai = 2018; //ano hv
int hvdf = 16; //dia hv
int hvmsf = 2; //mes hv
int hvaf = 2019; //ano hv
//configuracao do alarme
int ha = 0;
int ma = 0;
int al = 0; //1= alarme ligado, 0= alarme desligado
int bp = 0; //1= beep ligado, 0= beep desligado
//configuracoes globais
int memoria = 0; //memoria eeprom clock
int cki; //valor referencia do ajuste de clock interno eeprom
int ck = 872; //nao modificar clock interno usado pelo sistema
int p = 100; //pausa do pulso clock externo
int d = 900; //duracao do pulso clock externo
#define adj2 13 //ajuste clock-
#define ext 12 //entrada clock externo 12
#define adj1 11 //ajuste clock+
#define botao1 10 //ajusta dia da semana e ano
#define botao2 9 //ajuste de minutos e minutos alarme e mes
#define botao3 8 //ajuste de horas e horas alarme e dia
#define beep 7 //buzzer
#define mode 2 //mode relogio e alarme
#define alarme tone(7,1000,200); //beep de hora certa e alarme
void setup(){
pinMode(mode,INPUT_PULLUP);
pinMode(botao1,INPUT_PULLUP);
pinMode(botao2,INPUT_PULLUP);
pinMode(botao3,INPUT_PULLUP);
pinMode(ext,INPUT_PULLUP);
pinMode(beep,OUTPUT);
pinMode(adj1,OUTPUT);
pinMode(adj2,OUTPUT);
lcd.begin(20,4);
cki=EEPROM.read(memoria); //lê o valor para ck na eeprom
}
void loop(){
//clock usando millis
unsigned long currentMillis = millis();
//Intervalo de 1 segundo
if (currentMillis - previousMillis > interval){
previousMillis = currentMillis;
ss++;
int valor2=digitalRead(botao1);
if(valor2==LOW)
{
// noTone();
}
int valor3=digitalRead(mode);
if(valor3==LOW)
{
set+=1;
}
if(set==0) //tela inicial
{
display();
}
if(set==1) //menu semana
{
adjsemana();
}
if(set==2) //menu dia calendario
{
adjdia();
}
if(set==3) //menu dia calendario
{
adjmes();
}
if(set==4) //menu ano calendario
{
adjano();
}
if(set==5) //menu hora
{
adjhora();
}
if(set==6) //menu minuto
{
adjminuto();
}
if(set==7) //menu beep
{
beeps();
}
if(set==8) //menu hora alarme
{
adjhoraal();
}
if(set==9) //menu menu alarme
{
adjminutoal();
}
if(set==10) //menu beep alarme
{
beepal();
}
if(set==11) //menu inicio hv
{
iniciohv();
}
if(set==12) //menu fim hv
{
fimhv();
}
if(set==13) //menu ajustes extras
{
extras();
}
if(set==14) //menu ajustes clock
{
adjck();
}
if(set==15) //loop do menu
{
set=0;
display();
}
if(hh==ha && mm==ma && ss>=0) //horario do alarme
{
if(al==1)
{
alarme;
}}
if(dd==hvdi && ms==hvmsi && aa==hvai && hh==hvh && mm==hvm && ss>=59 && hv==1) //inicio hv
{
hh+=1;
hv=0;
}
if(dd==hvdf && ms==hvmsf && aa==hvaf && hh==hvh && mm==hvm && ss>=59 && hv==0) //fim hv
{
hh-=1;
// dd-=1;
// se-=1;
hv=1;
}
if(bp==2) //liga/desliga beep
{
bp=0;
//
}
if(al==2) //liga/desliga alarme
{
al=0;
//
}
if (ha == 24) //zera o contador de hora alarme
{
ha=0;
//
}
if (ma == 60) //zera o contador de minutos alarme
{
ma=0;
//
}
if (hvmsf== 13) //zera o contador de hvmsf
{
hvmsf=1;
//
}
if (hvmsi == 13) //zera o contador de hvmsi
{
hvmsi=1;
//
}
if (ss == 60) //zera o contador de segundos
{
ss=0;
//
mm+=1;
}
if (mm == 60) //zera o contador de minutos
{
mm=0;
//
hh+=1;
}
if (hh == 25) //correcao horario de verao
{
hh=1;
dd+=1;
se+=1;
}
if (hh == 24) //formato de 24 horas
{
hh=0;
dd+=1;
se+=1;
}
if(ms==0) //ms decrescente
{
ms=12;
}
if(ha==-1) //hora alarme decrescente
{
ha=23;
}
if(ma==-1) //minuto alarme decrescente
{
ma=59;
}
if(mm==-1) //minuto decrescente
{
mm=59;
}
if(hh==-1) //hora decrescente
{
hh=23;
}
if (se == 8) //zera o contador de dias da semana
{
se=1;
//
}
if (dd == 32 && ms == 1) //zera o contador de dias de janeiro
{
dd=1;
//
ms+=1;
}
if(dd==0 && ms==1) //janeiro decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 1) //zera o contador de dias de janeiro hvdi
{
hvdi=1;
//
}
if (hvdf == 32 && hvmsf == 1) //zera o contador de dias de janeiro hvdf
{
hvdf=1;
//
}
if(aa == bissexto && ms == 3 && dd ==1) //calcula o proximo ano bissexto no dia 1 de marco
{
bissexto+=4;
//
}
if(aa == bissexto && dd == 30 && ms == 2) //zera o contador de dias de fevereiro bissexto
{
dd=1;
ms+=1;
}
if(aa == bissexto && dd==0 && ms==2) //fevereiro bissexto decrescente
{
dd=29;
}
if(dd==31 && ms==2)
{
dd=29;
}
if(aa != bissexto && dd == 29 && ms == 2) //zera o contador de dias de fevereiro normal
{
dd=1;
ms+=1;
}
if(dd==0 && ms==2) //fevereiro normal decrescente
{
dd=28;
}
if (hvdi == 29 && hvmsi == 2) //zera o contador de dias de fevereiro hvdi
{
hvdi=1;
}
if (hvdf == 29 && hvmsf == 2) //zera o contador de dias de fevereiro hvdf
{
hvdf=1;
}
if (hvdi == 30 && hvmsi == 2) //zera o contador de dias de fevereiro bissexto hvdi
{
hvdi=1;
}
if (hvdf == 30 && hvmsf == 2) //zera o contador de dias de fevereiro bissexto hvdf
{
hvdf=1;
}
if (dd == 32 && ms == 3) //zera o contador de dias de marco
{
dd=1;
ms+=1;
}
if(dd==0 && ms==3) //marco decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 3) //zera o contador de dias de marco hvdi
{
hvdi=1;
}
if (hvdf == 32 && hvmsf == 3) //zera o contador de dias de marco hvdf
{
hvdf=1;
}
if (dd == 31 && ms == 4) //zera o contador de dias de abril
{
dd=1;
ms+=1;
}
if(dd==0 && ms==4) //abril decrescente
{
dd=30;
}
if (hvdi == 31 && hvmsi == 4) //zera o contador de dias de abril hvdi
{
hvdi=1;
}
if (hvdf == 31 && hvmsf == 4) //zera o contador de dias de abril hvdf
{
hvdf=1;
}
if (dd == 32 && ms == 5) //zera o contador de dias de maio
{
dd=1;
ms+=1;
}
if(dd==0 && ms==5) //maio decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 5) //zera o contador de dias de maio hvdi
{
hvdi=1;
}
if (hvdf == 32 && hvmsf == 5) //zera o contador de dias de maio hvdf
{
hvdf=1;
}
if (dd == 31 && ms == 6) //zera o contador de dias de junho
{
dd=1;
ms+=1;
}
if(dd==0 && ms==6) //junho decrescente
{
dd=30;
}
if (hvdi == 31 && hvmsi == 6) //zera o contador de dias de junho hvdi
{
hvdi=1;
}
if (hvdf == 31 && hvmsf == 6) //zera o contador de dias de junho hvdf
{
hvdf=1;
}
if (dd == 32 && ms == 7) //zera o contador de dias de julho
{
dd=1;
ms+=1;
}
if(dd==0 && ms==7) //julho decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 7) //zera o contador de dias de julho hvdi
{
hvdi=1;
}
if (hvdf == 32 && hvmsf == 7) //zera o contador de dias de julho hvdf
{
hvdf=1;
}
if (dd == 32 && ms == 8) //zera o contador de dias de agosto
{
dd=1;
ms+=1;
}
if(dd==0 && ms==8) //agosto decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 8) //zera o contador de dias de agosto hvdi
{
hvdi=1;
}
if (hvdf == 32 && hvmsf == 8) //zera o contador de dias de agoso hvdf
{
hvdf=1;
}
if (dd == 31 && ms == 9) //zera o contador de dias de setembro
{
dd=1;
ms+=1;
}
if(dd==0 && ms==9) //setembro decrescente
{
dd=30;
}
if (hvdi == 31 && hvmsi == 9) //zera o contador de dias de setembro hvdi
{
hvdi=1;
}
if (hvdf == 31 && hvmsf == 9) //zera o contador de dias de setembro hvdf
{
hvdf=1;
}
if (dd == 32 && ms == 10) //zera o contador de dias de outubro
{
dd=1;
ms+=1;
}
if(dd==0 && ms==10) //outubro decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 10) //zera o contador de dias de outubro hvdi
{
hvdi=1;
}
if (hvdf == 32 && hvmsf == 10) //zera o contador de dias de outubro hvdf
{
hvdf=1;
}
if (dd == 31 && ms == 11) //zera o contador de dias de novembro
{
dd=1;
ms+=1;
}
if(dd==0 && ms==11) //novembro decrescente
{
dd=30;
}
if (hvdi == 31 && hvmsi == 11) //zera o contador de dias de novembro hvdi
{
hvdi=1;
}
if (hvdf == 31 && hvmsf == 11) //zera o contador de dias de novembro hvdf
{
hvdf=1;
}
if (dd == 32 && ms == 12) //zera o contador de dias de dezembro
{
dd=1;
ms+=1;
}
if(dd==0 && ms==12) //dezembro decrescente
{
dd=31;
}
if (hvdi == 32 && hvmsi == 12) //zera o contador de dias de dezembro hvdi
{
hvdi=1;
}
if (hvdf == 32 && hvmsf == 12) //zera o contador de dias de dezembro hvdf
{
hvdf=1;
}
if (ms == 13) //zera o contador de mes
{
ms=1;
aa+=1;
}
if(mm == 0) //beep hora certa
{
{
if(bp==1 && ss==0)
{
alarme;
}
}}}}
//fim do loop
void adjck(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE CK ");
lcd.print(ck+cki);
lcd.print("ms ");
lcd.print(ss);
lcd.setCursor(0,1);
lcd.print("1= +clock ");
lcd.setCursor(0,2);
lcd.print("2= -clock ");
int valor2=digitalRead(botao2);
if(valor2==LOW)
{
cki-=1;
EEPROM.write(memoria,cki);
digitalWrite(adj1,HIGH);
//delay(d);
digitalWrite(adj1,LOW);
// delay(p);
}
int valor3=digitalRead(botao3);
if(valor3==LOW)
{
cki+=1;
EEPROM.write(memoria,cki);
digitalWrite(adj2,HIGH);
// delay(d);
digitalWrite(adj2,LOW);
// delay(p);
}
lcd.setCursor(0,3);
lcd.print("3= zerar segundos ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
ss=0;
}
}
void beeps(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE BEEP ");
lcd.setCursor(0,1);
lcd.print("1= beep ");
// lcd.print(bp);
if(bp==1)
{
lcd.print("ligado");
}
if(bp==0)
{
lcd.print("desligado");
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && dd!=0)
if(valor3==LOW)
{
alarme;
bp+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void beepal(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE BEEP ALARME ");
lcd.setCursor(0,1);
lcd.print("1= beep ");
// lcd.print(al);
if(al==1)
{
//alarme;
lcd.print("ligado");
}
if(al==0)
{
lcd.print("desligado");
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && dd!=0)
if(valor3==LOW)
{
alarme;
al+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void extras(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTES EXTRAS");
lcd.setCursor(0,1);
lcd.print("1=h. ver. 2=bissexto");
lcd.setCursor(0,2);
lcd.print("h. verao ativo: ");
if(hv==1)
{
lcd.print("SIM");
}
if(hv==0)
{
lcd.print("NAO");
}
int valor3=digitalRead(botao3);
if(valor3==LOW)
{
hv+=1;
alarme;
}
if(hv==2)
{
hv=0;
}
lcd.setCursor(0,3);
lcd.print("prox. bissexto: ");
lcd.print(bissexto);
int valor2=digitalRead(botao2);
if(valor2==LOW)
{
bissexto+=4;
}
// lcd.setCursor(0,3);
// lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void fimhv(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("FIM HORARIO VERAO");
lcd.setCursor(6,1);
lcd.print(hvdf);
lcd.print("/");
lcd.print(hvmsf);
lcd.print("/");
lcd.print(hvaf);
int valor2=digitalRead(botao2);
// if(valor2==LOW && dd!=0)
if(valor2==LOW)
{
hvmsf+=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && dd!=0)
if(valor3==LOW)
{
hvdf+=1;
}
int valor1=digitalRead(botao1);
// if(valor3==LOW && dd!=0)
if(valor1==LOW)
{
hvaf+=1;
}
}
void iniciohv(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("INICIO HORARIO VERAO");
lcd.setCursor(6,1);
lcd.print(hvdi);
lcd.print("/");
lcd.print(hvmsi);
lcd.print("/");
lcd.print(hvai);
int valor2=digitalRead(botao2);
// if(valor2==LOW && dd!=0)
if(valor2==LOW)
{
hvmsi+=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && dd!=0)
if(valor3==LOW)
{
hvdi+=1;
}
int valor1=digitalRead(botao1);
// if(valor3==LOW && dd!=0)
if(valor1==LOW)
{
hvai+=1;
}
lcd.setCursor(0,3);
if(hv==1){
lcd.print("auto ativado");
}
if(hv==0){
lcd.print("auto desativado");
}
}
void adjsemana(){
lcd.clear();
lcd.setCursor(5,0);
lcd.print("DIA SEMANA");
lcd.setCursor(0,1);
lcd.print("1= +semana: ");
if(se==1){
lcd.print("DOMINGO");
}
if(se==2){
lcd.print("SEGUNDA");
}
if(se==3){
lcd.print("TERCA ");
}
if(se==4){
lcd.print("QUARTA");
}
if(se==5){
lcd.print("QUINTA");
}
if(se==6){
lcd.print("SEXTA ");
}
if(se==7){
lcd.print("SABADO");
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
int valor3=digitalRead(botao3);
if(valor3==LOW)
{
se+=1;
}
}
void adjdia(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE DIA ");
lcd.print(dd);
lcd.setCursor(0,1);
lcd.print("1= +dia ");
// lcd.print(dd);
lcd.setCursor(0,2);
lcd.print("2= -dia ");
// lcd.print(dd);
int valor2=digitalRead(botao2);
// if(valor2==LOW && dd!=0)
if(valor2==LOW)
{
dd-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && dd!=0)
if(valor3==LOW)
{
dd+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void adjmes(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE MES ");
lcd.print(ms);
lcd.setCursor(0,1);
lcd.print("1= +mes ");
// lcd.print(ms);
lcd.setCursor(0,2);
lcd.print("2= -mes ");
// lcd.print(ms);
int valor2=digitalRead(botao2);
// if(valor2==LOW && ms!=0)
if(valor2==LOW)
{
ms-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && ms!=0)
if(valor3==LOW)
{
ms+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void adjano(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE ANO ");
lcd.print(aa);
lcd.setCursor(0,1);
lcd.print("1= +ano ");
// lcd.print(aa);
lcd.setCursor(0,2);
lcd.print("2= -ano ");
// lcd.print(aa);
int valor2=digitalRead(botao2);
// if(valor2==LOW && aa!=0)
if(valor2==LOW)
{
aa-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && aa!=0)
if(valor3==LOW)
{
aa+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void adjhora(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE HORAS ");
lcd.print(hh);
lcd.setCursor(0,1);
lcd.print("1= +hora ");
// lcd.print(hh);
lcd.setCursor(0,2);
lcd.print("2= -hora ");
// lcd.print(hh);
int valor2=digitalRead(botao2);
// if(valor2==LOW && hh!=0)
if(valor2==LOW)
{
hh-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && hh!=0)
if(valor3==LOW)
{
hh+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void adjminuto(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE MINUTOS ");
lcd.print(mm);
lcd.setCursor(0,1);
lcd.print("1= +minuto ");
// lcd.print(hh);
lcd.setCursor(0,2);
lcd.print("2= -minuto ");
// lcd.print(hh);
int valor2=digitalRead(botao2);
// if(valor2==LOW && mm!=0)
if(valor2==LOW)
{
mm-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && mm!=0)
if(valor3==LOW)
{
mm+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void adjhoraal(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE H. ALARME ");
lcd.print(ha);
lcd.setCursor(0,1);
lcd.print("1= +hora ");
// lcd.print(ha);
lcd.setCursor(0,2);
lcd.print("2= -hora ");
// lcd.print(ha);
int valor2=digitalRead(botao2);
// if(valor2==LOW && ha!=0)
if(valor2==LOW)
{
ha-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && ha!=0)
if(valor3==LOW)
{
ha+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void adjminutoal(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AJUSTE M. ALARME ");
lcd.print(ma);
lcd.setCursor(0,1);
lcd.print("1= +minuto ");
// lcd.print(ma);
lcd.setCursor(0,2);
lcd.print("2= -minuto ");
// lcd.print(ma);
int valor2=digitalRead(botao2);
// if(valor2==LOW && ma!=0)
if(valor2==LOW)
{
ma-=1;
}
int valor3=digitalRead(botao3);
// if(valor3==LOW && ma!=0)
if(valor3==LOW)
{
ma+=1;
}
lcd.setCursor(0,3);
lcd.print("3= SAIR ");
int valor1=digitalRead(botao1);
if(valor1==LOW)
{
set=0;
}
}
void display(){
lcd.clear();
lcd.setCursor(1,0);
if(se==1)
{
lcd.print("DOMINGO ");
}
if(se==2)
{
lcd.print("SEGUNDA ");
}
if(se==3)
{
lcd.print("TERCA ");
}
if(se==4)
{
lcd.print("QUARTA ");
}
if(se==5)
{
lcd.print("QUINTA ");
}
if(se==6)
{
lcd.print("SEXTA ");
}
if(se==7)
{
lcd.print("SABADO ");
}
lcd.setCursor(6,1);
if(hh<10)
{
lcd.print("0");
}
lcd.print(hh);
if(mm<10)
{
lcd.print(":0");
}
if(mm>=10)
{
lcd.print(":");
}
lcd.print(mm);
if(ss<10)
{
lcd.print(":0");
}
if(ss>=10)
{
lcd.print(":");
}
lcd.print(ss );
lcd.setCursor(9,0);
if(dd<10)
{
lcd.print("0");
lcd.print(dd);
}
if(dd>=10)
{
lcd.print(dd);
}
if(ms<10)
{
lcd.print("/0");
lcd.print(ms);
}
if(ms>=10)
{
lcd.print("/");
lcd.print(ms);
}
lcd.print("/");
lcd.print(aa );
lcd.setCursor(0,3);
if(al==1)
{
lcd.print("(al: ");
if(ha<10)
{
lcd.print("0");
}
lcd.print(ha);
if(ma<10)
{
lcd.print(":0");
}
if(ma>=10)
{
lcd.print(":");
}
lcd.print(ma);
lcd.print(") ");
if(bp==1)
{
lcd.setCursor(14,3);
lcd.print("(beep)");
}
}
Comentários
Postar um comentário