Générer des salves d'impulsions

Bonjour ProfesseurMephisto

Inspiré de ton exemple, mais "arrangé" différemment :wink:

Le programme:

struct relais {
	int GPIO;
	int count = 0;
	unsigned long start = 0;
};

relais commande[5];
const int relaisOnEtat = LOW; // Etat qui fait tirer les relais

const int periodeClic = 600;

void setup()
{
	Serial.begin(115200);
	commande[0].GPIO = 1;
	commande[1].GPIO = 2;
	commande[2].GPIO = 42;
	commande[3].GPIO = 41;
	commande[4].GPIO = 40;

	for (int i = 0; i < 5; ++i)
	{
		pinMode(commande[i].GPIO, OUTPUT);
		digitalWrite(commande[i].GPIO, !relaisOnEtat); // Faire tomber les relais
	}

	delay(1000);	
	clicStart(0, 12); // 12 impulsions sur le port 0
	clicStart(2, 20); // 20 impulsions sur le port 2
	clicStart(4, 15); // 15 impulsions sur le port 4
}

void loop()
{
	clicclic();
}

void clicclic()
{
	for (int i = 0; i < 5; ++i)
	{
		if (commande[i].count > 0) // il reste des impulsions à faire
		{
			if (millis() - commande[i].start >= periodeClic / 2) // Si une demi période é échéance
			{	
				digitalWrite(commande[i].GPIO, !digitalRead(commande[i].GPIO)); // Inverser le relais
				commande[i].start = millis(); // Redémarrage du chrono
				commande[i].count --; // Décrémenter les demi périodes
			}
		}
	}
}

void clicStart(int portNum, int pulsesNbr)
{
	commande[portNum].count = pulsesNbr * 2; // Salve de demi périodes
	commande[portNum].start = millis(); // Démarrage chrono
}

Cordialement
jpbbricole