Problème bouton poussoir

bonjour bonsoir, bonne année

voila j'ai un petit soucis sur un projet Arduino, carte UNO
Sans plus attendre je vous présente mon projet puis mon problème

sur mon projet j'ai un bouton poussoir qui permet la mise en route et la visualisation sur un LCD de valeur de niveau d'une cuve a eau (module ultrason) pendant 4cycles (lecture valeurs / affichage valeurs) puis mise en veille jusqu'au prochain appuis sur le bouton

Le problème est que il y a selon moi un courant résiduel dans le bouton qui me détecte un front montant sur le bouton sans que je ne touche au bouton
en plaçant une diode conduisant du GND vers le fil alimentant le pin qui capte le front montant (sortie du bouton)
j'ai du modifier mon projet du a ce problème car mon projet initial était que je puisse changer de page sur le lcd par appuis sur le bouton mais étant complètement aléatoire cela n'était pas utilisable j'ai donc fait un défilement des pages par cycle.

cela est un peut précaire a mon gout et j'aurais voulu comprendre pourquoi cela arrive, je ne trouve rien sur GOOGLE :confused:

voici mon code si cela est du a un problème de programmation ou peut-être modifier par programmation

puis étant débutant en Arduino si vous avez de petit conseil sur ma façon de programmé ou des amélioration a apporté a mon programme je suis ouvert a toute proposition.

/* 
 * Code pour la cuve a eau de pluie de Rémi
 */
// inclure la librairie écran:
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

/* pour la Température de la cuve

int ThermistorPin = 0;
int Vo;
float R1 = 10000;
float logR2, R2, T, Tc;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;
*/

//pour le bouton

const char bouton = 7;
boolean bp;
char pb;
char compteur;
const char eclair = 10;

//pour le volume:

float volume = 0; //volume de la cuve
int volume_L = 0; //volume en Litre de la cuve
float hauteur_cm ; //en cm
int hauteur_cuve = 280 ; //en cm
int largeur_cuve = 220; //en cm
int longueur_cuve = 200 ; //en cm

/* Constantes pour les broches a capteur ultrason */
const byte TRIGGER_PIN = 8; // Broche TRIGGER
const byte ECHO_PIN = 9;    // Broche ECHO
 
/* Constantes pour le timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s

/* Vitesse du son dans l'air en mm/us */
const float SOUND_SPEED = 340.0 / 1000;

/** Fonction setup() */

void setup() {
  pb = 0;
  bp = 0;
  compteur = 0;
  pinMode(eclair, OUTPUT);
   
  /* Initialise le port série */
//  Serial.begin(9600);
   
  /* Initialise les broches */
  pinMode(TRIGGER_PIN, OUTPUT);
  digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos
  pinMode(ECHO_PIN, INPUT);

// affichage écran
  
  digitalWrite(eclair, HIGH);
  lcd.begin(16, 2);
  lcd.print("visualisation");
  lcd.setCursor(0, 1);
  lcd.print("niveau de cuve");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("dimension cuve");
  delay(1500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" H     l     L");
  lcd.setCursor(0, 1);
  lcd.print(hauteur_cuve);
  lcd.setCursor(6, 1);
  lcd.print(largeur_cuve);
  lcd.setCursor(12, 1);
  lcd.print(longueur_cuve);
  delay(2000);
  lcd.clear();
  digitalWrite(eclair, LOW);

}

void loop() {
//bouton
bp = digitalRead(bouton);
if (bp == 1){
  pb = 1;
}
 
int compteur = 0;
while ((compteur != 4) && (pb == 1)){
  affichage();
  compteur ++;
}
pb = 0;
digitalWrite(eclair, LOW);
lcd.clear();
}

void affichage(){
lcd.clear();
   affichage_1();
delay(5000);
  affichage_2();
delay(5000); 
}

void capteur() {
  /* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER */
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);
  
  /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
  long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);
   
  /* 3. Calcul la distance à partir du temps mesuré */
  float distance_mm = measure / 2.0 * SOUND_SPEED;

