/*
* Autor: Lucas Matos da Silva
* Matrícula: 20251RSE.MTC0047
* Curso: Residência Tecnológica em Sistemas Embarcados
* Instituto: Instituto Federal do Maranhão (IFMA)
*
* Descrição:
* Este programa simula um sistema de monitoramento ambiental com o microcontrolador Raspberry Pi Pico W.
* Ele utiliza sensores para temperatura, luminosidade e gás, ativando atuadores conforme condições específicas:
*
* - Um servo motor (substituindo o motor vibracall, indisponível no Wokwi) é acionado se a temperatura ultrapassar 30°C.
* - Um LED infravermelho é aceso se a luminosidade for baixa.
* - Um relé é ativado ao detectar presença de gás/fumaça.
* - Um buzzer (alarme sonoro via PWM) é acionado com som contínuo junto ao relé.
*
* ATUALIZAÇÃO:
* - O sensor DHT22 foi reintegrado ao projeto, substituindo o potenciômetro anteriormente usado para leitura da temperatura.
* Isso corrige a exigência anterior incorreta quanto ao tipo de sensor.
*/
#include "pico/stdlib.h"
#include "hardware/adc.h"
#include "hardware/pwm.h"
#include <stdio.h>
#include "dht.h" // Biblioteca para o sensor DHT22 (precisa ser adicionada ao projeto)
// Definição dos pinos
#define PIN_DHT 26 // GPIO26 - sensor DHT22 (temperatura e umidade)
#define PIN_LDR 27 // GPIO27 - módulo LDR (luminosidade)
#define PIN_GAS 28 // GPIO28 - sensor de gás MQ-2
#define PIN_SERVO 16 // GPIO16 - servo motor (substitui vibracall)
#define PIN_LED_IR 17 // GPIO17 - LED infravermelho
#define PIN_RELE 18 // GPIO18 - relé
#define PIN_BUZZER 19 // GPIO19 - buzzer (alarme sonoro via PWM)
// Configura PWM no pino desejado
void setup_pwm(uint gpio) {
gpio_set_function(gpio, GPIO_FUNC_PWM);
uint slice = pwm_gpio_to_slice_num(gpio);
pwm_config config = pwm_get_default_config();
pwm_config_set_clkdiv(&config, 64.f);
pwm_init(slice, &config, true);
}
// Define ângulo para servo motor
void set_servo_angle(uint gpio, float angle) {
uint slice = pwm_gpio_to_slice_num(gpio);
float us = 500 + (angle / 180.0f) * 2000;
float clk = 125000000 / 64.0;
uint16_t level = (uint16_t)(us * clk / 1e6);
pwm_set_gpio_level(gpio, level);
}
// Ativa ou desativa o buzzer com som contínuo (PWM)
void buzzer_set_state(uint gpio, bool ligado) {
uint slice = pwm_gpio_to_slice_num(gpio);
if (ligado) {
pwm_set_wrap(slice, 62500); // Para ~2 kHz (com divisor 64)
pwm_set_gpio_level(gpio, 31250); // 50% duty cycle
} else {
pwm_set_gpio_level(gpio, 0); // Desliga som
}
}
int main() {
stdio_init_all();
// Inicializa ADCs para sensores analógicos
adc_init();
adc_gpio_init(PIN_LDR);
adc_gpio_init(PIN_GAS);
// Inicializa GPIOs de saída digital
gpio_init(PIN_LED_IR);
gpio_set_dir(PIN_LED_IR, GPIO_OUT);
gpio_init(PIN_RELE);
gpio_set_dir(PIN_RELE, GPIO_OUT);
// Inicializa PWM para servo motor e buzzer
setup_pwm(PIN_SERVO);
setup_pwm(PIN_BUZZER);
pwm_set_gpio_level(PIN_BUZZER, 0); // Garante que o buzzer inicie desligado
// Inicializa sensor DHT22
dht_init(PIN_DHT, DHT22);
while (1) {
// Leitura da temperatura do DHT22
float temperatura = 0.0f;
float umidade = 0.0f;
int status = dht_read(PIN_DHT, &temperatura, &umidade); // <-- Código novo: leitura digital do DHT22
if (status == 0) {
// Aciona servo motor se temperatura > 30 °C
set_servo_angle(PIN_SERVO, temperatura > 30.0f ? 90 : 0);
} else {
printf("Erro ao ler DHT22\n");
}
// Leitura da luminosidade
adc_select_input(1); // GPIO27
uint16_t ldr_val = adc_read();
// Leitura do gás
adc_select_input(2); // GPIO28
uint16_t gas_val = adc_read();
// LED IR aceso se pouca luz
gpio_put(PIN_LED_IR, ldr_val > 1000 ? 1 : 0);
// Relé e buzzer ativos se gás detectado
bool gas_detectado = gas_val > 1500;
gpio_put(PIN_RELE, gas_detectado ? 1 : 0);
buzzer_set_state(PIN_BUZZER, gas_detectado);
sleep_ms(1000);
}
}