#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "pico/stdlib.h"
#include "hardware/pio.h"
#include "hardware/clocks.h"
#include "pico/bootrom.h"
//arquivo .pio
#include "pio_matrix.pio.h"
//número de LEDs
#define NUM_PIXELS 25
//pino de saída
#define OUT_PIN 7
//vetores para as imagens
double desenho1[25] = {0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0,
1.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0};
double desenho2[25] = {0.0, 0.0, 0.0, 0.0, 0.0,
1.0, 0.0, 0.0, 0.0, 0.0,
1.0, 1.0, 0.0, 0.0, 0.0,
1.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0};
double desenho3[25] = {0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0, 0.0,
1.0, 1.0, 1.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0};
double desenho4[25] = {0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0, 0.0,
1.0, 1.0, 1.0, 1.0, 0.0,
0.0, 0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0};
double desenho5[25] = {0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 1.0, 0.0,
1.0, 1.0, 1.0, 1.0, 1.0,
0.0, 0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0};
//vetor de ponteiros para os desenhos
double *desenhos[] = {desenho1, desenho2, desenho3, desenho4, desenho5};
const int num_desenhos = 5;
//rotina para definição da intensidade de cores do led
uint32_t matrix_rgb(double b, double r, double g) {
unsigned char R, G, B;
R = r * 255;
G = g * 255;
B = b * 255;
return (G << 24) | (R << 16) | (B << 8);
}
//rotina para acionar a matrix de leds - ws2812b
void desenho_pio(double *desenho, uint32_t valor_led, PIO pio, uint sm, double r, double g, double b) {
for (int16_t i = 0; i < NUM_PIXELS; i++) {
if (i % 2 == 0) {
valor_led = matrix_rgb(desenho[24 - i], r = 0.0, g = 0.0);
} else {
valor_led = matrix_rgb(b = 0.0, desenho[24 - i], g = 0.0);
}
pio_sm_put_blocking(pio, sm, valor_led);
}
}
//função principal
int main() {
PIO pio = pio0;
bool ok;
uint32_t valor_led;
double r = 0.0, b = 0.0 , g = 0.0;
//configura o clock para 128 MHz
ok = set_sys_clock_khz(128000, false);
stdio_init_all();
printf("Iniciando a transmissão PIO\n");
if (ok) printf("Clock set to %ld Hz\n", clock_get_hz(clk_sys));
//configurações da PIO
uint offset = pio_add_program(pio, &pio_matrix_program);
uint sm = pio_claim_unused_sm(pio, true);
pio_matrix_program_init(pio, sm, offset, OUT_PIN);
//loop principal
int indice_desenho = 0;
while (true) {
desenho_pio(desenhos[indice_desenho], valor_led, pio, sm, r, g, b);
indice_desenho = (indice_desenho + 1) % num_desenhos; // alterna entre os desenhos
sleep_ms(500); // intervalo entre as transições
}
return 0;
}