Projeto Arduíno #4
Projeto Arduíno #4 Display 16x2 e RTC DS 1307
Bibliotecas necessárias já inclusas "Wire.h" e "LiquidCrystal.h". Código aplicável tanto para display 16x2 quanto para 20x4, necessário apenas pequenos ajuste para adaptação do display.
Código:
#include "Wire.h"
#include <LiquidCrystal.h>
#define DS1307_ADDRESS 0x68
// Inicializa o LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte zero = 0x00;
void setup()
{
// Define o LCD com 20 colunas e 4 linhas
lcd.begin(16, 2);
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 = 02; // Valores de 0 a 59
byte minutos = 59; // Valores de 0 a 59
byte horas = 23; // Valores de 0 a 23
byte diadasemana = 4; // Valores de 0 a 6 (0=Domingo, 1 = Segunda...)
byte diadomes = 23; // Valores de 1 a 31
byte mes = 4; // 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());
// Mostra a hora atual no display
lcd.setCursor(4, 0);
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 data atual no display
lcd.setCursor(0, 1);
lcd.print("Data : ");
lcd.setCursor(5,1);
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);
//Mostra o dia da semana no display
lcd.setCursor(13, 1);
switch(diadasemana)
{
case 0:lcd.print("Dom");
break;
case 1:lcd.print("Seg");
break;
case 2:lcd.print("Ter");
break;
case 3:lcd.print("Qua");
break;
case 4:lcd.print("Qui");
break;
case 5:lcd.print("Sex");
break;
case 6:lcd.print("Sab");
}
}
Comentários
Postar um comentário