probleme de raz

bonjour
je débute avec arduino
je realise une pesé sur chargeur hydraulique
tout fonctionne sauf que je voudrais faire une remise a zero du cumul des pesée et du compteur mais je n’y arrive pas si quelqu’un peut m’aider
merci d’avance

#include <LiquidCrystal.h>

LiquidCrystal lcd(12,11,5,4,3,2);
long portPotentiometre = A2;//capteur de pression
float valeurPotentiometre;//capteur de pression

const int buttonPin = 7; // compteur
int buttonPushCounter = 0; // compteur
int buttonState = 0; //compteur
int lastButtonState = 0; // compteur

int cumul = 0; //cumul
int lastcumul = 0; //cumul

int reset = 9; //reset

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(buttonPin, INPUT);
digitalWrite(reset, HIGH);
}
int raz()
{if(digitalRead(reset) == HIGH) // Si le bouton reset est appuyé alors on remet à zéro
{lastcumul = 0;
cumul = 0;
buttonPushCounter = 0 ;
return 1;}}

void loop() {

valeurPotentiometre = analogRead(portPotentiometre);
valeurPotentiometre = (valeurPotentiometre-400)*900/400;
delay(100);

// lit l’état actuel du bouton poussoir et le mémorise dans la variable
buttonState = digitalRead(buttonPin);

// compare l’état actuel du bouton poussoir à l’état précédent mémorisé
if (buttonState != lastButtonState) {
// si l’état du bouton poussoir a changé et est HAUT, on incrémente la variable de comptage
if (buttonState == HIGH) {
// si l’état actuel du bouton est HAUT
// il est passé de BAS à HAUT
buttonPushCounter++;
cumul = lastcumul +(valeurPotentiometre);

// affiche les messages sur le PC
Serial.println(“APPUI”);
Serial.print("nombre d’appuis: ");
Serial.println(buttonPushCounter, DEC); // affiche la valeur au format décimal
}
else {
// si le bouton courant est BAS
// il est passé de HAUT à BAS :
Serial.println(“PAS D’APPUI”);
}

//mémorise l’état courant du bouton poussoir
//pour les prochains passages dans la boucle loop
lastButtonState = buttonState;
}

lastcumul = cumul;

lcd.begin(16,2);
lcd.setCursor(10,0);
lcd.print(valeurPotentiometre);
lcd.setCursor(0,1);
lcd.print(buttonPushCounter);
lcd.setCursor(4,1);
lcd.print(cumul);

}

Bonjour vous avez essayé de placer la partie RAZ dans la loop ?

bonjour,
code entre balise code </>
dans l’ide ctrl+T pour formater le code

raz n’est pas appelé dans le loop, donc normal

iznobe:
Bonjour vous avez essayé de placer la partie RAZ dans la loop ?

oui et ca ne fonctionne pas non plus!

infobarquee:
bonjour,
code entre balise code </>
dans l’ide ctrl+T pour formater le code

raz n’est pas appelé dans le loop, donc normal

bonjour désoler pour le code entre balise j’ai vu cela après
merci pour le formatage c’est plus propre
même appeler dans le loop cela ne fonctionne pas

hello

pinMode(reset, INPUT);

dans la loop, mettre
if(digitalRead(reset) == HIGH) // Si le bouton reset est appuyé alors on remet à zéro
{lastcumul = 0;
cumul = 0;
buttonPushCounter = 0 ;}

Et bien sûr câbler correctement le bouton reset - il est connecté comment pour le moment ?

dfgh:
hello

pinMode(reset, INPUT);

dans la loop, mettre
if(digitalRead(reset) == HIGH) // Si le bouton reset est appuyé alors on remet à zéro
{lastcumul = 0;
cumul = 0;
buttonPushCounter = 0 ;}

Merci :ça fonctionne: j’avais fait des essais avec INPUT_PULLUP et ça ne fonctionnait pas mais la avec juste INPUT et la résistance a la masse cela fonctionne

