En este tema se comparte un reloj con el DS1302 y sensor de temperatura ambiental e higometro con el DHT11.
El diagrama de conexion es el siguiente
El codigo lo puedes copiar y pegar en tu sketch
#include <LiquidCrystal_I2C.h> // libreria para el LCD
// CONNECTIONS: del DS1302
// DS1302 CLK/SCLK --> 5
// DS1302 DAT/IO --> 4
// DS1302 RST/CE --> 2
// DS1302 VCC --> 3.3v - 5v
// DS1302 GND --> GND
#include <DHT11.h>
// conexiones del DHT11
// terminal data se conecta a D6
int pin=6; // al Data de DHT11
DHT11 dht11(pin);
#include <ThreeWire.h> //librería para DS1302
#include <RtcDS1302.h> //librería para DS1302
volatile int anio;
volatile int mes;
volatile int dia;
volatile int hora;
volatile int minuto;
volatile int segundo;
volatile int contador,xsegundo;
char texto[2];
const char * months[] ={"ENE","FEB","MAR","ABR","MAY","JUN","JUL","AGO","SEP","OCT","NOV","DIC"};
ThreeWire myWire(4,5,2); // IO, SCLK, CE
RtcDS1302<ThreeWire> Rtc(myWire);
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define countof(a) (sizeof(a) / sizeof(a[0]))
const char data[] = "what time is it";
String meridiano=" ";
void setup ()
{
Serial.begin(9600);
Serial.print("compiled: ");
Serial.print(__DATE__);
Serial.println(__TIME__);
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
printDateTime(compiled);
Serial.println();
if (!Rtc.IsDateTimeValid())
{
Serial.println("¡RTC perdió la confianza en el DateTime!");
Rtc.SetDateTime(compiled);
}
if (Rtc.GetIsWriteProtected())
{
Serial.println("RTC estaba protegido contra escritura, lo que permite escribir ahora");
Rtc.SetIsWriteProtected(false);
}
if (!Rtc.GetIsRunning())
{
Serial.println("RTC no se estaba ejecutando activamente, comenzando ahora");
Rtc.SetIsRunning(true);
}
lcd.begin();
lcd.setCursor(0, 0);
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled)
{
Serial.println("¡RTC es más antiguo que el tiempo de compilación! (Actualizando DateTime)");
Rtc.SetDateTime(compiled);
}
/* comentario en una segunda ejecución para ver que la información se almacena a largo plazo */
// Store something in memory on the RTC
uint8_t count = sizeof(data);
uint8_t written = Rtc.SetMemory((const uint8_t*)data, count); // esto incluye un terminador nulo para la cadena
if (written != count)
{
Serial.print("Algo no esta bien, count = ");
Serial.print(count, DEC);
Serial.print(", written = ");
Serial.print(written, DEC);
Serial.println();
}
/* fin de la sección de comentarios */
lcd.clear();
lcd.setCursor(0,0);
lcd.print("--RELOJ DIGITAL-");
lcd.setCursor(0,1);
delay(2000);
lcd.clear();
}
void loop ()
{
if(segundo!=xsegundo){
contador ++;
contador=contador%2;
xsegundo=segundo;
}
// temperatura
int err;
float temp, humi;
if((err=dht11.read(humi, temp))==0 and contador==1) //realiza consulta de temperatura cada segundo
{
// salida a la pantalla, estas lineas se pueden omitir
Serial.print("Temperatura:");
Serial.print(temp);
Serial.print(" Humedad:");
Serial.print(humi);
Serial.println();*/
}else{
// salida a la pantalla, estas lineas se pueden omitir
Serial.println();
Serial.print("Error No :");
Serial.print(err);
Serial.println();
}
// fin de temperatura
RtcDateTime now = Rtc.GetDateTime(); //obtiene la hora y fecha
printDateTime(now);
if (hora >= 0 && hora<=11){
meridiano=" AM";
}
if (hora >= 12 && hora<=23){
meridiano=" PM";
}
lcd.setCursor(0,0);
// bloque para usar formato de 12 horas
if (hora >= 0 && hora<=12){
sprintf(texto, "%02d",hora);
lcd.print(texto);
}
if (hora >= 13 && hora<=23){
sprintf(texto, "%02d",hora-12);
lcd.print(texto);
}
lcd.print(":");
sprintf(texto, "%02d",minuto);
lcd.print(texto);
lcd.print(":");
sprintf(texto, "%02d",segundo);
lcd.print(texto);
//siguiente linea
lcd.print(meridiano);
lcd.print(" ");
lcd.print(temp);
lcd.setCursor(15,0);
lcd.print("C");
lcd.setCursor(0,1);
sprintf(texto, "%02d",dia);
lcd.print(texto);
lcd.print(" ");
lcd.print(months[mes-1]);
lcd.print(" ");
lcd.print(anio);
lcd.setCursor(13,1);
lcd.print(humi);
lcd.setCursor(15,1);
lcd.print("H");
}
void printDateTime(const RtcDateTime& dt)
{
dia= dt.Day();
mes=dt.Month();
anio= dt.Year();
hora= dt.Hour();
minuto=dt.Minute();
segundo= dt.Second();
}
para algún otro proyecto, deje sus comentarios