Affichage tension moniteur série bouton poussoir

Bonjour,

Je suis afficher la valeur d'une tension aux bornes d'une resistance dans un montage PDDT (réalisé avec une thermistance) à condition que le bouton poussoir soit appuyé et que rien ne s'affiche dans le moniteur série lorsque le bouton est relâché. Je n'arrive pas à avoir une seule valeur de tension... J'ai trouvé une "astuce" grâce à un delay très long. Peut-être auriez-vous quelque chose de plus "joli" à me proposer. Merci!

// Définition des broches numériques d'entrée et de sortie du microcontrôleur
const int bouton = 3;

const int Ur = A1; // Entrée analogique A1 utilisée pour la tension de sortie Ur du pont diviseur

// BOUCLE D'INITIALISATION
void setup()
{
Serial.begin(9600);
pinMode(bouton, INPUT);
Serial.println("Ur");
Serial.println("V");
}

// BOUCLE PRINCIPALE : exécutée à l'infini
void loop()
{
boolean etatBouton = digitalRead(bouton);

// Affichage de la tension Ur en sortie du montage pont diviseur sur le Moniteur série si le bouton est appuyé

if (etatBouton == HIGH) //
{
int valeur = analogRead(Ur);
float tension = (valeur / 1024.0) * 5.0;
Serial.println(tension);// Affichage dans le Moniteur Série de la valeur de la tension Ur
}
delay(5000);
}

Bonjour,

Mets ton code entre balises.

Je ne comprend pas ce que tu veux faire. Tu veux que la tension s'affiche une seule fois quand tu appuies sur le bouton?
Si c'est le cas il faut tester si le bouton a changé d'état pour cela il faut mémoriser l'état précédent.

Bonjour,

Oui c'est bien ça, je veux que la tension s'affiche une seule fois lorsque j'appuie sur le bouton poussoir. Comment mémoriser son état précédent s'il te plait?

Merci!

Par exemple comme ceci:

void loop()
{
  static bool etatPrecedent = false;
  boolean etatBouton = digitalRead(bouton);

  // Affichage de la tension Ur en sortie du montage pont diviseur sur le Moniteur série si le bouton est appuyé

  if (etatBouton != etatPrecedent)
  {
    etatPrecedent = etatBouton;
    if (etatBouton == HIGH) //
    {
      int valeur = analogRead(Ur);
      float tension = (valeur / 1024.0) * 5.0;
      Serial.println(tension);// Affichage dans le Moniteur Série de la valeur de la tension Ur
    }
    delay(20);      // debounce
  }
}

Ou remplacer le delay(5000);
par un while(digitalRead(bouton)==HIGH);qui attendra que l'on relâche le bouton pour passer à la suite

Ce n'est pas une très bonne méthode car elle ne traite pas les rebonds du bouton et accessoirement elle bloque le programme (ce qui n'est pas gênant ici, mais limite les possibilités d'évolutions).

Merci beaucoup Kamill, ça fonctionne bien cependant, je ne peux prendre une nouvelle mesure qu'au bout d'une durée assez longue (une dizaine de seconde). En attendant le bouton ne répond pas. Est-ce normal?

Non, tu es sur que tu as enlevé ton delay(5000)?
Ton bouton a bien une résistance de pull-down?

Oui j'ai bien enlevé mon delay, mais je ne sais pas ce qu'est une résistance de pull down?

Tu as trois façons de connecter un bouton
pullup.png

Si tu ne veux pas ajouter de résistance, je te conseille d'utiliser le pullup interne
Il s'active avec l'instruction

 pinMode(bouton, INPUT_PULLUP);

La lecture du bouton est inversée il faut donc que tu l'inverses dans le programme

 boolean etatBouton = !digitalRead(bouton);

Super, ça fonctionne impeccablement!

Merci beaucoup!!

Avec plaisir, bonne continuation.