//ALESSANDRA KIMIE HIRO.
//EMBARCATEC IFMA - GRUPO 02
//TAREFA 2
//2. Na questão anterior, implemente o botão B,
//para mudar a frequência do LED para 1 Hz.
//Passo a Passo para Teste:
//Pressione o Botão A 5 vezes:
//O LED começará a piscar a uma frequência de 10Hz (100ms de intervalo).
//O LED continuará piscando por 10 segundos e, após isso, se apagará.
//Pressione o Botão B para alternar a frequência do LED:
//Quando o Botão B for pressionado, o LED começará a piscar a 1Hz (1 segundo de intervalo entre o ligar e desligar).
//Se o Botão B for pressionado novamente, o LED voltará a piscar a 10Hz.
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "pico/cyw43_arch.h"
const uint LED_PIN = 12; // Pino do LED
const uint BUTTON_A_PIN = 5; // Pino do Botão A
const uint BUTTON_B_PIN = 6; // Pino do Botão B (novo botão)
volatile int button_press_count = 0; // Contador de pressões do Botão A
volatile bool led_active = false;
volatile bool led_blinking = false;
volatile int led_blink_interval = 100; // Intervalo de piscar (inicialmente 10Hz)
void init_gpio();
int64_t turn_off_callback(alarm_id_t id, void *user_data) {
gpio_put(LED_PIN, false); // Desliga o LED
led_blinking = false; // Desativa o piscar
return 0;
}
int64_t led_blink_callback(alarm_id_t id, void *user_data) {
static bool led_on = false;
if (led_blinking) {
gpio_put(LED_PIN, led_on); // Alterna o estado do LED
led_on = !led_on; // Alterna a variável para inverter o estado
}
return led_blink_interval; // Retorna o intervalo para o piscar do LED
}
void logic() {
static bool button_a_last_state = false;
static bool button_b_last_state = false;
// Verifica o estado do Botão A (para contar pressões)
bool button_a_pressed = !gpio_get(BUTTON_A_PIN);
if (button_a_pressed && !button_a_last_state) {
button_press_count++; // Incrementa a contagem ao pressionar o botão A
printf("Pressão do Botão A: %d\n", button_press_count);
if (button_press_count == 5) {
led_blinking = true; // Ativa o piscar do LED
printf("5 pressões detectadas! LED começando a piscar.\n");
add_alarm_in_ms(100, led_blink_callback, NULL, true); // Inicia o piscar a 10Hz
add_alarm_in_ms(10000, turn_off_callback, NULL, false); // Desliga após 10 segundos
button_press_count = 0; // Reseta o contador
}
}
// Verifica o estado do Botão B (para mudar a frequência)
bool button_b_pressed = !gpio_get(BUTTON_B_PIN);
if (button_b_pressed && !button_b_last_state) {
// Alterna a frequência entre 10Hz e 1Hz ao pressionar o Botão B
if (led_blink_interval == 100) {
led_blink_interval = 1000; // Altera para 1Hz (1 segundo de intervalo)
printf("Botão B pressionado! Frequência do LED para 1Hz.\n");
} else {
led_blink_interval = 100; // Altera para 10Hz (100ms de intervalo)
printf("Botão B pressionado! Frequência do LED para 10Hz.\n");
}
}
// Atualiza os estados dos botões
button_a_last_state = button_a_pressed;
button_b_last_state = button_b_pressed;
}
int main() {
stdio_init_all();
clocks_init();
init_gpio();
while (true) {
logic();
sleep_ms(250); // Intervalo de verificação
}
}
void init_gpio() {
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 0); // Inicializa o LED apagado
// Configura o pino do Botão A como entrada com pull-up interno
gpio_init(BUTTON_A_PIN);
gpio_set_dir(BUTTON_A_PIN, GPIO_IN);
gpio_pull_up(BUTTON_A_PIN);
// Configura o pino do Botão B como entrada com pull-up interno
gpio_init(BUTTON_B_PIN);
gpio_set_dir(BUTTON_B_PIN, GPIO_IN);
gpio_pull_up(BUTTON_B_PIN);
}