Temporisation simple avec arduino et potentiometre

Bonjour

je cherche désespérément depuis plusieurs semaines le programme qui me permettrait d'allumer une led pendant un temps réglable par potentiomètre (temps de quelques minutes). Je suis novice sur arduino et j'ai beau chercher sur le net je n'y arrive pas. Quelqu'un peut-il m'aider ?
Un grand merci d'avance.

Bonjour philiou

Une petite recherche de arduino delay with potentiometer :wink:

Cordialement
jpbbricole

bonjour et merci pour votre info rapide
voici le code que j'ai récupéré sur votre lien lais la led clignote et le temps n'est pas ajustable.
En fait je souhaite que a l'alimentation la led s'allume selon une durée réglable par le potar puis s'éteint.
voici le code utilisé

int potPin = 2;    // select the input pin for the potentiometer
int ledPin = 13;   // select the pin for the LED
int val = 0;       // variable to store the value coming from the sensor

void setup() {
  pinMode(ledPin, OUTPUT);  // declare the ledPin as an OUTPUT
}

void loop() {
  val = analogRead(potPin)*10;    // read the value from the sensor
  digitalWrite(ledPin, HIGH);  // turn the ledPin on
  delay(val);                  // stop the program for some time
  digitalWrite(ledPin, LOW);   // turn the ledPin off
  delay(val);                  // stop the program for some time
}

Bonjour philiou

Oui, c'est normal, ton programme d'allumage/extinction de la LED se trouve dans la fonction loop() qui, comme son nom l'indique, tourne en permanence, d'où clignotement. Pour un one shot, il faut déplacer tes lignes en fin de setup(), cette fonction ne s'exécutant qu'une fois, au démarrage de l'Arduino.

Si tu branches le point milieu de ton pot sur A2, ça fonctionne.
La déclaration:
int potPin = 2; // select the input pin for the potentiometer
prête à confusion, c'est mieux de dire
int potPin = A2; // select the input pin for the potentiometer

int potPin = A2;    // select the input pin for the potentiometer
int ledPin = 13;   // select the pin for the LED
int val = 0;       // variable to store the value coming from the sensor

void setup() {
	pinMode(ledPin, OUTPUT);  // declare the ledPin as an OUTPUT

	val = analogRead(potPin)*10;    // read the value from the sensor
	digitalWrite(ledPin, HIGH);  // turn the ledPin on
	delay(val);                  // stop the program for some time
	digitalWrite(ledPin, LOW);   // turn the ledPin off
	//delay(val);                  // stop the program for some time
}

void loop() {
}

A+
Cordialement
jpbbricole

ok je comprends. Effectivement cela fonctionne maintenant par contre je rencontre le probleme suivant : à la mise sous tension de l'arduino, la led s'allume de manière impromptue. Peux-t-on envisager une coimmande par BP qui lors de la pression sur celui-ci met la tempo en route et meme si l' on appuye dessus pendant le cycle, le bp n' a pas d'effet tant que la tempo n'est pas passée ?

Bonjour philiou

Oui, j'ai vu! Je ne saurais pas comment supprimer cet "effet" si ce n'est de mettre une LED sur D12 au-lieu de prendre celle de D13.
Commander par un BP ne supprimerai pas ce problème.
Si tu veux commander par BP, regardes l'exemple:
image
Regardes aussi la bibliothèque Button.h.

Cordialement
jpbbricole

OK J'ai retranscrit ce code sur attiny 45. Tout fonctionne bien :

  • a la mise sous tension, la led reste éteinte. Normal.
    Pression sur le BP, la led s'allume durant le teps réglable (impec).
    Puis s'éteint au bout de la tempo.
    Mais si je rappuye sur le BP, rien ne se passe. ?????
    voici le code
[code]


#include <OneButton.h>

const byte buttonPin1 = 0; // notre bouton est sur la pin broche 5
int potPin = 2;    // select the input pin for the potentiometer  broche 7
int val = 0;       // variable to store the value coming from the sensor

OneButton button1(buttonPin1, true); // true pour le mettre en INPUT_PULLUP

