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.
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 ...
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 !
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
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
}
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é
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% ...