/*
* Unidades 5 a 8
* Tarefa 1:
* Reutilize o circuito no Wokwi criado na sala de aula e
* escreva o código. Abaixo está o lembrete das GPIOs do
* kit bitDogLab.
*
* Aluno: ALESSANDRA KIMIE HIRO
*
* Cap 5 Exemplo 6, 7 e 8: O diagrama mostra uma placa de microcontrolador, em um Raspberry Pi Pico W,
conectado a um LED RGB e a um botão.
O botão está conectado a um dos pinos do microcontrolador e o LED RGB está ligado a outro
pino, com um resistor em série.
O sistema começa inativo, ao pressionar o botão acenderá a cor e após 2 segundos
o LED RGB apagará, voltando a acender após pressionar novamente o botão.
As cores acenderão na sequência Vm, Vd e Az, após pressionar o botão.
*/
#include "pico/stdlib.h" // Biblioteca padrão para controle de GPIO e temporização.
#include <stdio.h> // Biblioteca para usar funções como printf para impressão no terminal.
const uint RED_PIN = 13; // Pino GPIO 13 - Vermelho
const uint GREEN_PIN = 11; // Pino GPIO 11 - Verde
const uint BLUE_PIN = 12; // Pino GPIO 12 - Azul
const uint BUTTON_PIN = 5; // Pino GPIO 5 - Pushbutton
// Variável para controlar a sequência de cores.
int led_color = 0; // 0: Vermelho, 1: Verde, 2: Azul
// Função para alternar as cores do LED RGB.
void change_led_color(int color) {
// Desliga todos os LEDs antes de acender a cor selecionada.
gpio_put(RED_PIN, false);
gpio_put(GREEN_PIN, false);
gpio_put(BLUE_PIN, false);
switch (color) {
case 0: // Vermelho
gpio_put(RED_PIN, true);
printf("LED Vermelho aceso\n");
break;
case 1: // Verde
gpio_put(GREEN_PIN, true);
printf("LED Verde aceso\n");
break;
case 2: // Azul
gpio_put(BLUE_PIN, true);
printf("LED Azul aceso\n");
break;
default:
break;
}
}
// Função para apagar o LED.
void turn_off_led() {
gpio_put(RED_PIN, false);
gpio_put(GREEN_PIN, false);
gpio_put(BLUE_PIN, false);
printf("LED desligado\n");
}
int main() {
// Inicializa a comunicação serial para imprimir mensagens no terminal.
stdio_init_all();
// Inicializa os pinos do LED RGB como saída.
gpio_init(RED_PIN);
gpio_init(GREEN_PIN);
gpio_init(BLUE_PIN);
gpio_set_dir(RED_PIN, GPIO_OUT);
gpio_set_dir(GREEN_PIN, GPIO_OUT);
gpio_set_dir(BLUE_PIN, GPIO_OUT);
// Inicializa o pino do botão como entrada com resistor pull-up.
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN);
gpio_pull_up(BUTTON_PIN); // Habilita o resistor pull-up para o botão.
// Exibe a cor inicial (LED apagado).
turn_off_led();
while (true) {
// Verifica se o botão foi pressionado (nível baixo no pino).
if (gpio_get(BUTTON_PIN) == 0) { // Botão pressionado (nível baixo)
// Aguarda um pequeno intervalo para debounce (evitar múltiplas leituras do botão).
sleep_ms(200); // Delay de 200 ms para debounce.
// Altera a cor do LED.
change_led_color(led_color);
// Aumenta a variável 'led_color' para passar para a próxima cor na sequência.
led_color = (led_color + 1) % 3; // Alterna entre 0-2 (vermelho -> verde -> azul).
// Espera 2 segundos (2000 ms) antes de apagar o LED.
sleep_ms(2000);
// Apaga o LED após 2 segundos.
turn_off_led();
// Aguarda até o botão ser liberado para evitar múltiplas leituras do botão.
while (gpio_get(BUTTON_PIN) == 0) {
sleep_ms(10); // Delay enquanto o botão ainda estiver pressionado.
}
}
// Delay para reduzir o uso da CPU (não é necessário, mas melhora a eficiência).
sleep_ms(10);
}
return 0;
}