Utiliser valeur du potentiomètre pour décaler une action

Bonjour à tous,
Dans le cadre de mon projet actuellement en préparation, j'aimerais pouvoir augmenter ou diminuer le temps à l'aide d'un potentiomètre pour décaler le déclenchement d'une action.
Je m'explique, j'ai une barrière infrarouge, cette barrière une fois déclenché déclenche une action. Avec un potentiomètre j'aimerais donc pouvoir temporiser (ajouter quelques secondes) entre le moment ou celle-ci est déclenché et le moment ou l'action doit être faite.
Déclenchement ---> potentiomètre = décalage de 1,5 secondes ---> action
Les 1,5 secondes sont données à titre indicatif mais il faut que je puisse agir pour baisser à 0,6 secondes (exemple) à 3 secondes.
Merci pour vos lumières

EDIT :

J'ai édité ce post après avoir eu différentes réponses. C'est en effet plus clair mais la solution n'est pas encore trouvé...

Voilà je récupère sur la sortie Analogique 1 une valeur comprise entre 0 et 1023. Avec la fonction map, je récupère donc une valeur du potentiomètre entre 0 et 100 qui seront des secondes. Donc de 0 à 100 secondes.

Maintenant je souhaite utiliser cette valeur pour décaler dans le temps l'action A. donc action A+resultat potentiomètre= A+0 à 100 secondes.

Voilà en espérant avoir été assez clair.

delay(1500); //Attendre 1.5s

Voir ici delay() - Arduino Reference

Merci pour ta réponse, mais la fonction delay n'est pas relié au potentiomètre et bloque le programme pour la suite...

gunsman76:
Merci pour ta réponse, mais la fonction delay n'est pas relié au potentiomètre et bloque le programme pour la suite...

bonjour
ton potentiometre va renvoyer une valeur comprise entre 0 et 1023 sur une entrée ana de l'arduino

sert toi de la fonction millis() qui n'est pas bloquante en appliquant un facteur derivé du potentiometre
entre 0 et 1000 (pour faire simple) avec un multiplicateur de 1 tu aura une latitude de 1000 ms = 1 seconde resolution 1 ms
avec un multi de 10 latitude de 10 seconde avec une resolution de 10 ms
etc ...

A merci !

Je me demandais si c'était possible c'est donc parfaitement réalisable.

Oui il ne faut pas que cela bloque, car pour tout expliquer lorsque le déclenchement se fait, je pas 3 pin en mode HIGH mais chacun des pin à une temporisation différentes en fonction justement du potentiomètre (donc 3 potentiomètres puisque je vais gérer 3 pin).

Les petits montages simple sont simple (la Palisse...) mais lorsqu'on veut vraiment adapter l'arduino à une fonction bien spécifique il faut faire marcher la matière grise !

delay(analogRead(PinPotard)*facteur);

La fonction delay ne va pas trop bloquer mon programme ?

1 --> déclenchement

2 --> action 1 + 1,2 secondes sur pin 5
3 --> action 2 + 1,4 secondes sur pin 6
4 --> action 3 + 1,8 secondes sur pin 7

les secondes peuvent être plus ou moins importante et toujours par rapport au déclenchement.

// déclenchement à t=0
delay(1200;) //Attendre t=1.2 s
// Action 1,2 secondes sur pin 5

delay(200); // 200 ms plus tard, soit t=1.4 s
//Action 1,4 secondes sur pin 6

delay(400); //400 ms plus tard soit t = 1.8 s
// action 1,8 secondes sur pin 7

Sinon avec la fonction millis() et des tests sur t

Merci à tous pour vos réponses, mais en fait soit je me suis mal exprimé, soit vous m'avez mal compris.

Les temps que je donne ne sont pas figé... c'est pour ça qu'il me faut un potard pour justement pouvoir intervenir sur le temps entre le moment ou la cellule détecte l'objet et le moment ou l'on passe à l'action.

Sinon je n'aurais embêter personne, j'aurais justement joué avec la fonction delay.

