#include "pico/stdlib.h" #include "hardware/pio.h" #include "ws2812.h" #include "ws2812.pio.h" #define WS2812_PIN 7 #define IS_RGBW false uint32_t couleur[13]; uint32_t buffer_couleur[12]; void ws2812_set_buffer(uint32_t couleur, uint8_t index_led); void ws2812_init(){ /*couleur[0]=0x000200; couleur[1]=0x010200; couleur[2]=0x020200; couleur[3]=0x020100; couleur[4]=0x020000; couleur[5]=0x020001; couleur[6]=0x020002; couleur[7]=0x010002; couleur[8]=0x000002; couleur[9]=0x000102; couleur[10]=0x000202; couleur[11]=0x000201; couleur[12]=0x000200;*/ couleur[0]=0x002000; couleur[1]=0x102000; couleur[2]=0x202000; couleur[3]=0x201000; couleur[4]=0x200000; couleur[5]=0x200010; couleur[6]=0x200020; couleur[7]=0x100020; couleur[8]=0x000020; couleur[9]=0x001020; couleur[10]=0x002020; couleur[11]=0x002010; couleur[12]=0x002000; /*couleur[0]=0x00FF00; couleur[1]=0x80FF00; couleur[2]=0xFFFF00; couleur[3]=0xFF8000; couleur[4]=0xFF0000; couleur[5]=0xFF0080; couleur[6]=0xFF00FF; couleur[7]=0x8000FF; couleur[8]=0x0000FF; couleur[9]=0x0080FF; couleur[10]=0x00FFFF; couleur[11]=0x00FF80; couleur[12]=0x00FF00;*/ // initialisation du PIO PIO pio = pio0; int sm = 0; uint offset = pio_add_program(pio, &ws2812_program); ws2812_program_init(pio, sm, offset, WS2812_PIN, 800000, IS_RGBW); // Tout rouge ! for(uint32_t i = 0; i<12; i++){ ws2812_set_buffer_rgb(0x4, 0x1, 0, i); } ws2812_affiche_buffer(); } void ws2812_arc_en_ciel(){ while(1){ uint32_t i; sleep_ms(50); // Affichage for(i = 0; i<12; i++){ ws2812_set_buffer(couleur[i], i); } ws2812_affiche_buffer(); // Décalage des couleurs for(i = 0; i<12; i++){ couleur[i] = couleur[i+1]; } couleur[12]=couleur[0]; } } static inline void put_pixel(uint32_t pixel_grb) { pio_sm_put_blocking(pio0, 0, pixel_grb << 8u); } static inline uint32_t urgb_u32(uint8_t r, uint8_t g, uint8_t b) { return ((uint32_t) (r) << 8) | ((uint32_t) (g) << 16) | (uint32_t) (b); } void ws2812_affiche_buffer(){ for(uint32_t i = 0; i<12; i++){ put_pixel(buffer_couleur[i]); } } void ws2812_set_buffer_rgb(uint8_t rouge, uint8_t vert, uint8_t bleu, uint8_t index_led){ ws2812_set_buffer(urgb_u32(rouge, vert,bleu), index_led); } //Bit 7 6 5 4 3 2 1 0 //Data R R R G G G B B void ws2812_set_buffer_8bits(uint8_t couleur, uint8_t index_led){ ws2812_set_buffer(urgb_u32(couleur >> 5, (couleur >> 2) & 0x07, couleur & 0x03), index_led); } /// @brief Rempli le buffer à envoyer au LED, necessite d'appeler la fonction ws2812_affiche_buffer() ensuite /// @param couleur : couleur en RVB /// @param index_led : index entre 0 et 11 void ws2812_set_buffer(uint32_t couleur, uint8_t index_led){ if(index_led <12){ buffer_couleur[index_led] = couleur; } }