#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "driver/adc.h"
#define PINO_PIR GPIO_NUM_13
#define PINO_TRIG GPIO_NUM_5
#define PINO_ECHO GPIO_NUM_18
#define PINO_RELE GPIO_NUM_2
#define CANAL_LDR ADC1_CHANNEL_6
// Hora inicial
static int hora_global = 17; // Começa em 17h
// ============ FUNÇÃO PARA SIMULAR LDR REALISTA ============
// Retorna valor de LDR baseado na hora (simula ciclo dia/noite)
int simular_ldr_realista(int hora) {
// Ciclo dia/noite baseado em hora
// 6h-18h: DIA (valores baixos: 400-2400)
// 18h-22h: NOITE (valores altos: 2600-3200)
// 22h-6h: MADRUGADA (valores muito altos: 3000-3500)
if (hora >= 6 && hora < 18) {
// DIA: valores baixos
return 800 + (hora * 50); // Vai de ~800 a ~2400
} else if (hora >= 18 && hora < 22) {
// NOITE: valores altos (PICO!)
return 2600 + (hora * 100); // Vai de ~2600 a ~4100
} else {
// MADRUGADA: valores muito altos
return 3000 + (hora * 80); // Vai de ~3000 a ~4700
}
}
bool eh_horario_pico(int hora) {
return (hora >= 18 && hora < 22); // 18h até 21:59h
}
bool eh_madrugada(int hora) {
return (hora >= 0 && hora <= 5);
}
void app_main() {
// Inicializa GPIO
gpio_reset_pin(PINO_RELE);
gpio_set_direction(PINO_RELE, GPIO_MODE_OUTPUT);
gpio_reset_pin(PINO_TRIG);
gpio_set_direction(PINO_TRIG, GPIO_MODE_OUTPUT);
gpio_reset_pin(PINO_PIR);
gpio_set_direction(PINO_PIR, GPIO_MODE_INPUT);
gpio_reset_pin(PINO_ECHO);
gpio_set_direction(PINO_ECHO, GPIO_MODE_INPUT);
// Inicializa ADC
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(CANAL_LDR, ADC_ATTEN_DB_11);
printf("\n╔════════════════════════════════════════════════╗\n");
printf("║ 🚨 POSTE DE LUZ INTELIGENTE COM PICO 18h ║\n");
printf("║ Pico: 18h-22h | Madrugada: 0-5h ║\n");
printf("║ [ESCALA: 1s real = 1h simulada] ║\n");
printf("║ [LDR SIMULADO: Ciclo dia/noite realista] ║\n");
printf("╚════════════════════════════════════════════════╝\n\n");
while (true) {
// 🌞 SIMULA LDR BASEADO NA HORA
int leitura = simular_ldr_realista(hora_global);
// 👁️ SIMULA MOVIMENTO (PIR)
int mov = gpio_get_level(PINO_PIR);
// 🌙 VERIFICA SE É NOITE (threshold 2500)
bool noite = (leitura > 2500);
printf("⏰ %02dh | 💡 LDR: %d | 🌙 Noite: %s | 👁️ Mov: %d | ",
hora_global, leitura,
noite ? "SIM✅" : "NÃO❌", mov);
if (noite) {
if (mov == 1) {
if (eh_horario_pico(hora_global)) {
// ⭐ HORÁRIO DE PICO: 100% (18h-22h)
printf("🔴 PICO 100%% [%dh] ⚡⚡⚡\n", hora_global);
gpio_set_level(PINO_RELE, 1);
} else if (eh_madrugada(hora_global)) {
// 🌃 MADRUGADA: 50% PWM
printf("🟡 MADRUGADA 50%% [%dh]\n", hora_global);
gpio_set_level(PINO_RELE, 1);
vTaskDelay(20 / portTICK_PERIOD_MS);
gpio_set_level(PINO_RELE, 0);
vTaskDelay(20 / portTICK_PERIOD_MS);
} else {
// 🟢 NOITE NORMAL: 100% (6h-17:59h)
printf("🟢 NOITE 100%% [%dh]\n", hora_global);
gpio_set_level(PINO_RELE, 1);
}
} else {
printf("⚫ VIA VAZIA (Desligado)\n");
gpio_set_level(PINO_RELE, 0);
}
} else {
printf("☀️ DIA (Desligado)\n");
gpio_set_level(PINO_RELE, 0);
}
// ⏱️ AGUARDA 1 SEGUNDO (que representa 1 HORA simulada)
vTaskDelay(1000 / portTICK_PERIOD_MS);
// ⏰ INCREMENTA HORA PARA PRÓXIMA ITERAÇÃO
hora_global++;
if (hora_global > 23) {
hora_global = 0;
}
}
}