/*************************************************************************/
/*************************************************************************/
/***** PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ *****/
/***** FACULTAD DE CIENCIAS E INGENIERÍA *****/
/***** SISTEMAS DIGITALES B *****/
/*************************************************************************/
/***** Tema: Comunicación I2C *****/
/***** Proyecto: I2C_LCDRTCyPIR *****/
/*************************************************************************/
/***** EvalBoard: ESP32 S3 DevKitC 1 *****/
/***** Autor: Rolando Sánchez Ponce *****/
/***** Fecha: Octubre 2024 *****/
/*************************************************************************/
/***** Enunciado: *****/
/***** Tenemos conectado al módulo ESP32-S3 una pantalla LCD y *****/
/***** dip switch conformado por ocho interruptores. El programa *****/
/***** muestra en la pantalla, cada vez que haya un cambio en *****/
/***** alguno de los interruptores, el estado de los interruptores *****/
/***** y el número de ocho bits formado por ellos en formato *****/
/***** hexadecimal. *****/
/***** Para el usuario el cabezal arriba de los interruptores indica *****/
/***** un uno lógico y el cabezal abajo representa el cero lógico. *****/
/*************************************************************************/
/*************************************************************************/
// Incluimos librerías
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
// Declaramos etiquetas para los pines
const uint8_t I2C_SDA = 41;
const uint8_t I2C_SCL = 40;
const uint8_t LED = 11;
const uint8_t PIR = 18;
// Creamos los objetos miLCD y miRTC
LiquidCrystal_I2C miLCD(0x27, 16, 2);
RTC_DS1307 miRTC;
// Declaramos variables
int estadoPIR;
boolean hayMovimiento;
DateTime horaActual;
void setup() {
// Configuramos pines para el led y el PIR
pinMode(LED, OUTPUT);
pinMode(PIR, INPUT);
// Reconfiguramos pines para I2C
Wire.begin(I2C_SDA, I2C_SCL);
// Inicializamos RTC
miRTC.begin();
// Inicializamos LCD
miLCD.init();
miLCD.backlight();
miLCD.home();
miLCD.print("Monitoreo sensor");
miLCD.setCursor(0, 1);
miLCD.print(" de movimiento.");
// Apagamos el led
digitalWrite(LED, HIGH);
// Inicializamos variable
hayMovimiento = false;
}
void loop() {
// Leemos estado del PIR
estadoPIR = digitalRead(PIR);
// Si se detecta movimiento
if(estadoPIR==HIGH){
// Si en la lectura anterior no se detectó movimiento
if(!hayMovimiento){
// Mostramos en la primera fila del LCD la hora actual
horaActual = miRTC.now();
digitalWrite(LED, LOW); // encendemos el led
miLCD.clear();
miLCD.setCursor(0, 0);
miLCD.print("Inicio: ");
miLCD.printf("%02d:%02d:%02d\n", horaActual.hour(), horaActual.minute(), horaActual.second());
hayMovimiento = true;
}
}
// Caso contrario (no hay movimiento)
else{
// Si en la lectura anterior sí se detectó movimiento
if(hayMovimiento){
// Mostramos en la segunda fila del LCD la hora actual
horaActual = miRTC.now();
digitalWrite(LED, HIGH); // apagamos el led
miLCD.setCursor(3, 1);
miLCD.print("Fin: ");
miLCD.printf("%02d:%02d:%02d\n", horaActual.hour(), horaActual.minute(), horaActual.second());
hayMovimiento = false;
}
}
// Retardo
delay(100);
}