Condition tant que la valeur est incrémenté

Bonjour à tous,

voila je rencontre un problème dont je narriva pas a faire ce que je veut, après pas mal de recherche je n'ai rien trouvé.

je vous explique donc ma recherche :

j'ai un capteur HALL dont je relève le valeur montante (hall++) , mes tests sont bon sur l'entrée D2 mon soucis est le suivant.

je cherche à écrire :

  • Tant que HALL a une valeur montante je laisse faire, mais au bout de "X" (temps) si elle ne monte plus alors tu la bascule dans une variable TOTAL
  • tu remet HALL a 0
  • Tu prend la variable TOTAL et si elle est supérieur à "X" (valeur) et tu l'ajoute à COMPTEUR MEMOIRE en EEPROM
  • et une fois ajouté tu remet TOTAL a 0

le but est de comptabiliser cette valeur la stocker en cas de coupure de courant, et de l’écrire que si elle est montante.

J’espère avoir été clair dans mes propos.

merci d'avance.

hello
un truc dans ce genre là
attention ce n’est pas un code fonctionnel
il faut le rédiger correctement
ce n’est qu’une epure

unsigned long deb = 0;
void setup() {
  // put your setup code here, to run once:
  attach_interrup (0, isr, falling);
}
void isr() {
  val++;
}
void loop() {
  if (val > 1) {
    if ((millis() - deb) < 10000) //
    {
      if (val > memo_val)
      {
        deb = millis(); memo_val = val;
      }
    }
    else
    {
      total = val;
      val = 0;
      if (total > XXX)
      {
        tampon = valeur lue en eeprom
                 tampon += total;
        ecrire tampon en eeprom
      }
    }
  }
}

Hello,

Merci je viens de mettre en forme tes indication sous cette forme

#include <EEPROMex.h>

unsigned long deb = 0;         // temps de réference
unsigned long Nbrpmhall;       // nombre de tour du capteur hall
unsigned long mem_Nbrpmhall;   // réference Nb de tour capteur hall
float QtsE = 0.0;              // quantité d'eau passé au cycle
float QtsEm = 0.0;             // quantité d'eau total
uint8_t hallsensor = 2;        // broche de connxion du capteur
int addr_QtsEm = 150;          // adresse memoire en eprom





void setup() {
    
       pinMode(hallsensor, INPUT);              // definir broche a écouter
       attachInterrupt(0, rpm, RISING);         // comptage des interuption
}
void rpm() {
  Nbrpmhall++;                           // fonction d'incrémentation des tours
}
void loop() {
  
  if (Nbrpmhall > 1) {                                // si le nombre de tour est superieur a 1
    if ((millis() - deb) < 10000)                     // si le temps écoulé moins le temps de réference est inferieur a 10 sec  
    {                     
      if (Nbrpmhall > mem_Nbrpmhall)                  // et si le nombre de tour est superieur de nombre de tour de réfernece
      {
        deb = millis(); mem_Nbrpmhall = Nbrpmhall;    // alors on met à jour ses valeur de réference
      }
    }
    else                                          // sinon on met à jour les valeur lu comme tels ->
    {
      QtsE = ((Nbrpmhall*2.222222)/1000);         //  on comptabilise par la formule de comptage pour un litre d'eau
      Nbrpmhall = 0;                              // on réinitialise le nombre de tour du capteur hall
      if (QtsE > 1.0)                             // et si le nombre de litre est superieur a 1.0 litre on l'ecrit en memoire
      {
        QtsEm = EEPROM.readFloat(addr_QtsEm);     //QtsEm = valeur lu en eeprom
                 QtsEm += QtsE;                   // et on on ajoute a la valeur mémoire QtsEm la valeur QtsE qui à été ajouté 
        EEPROM.writeDouble(addr_QtsEm, QtsEm);    // On écrit la valeur Qtsem en Eeprom
      }
    }
  }
}

Bon voila un premier point, je vais faire des essais tout a l’heure.

Encore merci de ton aide.

