//CAIO CÉSAR CARDOSO DE BRITO
//[email protected]
#include <stdio.h>
#include <stdlib.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "dht.h"
#include "lcd_i2c.h"
#include "mq2.h"
// Definição dos pinos dos sensores e periféricos
#define DHT_PIN 15 // Pino de dados do sensor DHT22
#define I2C_SDA 4 // Pino SDA da comunicação I2C para o LCD
#define I2C_SCL 5 // Pino SCL da comunicação I2C para o LCD
// Definição dos pinos dos LEDs indicadores
#define LED_VERMELHO 6 // Indica temperatura acima de 45°C ou fumaça alta
#define LED_LARANJA 7 // Indica temperatura entre 30°C e 45°C
#define LED_VERDE 8 // Indica temperatura entre 20°C e 30°C
#define LED_AZUL 9 // Indica temperatura abaixo de 20°C
/**
* @brief Configuração inicial dos sensores, LCD e LEDs.
*/
void setup() {
// Inicializa LEDs e define como saída
gpio_init(LED_VERMELHO);
gpio_set_dir(LED_VERMELHO, GPIO_OUT);
gpio_init(LED_LARANJA);
gpio_set_dir(LED_LARANJA, GPIO_OUT);
gpio_init(LED_VERDE);
gpio_set_dir(LED_VERDE, GPIO_OUT);
gpio_init(LED_AZUL);
gpio_set_dir(LED_AZUL, GPIO_OUT);
// Inicializa a saída serial para monitoramento
stdio_init_all();
// Inicializa a comunicação I2C para o LCD
i2c_init(i2c0, 100 * 1000);
gpio_set_function(I2C_SDA, GPIO_FUNC_I2C);
gpio_set_function(I2C_SCL, GPIO_FUNC_I2C);
gpio_pull_up(I2C_SDA);
gpio_pull_up(I2C_SCL);
// Inicializa e limpa o LCD
lcd_init();
lcd_clear();
lcd_set_cursor(0, 0);
lcd_print("Inicializando...");
sleep_ms(2000);
// Inicializa o sensor MQ-2
mq2_init();
}
/**
* @brief Controla os LEDs com base na temperatura e em condições especiais.
*
* @param temperature Temperatura medida (°C).
* @param smoke_high Indica se o nível de fumaça está alto (1 = sim, 0 = não).
* @param probable_rain Indica se há condição de provável chuva (1 = sim, 0 = não).
*/
void controlar_leds(float temperature, int smoke_high, int probable_rain) {
int led_atual = -1; // Variável para armazenar qual LED será aceso
// Define qual LED deve ser aceso com base na temperatura
if (temperature > 45) {
led_atual = LED_VERMELHO;
} else if (temperature > 30) {
led_atual = LED_LARANJA;
} else if (temperature >= 20) {
led_atual = LED_VERDE;
} else {
led_atual = LED_AZUL;
}
// Apaga todos os LEDs antes de acender o correto
gpio_put(LED_VERMELHO, 0);
gpio_put(LED_LARANJA, 0);
gpio_put(LED_VERDE, 0);
gpio_put(LED_AZUL, 0);
// Se houver fumaça alta ou condição de provável chuva, o LED deve piscar
if (smoke_high || probable_rain) {
for (int i = 0; i < 4; i++) { // Pisca 4 vezes em 2 segundos
gpio_put(led_atual, 1);
sleep_ms(250);
gpio_put(led_atual, 0);
sleep_ms(250);
}
} else {
// Caso contrário, apenas acende o LED correspondente
gpio_put(led_atual, 1);
sleep_ms(2000);
}
}
/**
* @brief Loop principal que lê sensores e atualiza o LCD e os LEDs.
*/
int main() {
setup(); // Configuração inicial
float temperature, humidity;
char buffer[16];
while (1) {
// Simulação da leitura do sensor de temperatura (valores entre 18°C e 50°C)
temperature = 18.0 + (rand() % 320) / 10.0;
// Simulação da leitura do sensor de umidade (valores entre 25% e 90%)
humidity = 25.0 + (rand() % 651) / 10.0;
// Leitura do nível de fumaça em PPM a partir do sensor MQ-2
int ppm = mq2_get_ppm();
// Verifica se o nível de fumaça é considerado alto (≥ 4000 PPM)
int smoke_high = ppm >= 4000;
// Verifica se há condição de provável chuva (umidade ≥ 70% e temperatura < 30°C)
int probable_rain = (humidity >= 70 && temperature < 30);
// Exibe as leituras no terminal serial
printf("Temp: %.1fC Hum: %.0f%% PPM: %d Fumaça: %s\n",
temperature, humidity, ppm, smoke_high ? "ALTA, PROVÁVEL QUEIMADA!" : "Baixa");
// Se houver condição de provável chuva, exibe a mensagem no terminal
if (probable_rain) {
printf("Provável Chuva 🌧️\n");
}
// Atualiza a tela do LCD com os dados de temperatura e umidade
lcd_clear();
snprintf(buffer, sizeof(buffer), "Temp: %.1fC", temperature);
lcd_set_cursor(0, 0);
lcd_print(buffer);
snprintf(buffer, sizeof(buffer), "Hum: %.0f%%", humidity);
lcd_set_cursor(0, 1);
lcd_print(buffer);
// Controla os LEDs com base nas leituras
controlar_leds(temperature, smoke_high, probable_rain);
}
}
Loading
pi-pico-w
pi-pico-w