// IFMA - Embarcatech - jan-fev/2025
// Atividade Capítulos 05 a 08 - Clock e Temporizador
// Nome: Alberto Carlos de Oliveira Andrade
// 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.
// Leds RGB: Vm - GPIO13 Az - GPIO12 Vd - GPIO11
// Comunicação SPI: Tx - GP19 Rx - GPIO16 CSn - GPIO17 SCK - GP18
// Display OLED: SDA - GPIO14 SCL - GPIO15
// Botões: GPIO5 e GPIO6
// Buzzer: GPIO10 e GPIO21
// Matriz de Leds Coloridos: GPIO7, 5 linhas por 5 colunas
// Microfone: GP28
// Joystick: Vry - GPIO26 Vrx - GPIO27 Sw - GPIO22
// O código para escrever é referente a esse exercício feito em sala de aula:
//
// Controle de LED RGB através da leitura de 2 botões:
// - Configurar os botões como periféricos de entrada de dados;
// - Configurar o LED Vermelho, LED Azul e LED Verde como periféricos de saída de dados;
// - Controle: o LED azul deve acender quando o botão A for pressionado;
// o LED vermelho deve acender quando o botão B for pressionado
// e o LED verde deve acender quando nenhum dos botões for pressionado.
// - Observação: Fazer um código no Wokwi usando um resistor pull down ou pull up interno.
#include <stdio.h>
#include "pico/stdlib.h"
// Definição dos pinos para os LEDs e botões
#define LED_R_PIN 13 // LED Vermelho
#define LED_G_PIN 11 // LED Verde
#define LED_B_PIN 12 // LED Azul
#define BTN_A_PIN 5 // Botão A (Botão Azul)
#define BTN_B_PIN 6 // Botão B (Botão Vermelho)
// Funções para inicializar LEDs, botões e controle dos LEDs
void init_leds();
void init_buttons();
void set_leds(bool red, bool green, bool blue);
bool read_button(uint pin);
int main() {
// Inicializa os periféricos (LEDs e botões)
init_leds(); // Chama a função para inicializar os LEDs
init_buttons(); // Chama a função para inicializar os botões
while(1) { // Loop principal que vai controlar os LEDs com base nos botões
if (read_button(BTN_A_PIN)) { // Verifica se o Botão A foi pressionado (LED Azul acende)
set_leds(0, 0, 1); // Acende o LED Azul
}
else if (read_button(BTN_B_PIN)) { // Verifica se o Botão B foi pressionado (LED Vermelho acende)
set_leds(1, 0, 0); // Acende o LED Vermelho
}
else { // Se nenhum botão for pressionado, acende o LED Verde
set_leds(0, 1, 0); // Acende o LED Verde
}
sleep_ms(100); // Atraso de 100ms para debouncing e evitar sobrecarga no processador
}
return 0; // Não será alcançado, pois o loop é infinito
}
// Função para inicializar os LEDs como saída
void init_leds() {
gpio_init(LED_R_PIN); // Inicializa o pino do LED Vermelho
gpio_set_dir(LED_R_PIN, GPIO_OUT); // Define o pino do LED Vermelho como saída
gpio_init(LED_G_PIN); // Inicializa o pino do LED Verde
gpio_set_dir(LED_G_PIN, GPIO_OUT); // Define o pino do LED Verde como saída
gpio_init(LED_B_PIN); // Inicializa o pino do LED Azul
gpio_set_dir(LED_B_PIN, GPIO_OUT); // Define o pino do LED Azul como saída
}
// Função para inicializar os botões como entrada com pull-up
void init_buttons() {
gpio_init(BTN_A_PIN); // Inicializa o pino do Botão A
gpio_set_dir(BTN_A_PIN, GPIO_IN); // Define o pino do Botão A como entrada
gpio_pull_up(BTN_A_PIN); // Habilita o resistor pull-up interno para o Botão A
gpio_init(BTN_B_PIN); // Inicializa o pino do Botão B
gpio_set_dir(BTN_B_PIN, GPIO_IN); // Define o pino do Botão B como entrada
gpio_pull_up(BTN_B_PIN); // Habilita o resistor pull-up interno para o Botão B
}
// Função para controlar o estado dos LEDs
void set_leds(bool red, bool green, bool blue) {
gpio_put(LED_R_PIN, red); // Atualiza o estado do LED Vermelho
gpio_put(LED_G_PIN, green); // Atualiza o estado do LED Verde
gpio_put(LED_B_PIN, blue); // Atualiza o estado do LED Azul
}
// Função para ler o estado de um botão
bool read_button(uint pin) {
return !gpio_get(pin); // Retorna o estado do botão. Invertido porque usamos pull-up
}Botão A
Botão B