hello

#include <EEPROMex.h>

unsigned long deb = 0;         // temps de réference
unsigned long Nbrpmhall;       // nombre de tour du capteur hall
unsigned long mem_Nbrpmhall;   // réference Nb de tour capteur hall
float QtsE = 0.0;              // quantité d'eau passé au cycle
float QtsEm = 0.0;             // quantité d'eau total
uint8_t hallsensor = 2;        // broche de connxion du capteur
int addr_QtsEm = 150;          // adresse memoire en eprom
void setup() {
   Serial.begin(1000000);
       pinMode(hallsensor, INPUT);              // definir broche a écouter
       attachInterrupt(0, rpm, RISING);         // comptage des interuption
  Serial.println(" Pret ");     
}
void rpm() {
  Nbrpmhall++;                           // fonction d'incrémentation des tours
  Serial.print(" Nbrpmhall = ");
  Serial.println( Nbrpmhall);
}
void loop() {
 if (Nbrpmhall ==0) {deb=millis();}
  if (Nbrpmhall >= 1) {                                // si le nombre de tour est superieur a 1
    if ((millis() - deb) < 10000)                     // si le temps écoulé moins le temps de réference est inferieur a 10 sec 
    {   
      if (Nbrpmhall > mem_Nbrpmhall)                  // et si le nombre de tour est superieur de nombre de tour de réfernece
      {
        deb = millis();     // alors on met à jour ses valeur de réference
      Serial.print(" Nbrpmhall à augmente de ");
      Serial.print( mem_Nbrpmhall);
      Serial.print(" a ");
      Serial.println( Nbrpmhall);
      mem_Nbrpmhall = Nbrpmhall;
      }
    }
    else                                          // sinon on met à jour les valeur lu comme tels ->
    {
      
      Serial.println(" 10 secondes sans incrementation ");
      //QtsE = ((Nbrpmhall*2.222222)/1000);         //  on comptabilise par la formule de comptage pour un litre d'eau
      //ligne ci dessous pour debug
      QtsE = ((Nbrpmhall*2.222222));              //  20 = 0.05 litre
      Serial.print("nombre de litres pompes ");
        Serial.println( QtsE);
      Nbrpmhall = 0;                              // on réinitialise le nombre de tour du capteur hall
      if (QtsE > 1.0)                             // et si le nombre de litre est superieur a 1.0 litre on l'ecrit en memoire
      {
        //EEPROM.writeFloat(addr_QtsEm, QtsEm);
        QtsEm = EEPROM.readFloat(addr_QtsEm);     //QtsEm = valeur lu en eeprom
        Serial.print("en eprom, il y a ");
        Serial.println( QtsEm);
                 QtsEm += QtsE;                   // et on on ajoute a la valeur mémoire QtsEm la valeur QtsE qui à été ajouté
        EEPROM.writeFloat(addr_QtsEm, QtsEm);    // On écrit la valeur Qtsem en Eeprom
        Serial.print("en eprom, il y a  maintenant ");
        Serial.println(EEPROM.readFloat(addr_QtsEm));
      }
    }
  }
}

Hello,

Merci de ton aide,

Bon je rencontre des incohérences sur les tests, des remise à zéro incohérente

Ou des incrémentations non mis en eprom.

Lors du démarrage j'ai des "Nbrpmhall = (2033 // valeur au hasard à chaque démarrage" par exemple, alors que le HALL ne tourne pas malgré une résistance de 4.7K en tirage.

hello
vires ta résistance de tirage " pullup", elle est dans le setup()

mets un condensateur en // sur le capteur ( entre la masse et D2)

prg testé avec une nano et un BP

fais nous un retour

//# define debug 1
# define debug 0
#include <EEPROMex.h>

