Intéger ramdon millis en double fonction

Bonjour,

J'aimerai dans un même programme avoir deux fois le programme ci-joint et donc d'avoir deux tempo différentes dans le même programme. Je dois pouvoir régler les deux tempo séparément.
La première tempo serait sur la sortie 13, la deuxième sur sortie 12.
Je ne vois pas comment faire, voulez-vous m'aider, merci

Tempo_Random_Millis.ino (386 Bytes)

bonjour

...
if (dateCourante - dateDernierChangement > delaiAleatoire)
...

si tu gérais 2 dateDernierChangement et 2 delaiAleatoire différents, 1 pour chaque fonction, tu ne penses pas que ça pourrait régler ton souci ?

Merci pour ta réponse 5_cylindres,
Oui, mais comment les rendre différent ?
Peux-tu me rappeler comment utiliser la fenêtre "code sélect", merci

dans la fenêtre "Reply" tu cliques sur "</>" en haut à gauche, puis tu colles ton code entre les 2 "code" entre crochets qui apparaissent.

pour tes variables, c'est simple : tu veux déjà dupliquer ta fonction, donc tu vas devoir les nommer différemment chacune, genre fonction1 et fonction2.
tu fais pareil pour tes variables : delai1, delai2, changement1, changement2.
il n'y a que dateCourante qui reste unique.

Merci pour ta réponse j'essaie ça et te dis quoi

ton code :

unsigned long dateDernierChangement = 0;
unsigned long delaiAleatoire;

void setup()
{
	pinMode(13, OUTPUT);
	delaiAleatoire = random(10, 9000);
}

void loop()
{
	unsigned long dateCourante = millis();
	if (dateCourante - dateDernierChangement > delaiAleatoire)
	{
		dateDernierChangement = dateCourante;
		delaiAleatoire = random(10,500);//(500, 3000)
		digitalWrite(13, ! digitalRead(13));
	}
}

je rectifie ce que j'ai écrit plus haut : tu n'appelles pas de fonction, donc je suppose que tu vas dupliquer ton if, mais le reste est toujours valable (dupliquer les variables).

Voilà ce que j'ai fait et qui fonctionne, dis-moi si tu trouves ça correcte.

unsigned long dateDernierChangement1 = 0;
unsigned long delaiAleatoire1;

unsigned long dateDernierChangement2 = 0;
unsigned long delaiAleatoire2;

void setup() {
pinMode(13, OUTPUT);
delaiAleatoire1 = random(400, 5500);
pinMode(12, OUTPUT);
delaiAleatoire2 = random(100, 7000);
}

void loop() {
unsigned long dateCourante = millis();
if (dateCourante - dateDernierChangement1 > delaiAleatoire1){
dateDernierChangement1 = dateCourante;
delaiAleatoire1 = random(400,5500);
digitalWrite(13, ! digitalRead(13));
}
if (dateCourante - dateDernierChangement2 > delaiAleatoire2){
dateDernierChangement2 = dateCourante;
delaiAleatoire2 = random(10,9000);
digitalWrite(12, ! digitalRead(12));
}
}

bonjour,

que dire de plus, tu l'écris toi-même : ça fonctionne.

bienvenue dans le monde du pseudo-multi-tâches !

Puisse-je te demander encore un petit coup de main afin m'aiguiller pour ajouter à ce programme une programmation qui permet à l'aide d'un Switch de mettre les sortie 12 et 13 à 0 pendant un certain temps programmable, par ex. si le Switch passe de 0 à 1 une tempo bloque pendant un certain temps les sorties 12 et 13, merci

bonjour,

précise ton cahier des charges : action(s) à effectuer lors de chaque événement (0>1;stable;1>0;etc...)

à+

Tu reprends le programme que j'ai mis au poste 21. Dans ce programme les sorties 12 et 13 vont passer aléatoirement de 0 à 1 continuellement tant que le programme tourne. Ce que j'aimerai faire, c'est de pouvoir simplement à l'aide d'un Switch extérieur, de mettre à n'importe quel moment à l'aide de ce switch, les sortie 12 et 13 à 0 pendant un certain temps (temps que l'on peut modifier).
J'espère que je me suis fais comprendre sinon dis-le moi. Merci