// calcule de la quantité d'eau
  
  hauteur_cm = (hauteur_cuve - (distance_mm / 10.0)); // calcule de la hauteur en centimetre
  volume =( hauteur_cm * largeur_cuve * longueur_cuve * 0.000001);// volume en m3, rentré dimension en mètre de la cuve (M=Hauteur * largeur * longeur)
  volume_L =(volume * 1000); //volume en litre 
}

// Affiche les résultats
// Affiche par l'écran LCD
int affichage_1() {
capteur();
digitalWrite(eclair, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(volume);
lcd.setCursor(6, 0);
lcd.print("Metre cube");
lcd.setCursor(0, 1);
lcd.print(volume_L);
lcd.setCursor(6, 1);
lcd.print("Litres");
}

int affichage_2() {
capteur();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(hauteur_cm);
lcd.setCursor(7, 0);
lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print("Hauteur de l'eau"); 
}

merci a ceux qui se pencheront sur mon problème

bonjour,
pourquoi

const char bouton = 7;

au lieu de

#define bouton 7
ou
const byte bouton = 7;

ce que tu constate est un rebond de ton bouton

dans le setup

pinMode(bouton, INPUT_PULLUP);

cela active la résistance interne antirebonf

et avec un

bp = digitalRead(bouton);
delay(500);

ca résoud le soucis

Bonsoir,

ce que tu constate est un rebond de ton bouton

Un état du bouton qui change sans qu'on appuie dessus, c'est plutôt un souci de câblage du bouton avec l'entrée de l'Arduino laissée flottante.

dans le setup
pinMode(bouton, INPUT_PULLUP);

cela active la résistance interne antirebonf

Une résistance antirebond :o La résistance pullup est une bonne solution pour éviter de laisser flotter l'entrée entre deux états aléatoirement, mais pour éviter les rebonds (cette salle habitude des boutons mécaniques) faudra trouver autre chose. (debounce façon software, condensateur...)

merci pour ta réponse infobarquee

j'ai effectué les modifications que tu ma proposé

mais le problème subsiste maintenant avec les modifications apporté même avec la diode (que j'avais ajouté pour supprimé se problème et absorbé les courants résiduel) le problème est présent, ma diode est inutile a présent

si je branche le fil allant au pin 7 (bp) au GND no problème mais dé que je le déconnecté du GND il détecte un front montant comme si je l'avais connecté au +5 or il n'est relié a rien et par moment il ne détecte pas se faut front montant mais le fait d'approché un doigt ou de touché le fil (gaine, pas la partie conductrice) génère le front montant comme si j'envoyé 5V

cela me trouble :confused:

han merci f-leb

je comprend donc le problème actuellement je suis sur breadboard mais lorsque je vais mettre le système en place étant électrotechnicien je possède des bouton industriels cela possèdent un plus grand écart entre les contactes je ne devrais donc plus avoir ce problème d'état flottant si je comprend bien ? cela est seulement du au petit bouton mécanique

Les rebonds d'un bouton (phénomène qui se produit lors de la fermeture d'un contact mécanique) et les entrées flottantes sont deux choses différentes.

Regarde ce schéma :

Sans précaution, on voit bien que l'entrée D2 est au 5V lorsque le bouton est pressé, mais elle est "en l'air" lorsque le bouton est relâché (son état est indéfini).

Tout d'abord, comment est connecté ton bouton ?

ton problème est connu, si tu déconnecte le GND, ca fait antenne et chope tous les parasites possibles.
pour s'en convaincre, il suffit de laisser le fil en l'air sans bouton et d'approcher son doigt.
tu verras que tu as des rebonds comme par magie.

que ce soit avec un bouton à 2 balles ou un bouton industriel, le phénomène sera le même.
donc sot
résistance interne avec pullup
soit résistance physuque entre gnd et +5v sur le bouton pour un antirebond

aucun besoin d'une diode qui ne sert pas a grand chose

le bouton est câblé normalement comme sur ton schéma F-leb j'ai seulement rajouté une diode entre le GND et le "2" de ton schéma passante dans le sens GND-->pin2 qui jusqu'ici règle ce problème d'antenne

j'ai exactement ça infobarquee

mais j'ai fait comme tu a dit dans ton premier message avec pullup cela n'a rien amélioré mais empiré maintenant cela fait tout le temp antenne même avec ma diode sauf si je relie au GND

physiquement comment réglé le problème donc ?

merci a vous pour vos réponses

j'ai fait quelque recherche dans mon cas ce ne serais pas un pulldown qu'il me faudrait si j'ai bien compris ?

Bonjour,

Pierro59lv:
j'ai fait quelque recherche dans mon cas ce ne serais pas un pulldown qu'il me faudrait si j'ai bien compris ?

Pulldown n'existe pas sous "Arduino" mais il faut mettre une résistance externe entre l'entrée et le GND.

Pierro59lv:
le bouton est câblé normalement comme sur ton schéma F-leb

Dans ce cas oui, il faut une pulldown. Mais il n'y a pas de résistance pulldown interne dans l'Arduino et il faut donc câbler une résistance :

C'est aussi pour ça qu'un montage avec pullup est préféré.

Merveilleux j'ai monté une résistance de 10K comme sur le schéma cela fonctionne a merveille
un GRAND merci a vous tous pour votre aide

et j'ai une dernière petite question a la qu'elle je n'ai pas trouvé de réponse

quel serrait la distance maximal a la quel je pourrais disposé mon LCD avec mon bouton car j'avais en tête de le mettre pour des raisons pratique a 5-7 mètres de l'arduino cablé a l'aide d'un câble téléphonique blindé de moyenne/bonne facture étant prévue pour des courants faible un câble téléphonique devrais occasionné un minimum de perte et une restitution des donnés vers le LCD correct je l'espère

encore merci

Re,
Avec un LCD commandé en parallèle, il est probable d'avoir des dysfonctionnements.
Une solution plus réaliste (avec les protections électromagnétiques de rigueur) est d'utilisé un LCD en I2C.

un LCD I2C est un lcd type 2 lignes 16 caractère muni d'une carte I2C?
car actuellement j'utilise un 16X2 tout ce qu'il y a de plus basic et de moins chère

mais pourquoi utilisé cette carte I2C pour une longue distance ?

indirectement j'avais en quelque sorte réalisé un pulldown avec ma diode également

Re,

Pierro59lv:
un LCD I2C est un lcd type 2 lignes 16 caractère muni d'une carte I2C?
car actuellement j'utilise un 16X2 tout ce qu'il y a de plus basic et de moins chère

mais pourquoi utilisé cette carte I2C pour une longue distance ?

Le plus simple "essaye", avec un peu de chance, cela fonctionnera.
Mais en général, la chance n'est pas une rubrique du module conception.
:wink:

Merci a tous pour votre aide

je vais essayer après tout cela ne me coute rien même si je pense que tu a raison pour le module I2C sinon pourquoi en parlerai-tu haha.

il y a vraiment une super communauté autour du projet arduino cela est vraiment agréable encore merci d'avoir enrichit mon petit savoir sur les Arduino

bonne année a tous plein de bonheur

Bonjour,

L'i2c n'est pas prévu pour de longues distances, ce n'est pas un bus de terrain. Toutefois, atteindre quelques mètres de distance est tout à fait possible avec le bon équipement (câbles torsadés, extender i2c...)

oui après quelque recherche j'ai pu constaté que l'I2C est donné pour 6 mètres maximum
je vais faire quelque recherche, mais 6 mètres devrais suffire pour mon cas n'aillant pas encore métré je n'en suis pas certain, cependant est-il mieux d'utilisé un câble type téléphonique/ethernet étant torsadé et blindé pour véhiculé les infos ou un simple câble classique suffira ?

Bonjour,

f-leb:
L'i2c n'est pas prévu pour de longues distances, ce n'est pas un bus de terrain. Toutefois, atteindre quelques mètres de distance est tout à fait possible avec le bon équipement (câbles torsadés, extender i2c...)

Perso, j'ai une liaison de 120 m en I2C avec extender qui fonctionne depuis plus de 10 ans.

c'est bon a savoir, qu'elle type de câble a tu utilisé pour une tel liaison ?

avec un I2C je doit utilisé la petite broche avec le jumper que je doit câble a l'Arduino pour l'alimentation de l'éclairage ?

et j'ai une petite question a propos du capteur a ultrason que j'ai commander ne sachant pas si je doit en faire un nouveau post

J'en ai fait un quand même

:slight_smile: