Gestion des LED avec clignottement et pulsation

This commit is contained in:
Samuel 2025-11-16 17:00:25 +01:00
parent 0b1fcaa085
commit d2552f198b
4 changed files with 250 additions and 10 deletions

View File

@ -15,6 +15,7 @@
"rp2040_sdio.h": "c", "rp2040_sdio.h": "c",
"util.h": "c", "util.h": "c",
"stddef.h": "c", "stddef.h": "c",
"log_usb.h": "c" "log_usb.h": "c",
"ws2812.h": "c"
} }
} }

77
main.c
View File

@ -134,6 +134,7 @@ void sd_card_gestion(){
void core1_functions(){ void core1_functions(){
while(1){ while(1){
ws2812_gestion();
ws2812_affiche_buffer(); ws2812_affiche_buffer();
sleep_ms(2); sleep_ms(2);
} }
@ -142,6 +143,10 @@ void core1_functions(){
/*------------- MAIN -------------*/ /*------------- MAIN -------------*/
int main(void) { int main(void) {
gpio_set_function(12, UART_FUNCSEL_NUM(uart0, 12));
gpio_set_function(13, UART_FUNCSEL_NUM(uart0, 13));
printf("TinyUSB Host CDC MSC HID - Logs\r\n");
multicore_launch_core1(core1_functions); multicore_launch_core1(core1_functions);
board_init(); board_init();
ws2812_init(); ws2812_init();
@ -154,15 +159,75 @@ int main(void) {
gpio_set_dir(1, GPIO_IN); gpio_set_dir(1, GPIO_IN);
gpio_pull_up(1); gpio_pull_up(1);
/*while(1){ float f;
sd_card_gestion(); absolute_time_t current_time, start_time;
start_time = get_absolute_time() / 1000.;
}*/ uint32_t couleur[13];
couleur[0]=0x000800;
couleur[1]=0x040800;
couleur[2]=0x080800;
couleur[3]=0x080400;
couleur[4]=0x080000;
couleur[5]=0x080004;
couleur[6]=0x080008;
couleur[7]=0x040008;
couleur[8]=0x000008;
couleur[9]=0x000408;
couleur[10]=0x000808;
couleur[11]=0x000804;
couleur[12]=0x000800;
uint8_t index_couleur=0;
ws2812_set_mode(LED_ID_SD_CARD, LED_CLI_RAPIDE, 0x000004);
ws2812_set_mode(LED_ID_USB, LED_CLI_NORMAL, 0x000004);
ws2812_set_mode(LED_ID_ASSERV, LED_CLI_PANIQUE_1, 0x000004);
ws2812_set_mode(LED_ID_DETECTION, LED_PULSE_RAPIDE, 0x000004);
while(1){
f = get_absolute_time() / 1000. - start_time;
f = f / 1000.;
if(f > 1){
f=1;
start_time = get_absolute_time() / 1000.;
f = 0;
index_couleur++;
if(index_couleur > 11){
index_couleur = 0;
}
}
//ws2812_set_buffer(ws2812_mix_color(couleur[index_couleur], couleur[index_couleur+1],f), 4);
ws2812_set_mode(LED_ID_SD_CARD, LED_CLI_RAPIDE, 0x000004);
ws2812_set_mode(LED_ID_USB, LED_CLI_NORMAL, 0x000004);
ws2812_set_mode(LED_ID_ASSERV, LED_CLI_PANIQUE_1, 0x000004);
ws2812_set_mode(LED_ID_DETECTION, LED_PULSE_RAPIDE, 0x000004);
ws2812_set_mode(LED_ID_DIVERS, LED_STABLE, 0x000004);
sleep_ms(3000);
ws2812_set_mode(LED_ID_SD_CARD, LED_CLI_RAPIDE, 0x000404);
ws2812_set_mode(LED_ID_USB, LED_CLI_NORMAL, 0x000404);
ws2812_set_mode(LED_ID_ASSERV, LED_CLI_LENT, 0x000404);
ws2812_set_mode(LED_ID_DETECTION, LED_CLI_PANIQUE_1, 0x000404);
ws2812_set_mode(LED_ID_DIVERS, LED_CLI_PANIQUE_2, 0x000404);
sleep_ms(3000);
ws2812_set_mode(LED_ID_SD_CARD, LED_CLI_PANIQUE_3, 0x040000);
ws2812_set_mode(LED_ID_USB, LED_PULSE_RAPIDE, 0x040000);
ws2812_set_mode(LED_ID_ASSERV, LED_PULSE_NORMAL, 0x040000);
ws2812_set_mode(LED_ID_DETECTION, LED_PULSE_LENT, 0x040000);
ws2812_set_mode(LED_ID_DIVERS, LED_STABLE, 0x040000);
sleep_ms(3000);
sleep_ms(1);
}
gpio_set_function(12, UART_FUNCSEL_NUM(uart0, 12));
gpio_set_function(13, UART_FUNCSEL_NUM(uart0, 13));
printf("TinyUSB Host CDC MSC HID - Logs\r\n");
// init host stack on configured roothub port // init host stack on configured roothub port
// à mettre avant tuh_init // à mettre avant tuh_init

151
ws2812.c
View File

@ -3,14 +3,24 @@
#include "ws2812.h" #include "ws2812.h"
#include "ws2812.pio.h" #include "ws2812.pio.h"
#include <stdio.h>
#define WS2812_PIN 15 #define WS2812_PIN 15
#define IS_RGBW false #define IS_RGBW false
#define NB_WS2812 5
uint32_t couleur[13]; uint32_t couleur[13];
uint32_t buffer_couleur[12]; uint32_t buffer_couleur[12];
struct ws2812_type_gestion_t
{
enum led_type_gestion_t led_type_gestion;
uint32_t couleur;
} ws2812_type_gestion[NB_WS2812];
void ws2812_set_buffer(uint32_t couleur, uint8_t index_led); void ws2812_set_buffer(uint32_t couleur, uint8_t index_led);
static inline uint32_t urgb_u32(uint8_t r, uint8_t g, uint8_t b);
void ws2812_init(){ void ws2812_init(){
couleur[0]=0x000200; couleur[0]=0x000200;
@ -65,6 +75,8 @@ void ws2812_init(){
// Tout rouge ! // Tout rouge !
for(uint32_t i = 0; i<12; i++){ for(uint32_t i = 0; i<12; i++){
ws2812_set_buffer_rgb(ORANGE_24BITS, i); ws2812_set_buffer_rgb(ORANGE_24BITS, i);
ws2812_type_gestion[NB_WS2812].couleur = urgb_u32(ORANGE_24BITS);
ws2812_type_gestion[NB_WS2812].led_type_gestion = PAS_DE_GESTION;
} }
ws2812_affiche_buffer(); ws2812_affiche_buffer();
} }
@ -141,6 +153,143 @@ uint32_t ws2812_mix_color(uint32_t couleur1, uint32_t couleur2, float facteur){
uint8_t r, g, b; uint8_t r, g, b;
b = (couleur1 & 0xFF) * (1 - facteur) + (couleur2 & 0xFF) * facteur; b = (couleur1 & 0xFF) * (1 - facteur) + (couleur2 & 0xFF) * facteur;
r = ((couleur1 & 0xFF00)>> 8) * (1 - facteur) + ((couleur2 & 0xFF00)>> 8) * facteur; r = ((couleur1 & 0xFF00)>> 8) * (1 - facteur) + ((couleur2 & 0xFF00)>> 8) * facteur;
g = ((couleur1 & 0xFF0000)>> 16) * (1 - facteur) + ((couleur2 & 0xFF00)>> 16) * facteur; g = ((couleur1 & 0xFF0000)>> 16) * (1 - facteur) + ((couleur2 & 0xFF0000)>> 16) * facteur;
return urgb_u32(r, g, b); return urgb_u32(r, g, b);
} }
void ws2812_set_mode(uint8_t led_id, enum led_type_gestion_t led_type_gestion, uint32_t couleur){
if(led_id < NB_WS2812){
ws2812_type_gestion[led_id].couleur = couleur;
ws2812_type_gestion[led_id].led_type_gestion = led_type_gestion;
}
}
void ws2812_gestion(void){
uint32_t temps_ref;
uint8_t nb_cli;
uint8_t phase_led;
float f;
for(int led_id = 0; led_id < NB_WS2812; led_id++){
switch (ws2812_type_gestion[led_id].led_type_gestion)
{
case PAS_DE_GESTION:
break;
case LED_STABLE:
ws2812_set_buffer(ws2812_type_gestion[led_id].couleur, led_id);
break;
case LED_CLI_RAPIDE:
if((get_absolute_time() / 50000) % 2){
ws2812_set_buffer(ws2812_type_gestion[led_id].couleur, led_id);
}else{
ws2812_set_buffer(0x000000, led_id);
}
break;
case LED_CLI_NORMAL:
if((get_absolute_time() / 200000) % 2){
ws2812_set_buffer(ws2812_type_gestion[led_id].couleur, led_id);
}else{
ws2812_set_buffer(0x000000, led_id);
}
break;
case LED_CLI_LENT:
if((get_absolute_time() / 1000000) % 2){
ws2812_set_buffer(ws2812_type_gestion[led_id].couleur, led_id);
}else{
ws2812_set_buffer(0x000000, led_id);
}
break;
case LED_CLI_PANIQUE_1:
temps_ref =100000;
nb_cli = 1;
phase_led =(get_absolute_time() / temps_ref) % (nb_cli*2 + 4) ;
printf(">l:%d\n", phase_led);
if(phase_led >= nb_cli*2){
ws2812_set_buffer(0x000000, led_id);
}else{
printf(">l1:%d\n",phase_led );
if(phase_led % 2){
ws2812_set_buffer(ws2812_type_gestion[led_id].couleur, led_id);
}else{
ws2812_set_buffer(0x000000, led_id);
}
}
break;
case LED_CLI_PANIQUE_2:
temps_ref =100000;
nb_cli = 2;
phase_led =(get_absolute_time() / temps_ref) % (nb_cli*2 + 4) ;
if(phase_led >= nb_cli*2){
ws2812_set_buffer(0x000000, led_id);
}else{
if(phase_led % 2){
ws2812_set_buffer(ws2812_type_gestion[led_id].couleur, led_id);
}else{
ws2812_set_buffer(0x000000, led_id);
}
}
break;
case LED_CLI_PANIQUE_3:
temps_ref =100000;
nb_cli = 3;
phase_led =(get_absolute_time() / temps_ref) % (nb_cli*2 + 4) ;
if(phase_led >= nb_cli*2){
ws2812_set_buffer(0x000000, led_id);
}else{
if(phase_led % 2){
ws2812_set_buffer(ws2812_type_gestion[led_id].couleur, led_id);
}else{
ws2812_set_buffer(0x000000, led_id);
}
}
break;
case LED_PULSE_LENT:
temps_ref = 3000000;
if((get_absolute_time() / temps_ref) % 2){
f = (float)(get_absolute_time() % temps_ref) / (float)temps_ref;
ws2812_set_buffer(ws2812_mix_color(0, ws2812_type_gestion[led_id].couleur, f), led_id);
}else{
f = (float)(get_absolute_time() % temps_ref) / (float)temps_ref;
ws2812_set_buffer(ws2812_mix_color(ws2812_type_gestion[led_id].couleur, 0, f), led_id);
}
break;
case LED_PULSE_NORMAL:
temps_ref = 1000000;
if((get_absolute_time() / temps_ref) % 2){
f = (float)(get_absolute_time() % temps_ref) / (float)temps_ref;
ws2812_set_buffer(ws2812_mix_color(0, ws2812_type_gestion[led_id].couleur, f), led_id);
}else{
f = (float)(get_absolute_time() % temps_ref) / (float)temps_ref;
ws2812_set_buffer(ws2812_mix_color(ws2812_type_gestion[led_id].couleur, 0, f), led_id);
}
break;
case LED_PULSE_RAPIDE:
temps_ref = 200000;
if((get_absolute_time() / temps_ref) % 2){
f = (float)(get_absolute_time() % temps_ref) / (float)temps_ref;
ws2812_set_buffer(ws2812_mix_color(0, ws2812_type_gestion[led_id].couleur, f), led_id);
}else{
f = (float)(get_absolute_time() % temps_ref) / (float)temps_ref;
ws2812_set_buffer(ws2812_mix_color(ws2812_type_gestion[led_id].couleur, 0, f), led_id);
}
break;
default:
break;
}
}
}

View File

@ -1,12 +1,37 @@
#include "pico/stdlib.h" #include "pico/stdlib.h"
enum led_type_gestion_t{
PAS_DE_GESTION,
LED_STABLE,
LED_CLI_RAPIDE,
LED_CLI_NORMAL,
LED_CLI_LENT,
LED_CLI_PANIQUE_1,
LED_CLI_PANIQUE_2,
LED_CLI_PANIQUE_3,
LED_PULSE_RAPIDE,
LED_PULSE_NORMAL,
LED_PULSE_LENT
};
void ws2812_init(void); void ws2812_init(void);
void ws2812_affiche_buffer(void); void ws2812_affiche_buffer(void);
void ws2812_set_buffer_rgb(uint8_t rouge, uint8_t vert, uint8_t bleu, uint8_t index_led); void ws2812_set_buffer_rgb(uint8_t rouge, uint8_t vert, uint8_t bleu, uint8_t index_led);
void ws2812_set_rgb(uint8_t rouge, uint8_t vert, uint8_t bleu, uint8_t index_led); void ws2812_set_rgb(uint8_t rouge, uint8_t vert, uint8_t bleu, uint8_t index_led);
void ws2812_set_buffer_8bits(uint8_t couleur, uint8_t index_led); void ws2812_set_buffer_8bits(uint8_t couleur, uint8_t index_led);
void ws2812_set_buffer(uint32_t couleur, uint8_t index_led);
void ws2812_arc_en_ciel(void); void ws2812_arc_en_ciel(void);
void ws2812_set_led(uint8_t led, uint32_t couleur); void ws2812_set_led(uint8_t led, uint32_t couleur);
void ws2812_set_mode(uint8_t led_id, enum led_type_gestion_t led_type_gestion, uint32_t couleur);
void ws2812_gestion(void);
uint32_t ws2812_mix_color(uint32_t couleur1, uint32_t couleur2, float facteur);
#define LED_ID_SD_CARD 0
#define LED_ID_USB 1
#define LED_ID_ASSERV 2
#define LED_ID_DETECTION 3
#define LED_ID_DIVERS 4
#define OFF_24BITS 0, 0, 0 #define OFF_24BITS 0, 0, 0
#define ORANGE_24BITS 4, 1, 0 #define ORANGE_24BITS 4, 1, 0