/*
por: Atenilton Santos de Souza Júnior
*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pio.h"
#include "ws2812b.pio.h"
// definindo os pinos de cada componente
#define matriz 7 // pino da matriz de led
#define total 25 // número total de leds da matriz
#define ba 5 // Botão A
#define bb 6 // Botão B
#define blue 11 // led azul
#define green 12 // led verde
#define red 13 // Led vermelho
int ev = 2; // Quantidade de eventos para chamada dos botões
int estado = 0; // Estado atual
// Função para converter a posição do matriz para uma posição do vetor
int getIndex(int x, int y) {
if (y % 2 == 0) {
return 24 - (y * 5 + x);
} else {
return 24 - (y * 5 + (4 - x));
}
}
// Funções para a configuração da matriz de led
struct pixel_t {
uint8_t R, G, B;
};
typedef struct pixel_t npLED_t;
npLED_t leds[total];
PIO np_pio;
uint sm;
void bf() {
for (uint i = 0; i < total; ++i) {
pio_sm_put_blocking(np_pio, sm, leds[i].R);
pio_sm_put_blocking(np_pio, sm, leds[i].G);
pio_sm_put_blocking(np_pio, sm, leds[i].B);
}
sleep_us(100);
}
void controle(uint pin) {
uint offset = pio_add_program(pio0, &ws2812b_program);
np_pio = pio0;
sm = pio_claim_unused_sm(np_pio, true);
ws2812b_program_init(np_pio, sm, offset, pin, 800000.f);
for (uint i = 0; i < total; ++i) {
leds[i].R = leds[i].G = leds[i].B = 0;
}
bf();
}
void cor(const uint index, const uint8_t r, const uint8_t g, const uint8_t b) {
leds[index].R = r;
leds[index].G = g;
leds[index].B = b;
}
void desliga() {
for (uint i = 0; i < total; ++i) {
cor(i, 0, 0, 0);
}
bf();
}
void botao_callback_A(uint gpio, uint32_t events) {
estado = (estado + 1) % ev;
}
void botao_callback_B(uint gpio, uint32_t events) {
estado = (estado - 1 + ev) % ev; // Decremento circular
}
void chuva() {
int tempo_do_frame = 200;
int duracao_total = 10 * 1000;
int frames_totais = duracao_total / tempo_do_frame;
int matriz[5][5] = {
{24, 23, 22, 21, 20},
{15, 16, 17, 18, 19},
{14, 13, 12, 11, 10},
{5, 6, 7, 8, 9},
{4, 3, 2, 1, 0}};
for (int frame = 0; frame < frames_totais; frame++) {
int chuva[5][5][3] = {0};
for (int coluna = 0; coluna < 5; coluna++) {
int linhaAleatoria = rand() % 5;
chuva[linhaAleatoria][coluna][0] = rand() % 256;
chuva[linhaAleatoria][coluna][1] = rand() % 256;
chuva[linhaAleatoria][coluna][2] = rand() % 256;
}
for (int linha = 0; linha < 5; linha++) {
for (int coluna = 0; coluna < 5; coluna++) {
cor(matriz[linha][coluna], chuva[linha][coluna][0], chuva[linha][coluna][1], chuva[linha][coluna][2]);
}
}
bf();
sleep_ms(tempo_do_frame);
desliga();
}
}
int main() {
controle(matriz);
gpio_init(ba);
gpio_init(bb);
gpio_set_dir(ba, GPIO_IN);
gpio_set_dir(bb, GPIO_IN);
gpio_pull_up(ba);
gpio_pull_up(bb);
gpio_set_irq_enabled_with_callback(ba, GPIO_IRQ_EDGE_FALL, true, &botao_callback_A);
gpio_set_irq_enabled_with_callback(bb, GPIO_IRQ_EDGE_FALL, true, &botao_callback_B);
while (1) {
switch (estado) {
case 0:
desliga();
break;
case 1:
chuva();
break;
}
sleep_ms(500);
}
}Loading
pi-pico-w
pi-pico-w