#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/adc.h"
#include "hardware/gpio.h"
#include "hardware/pwm.h"
// Definições de pinos GPIO
#define DHT_PIN 28 // Pino ADC para o DHT22
#define LDR_PIN 26 // Pino ADC para o LDR
#define MQ2_PIN 27 // Pino ADC para o MQ-2
#define RELAY_PIN 15 // Pino GPIO para o Relé
#define SERVO_PIN 16 // Pino GPIO para o Servo Motor
#define IR_LED_PIN 17 // Pino GPIO para o LED Infravermelho
// Limiares
#define TEMPERATURE_THRESHOLD 30.0f // Temperatura em graus Celsius
#define LUMINOSITY_THRESHOLD 500 // Valor ADC para baixa luminosidade
#define MQ2_GAS_THRESHOLD 1000 // Valor ADC para detecção de gás/fumaça
// Variáveis para leituras
float temperature = 0.0f;
float humidity = 0.0f;
uint16_t ldr_value = 0;
uint16_t mq2_value = 0;
bool read_dht22_sensor(float *temp, float *hum) {
adc_select_input(2); // Pino ADC correspondente ao DHT_PIN
uint16_t raw_temp = adc_read(); // Valor bruto do ADC para temperatura
// Conversão de um valor ADC para temperatura e humidade
*temp = (raw_temp / 4095.0f) * 50.0f;
*hum = (raw_temp / 4095.0f) * 100.0f;
return true;
}
// Função para controlar o servo motor
void set_servo_angle(uint slice_num, uint chan, float angle) {
uint16_t duty_cycle;
duty_cycle = (uint16_t)((angle / 180.0f) * (6553 - 3276) + 3276);
pwm_set_chan_level(slice_num, chan, duty_cycle);
}
int main() {
stdio_init_all(); // Inicializa comunicação serial
// Inicializa ADC
adc_init();
adc_gpio_init(LDR_PIN); // Configura GPIO26 (ADC0) para LDR
adc_gpio_init(MQ2_PIN); // Configura GPIO27 (ADC1) para MQ-2
adc_gpio_init(DHT_PIN); // Configura GPIO28 (ADC2) para DHT-22
// Inicializa GPIOs para atuadores
gpio_init(RELAY_PIN); //
gpio_set_dir(RELAY_PIN, GPIO_OUT);
gpio_put(RELAY_PIN, 0); // Garante que o relé esteja desligado no início
gpio_init(IR_LED_PIN); //
gpio_set_dir(IR_LED_PIN, GPIO_OUT);
gpio_put(IR_LED_PIN, 0); // Garante que o LED IR esteja desligado no início
// Configuração do PWM para o Servo Motor
gpio_set_function(SERVO_PIN, GPIO_FUNC_PWM); //
uint slice_num = pwm_gpio_to_slice_num(SERVO_PIN);
uint chan = pwm_gpio_to_channel(SERVO_PIN);
pwm_set_wrap(slice_num, 65535); // 20ms período com clock padrão de 125MHz
pwm_set_clkdiv_int_frac(slice_num, 125, 0); // Configura o divisor de clock para 125 para 1MHz PWM base
pwm_set_enabled(slice_num, true); // Habilita o PWM
printf("Sistema de Monitoramento Ambiental Inicializado!\n");
while (1) {
// 1. Leitura do DHT-22 (Temperatura)
if (read_dht22_sensor(&temperature, &humidity)) {
printf("Temperatura: %.2f C, Umidade: %.2f %%\n", temperature, humidity);
if (temperature > TEMPERATURE_THRESHOLD) { //
printf("ALERTA: Temperatura Alta! Ativando Servo Motor.\n");
set_servo_angle(slice_num, chan, 90.0f); // Move o servo para 90 graus como alerta
} else {
set_servo_angle(slice_num, chan, 0.0f); // Retorna o servo para 0 graus
}
} else {
printf("Erro na leitura do DHT-22.\n");
}
// 2. Leitura do LDR (Luminosidade)
adc_select_input(0); // Seleciona ADC0 para o LDR
ldr_value = adc_read();
printf("Luminosidade (ADC): %d\n", ldr_value);
if (ldr_value < LUMINOSITY_THRESHOLD) { //
printf("Baixa Luminosidade Detectada! Acendendo LED IR.\n");
gpio_put(IR_LED_PIN, 1); // Acende o LED IR
} else {
gpio_put(IR_LED_PIN, 0); // Desliga o LED IR
}
// 3. Leitura do MQ-2 (Gás/Fumaça)
adc_select_input(1); // Seleciona ADC1 para o MQ-2
mq2_value = adc_read();
printf("Gás/Fumaça (ADC): %d\n", mq2_value);
if (mq2_value > MQ2_GAS_THRESHOLD) { //
printf("Presença de Gás/Fumaça Detectada! Ativando Relé.\n");
gpio_put(RELAY_PIN, 1); // Ativa o relé
} else {
gpio_put(RELAY_PIN, 0); // Desativa o relé
}
sleep_ms(2000); // Espera 2 segundos antes da próxima leitura
}
return 0;
}