merci pour vos réponses

Avec INPUT_PULLUP et le bouton entre la pin et la masse, il faut tester s'il est LOW pour l'appui

dfgh:
hello

pinMode(reset, INPUT);

dans la loop, mettre
if(digitalRead(reset) == HIGH) // Si le bouton reset est appuyé alors on remet à zéro
{lastcumul = 0;
cumul = 0;
buttonPushCounter = 0 ;}

Bonjour ,

hum , la partie remise a zero ( RAZ ) des compteurs c ' est bien ce que j' avais dis dans mon premier post ^^ .

Coder sans savoir ce que l ' on met ni ce que le code fait et ne pas essayer de comprendre ce qu il fait n ' est pour moi pas tres educatif .
Donner une reponse toute prete qui ne fait pas reflechir ni comprendre au demandeur d' aide ne le fait pas evoluer , mais c ' est sympa .

la fonction :

int raz() {
if(digitalRead(reset) == HIGH) // Si le bouton reset est appuyé alors on remet à zéro
{lastcumul = 0;
    cumul = 0;
    buttonPushCounter = 0 ;
return 1;}
}

peut aussi tout simplement etre appellée dans la boucle ( loop ) au bon endroit en mettant simplement :

raz () ;

hello
@iznobe

peut aussi tout simplement etre appellée dans la boucle ( loop ) au bon endroit en mettant simplement :
raz () ;

pour etre précis, il ne faut pas faire l'appel dans la boucle de cette manière car l'appel à la fonction raz se fera à chaque tour de boucle. ( soit x centaines de fois par seconde).

il faudrait:
if(digitalRead(reset) == HIGH){raz();} // Si le bouton reset est appuyé alors on remet à zéro

perso, je ne déclare une fonction que si le code qui la compose devait être écrit à plusieurs endroits dans le prg.

iznobe:
Bonjour ,

hum , la partie remise a zero ( RAZ ) des compteurs c ' est bien ce que j' avais dis dans mon premier post ^^ .

Coder sans savoir ce que l ' on met ni ce que le code fait et ne pas essayer de comprendre ce qu il fait n ' est pour moi pas tres educatif .
Donner une reponse toute prete qui ne fait pas reflechir ni comprendre au demandeur d' aide ne le fait pas evoluer , mais c ' est sympa .

la fonction :

int raz() {

if(digitalRead(reset) == HIGH) // Si le bouton reset est appuyé alors on remet à zéro
{lastcumul = 0;
    cumul = 0;
    buttonPushCounter = 0 ;
return 1;}
}




peut aussi tout simplement etre appellée dans la boucle ( loop ) au bon endroit en mettant simplement :


raz () ;

Bonjour et oui vous avez raison , mais la fonction etait deja dans le code poster par le demandeur , donc etant deja codé , il etait possible de faire un simple appel comme vous l ' avez specifié dans le detail ( avec la condition evidement ) .

Le principal etant que cela fonctionne !

le code a bien avancer il me reste que la tare a mettre en place
pour cela j’ai créé une ligne valeurZero que je soustrais a la valeur actuel du capteur de pression mais ça ne fonctionne pas quand j’appuis sur le bouton ‘R’ ça ne change pas la valeur de valeurZero ??? je ne vois pas pourquoi donc si quelqu’un peut m’aider ce serait sympa merci

voir void menuA vers la fin

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int keypad_pin = A0;
int keypad_value = 0;
int keypad_value_old = 0;

char btn_push;

byte mainMenuPage = 1;
byte mainMenuPageOld = 1;
byte mainMenuTotal = 4;

long portPotentiometre = A2;//capteur de pression
float valeurPotentiometre;//capteur de pression

const int  buttonPin = 3;     // compteur
int buttonPushCounter = 0;   // compteur
int buttonState = 0;         //compteur
int lastButtonState = 0;     // compteur

