Générer des salves d'impulsions

Bonjour @ProfesseurMephisto

Les ESP32 ont un module RMT (Remote Control Transceiver) conçu pour générer/recevoir des salves d'impulsions (modulées ou pas.)
https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/peripherals/rmt.html

Par contre je ne suis pas certain que le core ESP32 pour Arduino permet de gérer simplement ce module RMT

Oui d'après DepSeek qui propose le code suivant pour faire produire par le module hardware RMT 5 impulsions identiques dont les états hauts et bas durent 250ms
Non testé, sI OK une fois configuré le module RMT et défini le 'profil' de la salve à émettre , un simple appel de fonction (non bloquante) permet d'envoyer une salve prédéfinie

#include <driver/rmt.h>

#define RMT_TX_CHANNEL RMT_CHANNEL_0  // Canal RMT à utiliser
#define RMT_TX_GPIO_NUM 4             // GPIO à utiliser pour la sortie

void setup() {
  // Configuration du canal RMT
  rmt_config_t config;
  config.rmt_mode = RMT_MODE_TX;
  config.channel = RMT_TX_CHANNEL;
  config.gpio_num = (gpio_num_t)RMT_TX_GPIO_NUM;
  config.mem_block_num = 1;
  config.tx_config.loop_en = false;
  config.tx_config.carrier_en = false;
  config.tx_config.idle_output_en = true;
  config.tx_config.idle_level = RMT_IDLE_LEVEL_LOW;
  config.clk_div = 80;  // Diviseur d'horloge (80 MHz / 80 = 1 MHz → 1 tick = 1 µs)

  rmt_config(&config);
  rmt_driver_install(config.channel, 0, 0);
  
  // Création des impulsions
  const int pulse_count = 10;  // 5 impulsions = 10 transitions (haut+bas)
  rmt_item32_t items[pulse_count];
  
  // Durées en µs (250 ms = 250000 µs)
  const uint32_t high_duration = 250000;
  const uint32_t low_duration = 250000;  // Même durée pour l'état bas dans cet exemple
  
  // Remplir le tableau d'items
  for (int i = 0; i < pulse_count; i++) {
    items[i].duration0 = (i % 2 == 0) ? high_duration : low_duration;
    items[i].level0 = (i % 2 == 0) ? 1 : 0;
    items[i].duration1 = 0;
    items[i].level1 = 0;
  }
  
  // Envoyer les impulsions
  rmt_write_items(RMT_TX_CHANNEL, items, pulse_count, true);
}

void loop() {
  // Ne rien faire ici
}
`...