#include <IRremote.h>
#include <Adafruit_Sensor.h>
#include <WiFi.h>
#include "time.h"
#define IR_RECEIVE_PIN 5
#define IR_EMISOR_PIN 15
#define USE_DEFAULT_FEEDBACK_LED_PIN 2 // led integrado
const int PIN_TO_SENSOR = 2; // GPIO5 conectado al pin de SALIDA del sensor con 3.3V
const int PIN_LUZ =23; //pin de salida de activacion de luz
const char * ssid = "Pleitez2"; // nombre de la red
const char * wifipw = "SAMANTABEAR29"; //contraseña de la red
int pinStateCurrent, pinStatePrevious = LOW; // estado actual y previo del pin
unsigned long previousMillis = 0; // almacena intervalos para imprimir la hora
void setTimezone(String timezone) {
Serial.printf(" Estableciendo zona horaria a %s\n", timezone.c_str());
setenv("TZ", timezone.c_str(), 1); // Ajusta la variable de entorno TZ. La configuración del reloj se ajusta para mostrar la nueva hora local
tzset();
}
void initTime(String timezone) {
struct tm timeinfo;
Serial.println("Configurando la hora...");
configTime(0, 0, "pool.ntp.org"); // Primero se conecta al servidor NTP, con un desfase de 0 horas
if (!getLocalTime(&timeinfo)) {
Serial.println(" Error al obtener la hora");
return;
}
Serial.println(" se obtuvo la hora..");
Serial.println();
// zona horaria
setTimezone(timezone);
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Error al obtener la hora ");
Serial.println();
delay(30000);
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S zona %Z %z ");
}
void startWifi() {
WiFi.begin(ssid, wifipw);
Serial.println("Conectando a WiFi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.print("Señal WiFi (RSSI)=");
Serial.println(WiFi.RSSI());
}
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
startWifi();
initTime("CST6"); // Configurar para El Salvador
printLocalTime();
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK, USE_DEFAULT_FEEDBACK_LED_PIN); // Inicializa el Receptor IR
IrSender.begin(IR_EMISOR_PIN, ENABLE_LED_FEEDBACK, USE_DEFAULT_FEEDBACK_LED_PIN);
pinMode(IR_RECEIVE_PIN, INPUT);
pinMode(IR_EMISOR_PIN, OUTPUT);
pinMode(PIN_LUZ, OUTPUT);
digitalWrite(IR_EMISOR_PIN, 0);
//Serial.begin(115200); // Inicializa el Monitor Serial
pinMode(PIN_TO_SENSOR, INPUT); // Configura el pin del ESP32 como entrada para leer el valor del sensor
Serial.println();
Serial.println("Espere mientras el sensor se autocalibra, trate de no moverse.");
delay(60 * 1000); // Espera 60 segundos mientras el sensor se autocalibra
Serial.println("Sensor LISTO.");
}
void loop() {
//evitarleer miestras se envia codigo ir
bool irReceiverEnabled = true; // Declarar una variable booleana para controlar el estado del receptor IR
// Declarar timeinfo aquí
struct tm timeinfo;
//encendido de luz de movimeinto
pinStatePrevious = pinStateCurrent; // Guarda el estado anterior
pinStateCurrent = digitalRead(PIN_LUZ); // Lee el nuevo estado
// Manejar la hora
unsigned long currentMillis = millis(); // Obtiene el tiempo actual en milisegundos
// Manejar la hora
if (currentMillis - previousMillis >= 30000) { // Si han pasado 30 segundos desde la última impresión
previousMillis = currentMillis; // Actualiza el tiempo de referencia
printLocalTime(); // Imprime la hora
}
// Manejar la detección de movimiento y el envío de códigos IR
pinStatePrevious = pinStateCurrent; // Guarda el estado anterior
pinStateCurrent = digitalRead(PIN_TO_SENSOR); // Lee el nuevo estado
if (pinStatePrevious != pinStateCurrent) { // Si el estado del pin cambió
//digitalWrite(LED_BUILTIN, pinStateCurrent); // Enciende o apaga el LED azul integrado
Serial.println(pinStateCurrent ? "¡Movimiento detectado!" : "¡Movimiento detenido!");
digitalWrite(PIN_LUZ, HIGH); // Encender el LED
delay(5000); // Esperar 5 segundos
digitalWrite(PIN_LUZ, LOW); // Apagar el LED
delay(1000); // Esperar un segundo antes de repetir el ciclo
}
// leer codigos ir para programar
if (irReceiverEnabled && IrReceiver.decode()) { // Si el receptor IR está habilitado y se reciben datos desde el receptor IR, entonces:
IrReceiver.printIRResultShort(&Serial); // Imprime en una línea los datos completos recibidos
IrReceiver.printIRSendUsage(&Serial); // Imprime el comando necesario para enviar este dato
delay(500); // retraso antes de la próxima señal IR
irReceiverEnabled = false; // Desactivar el receptor IR
IrReceiver.resume(); // Habilita la recepción del siguiente valor
}
//envio codigo programado
if (timeinfo.tm_hour == 12 && timeinfo.tm_min == 40) {
Serial.write('p');
delay(5000);
}
if (Serial.available() > 0) {
char command = Serial.read();
switch (command) {
case 'p': // POWER
irReceiverEnabled = false; // Desactivar el receptor IR
Serial.println("Encendido");
IrSender.sendPulseDistanceWidth(38, 4000, 4000, 550, 2000, 550, 950, 0x8B074F, 24, PROTOCOL_IS_LSB_FIRST, 500, 1);
irReceiverEnabled = false;
break;
case 'm': // MUTE
irReceiverEnabled = false; // Desactivar el receptor IR
Serial.println("Silencio");
IrSender.sendPulseDistanceWidth(38, 4050, 3950, 500, 2000, 500, 1000, 0xB0F4F, 24, PROTOCOL_IS_LSB_FIRST, 50, 0);
irReceiverEnabled = false;
break;
//espacio par más códigos ir
//case '+': // +CH
//Serial.println("Canales +");
//IrSender.sendSony(0x1, 0x10, 2, 12);
//break;
//case '-': // -CH
//Serial.println("Canales -");
//IrSender.sendSony(0x1, 0x11, 2, 12);
//break;
//case 'v': // +VOL
//Serial.println("Volumen +");
//IrSender.sendSony(0x1, 0x12, 2, 12);
//break;
//case 'w': // -VOL
//Serial.println("Volumen -");
//IrSender.sendSony(0x1, 0x13, 2, 12);
//break;
default:
break;
}
}
}