// Temporizador de sistema para alternar um LED
#include "pico/stdlib.h" // Inclui a biblioteca padrão para funcionalidades básicas como controle de GPIO, temporização e comunicação serial.
#include "pico/time.h" // Inclui a biblioteca para gerenciamento de tempo, como manipulação de temporizadores e atrasos.
int main() {
// Inicializa a comunicação padrão, permitindo o uso de funções como printf para depuração.
// Isso é necessário para enviar mensagens pela interface serial.
stdio_init_all();
// Define o pino 12 como a constante LED_PIN para fácil referência.
// Esse pino será usado para controlar um LED.
const uint LED_PIN = 12;
// Inicializa o pino 12 como GPIO, preparando-o para ser usado como saída.
gpio_init(LED_PIN);
// Configura a direção do pino 12 como saída, permitindo controlar o estado do LED (ligado/desligado).
gpio_set_dir(LED_PIN, GPIO_OUT);
// Define o intervalo de tempo em milissegundos para a alternância do LED.
// Neste caso, o intervalo é de 1000 milissegundos (1 segundo).
uint32_t interval = 1000;
// Calcula o próximo tempo absoluto em que o LED deve mudar de estado.
// get_absolute_time() retorna o tempo atual do sistema.
// delayed_by_us() calcula um tempo futuro adicionando o intervalo em microsegundos ao tempo atual.
absolute_time_t next_wake_time = delayed_by_us(get_absolute_time(), interval * 1000);
// Define o estado inicial do LED como desligado (false).
bool led_on = false;
// Loop infinito que mantém o programa em execução contínua.
while (true) {
// Verifica se o tempo atual atingiu ou ultrapassou o próximo tempo definido (next_wake_time).
if (time_reached(next_wake_time)) {
// Alterna o estado do LED entre ligado e desligado.
// A variável led_on armazena o estado atual do LED.
led_on = !led_on; // Inverte o estado do LED (se estava ligado, desliga e vice-versa).
// Define o estado do pino 12 (LED_PIN) com base no valor de led_on.
// Se led_on for true, o LED será ligado; se for false, será desligado.
gpio_put(LED_PIN, led_on);
// Calcula o próximo tempo em que o LED deve alternar de estado.
// Adiciona o intervalo de 1 segundo ao valor atual de next_wake_time para definir o próximo evento.
next_wake_time = delayed_by_us(next_wake_time, interval * 1000);
}
// Introduz uma pequena pausa de 1 milissegundo para reduzir o uso da CPU.
// Isso evita que o loop seja executado muito rapidamente, economizando energia.
sleep_ms(1);
}
// Retorno de 0, que nunca será alcançado devido ao loop infinito.
// Isso é apenas uma boa prática em programas com um ponto de entrada main().
return 0;
}