#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "hardware/adc.h"
#include <stdio.h>
#include <string.h>
// ---------------- CONFIGURAÇÃO DE PINOS ----------------
// Pinos dos Sensores
#define DHT_PIN 16
#define LDR_PIN 26
#define MQ2_PIN 27
// Pinos dos Atuadores
#define IR_LED_PIN 18
#define VIBRATION_MOTOR_PIN 19
#define RELAY_PIN 20
// ---------------- DEFINIÇÕES DE LIMITES ----------------
#define TEMPERATURE_THRESHOLD 30.0f // Temperatura limite em °C
#define LUMINOSITY_THRESHOLD 2000 // Limiar de baixa luminosidade (ajuste conforme calibração)
#define GAS_THRESHOLD 1500 // Limiar de detecção de gás (ajuste conforme calibração)
#define DHT_TIMEOUT_US 1000 // Timeout para leitura do DHT22
// ---------------- LEITURA DO SENSOR DHT22 ----------------
static uint32_t measure_pulse(bool level) {
uint32_t start = time_us_32();
while (gpio_get(DHT_PIN) == level) {
if (time_us_32() - start > DHT_TIMEOUT_US) return DHT_TIMEOUT_US;
}
return time_us_32() - start;
}
bool read_dht_data(uint8_t *data) {
memset(data, 0, 5);
// Sinal de Start
gpio_set_dir(DHT_PIN, GPIO_OUT);
gpio_put(DHT_PIN, 0);
sleep_ms(20);
gpio_put(DHT_PIN, 1);
sleep_us(30);
gpio_set_dir(DHT_PIN, GPIO_IN);
// Espera resposta do sensor
if (measure_pulse(0) == DHT_TIMEOUT_US || measure_pulse(1) == DHT_TIMEOUT_US) {
return false; // Sem resposta
}
// Lê os 40 bits de dados
for (int i = 0; i < 40; i++) {
if (measure_pulse(0) == DHT_TIMEOUT_US) return false;
uint32_t duration = measure_pulse(1);
if (duration == DHT_TIMEOUT_US) return false;
if (duration > 50) {
data[i / 8] |= (1 << (7 - (i % 8)));
}
}
// Valida checksum
uint8_t checksum = data[0] + data[1] + data[2] + data[3];
return (checksum == data[4]);
}
void get_dht_values(float *temperature, float *humidity) {
uint8_t data[5];
if (read_dht_data(data)) {
*humidity = ((data[0] << 8) | data[1]) / 10.0f;
*temperature = (((data[2] & 0x7F) << 8) | data[3]) / 10.0f;
if (data[2] & 0x80) *temperature = -(*temperature);
} else {
*temperature = -999.0f;
*humidity = -999.0f;
}
}
// ---------------- LEITURA DOS SENSORES ANALÓGICOS ----------------
uint16_t read_adc(uint channel) {
adc_select_input(channel);
return adc_read();
}
uint16_t read_ldr() {
return read_adc(0);
}
uint16_t read_mq2() {
return read_adc(1);
}
// ---------------- CONTROLE DOS ATUADORES ----------------
void ativar_motor(bool estado) {
gpio_put(VIBRATION_MOTOR_PIN, estado);
}
void ativar_led_ir(bool estado) {
gpio_put(IR_LED_PIN, estado);
}
void ativar_rele(bool estado) {
gpio_put(RELAY_PIN, estado);
}
// ---------------- CONFIGURAÇÃO INICIAL ----------------
void setup_peripherals() {
stdio_init_all();
// Atuadores como saída
gpio_init(IR_LED_PIN);
gpio_set_dir(IR_LED_PIN, GPIO_OUT);
ativar_led_ir(false);
gpio_init(VIBRATION_MOTOR_PIN);
gpio_set_dir(VIBRATION_MOTOR_PIN, GPIO_OUT);
ativar_motor(false);
gpio_init(RELAY_PIN);
gpio_set_dir(RELAY_PIN, GPIO_OUT);
ativar_rele(false);
// Configura DHT
gpio_init(DHT_PIN);
// Inicializa ADC
adc_init();
adc_gpio_init(LDR_PIN);
adc_gpio_init(MQ2_PIN);
}
// ---------------- LOOP PRINCIPAL ----------------
int main() {
setup_peripherals();
sleep_ms(2000); // Aguarda estabilização inicial
while (true) {
float temperatura, umidade;
uint16_t luminosidade = read_ldr();
uint16_t gas = read_mq2();
get_dht_values(&temperatura, &umidade);
printf("\n-------------------------\n");
if (temperatura > -900.0f) {
printf("Temperatura: %.1f°C | Umidade: %.1f%%\n", temperatura, umidade);
} else {
printf("Erro na leitura do DHT22.\n");
}
printf("Luminosidade (ADC): %d\n", luminosidade);
printf("Nível de Gás (ADC): %d\n", gas);
// ---- Lógica de Controle ----
// Controle do motor vibracall (temperatura)
if (temperatura > TEMPERATURE_THRESHOLD) {
ativar_motor(true);
printf(" ALERTA:Temperatura alta! Vibracall ligado.\n");
} else {
ativar_motor(false);
}
// Controle do LED IR (luminosidade)
if (luminosidade > LUMINOSITY_THRESHOLD) {
ativar_led_ir(true);
printf(" INFO:Baixa luminosidade! LED IR ligado.\n");
} else {
ativar_led_ir(false);
}
// Controle do relé (gás)
if (gas > GAS_THRESHOLD) {
ativar_rele(true);
printf(" ALERTA:Gás/Fumaça detectado! Relé ativado.\n");
} else {
ativar_rele(false);
}
sleep_ms(2000);
}
return 0;
}