// les pins utilisées pour les LEDs

const byte pinLedVerte1 = 3; // broche 2


// la liste des états possible de notre système
// ainsi qu'une variable etatCourant prenant une de ces valeurs
enum {REPOS, ETAT_R, ETAT_V} etatCourant1, etatCourant2;

// ------------------------------------------------------
// Cette fonction installe l'état initial
// ------------------------------------------------------
void mettreAuRepos()
{


  digitalWrite(pinLedVerte1, LOW);


  etatCourant1 = REPOS;

}

// ------------------------------------------------------
// La fonction de call back, appellée automatiquement quand on clique
// ------------------------------------------------------
void simpleclick1()
{
  switch (etatCourant1) {
    case REPOS: // on était au repos et on a un appui, on allume la VERTE
      digitalWrite(pinLedVerte1, HIGH); // LED verte alimentée
  
val = analogRead(potPin)*10;    // read the value from the sensor
  digitalWrite(pinLedVerte1, HIGH);  // turn the ledPin on
  delay(val);                  // stop the program for some time
  digitalWrite(pinLedVerte1, LOW);   // turn the ledPin off
  //delay(val);                  // stop the program for some time
  
      etatCourant1 = ETAT_R; // on note le nouvel état de notre système
      break;

  
   
  }
}



// ------------------------------------------------------
// On initialise notre système dans le setup
// ------------------------------------------------------
void setup() {
 
  pinMode(pinLedVerte1, OUTPUT);
  

  mettreAuRepos();
  button1.attachClick(simpleclick1);
 
}

void loop()
{
  button1.tick();
 
}
[/code]

Dans ta machine d'états, tu ne traites que l'état REPOS, pas les autres, ça doit être pour ça que ton bouton n'est pas pris en compte. Tu changes effectivement d'état, mais tu ne dis pas ce qu'il faut faire ensuite...

ok effectivement je comprends ce que tu veux dire mais je ne sais pas pas quelle ligne de code je dois rajouter ?

La syntaxe du switch / case est ici :
https://www.arduino.cc/reference/en/language/structure/control-structure/switchcase/

Il faut que tu ajoutes un ou plusieurs 'case' pour traiter les cas qui manquent

Je suis désolé mais je suis complètement perdu dans mon programme : je ne comprends pas : en fait , à la fin de la tempo la led s'éteint mais il faut indiquer au programme de regarder l'état du BP ??

de plus je viens de me rendre compte que pour un même réglage défini par le potentiomètre, la tempo variait  de façon complètement aléatoire !!!!!  Au secours svp, merci

J'ai du mal à comprendre ton code. A vrai dire je n'aurais pas fait du tout comme toi. Donc plutôt que débuguer ton code, je préfère expliquer ma manière de procéder.

Cahier des charges :

et

