#include "pico/stdlib.h" // Biblioteca padrão do Raspberry Pi Pico
#include "hardware/uart.h" // Biblioteca para manipulação de UART
#include "hardware/i2c.h" // Biblioteca para manipulação de I2C
#include "ssd1306.h" // Biblioteca para controlar o display SSD1306
#include "hardware/adc.h" // Biblioteca para manipulação do ADC (leitura analógica)
#include "stdio.h" // Biblioteca para funções de entrada/saída padrão
// Definições dos pinos utilizados
#define I2C_PORT i2c0
#define SDA_PIN 4 // Pino GPIO para SDA (comunicação I2C)
#define SCL_PIN 5 // Pino GPIO para SCL (comunicação I2C)
#define DHT_PIN 15 // Pino GPIO para o sensor DHT22 (não utilizado diretamente no código, substituído por potenciômetro)
#define BUTTON_ON_PIN 16 // Pino GPIO para o botão de ligar
#define BUTTON_OFF_PIN 17 // Pino GPIO para o botão de desligar
#define LED_OFF_PIN 18 // Pino GPIO para o LED de sistema desligado
#define LED_ON_PIN 21 // Pino GPIO para o LED de sistema ligado
#define BUZZER_PIN 19 // Pino GPIO para o buzzer de alerta
#define ALERT_LED_PIN 20 // Pino GPIO para o LED de alerta
#define POT_PIN 26 // Pino GPIO para o potenciômetro (pino ADC)
// Função para inicializar a UART
void uart_init_custom() {
uart_init(uart0, 115200); // Inicializa a UART com taxa de 115200
gpio_set_function(0, GPIO_FUNC_UART); // Configura o pino 0 para UART
gpio_set_function(1, GPIO_FUNC_UART); // Configura o pino 1 para UART
}
int main() {
// Inicializações gerais
stdio_init_all(); // Inicializa o printf para a UART
uart_init_custom(); // Configura a UART para comunicação com o terminal
sleep_ms(1000); // Aguarda 1 segundo
printf("Sistema iniciado, para ligar pressione ON...\n"); // Mensagem inicial via UART
// Configuração do barramento I2C
i2c_init(I2C_PORT, 400 * 1000); // Configura o I2C com taxa de 400 kHz
gpio_set_function(SDA_PIN, GPIO_FUNC_I2C); // Configura o pino SDA
gpio_set_function(SCL_PIN, GPIO_FUNC_I2C); // Configura o pino SCL
gpio_pull_up(SDA_PIN); // Ativa o pull-up no pino SDA
gpio_pull_up(SCL_PIN); // Ativa o pull-up no pino SCL
// Inicialização do display SSD1306
ssd1306_init(I2C_PORT); // Inicializa o display
ssd1306_clear(); // Limpa o display
// Inicialização dos pinos GPIO
gpio_init(DHT_PIN); // Inicializa o pino do sensor DHT (não usado diretamente)
gpio_set_dir(DHT_PIN, GPIO_IN); // Configura o pino como entrada
gpio_init(BUTTON_ON_PIN); // Inicializa o pino do botão de ligar
gpio_set_dir(BUTTON_ON_PIN, GPIO_IN); // Configura o pino como entrada
gpio_pull_up(BUTTON_ON_PIN); // Ativa o pull-up no botão
gpio_init(BUTTON_OFF_PIN); // Inicializa o pino do botão de desligar
gpio_set_dir(BUTTON_OFF_PIN, GPIO_IN); // Configura o pino como entrada
gpio_pull_up(BUTTON_OFF_PIN); // Ativa o pull-up no botão
gpio_init(LED_OFF_PIN); // Inicializa o pino do LED de desligado
gpio_set_dir(LED_OFF_PIN, GPIO_OUT); // Configura o pino como saída
gpio_put(LED_OFF_PIN, true); // Acende o LED de desligado
gpio_init(LED_ON_PIN); // Inicializa o pino do LED de ligado
gpio_set_dir(LED_ON_PIN, GPIO_OUT); // Configura o pino como saída
gpio_put(LED_ON_PIN, false); // Desliga o LED de ligado
gpio_init(BUZZER_PIN); // Inicializa o pino do buzzer
gpio_set_dir(BUZZER_PIN, GPIO_OUT); // Configura o pino como saída
gpio_put(BUZZER_PIN, false); // Desliga o buzzer
gpio_init(ALERT_LED_PIN); // Inicializa o pino do LED de alerta
gpio_set_dir(ALERT_LED_PIN, GPIO_OUT); // Configura o pino como saída
gpio_put(ALERT_LED_PIN, false); // Desliga o LED de alerta
adc_init(); // Inicializa o ADC
adc_gpio_init(POT_PIN); // Inicializa o pino do potenciômetro
adc_select_input(0); // Seleciona o canal 0 do ADC (pino 26)
// Variáveis para armazenar dados
float humidity = 0.0;
float temperature = 0.0;
bool system_on = false; // Estado do sistema
uint32_t last_alert_time = 0;
uint32_t led_toggle_time = 0;
uint32_t display_toggle_time = 0; // Controle do piscar do alerta no display
bool display_alert = false; // Flag para controle do alerta no display
static bool last_system_state = false; // Estado anterior do sistema
uint32_t last_print_time = 0; // Controle do tempo para exibir dados no terminal
while (true) {
// Controle do sistema com os botões
if (gpio_get(BUTTON_ON_PIN) == 0) { // Se o botão de ligar for pressionado
sleep_ms(200); // Debounce do botão
system_on = true; // Liga o sistema
gpio_put(LED_ON_PIN, true); // Acende o LED de sistema ligado
gpio_put(LED_OFF_PIN, false); // Apaga o LED de sistema desligado
if (!last_system_state) {
ssd1306_clear(); // Limpa o display
ssd1306_draw_string(16, 16, "Sistema ligado", true); // Exibe mensagem no display
ssd1306_update(I2C_PORT); // Atualiza o display
printf("Sistema ligado...\n"); // Mensagem no terminal
last_system_state = true; // Atualiza o estado do sistema
sleep_ms(1000); // Pausa para exibir a mensagem
}
}
if (gpio_get(BUTTON_OFF_PIN) == 0) { // Se o botão de desligar for pressionado
sleep_ms(200); // Debounce do botão
system_on = false; // Desliga o sistema
gpio_put(LED_ON_PIN, false); // Apaga o LED de sistema ligado
gpio_put(LED_OFF_PIN, true); // Acende o LED de sistema desligado
gpio_put(BUZZER_PIN, false); // Desliga o buzzer
gpio_put(ALERT_LED_PIN, false); // Desliga o LED de alerta
ssd1306_clear(); // Limpa o display
ssd1306_draw_string(16, 16, "Sistema desligado", true); // Exibe mensagem no display
ssd1306_update(I2C_PORT); // Atualiza o display
if (last_system_state) {
printf("Sistema desligado...\n"); // Mensagem no terminal
last_system_state = false; // Atualiza o estado do sistema
}
}
if (system_on) { // Se o sistema estiver ligado
// Leitura do potenciômetro para simular temperatura e umidade
uint16_t pot_value = adc_read(); // Lê o valor do potenciômetro
temperature = 20.0 + (pot_value / 4095.0) * 20.0; // Calcula a temperatura
humidity = 30.0 + (pot_value / 4095.0) * 70.0; // Calcula a umidade
// Alerta de alta temperatura
if (temperature > 37.0) { // Se a temperatura for alta
gpio_put(BUZZER_PIN, true); // Ativa o buzzer
// Exibe o alerta no terminal
printf("ALERTA: Temperatura alta! (%.1f°C), Umidade: %.1f%%\n", temperature, humidity);
// Pisca o LED de alerta a cada 1 segundo
if (time_us_32() - led_toggle_time >= 1000000) {
gpio_xor_mask(1 << ALERT_LED_PIN); // Inverte o estado do LED
led_toggle_time = time_us_32(); // Atualiza o tempo do LED
}
// Controla o piscar do alerta no display a cada 2 segundos
if (time_us_32() - display_toggle_time >= 2000000) {
display_alert = !display_alert; // Alterna entre mostrar e esconder o alerta
display_toggle_time = time_us_32(); // Atualiza o tempo do display
}
// Exibe o alerta no display
if (display_alert) {
ssd1306_clear();
ssd1306_draw_string(16, 16, "ALERTA!", true);
ssd1306_draw_string(16, 32, "Temp Alta!", true);
ssd1306_update(I2C_PORT); // Atualiza o display
} else {
ssd1306_clear(); // Apaga o alerta
ssd1306_update(I2C_PORT); // Atualiza o display
}
} else {
gpio_put(BUZZER_PIN, false); // Desliga o buzzer
gpio_put(ALERT_LED_PIN, false); // Desliga o LED de alerta
// Atualiza o display com os valores de temperatura e umidade
char temp_str[16];
char hum_str[16];
snprintf(temp_str, sizeof(temp_str), "Temp: %.1fC", temperature);
snprintf(hum_str, sizeof(hum_str), "Hum: %.1f%%", humidity);
ssd1306_clear();
ssd1306_draw_string(16, 16, temp_str, true);
ssd1306_draw_string(16, 32, hum_str, true);
ssd1306_update(I2C_PORT); // Atualiza o display
}
// Envio de dados para o terminal a cada 4 segundos
if (time_us_32() - last_print_time >= 4000000) { // 4 segundos
printf("Temperatura: %.1fC, Umidade: %.1f%%\n", temperature, humidity);
last_print_time = time_us_32(); // Atualiza o tempo de envio
}
}
sleep_ms(200); // Aguarda 200 ms antes de repetir o loop
}
return 0; // Retorno do programa (não será alcançado)
}
BOTÃO ON
BOTÃO OFF
BUZZER ALARME
LED ON
LED OFF
DISPLAY SSD1306
POTENCIÔMETRO
SENSOR DHT22
LED ALARME
RASPBERRY PI PICO