#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "hardware/pwm.h"
#include "pico/unique_id.h"
// --- DEFINIÇÕES DE PINOS PARA HARDWARES ---
#define PRESENCE_SENSOR_PIN 15 // Pino GPIO para o sensor de presença (PIR)
#define BUZZER_PIN 16 // Pino GPIO para o buzzer (PWM)
#define RELAY_PIN 17 // Pino GPIO para o módulo relé
// --- VARIÁVEIS GLOBAIS ---
static bool g_last_presence_state = false;
// --- SENSOR AHT10 ---
bool read_aht10(float *temperature, float *humidity) {
uint8_t buffer[6];
uint8_t trigger_cmd[] = {0xAC, 0x33, 0x00};
if (i2c_write_blocking(i2c0, 0x38, trigger_cmd, 3, false) != 3) return false;
sleep_ms(80);
if (i2c_read_blocking(i2c0, 0x38, buffer, 6, false) != 6) return false;
if ((buffer[0] & 0x80) != 0) {
uint8_t init_cmd[] = {0xE1, 0x08, 0x00};
i2c_write_blocking(i2c0, 0x38, init_cmd, 3, false);
sleep_ms(300);
return false;
}
uint32_t raw_humidity = ((buffer[1] << 16) | (buffer[2] << 8) | buffer[3]) >> 4;
uint32_t raw_temp = ((buffer[3] & 0x0F) << 16) | (buffer[4] << 8) | buffer[5];
*humidity = ((float)raw_humidity / 1048576.0) * 100.0;
*temperature = ((float)raw_temp / 1048576.0) * 200.0 - 50.0;
return true;
}
// --- FUNÇÕES DE HARDWARE (BUZZER, RELÉ) ---
void init_buzzer() {
gpio_set_function(BUZZER_PIN, GPIO_FUNC_PWM);
uint slice_num = pwm_gpio_to_slice_num(BUZZER_PIN);
pwm_config config = pwm_get_default_config();
pwm_config_set_clkdiv(&config, 125.f);
pwm_config_set_wrap(&config, 2000); // Frequência de ~500 Hz
pwm_init(slice_num, &config, false);
}
void set_buzzer_state(bool active) {
uint slice_num = pwm_gpio_to_slice_num(BUZZER_PIN);
if (active) {
pwm_set_gpio_level(BUZZER_PIN, 1000); // 50% duty cycle
pwm_set_enabled(slice_num, true);
} else {
pwm_set_enabled(slice_num, false);
}
}
void init_extra_hardware() {
// Sensor de Presença
gpio_init(PRESENCE_SENSOR_PIN);
gpio_set_dir(PRESENCE_SENSOR_PIN, GPIO_IN);
// Relé
gpio_init(RELAY_PIN);
gpio_set_dir(RELAY_PIN, GPIO_OUT);
gpio_put(RELAY_PIN, 0); // Garante que o relé comece desligado
// Buzzer
init_buzzer();
}
// --- FUNÇÃO PRINCIPAL ---
int main() {
stdio_init_all();
sleep_ms(2000); // Espera para o monitor serial conectar
// Inicialização do I2C e Hardware extra
i2c_init(i2c0, 100 * 1000);
gpio_set_function(0, GPIO_FUNC_I2C);
gpio_set_function(1, GPIO_FUNC_I2C);
gpio_pull_up(0);
gpio_pull_up(1);
init_extra_hardware();
printf("Inicialização completa. Entrando no loop principal...\n\n");
// Loop principal
float temp, hum;
while (true) {
// 1. Leitura e Ação do Sensor de Presença
bool presence_detected = gpio_get(PRESENCE_SENSOR_PIN);
set_buzzer_state(presence_detected);
if (presence_detected && !g_last_presence_state) {
printf("!!! ALERTA DE PRESENÇA DETECTADA !!!\n");
}
g_last_presence_state = presence_detected;
// 2. Leitura do Sensor de Temp/Umid e Ação do Relé
if (read_aht10(&temp, &hum)) {
printf("Sensor Lido: Temp=%.2f C, Umid=%.2f %%\n", temp, hum);
// Controle do relé baseado na temperatura
if (temp >= 30.0) {
printf("Temperatura >= 30 C. ATIVANDO RELÉ.\n");
gpio_put(RELAY_PIN, 1);
} else {
gpio_put(RELAY_PIN, 0);
}
} else {
printf("Falha ao ler dados do sensor AHT10.\n");
}
printf("----------------------------------------\n");
sleep_ms(10000); // Intervalo de 10 segundos entre as leituras
}
}