#include <stdio.h> // Biblioteca padrão para entrada/saída (ex.: printf)
#include <string.h> // Funções para manipulação de strings (ex.: strcmp)
#include "tm1637.h" // Driver para controlar o display TM1637 de 7 segmentos
#include "servo.h" // Funções para controle do servo motor
#include "keypad.h" // Driver para leitura do teclado matricial
#include "cofre.h" // Declarações específicas do projeto do cofre
#include "buzzer.h" // Funções para controlar o buzzer (som)
#include "cyw43.h" // Biblioteca para Wi-Fi do Pico W (chip CYW43)
#include "pico/time.h" // Funções de temporização do Pico (ex.: sleep_ms)
#include "pico/stdlib.h" // Biblioteca padrão do Pico (funções básicas)
#include "wifi_handler.h" // Funções personalizadas para gerenciar conexão Wi-Fi
#include "http_client.h" // Funções para requisições HTTP ao servidor
#include "hardware/gpio.h" // Controle de pinos GPIO do Pico
#include "lwip/dns.h" // Funções DNS da biblioteca lwIP (resolução de domínio)
#include "lwip/ip4_addr.h" // Funções para manipulação de endereços IPv4
#define CHECK_INTERVAL_MS 5000 // Intervalo de verificação em milissegundos
// Variável global para o display
TM1637 *mydisplay;
int main() {
stdio_init_all();
sleep_ms(2000);
printf("Iniciando...\n");
// Define o pino do buzzer (agora constante)
const uint32_t buzzer_pin = BUZZER_PIN;
// Inicializa o buzzer
init_buzzer(buzzer_pin);
// Alerta sonoro na inicialização
beep(buzzer_pin, 1500, 100); // Bip curto ao iniciar
// Inicializa o servo motor
init_servo();
set_servo_locked(); // Inicialmente travado
// Inicializa o display TM1637
int clk_pin = 26;
int dio_pin = 27;
mydisplay = TM1637_create(clk_pin, dio_pin, 7);
// Exibe "LOCK" inicialmente
TM1637_show(mydisplay, "LOCK", false);
char entered_password[PASSWORD_LENGTH + 1] = ""; // Senha digitada pelo usuário
int incorrect_attempts = 0; // Contador de tentativas incorretas
while (true) {
read_password(entered_password, PASSWORD_LENGTH, mydisplay);
if (verify_password(entered_password)) { // Use a função verify_password
printf("Senha correta!\n");
TM1637_show(mydisplay, "OPEN", false);
beep(buzzer_pin, 2000, 200); // Adicione um bipe aqui (1kHz por 200ms)
set_servo_unlocked();
sleep_ms(8000); // Mantém destravado por 8 segundos
set_servo_locked();
TM1637_show(mydisplay, "LOCK", false); // Volta a mostrar "LOCK"
beep(buzzer_pin, 500, 500);
incorrect_attempts = 0; // Reseta o contador de tentativas incorretas
} else {
printf("Senha incorreta.\n");
TM1637_show(mydisplay, "FAIL", false);
beep(buzzer_pin, 500, 500); // Adicione um bipe de erro aqui (500Hz por 500ms)
printf("Cofre permanece travado!\n");
incorrect_attempts++; // Incrementa o contador de tentativas incorretas
if (incorrect_attempts >= MAX_ATTEMPTS) {
TM1637_show(mydisplay, "ALARM", false);
printf("Alarme! Bloqueado por 30 segundos.\n");
int remaining_time = BLOCK_TIME_MS / 1000; // Tempo restante em segundos
int alarm_cycles = 30; // Número de ciclos do alarme
// Intercala o alarme sonoro com a contagem regressiva no display
for (int i = 0; i < alarm_cycles && remaining_time > 0; i++) {
beep(buzzer_pin, 800, 500); // Som de alarme
sleep_ms(500); // Espera 0.5 segundos
TM1637_number(mydisplay, remaining_time); // Exibe o tempo restante
sleep_ms(500); // Espera 0.5 segundos
remaining_time--; // Decrementa o tempo restante
}
TM1637_show(mydisplay, "LOCK", false);
// Alerta sonoro após o fim do bloqueio
beep(buzzer_pin, 1500, 200); // Bip curto após o desbloqueio
incorrect_attempts = 0; // Reseta o contador após o bloqueio
}
sleep_ms(2000);
TM1637_show(mydisplay, "LOCK", false); // Volta a mostrar "LOCK"
}
sleep_ms(500); // Pequeno delay antes de pedir a senha novamente
}
}