J'ai un déclenchement A, je souhaite que ce déclenchement déclenche une action X seconde plus tard. Sachant que X est déterminé par la position du Potard.

Voilà en espérant avoir été plus clair.

Donc dans le programme, il ne faut pas que j'ai une fonction delay

Merci encore pour votre aide

Interruption temporelle :

long Depart;
boolean Flag;
....
if(digitalRead(10)==HIGH){ // un bouton est appuyé
Depart=millis(); 
Flag=TRUE;  // on lève le flag pour signigier une nouvelle action
}

if((millis()-Depart)>analogRead(Potar*Facteur) && Flag==TRUE){   // si le temps est écoulé et que l'action ne s'est pas déjà produite
Action();
Flag=FALSE; // le flag est abaissé pour eviter de relancer Action() au prochain passage
}

Quand tu dis "bouton appuyer" en fait c'est le déclenchement de L'infrarouge ?

Oui, bah je vais pas t'écrire tout le code non plus :wink:

Non !!!

Et merci beaucoup, j'ai fait un pas de géant aujourd'hui !

Un grand merci à tous ceux qui ont répondu.

Demain après midi, je commence mon petit code, je vous tiendrai au courant au fur et à mesure de son évolution.

Bonjour,

Juste pour information il existe un fonction toute prête pour "mapper" deux fourchettes de valeur :wink:

delay(map(analogRead(A0), 0, 1023, 1000, 10000)); // délai entre 1s et 10s suivant la valeur du potentiomètre

La fonction delay va stopper le programme et empêcher l'execution des autres tâches ?

Déjà il faut modérer le terme de tâche sur Arduino : il ne peut pas executer plusieurs tâche à la fois comme sur un PC par exemple. En revanche il tourne à 16 mhz, et bien souvent on utilise moins de 1% de la capacité de calcul, ce qui fait qu'on peut très bien executer une tache, puis uen autre et que celà soit completement transparent pour l'utilisateur.

Le delay() consiste à faire tourner l'atmega dans le vide, ce qui bloque le code un certain temps à cette ligne la donc pendant ce temps on ne peut rien faire. L'astuce consite plutot à vérifier à chaque boucle avec la fonction millis() si le temps voulu s'est écouler, comme si tu étais dans un bureau à surveiller l'horloge pour executer une autre tache. Tu scrute l'heure en permanence mais tu peux taper à l'ordianteur par exemple, et quand l'heure vient tu vas te chercher un café :wink:

Le problème est un peu plus compliqué qu'il n'y parait.

En fait je ne veux pas utiliser la commande delay tout simplement parce que le nombre de tâche à effectuer et d'environ 50 par minutes...

chaque fois que l'IR est déclenché (donc environ 50 fois par minutes, chiffre qui peut évoluer à la baisse mais au minimum 26), chaque déclenchement doit entrainer la mise au niveau haut de 3 sortie de l'arduino décalé dans le temps de 0,5 à 5 secondes. Mais ce qui complique encore c'est que les 3 sorties ne sont pas déclenché ensemble mais décalé.

Déclenchement = décalage
Déclenchement = décalage

Etc...

et ceci multiplié par au maximum 50 fois par minutes

Voilà pourquoi j'hésite à utiliser delay sur le potentiomètre, car j'ai peur qu'un déclenchement suivant soit bloqué ou pas vu car la fonction delay a été utilisé

C'est justement ce que B@tto t'explique, au lieu d'utiliser delay() tu utilises millis() qui bien que plus laborieux à utiliser dans ce contexte, ne bloque pas le déroulement de la boucle.

Et puis 50 fois par minute, ton Atmega est en train de rigoler ... Une mesure IR tu peux la faire très très largement en 1 ms, x 50 il te reste environ 59,995 secondes de libre pour faire ce que tu veux ... Soit une exploitation de ton Atmega de 0.01% ...

A merci pour le renseignement, je m'inquiétais justement, j'avais peur de dépasser la capacité.

Et le relais va resister pour 50 ouverture fermeture par minute 365 jours par an ?