Si je comprends bien : tu règles la durée avec le potentiomètre, puis tu appuies sur le bouton pour allumer la led, et elle reste allumée pendant cette durée. Je vais faire au plus simple : supposer que rien ne peut être modifié pendant que la led est allumée (pas d'effet si on appuie sur le BP ou si on tourne le potard).

On part avec la led éteinte (--> éteindre la led dans le setup).
Dans le setup :

  • Serial.begin
  • Déclarer le BP
  • Eteindre la led

Dans la loop :

  • Tant que le BP n'est pas appuyé :
    • Lire le potentiomètre
    • Calculer la durée
    • Afficher la durée calculée (uniquement en cas de changement du potentiomètre, sinon ça fait trop de choses dans le moniteur)
  • Quand le BP est appuyé :
    • Allumer la led
    • Faire un delay() avec la durée calculée
  • A la fin du delay :
    • Afficher un message pour indiquer qu'on peut à nouveau régler le potentiomètre

Fin de la loop

Est-ce que tu pense pouvoir le coder ? Ce n'est pas très compliqué.

Merci pour ces infos mais je dois avouer que je suis completement perdu
J'ai donc déclaré le potar, le BP et la led ds le setup

Par contre pour ce qui est de lire le potar et la suite, je n'y arrive pas...

[code]
#include <OneButton.h>

const byte buttonPin1 = 0; // notre bouton est sur la pin broche 5
int potPin = 2;    // select the input pin for the potentiometer  broche 7
int val = 0;       // variable to store the value coming from the sensor

OneButton button1(buttonPin1, true); // true pour le mettre en INPUT_PULLUP

// les pins utilisées pour les LEDs

const byte pinLedVerte1 = 3; // broche 2



// ------------------------------------------------------
// On initialise notre système dans le setup
// ------------------------------------------------------
void setup() {
 
  pinMode(pinLedVerte1, OUTPUT);
  digitalWrite(pinLedVerte1, LOW);

  
  button1.attachClick(simpleclick1);
 
}

void loop()
{
  button1.tick();
 
}
[/code]

Tu ne lis pas le potentiomètre.
As tu seulement regarder comment on fait une mesure analogique ?
Si tu ne commences pas par le ba_ba on ne peut rien pour toi.

Va sur le site www.eskimon.fr et progresses doucement en faisant des exemples basiques.

Un conseil : laisse tomber la bibliothèque pour lire le BP. Il suffit de le déclarer avec pinMode, et de faire un digitalRead pour le lire.

int valPrec = 0; // variable globale pour stocker la valeur du potentiomètre
int duree = 0; // variable globale pour la durée

void setup() {
  pinMode(pinLedVerte1, OUTPUT);
  digitalWrite(pinLedVerte1, LOW);
  pinMode(buttonPin1, INPUT_PULLUP); // digitalRead renvoie LOW si appuyé
  Serial.println("Veuillez régler le potentiomètre pour choisir la durée");
}

Dans la loop :

void loop() {
  if (digitalRead(buttonPin1) == HIGH) { // bouton pas appuyé
    // lire le potard
    int val = analogRead(potPin);
    if (val != valPrec) {  // le potard a changé
      // ici calculer le délai (avec map par exemple)
      //  duree = ...
      // afficher le délai
    }
    valPrec = val;
  } else { // bouton appuyé
    digitalWrite(pinLedVerte1, HIGH);
    delay(duree);
    digitalWrite(pinLedVerte1, LOW);
    Serial.println("Veuillez régler le potentiomètre pour choisir la durée");
  }
}

Le BP est câblé en INPUT_PULLUP donc entre GND et la pin choisie.
A tester...

Merci pour ce programme que je vais essayer dès demain matin.
Un grand merci pour votre patience et partagé d’info.
il m’est plus facile de comprendre un programme déjà fonctionnel que de tourner en rond avec des bouts de code, je dis ça pour 68tjs qui part des conseils ne pas pas fait vraiment avancer….
Je vois ça dès demain et te tiens au courant

Par contre je ne comprends pas comment le programme fait le lien avec la valeur du potar et une durée : quelques minutes ?

Et pour couronner le tout tu n'as pas jugé utile de lire le message épinglé :

Où tu aurais vu qu'il n'est pas autorisé de poster des questions générales dans le sous forum destiné à publier des tutos .
--> message transféré à l'endroit où il aurait du être posté.

Donc je répète : www.eskimon.fr pour apprendre les bases de la programmation sur microcontrôleur.

La base de l'apprentissage n'est pas se précipiter à vouloir écrire son programme,.
La base c'est de faire des exemples simples que l'on sait corrects et fonctionnels et de faire l'effort de les comprendre.

Tout autre tentative est voué à l'échec.

  1. apprendre à lire l'état d'un bouton poussoir.
  2. apprendre à utiliser une condition "if" pour définir ce que l'on veut faire suivant l'état du bouton.
  3. apprendre comment fonctionne un potentiomètre et apprendre comment on lit une tension continue avec la fonction analogRead().

www.eskimon.fr

Avec ce type de réponses, je pense que le forum d’arduino est fini pour moi. Je ne suis pas prêt d’y retourner si c’est pour recevoir des leçons de cette manière
Je retourne à mes schémas, vraiment dégoûté :angry::angry::angry:
Et je souhaite bon courage aux novices comme moi qui recevront de tels messages