int cumul = 0;                //cumul
int lastcumul = 0;            //cumul

int reset = 2;                //reset

int valeurZero = 200;


void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2); //Initialize a 2x16 type LCD

  MainMenuDisplay();
  delay(1000);
}

void MainMenuDisplay()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  switch (mainMenuPage)
  {
    case 1:
      lcd.print("jd godet cereale");
      break;
    case 2:
      lcd.print("jd pic botte");
      break;
    case 3:
      lcd.print("jd godet terre");
      break;
    case 4:
      lcd.print("nissan");
      break;
  }
}

char ReadKeypad()
{
  /* Keypad button analog Value
    no button pressed 1023
    select  741
    left    503
    down    326
    up      142
    right   0
  */
  keypad_value = analogRead(keypad_pin);

  if (keypad_value < 50)
    return 'S';
  else if (keypad_value < 200)
    return 'U';
  else if (keypad_value < 350)
    return 'D';
  else if (keypad_value < 500)
    return 'L';
  else if (keypad_value < 800)
    return 'R';
  else
    return 'N';

}

void MainMenuBtn()
{
  WaitBtnRelease();
  if (btn_push == 'U')
  {
    mainMenuPage++;
    if (mainMenuPage > mainMenuTotal)
      mainMenuPage = 1;
  }
  else if (btn_push == 'D')
  {
    mainMenuPage--;
    if (mainMenuPage == 0)
      mainMenuPage = mainMenuTotal;
  }

  if (mainMenuPage != mainMenuPageOld) //only update display when page change
  {
    MainMenuDisplay();
    mainMenuPageOld = mainMenuPage;
  }
}

void WaitBtnRelease()
{
  while ( analogRead(keypad_pin) < 800) {}
}
void MenuB()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Inside Menu B");

  while (ReadKeypad() != 'L')
  {
    //Insert Task for Menu B here

  }
}
void MenuC()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Inside Menu C");

  while (ReadKeypad() != 'L')
  {
    //Insert Task for Menu C here
  }
}

void MenuD()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Inside Menu D");

  while (ReadKeypad() != 'L')
  {
    valeurPotentiometre = analogRead(portPotentiometre);
    valeurPotentiometre = (valeurPotentiometre - 400) * 900 / 400;
    delay(100);




    // lit l'état actuel du bouton poussoir et le mémorise dans la variable
    buttonState = digitalRead(buttonPin);

    // compare l'état actuel du bouton poussoir à l'état précédent mémorisé
    if (buttonState != lastButtonState) {
      // si l'état du bouton poussoir a changé et est HAUT, on incrémente la variable de comptage
      if (buttonState == HIGH) {
        // si l'état actuel du bouton est HAUT
        // il est passé de BAS  à HAUT
        buttonPushCounter++;
        cumul = lastcumul + (valeurPotentiometre);

        // affiche les messages sur le PC
        Serial.println("APPUI");
        Serial.print("nombre d'appuis:  ");
        Serial.println(buttonPushCounter, DEC); // affiche la valeur au format décimal
      }
      else {
        // si le bouton courant est BAS
        // il est passé de HAUT à BAS :
        Serial.println("PAS D'APPUI");
      }

      //mémorise l'état courant du bouton poussoir
      //pour les prochains passages dans la boucle loop
      lastButtonState = buttonState;

    }

    lastcumul = cumul;

    if (digitalRead(reset) == HIGH) // Si le bouton reset est appuyé alors on remet à zéro
    { lastcumul = 0;
      cumul = 0;
      buttonPushCounter = 0 ;
    }

    lcd.begin(16, 2);
    lcd.setCursor(10, 0);
    lcd.print(valeurPotentiometre);
    lcd.setCursor(0, 1);
    lcd.print(buttonPushCounter);
    lcd.setCursor(4, 1);
    lcd.print(cumul);
    lcd.setCursor(0, 0);
    lcd.print("jd;god.");

  }
}

