Random sur uniquement 3 relais pour module relais 8

Bonjour à tous,
Je suis coincé sur un code avec un random sur les relais.
Je souhaite faire fonctionner en aléatoire juste 3 relais (ils peuvent aussi s'activer les 3 en même temps).
J'utilise une carte arduino uno basique et un relais 8.
voila mon code

void setup() {
  for (uint8_t relay = 6; relay < 14; relay++) pinMode(relay, OUTPUT);
}
void loop() {
  digitalWrite(6 + random(9), random(2));
  delay(random(500, 1000));
}

là où j'ai du mal c'est que tout les relais peuvent s'allumer et je n'en veux que 3.

Quelqu'un pourrait il me venir en aide?

Merci encore pour vos réponses.

C'est 3 particuliers ou c'est 3 parmi 8?

Bonjour!
c'est 3 parmi les huit.
merci

Bonjour surveritisme

Si random(9) sort 2 fois le même port, on a que 2 relais qui tirent sur 3, juste?

Cordialement
jpbbricole

Ton code actuel n'en allume qu'un à la fois. Donc tu ne peux pas les allumer tous en même temps.

La définition de ton besoin est incomplète.
Est-ce qu'il doit toujours y avoir 3 sorties actives?
Les sorties étant actives pour un temps aléatoire, indépendamment les unes des autres, est-ce que l'on attend qu'une sortie soit devenue inactive pour en activer une nouvelle, ou on attend que toutes les sorties soient devenues inactives, ou bien on en active une nouvelle toutes les n secondes?

Autrement pour gérer des phénomènes liés au temps il y a cette librairie

Mais tu pourras en trouver d'autres sur le net aussi.

Bonjour,
Si justement, ils peuvent s'allumer tous en même temps!
Ce que je veux c'est juste que 3 s'allument sur les 8.
merci de votre réponse en tout cas

non, ils s'allument tous au bout d'un moment

Bonjour Bonjour surveritisme

Pour résumer, à chaque tour de loop() on allume ou on éteint au hasard 3 LED sur 3 ports sur 8, choisis au hasard, on fait une pause, on éteint toutes les LED puis on recommence une nouvelle séquence.
Juste?

Cordialement
jpbbricole

Le plus trivial, c'est de faire un tableau contenant les possibilités (je crois qu'il y en a 56, mais c'est pas sûr). On prends une possibilité au hasard, et on l'affiche.

Pour 8 relais qui ont chacun 2 états, on peut l'écrire sur un octet. En binaire, cela peut faire par exemple 0b01001100 avec bit à 1 -> relais collé, bit à 0 -> relais décollé. Le tableau commence par exemple par

const uint8_t possibilites[56] = {
   0b11100000,
   0b11010000,
   0b11001000,
   0b11000100,
   0b11000010,
   0b11000001,
   0b10110000,
   0b10101000,
   0b10100100,
   0b10100010,
   0b10100001,
   0b10011000,
 ...

Pour avoir un état possible:
etat = possibilites[random(56)];

Pour changer l'état des relais:

for (uint8_t relay = 0; relay < 8; relay++)
{
  if ((etat & (1 << relay)) > 0) digitalWrite(6 + relay, HIGH); 
  else digitalWrite(6 + relay, LOW);
}

Une autre optionc’est de faire un tableau de 8 cases qui contient les chiffres de 0 à 7 (ou les numéros des pins dans notre cas) et à chaque tour de loop on le mélange et on prend les 3 premiers (ou un nombre aléatoire entre 1 et 3 si on en veut jusqu’à 3)

Ca se fait avec un algo classique le Mélange de Fisher-Yates — Wikipédia

Il semblerait qu'il y ait une variable supplémentaire puisque @surveritisme introduit une durée aléatoire différente pour chacune des sorties, d'où mes questions au #5.

Pour être clair, on ne sait pas ce que l'OP veut faire exactement.

Pas clair pour moi:

A partir d'un état donné, par exemple les relais 6, 7 et 8 activées, on ne peut pas avoir une nouvelle fois les sorties 6, 7 et 8 activées. Le nouvel état n'est pas un "mélange quelconque", mais un "mélange quelconque différent du précédent". Mais dans notre cas présent cela peut suffire.

Pas faux, cela permettra de répondre comme @surveritisme le pense et pas comme nous avons compris qu'il le pense

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.