[Résolu]Débimetre avec écran UTFT et LiquidCrystal lcd

Bonjour,
J essai de mettre au point mon débitmètre je suis parti de l’exemple
http://www.hobbytronics.co.uk/download/YF-S201.ino
tout fonctionne quand je l’utilise avec le moniteur,
Avec mon écran UTFT la variable L/hour en l’absence de débit ne descend jamais à zéro
a l affichage il reste des chiffres
ce qui est gênant un peu d’aide me serai utile

/*
   YF-S201 Hall Effect Water Flow Meter / Sensor
   http://www.hobbytronics.co.uk/yf-s201-water-flow-meter
   
   Read Water Flow Meter and output reading in litres/hour

*/
#include <UTFT.h>
extern uint8_t SmallFont[];    //8x12  pixels 95 Caractères
UTFT myGLCD(CTE32HR,38,39,40,41);   



volatile int  flow_frequency;  // Measures flow meter pulses
unsigned int  l_hour;          // Calculated litres/hour                      
unsigned char flowmeter = 2;  // Flow Meter Pin number
unsigned long currentTime;
unsigned long cloopTime;

void flow ()                  // Interruot function
{ 
   flow_frequency++;
} 

void setup()
{ 
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  
   pinMode(flowmeter, INPUT);
   Serial.begin(9600); 
   attachInterrupt(0, flow, RISING); // Setup Interrupt 
                                     // see http://arduino.cc/en/Reference/attachInterrupt
   sei();                            // Enable interrupts  
   currentTime = millis();
   cloopTime = currentTime;
} 

void loop ()    
{
   currentTime = millis();
   // Every second, calculate and print litres/hour
   if(currentTime >= (cloopTime + 1000))
   {     
      cloopTime = currentTime;              // Updates cloopTime
      // Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min. (Results in +/- 3% range)
      l_hour = (flow_frequency * 60 / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flow rate in L/hour 
      flow_frequency = 0;                   // Reset Counter
      Serial.print(l_hour, DEC);            // Print litres/hour
      Serial.println(" L/hour");
      myGLCD.printNumI(l_hour,1,10); // garde des chiffres malgré une absence d’impulsion
   }
}

es tu sur que tu n'as pas d'impulsions parasites en entrée interruptible
( fais afficher flowfrequency à chaque boucle ( avant de la razer). tu verras bien si elle passe et reste à 0 si pas de débit)

Salut,

Pourquoi déclarer l_hour comme un entier , alors que dans
l_hour = (flow_frequency * 60 / 7.5); le calcul fait usage d'un chiffre à virgule ??

Sinon pour quoi ne pas remettre la variable l_hour à zéro quand flow_frequency est aussi à zéro, ce qui indique qu'il n'y a pas de débit.

@+

bonne idée hameau je vais tester, je cherchais une solution pour le mettre a zéro
non puisque flow_frequency ne descend pas zéro

oui j ai fait afficher flowfrequency c est la même chose

c'est la meme chose ? tu peux expliquer?

flow frequency n'est pas à zéro ?

si pardon il est bien a zéro et pas d affichage parasite les valeurs sont figé il faut un débit pour relancer
par contre si je fais la meme operation avec (flow_frequency * 60 / 7.5) je ne suis pas zero

Si tu fais ça :
Serial.println(l_hour), cela donne quoi, car ça me dérange la ligne :

l_hour = (flow_frequency * 60 / 7.5) avec l_hour comme un entier.

avec Serial.println(l_hour) sa fonctionne normal en l absence d impulsion je suis a zero

L'affichage avec Serial.println, indique : 0 ou 0.0 ou autre

@+

L'affichage avec Serial.println, indique : 0

C'est bizarre, change la ligne qui calcul l_hour par :

l_hour = int ((flow_frequency * 60 )/ 7.5); puis voir si cela change quelque chose.

Sinon est il possible d'avoir une photo de l'affichage du LCD

Bonjour, j ai le même resultat avec la ligne
l_hour = int ((flow_frequency * 60 )/ 7.5);
Je prépare les photos
Merci de m aider

Le problème ne viendrait-il pas tout simplement du fait que tu n'effaces pas le texte écrit précédemment?

Je pense pas, l information 0 devrais être affiché il l affiche avec Serial.print
Je pense plus à l’utilisation de l interrupts() qui perturbe la mise a zéro des variables je lis ca
Si vous vouliez vous assurer qu un programme toujours pris les impulsions d'un codeur rotatif, de sorte qu'il ne manque jamais une impulsion, il serait très difficile d'écrire un programme pour faire autre chose, parce que le programme aurait besoin d'interroger en permanence le capteur lignes pour le codeur, afin de capturer
des impulsions quand ils se sont produits.

Il faut que j’intègre les fonctions si dessous
#define interrupts() sei() // j active les interrupts
#define noInterrupts() cli() je désactive

C est la première fois que j utilise cette fonction

En pièce jointe 2 photos monitor et UTFT

le bout de code correspondant

Serial.print(l_hour,DEC);       // Print litres/hour
      Serial.println(" L/hour");
     
      myGLCD.printNumI(l_hour,1,10);
      myGLCD.printNumI(flow_frequency,1,50);
      myGLCD.printNumI((flow_frequency * 60 / 7.5),1,90);
      // garde des chiffres malgré une absence d’impulsion

J’ai soufflé dans le débitmètre on voit sur la photo moniteur et attendu l’arrêt complet pour prendre la photo de l’afficheur
Merci encore de m’aider

Pour infos j ai essayer ce code avec librairie compteur qui fonctionne sur moniteur et sur l afficheur UTFT même probleme le lien
http://domoenergytics.com/domo.energy/La-librairie-Ticks

resultat debit arduino sur moniteur.jpg

Essai cette modification :

myGLCD.printNumI(l_hour,1,10,1);

Cela demande d'afficher au mini 1 chiffre, pour la variable l_hour.

@+

Juste en passant :

Faire des calculs en mélangeant int et float est souvent hasardeux.

Personnellement, je serais assez favorable à remplacer

l_hour = int ((flow_frequency * 60 )/ 7.5);

par

l_hour = (flow_frequency * 120) / 15; //que des int

voir même

l_hour = flow_frequency * 8;

voir même

l_hour = flow_frequency << 3;

:smiley:

Pour hameau et bricoleau j ai tout essayé rien ne change je n obtiens pas le 0

Dans ton premier code

      Serial.print(l_hour, DEC);            // Print litres/hour
      Serial.println(" L/hour");
      myGLCD.printNumI(l_hour,1,10); // garde des chiffres malgré une absence d'impulsiongarde des chiffres malgré une absence d'impulsion

Serial.print et myGLCD.print affichaient la même variable qui n'était pas modifiée par la routine d'interruption. Donc il n'y avait aucune raison que les valeurs diffèrent. Il y a manifestement un problème ou une mauvaise utilisation de la librairie associée à ton afficheur graphique.

C'est franchement bizarre le problème, j'ai commande aussi un flowmeter, je verrais si j'ai les même problème d'affichage sur mon TFT, la formule donnant la fréquence en fonction du débit elle a été fourni avec le débit metre ??, car le mien est plus petit que le votre.