unsigned long deb = 0;         // temps de réference
unsigned long Nbrpmhall;       // nombre de tour du capteur hall
unsigned long mem_Nbrpmhall;   // réference Nb de tour capteur hall
float QtsE = 0.0;              // quantité d'eau passé au cycle
float memo_QtsE;               // memo quantité eau non sauvegardee
float QtsEm = 0.0;             // quantité d'eau total
uint8_t hallsensor = 2;        // broche de connxion du capteur
int addr_QtsEm = 150;          // adresse memoire en eprom

void setup() {
  Serial.begin(1000000);
  pinMode(hallsensor, INPUT_PULLUP);       // definir broche a écouter
  attachInterrupt(0, rpm, RISING);         // comptage des interuption
  QtsEm = EEPROM.readFloat(addr_QtsEm);    //QtsEm = valeur lu en eeprom
  Serial.print(F("en eprom, il y a "));
  Serial.println( QtsEm);
  Serial.println(F(" Pret "));
}
void rpm() {
  Nbrpmhall++;                                          // fonction d'incrémentation des tours
}
void loop() {
  if (Nbrpmhall == 0) {
    deb = millis();
  }
  if (Nbrpmhall >= 1) {                                // si le nombre de tour est superieur a 1
    if ((millis() - deb) < 10000)                       // si le temps écoulé moins le temps de réference est inferieur a 10 sec
    {
      if (Nbrpmhall > mem_Nbrpmhall)                   // et si le nombre de tour est superieur de nombre de tour de réfernece
      {
        deb = millis();                                // alors on met à jour ses valeur de réference
        if (debug)
        {
        Serial.print(F(" Nbrpmhall à augmente de "));
        Serial.print( mem_Nbrpmhall);
        Serial.print(F(" a "));
        }
        Serial.print( Nbrpmhall);Serial.print( "\t");
        Serial.println(((Nbrpmhall * 2.222222) / 1000)+ memo_QtsE,8);
        mem_Nbrpmhall = Nbrpmhall;
      }
    }
    else                                               // sinon on met à jour les valeur lu comme tels ->
    {
      Serial.println(F(" 10 secondes sans incrementation "));
      QtsE = (((Nbrpmhall * 2.222222) / 1000)+ memo_QtsE);   //  on comptabilise par la formule de comptage pour un litre d'eau
      Serial.print(F("nombre de litres pompes "));
      Serial.println( QtsE);//Serial.flush();
      Nbrpmhall = 0;                               // on réinitialise le nombre de tour du capteur hall
      mem_Nbrpmhall=Nbrpmhall;
      if (QtsE > 1.0)                             // si le nombre de litre est superieur a 1.0 litre on l'ecrit en memoire
      {
        QtsEm = EEPROM.readFloat(addr_QtsEm);     //QtsEm = valeur lu en eeprom
        Serial.print(F("en eprom, il y a "));
        Serial.println( QtsEm);
        QtsEm += QtsE;                   // et on on ajoute a la valeur mémoire QtsEm la valeur QtsE qui à été ajouté
        EEPROM.writeFloat(addr_QtsEm, QtsEm);    // On écrit la valeur Qtsem en Eeprom
        Serial.print(F("en eprom, il y a  maintenant "));
        Serial.println(EEPROM.readFloat(addr_QtsEm));
        memo_QtsE = 0;                           // on réinitialise la memorisation d'une qutité non sauvegardee
      }
      else
      {
        memo_QtsE=QtsE;
        Serial.println(F("c est insignifiant, pas de sauvegarde en eeprom "));
        Serial.print(F("mais on garde memo_QtsE = QtsE = "));
        Serial.println( memo_QtsE,8);
      }
    }
  }
}

Bonjour,

parfait je te remercie, les tests son parfait.

j'ajoute le condensateur et je te fait un retour sur la stabilité sur le système car la je n'ai fait les test que sur breadbord et poussoir.

Encore merci

Bonjour,

le code est parfait, il fonctionne à merveille

le condensateur de 10uF à stabilisé parfaitement interruption est nette.

j'ai supprimé le pull-up interne car mon circuit comportant une résistance de 10K

et tout est bon

encore merci pour ton aide précieuse @dfgh

hello heureux pour toi merci du retour :)