#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include "hardware/gpio.h"
#include "ssd1306.h"
#include "lwip/apps/httpd.h"
// Definir GPIO dos periféricos
#define LED_PIN 15
#define BUZZER_PIN 14
// Estado do sistema
volatile bool alarme_ativo = false;
// Inicializar display OLED (I2C padrão: SDA=4, SCL=5)
ssd1306_t disp;
// Função para atualizar mensagem no display
void atualizar_display() {
ssd1306_clear(&disp);
ssd1306_draw_string(&disp, 10, 20,
alarme_ativo ? "EVACUAR" : "Sistema em repouso");
ssd1306_show(&disp);
}
// Função chamada ao acessar /ligar
const char *ligar_alarme(int iNumParams, char *pcParam[], char *pcValue[]) {
alarme_ativo = true;
atualizar_display();
return "/index.html";
}
// Função chamada ao acessar /desligar
const char *desligar_alarme(int iNumParams, char *pcParam[], char *pcValue[]) {
alarme_ativo = false;
atualizar_display();
return "/index.html";
}
// Loop separado para controle do LED e Buzzer
void controle_sinalizacao() {
static absolute_time_t ultimo_tempo = {0};
static bool estado = false;
if (alarme_ativo) {
if (absolute_time_diff_us(ultimo_tempo, get_absolute_time()) > 500000) { // 500ms
estado = !estado;
gpio_put(LED_PIN, estado);
gpio_put(BUZZER_PIN, estado);
ultimo_tempo = get_absolute_time();
}
} else {
gpio_put(LED_PIN, 0);
gpio_put(BUZZER_PIN, 0);
}
}
// HTML embutido (bem simples)
const char index_html[] =
"<!DOCTYPE html><html><head><title>Alarme</title></head><body>"
"<h1>Simulador de Alarme</h1>"
"<p><a href=\"/ligar\">Ligar Alarme</a></p>"
"<p><a href=\"/desligar\">Desligar Alarme</a></p>"
"</body></html>";
// Handlers HTTP
const char* cgi_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]);
const tCGI cgi_table[] = {
{"/ligar", ligar_alarme},
{"/desligar", desligar_alarme}
};
// Arquivos estáticos
const struct fsdata_file file_index = {
NULL, (const unsigned char *)"/index.html", (const unsigned char *)index_html, sizeof(index_html) - 1
};
void iniciar_httpd() {
httpd_init();
http_set_cgi_handlers(cgi_table, 2);
fsdata_init(&file_index);
}
// Main
int main() {
stdio_init_all();
if (cyw43_arch_init_with_country(CYW43_COUNTRY_BR)) {
printf("Erro ao iniciar Wi-Fi\n");
return -1;
}
// Modo Access Point
cyw43_arch_enable_ap_mode("Alarme-PICO", "12345678", CYW43_AUTH_WPA2_AES_PSK);
// Configurar GPIO
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_init(BUZZER_PIN);
gpio_set_dir(BUZZER_PIN, GPIO_OUT);
// Inicializar Display OLED
i2c_init(i2c0, 400 * 1000);
gpio_set_function(4, GPIO_FUNC_I2C);
gpio_set_function(5, GPIO_FUNC_I2C);
gpio_pull_up(4);
gpio_pull_up(5);
ssd1306_init(&disp, 128, 64, 0x3C, i2c0);
atualizar_display();
// Iniciar servidor HTTP
iniciar_httpd();
printf("Servidor iniciado. Conecte-se à rede 'Alarme-PICO'\n");
// Loop principal
while (true) {
controle_sinalizacao();
sleep_ms(100);
}
}