void MenuA()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Inside Menu A");

  while (ReadKeypad() != 'L')
  {
    

     if (btn_push == 'R')
    {
      valeurZero = analogRead(portPotentiometre);
    }
    

    valeurPotentiometre = analogRead(portPotentiometre);
    valeurPotentiometre = (valeurPotentiometre - valeurZeroo) * 900 / 400;
    delay(100);

   

    // lit l'état actuel du bouton poussoir et le mémorise dans la variable
    buttonState = digitalRead(buttonPin);

    // compare l'état actuel du bouton poussoir à l'état précédent mémorisé
    if (buttonState != lastButtonState) {
      // si l'état du bouton poussoir a changé et est HAUT, on incrémente la variable de comptage
      if (buttonState == HIGH) {
        // si l'état actuel du bouton est HAUT
        // il est passé de BAS  à HAUT
        buttonPushCounter++;
        cumul = lastcumul + (valeurPotentiometre);

        // affiche les messages sur le PC
        Serial.println("APPUI");
        Serial.print("nombre d'appuis:  ");
        Serial.println(buttonPushCounter, DEC); // affiche la valeur au format décimal
      }
      else {
        // si le bouton courant est BAS
        // il est passé de HAUT à BAS :
        Serial.println("PAS D'APPUI");
      }

      //mémorise l'état courant du bouton poussoir
      //pour les prochains passages dans la boucle loop
      lastButtonState = buttonState;

    }

    lastcumul = cumul;

    if (digitalRead(reset) == HIGH) // Si le bouton reset est appuyé alors on remet à zéro
    { lastcumul = 0;
      cumul = 0;
      buttonPushCounter = 0 ;
      
    }

    lcd.begin(16, 2);
    lcd.setCursor(10, 0);
    lcd.print(valeurPotentiometre);
    lcd.setCursor(0, 1);
    lcd.print(buttonPushCounter);
    lcd.setCursor(4, 1);
    lcd.print(valeurZeroo);
    lcd.setCursor(0, 0);
    lcd.print("jd;god.");

  }
}
void loop()
{ int sensorValue = analogRead(A0);
  // print out the value you read:
  Serial.println(sensorValue);
  delay(1);
  btn_push = ReadKeypad();

  MainMenuBtn();

  if (btn_push == 'S') //enter selected menu
  {
    WaitBtnRelease();
    switch (mainMenuPage)
    {
      case 1:
        MenuA();
        break;
      case 2:
        MenuB();
        break;
      case 3:
        MenuC();
        break;
      case 4:
        MenuD();
        break;
    }

    MainMenuDisplay();
    WaitBtnRelease();
  }



  delay(10);

c’est quoi valeurZeroo (avec 2 o) ?

comme valeurPotentiometre est un float vous devriez faire tous les calculs qui s’y rapportent en flottant

au lieu de faire     valeurPotentiometre = (valeurPotentiometre - 400) * 900 / 400;faites plutôt    valeurPotentiometre = (valeurPotentiometre - 400.0) * 900.0 / 400.0; ou    valeurPotentiometre = (valeurPotentiometre - valeurZero) * 900.0 / 400.0;ça évitera les arrondis entiers intempestifs…


Quand vous faites

  while (ReadKeypad() != 'L')
  {


    if (btn_push == 'R')
    {
      valeurZero = analogRead(portPotentiometre);
    }

qu’est-ce qui vous garanti que btn_push est initialisé à autre chose que ‘S’ qui a servi à déclencher le menu?

bonjour
valeurZeroo est un reste d'essai que j'avais fait ! il faut le lire avec un seul o

merci pour le .0 c'est mieux

"qu'est-ce qui vous garanti que btn_push est initialisé à autre chose que 'S' qui a servi à déclencher le menu?"
je vois ce que vous voulez dire je vais essayer d’arranger ça merci