Bonjour,

Quand tu parles de switch je suppose que tu veux parler d'un bouton. Un switch a deux (ou plus) états stables, un bouton a une action fugitive.

Quand ton bouton vient d'être enfoncé tu mémorises le temps millis() par exemple dans millisDebut et tant que millis() - millisDebut < delai au lieu d'effectuer le clignotement tu éteins les leds.

Bonjour,

J'ai fais un cahier de charge comme demandé, c'est plus clair à comprendre.
Je pensais au micro Switch en parlant d'un Switch, je vais utiliser à l'avenir Bouton Poussoir (BP).

Voici le cahier de charge :

Le BP est raccordé à une entrée (par ex.11) et permet le passage de l'etat 0 à 1 de cette entrée.

Si entrée 11 est à 1, les sorties 12, 13 passe à 0 pendant un temps que l'on peut déterminer (par ex. 6 secondes).
Si entrée 11 reste à 1, les sorties restent à 0
Si entrée 11 passe à 0, les sorties 12, 13 reste à 0 pendant 6 secondes puis repasse à 1.

Je ne sais pas si le programme du trigger ci-dessous peut-être une piste, mais je ne vois pas comment l'intégrer à mon programme.

//Tempo trigger avec BP
const int trigger = 2; 
const int output =  3; (à remplacer par 12, 13)
int Time =3000;        

void setup() {
 pinMode(output, OUTPUT);
 pinMode(trigger, INPUT);
}
void loop() {

 if (digitalRead(trigger) == HIGH) {
    digitalWrite(output, HIGH);
    delay(Time);//BP trigger
    digitalWrite(output, LOW);
}
}

kamill, je ne comprends pas ce que tu veux faire !

C'est facile de l'intégrer dans ton programme

void loop() {
  if (digitalRead(trigger) == HIGH) {
    digitalWrite(12, LOW);
    digitalWrite(13, LOW);
    delay(Time);//BP trigger
  }

  unsigned long dateCourante = millis();
  if (dateCourante - dateDernierChangement1 > delaiAleatoire1) {
    dateDernierChangement1 = dateCourante;
    delaiAleatoire1 = random(400, 5500);
    digitalWrite(13, ! digitalRead(13));
  }
  if (dateCourante - dateDernierChangement2 > delaiAleatoire2) {
    dateDernierChangement2 = dateCourante;
    delaiAleatoire2 = random(10, 9000);
    digitalWrite(12, ! digitalRead(12));
  }
}

Par contre ce n'est pas la meilleure solution car ça bloque complètement le programme pendant le durée Time

Comme tu utilise INPUT, ça suppose qu'il y a une résistance de pulldown sur le bouton. Est ce bien le cas?

Ca fonctionne impec. pas de blocage pendant durée Time.

Un sincère merci à tous les deux pour votre rapidité dans vos réponses et vos conseils.

Bonjour,

Pour terminer sur les temporisations.
J'ai essayé d'applique le même principe du trigger avec une tempo faite avec Delay (programme ci-joint), mais contrairement de la tempo faite avec Millis, celle faite avec Delay, "int Time =3000" du trigger bloque le programme.

Le cahier de charge restant le même qu'avec millis.
Le BP est raccordé à une entrée (par ex.11) et permet le passage de l'etat 0 à 1 de cette entrée.
Si entrée 11 est à 1, les sorties 12, 13 passe à 0 pendant un temps que l'on peut déterminer (par ex. 6 secondes).
Si entrée 11 reste à 1, les sorties restent à 0
Si entrée 11 passe à 0, les sorties 12, 13 reste à 0 pendant 6 secondes puis repasse à 1.
Pourriez-vous me conseiller, merci

int ledPin1 = 13;                 
long randOn = 0;                 
long randOff = 0;                

void setup() {                    
 randomSeed (analogRead (0));   
 pinMode(ledPin1, OUTPUT);   
}

void loop() {                    
randOn = random (0, 1000);    
randOff = random (0, 100);   
digitalWrite(13, HIGH);  
delay(randOn);                
digitalWrite(13, LOW);   
delay(randOff);               
}