En poursuivant votre navigation sur ce site, vous acceptez l'utilisation de cookies pour vous proposer des contenus et services adaptés. Mentions légales.
  • bandeau2
Vous êtes ici :   ACCUEIL » Arduino : Consommation eau

Arduino : Consommation eau

MISE A JOUR IMPORTANTE (01/2020)

J'AI CORRIGE LE CODE QUI NE FONCTIONNAIT PAS

VOIR FIN DE PAGE

Toutes les photos sont agrandissables...

cool

1. Compteur consommation d'eau

Le système est relativement simple (hum, hum,...) et il existe plein de tutos sur le ouaibe.

Il suffit d'intercaler un capteur à effet Hall à la sortie du réservoir et de récupérer puis interpréter les impulsions sur une carte arduino, sur laquelle un petit programme aura été préalablement chargé. J'ai choisi d'afficher le tout sur un écran LCD de 4 lignes, mais 2 lignes auraient suffi.

jaycar_gauge.png
Capteur à effet Hall que j'ai installé sur le circuit eau douce, après la pompe

L'ensemble de toute l'installation (carte Arduino y compris) ne m'a pas coûté plus de 50 roros.
Ce n'est pas forcément indispensable, cela permet d'anticiper le moment de recharger sa réserve d'eau (accessoirement de montrer aux enfants comment l'eau file, sitôt le robinet ouvert).

Surtout, la nécessité de me pencher sur l'écriture du programme, de chercher à comprendre le sens de telle formule ou telle formule, sa position dans la boucle ou non, etc. , tout cela m'a permis de mieux appréhender le programme complexe fourni par PauloSurArbutus pour la gestion du fuel...

eau arduino bricol2.jpg

1.1 Réalisation

Une chute de plaque acrylique achetée 10 euros chez un industriel (plaque suffisamment grande pour me permettre de réaliser 2 panneaux électriques 12V et plusieurs essais de la plaque pour les compteurs eau&fuel )

La découverte - au bon moment - de la présence d'un FabLab municipal gratuit sur mon quartier avec accès libre et aidé à une découpeuse laser ( ce FabLab est maintenant fermé et c'est un truc payant qui s'est ouvert ailleurs confused), et hop ! je me suis lancé...

cliquez pour agrandir les photos

Eau_affich_colonne.jpg eau_fuel0.jpg

Depuis cette installation, j'ai modifié la plaque acrylique et n'ai conservé que l'écran LCD EAU, puisque le reste FUEL est dorénavant affiché sur un écran LCD, avec d'autres informations, au poste de pilotage.

____________________________________________

En plus de l'arduino NANO, du capteur à effet Hall et de l'écran LCD I2C 16*4, il faut également acheter un clavier de 4 boutons super fin référence SKU094590.

clavier.jpg

Je ne sais plus où je l'ai acheté, cela coûte pas grand chose, on en trouve par exemple à ces adresses :

https://www.arduino-tech.com/10pcs-dc-4-key-matrix-membrane-switch-control-keypad-keyboard-with-led/

ou bien

https://stak.com/Membrane_Keypad_-_4_button_1_x_4_matrix_keypad

IMPORTANT  Bien repérer l'ordonnancement des boutons, leurs connections et le neutre (cf.commentaires dans le programme arduino ci-dessous).

N.B. : Le choix de l'écran LCD I2C a été dicté par sa facilité d'usage et de connexion.
On peut bien entendu utiliser un écran LCD classique.


Idem pour le nombre de lignes, j'ai choisi de travailler sur un écran 20*4 car c'est ce que j'avais à portée de main.

Il est possible d'afficher le reste d'eau sur un écran de 2 lignes (16*2), il suffit de changer les déclarations et les textes affichés dans le programme.

schematic_LCD.png

frown

________________________________________________________________________________

new1.gif  PROGRAMME ARDUINO   new1.gif

L'ancien programme comportait des erreurs et ne fonctionnait pas sur le bateau.

Je pensais à un problème de branchement alors qu'en réalité cela était dû à la fonction SENSORINTERRUPT qui - sur le NANO - ne peut être activée que par la pin D2 ou D3... sur lesquelles j'avais connecté les boutons !

Autre modification, j'ai retiré la carte SD qui prend de la place dans le programme et complique inutilement. La sauvegarde se fait via l'EEPROM, ce qui suffit pour normalement une dizaine d'années de lecture/écriture...biggrin

Ce qu'il faut changer en fonction de votre réservoir d'eau est la quantité (perso, j'ai mis 360 litres, ce qui correspond à mon réservoir d'eau). Cela s'écrit en dur dans le programme, il me semble inutile de compliquer en saisissant à chaque fois le volume sachant que quand on fait le plein d'eau - contrairement au fuel - on remplit le réservoir à chaque fois...
Egalement, avant d'installer à bord ce dispositif, faites des tests chez vous avec des bouteilles d'eau de différentes contenances. En effet dans le programme trouvé sur le ouaibe, le calibrationFactor est de 4.5, ce qui chez moi (en fonction du capteur) surestimait la consommation.
Après tests, j'ai fixé cette valeur à 6 (et à l'usage, je verrai bien s'il faut affiner)

N.B. : Le programme fonctionne  cool

/*
 
COMMENTAIRES

ECRAN
 De ARDUINO /vers ECRAN
 GND     --------------->  Noir
 5V      --------------->  Rouge
 A4      --------------->  SDA
 A5      --------------->  SCL

BOUTONS
De CLAVIER /vers ARDUINO (digital)
(par ordre de branchement sur la nappe)
BUTTON_2 => D9 --- fil blanc
BUTTON_1 => D7 --- fil gris
BUTTON_4 => D6 --- fil jaune
BUTTON_3 => D3 --- fil orange
Zone MOINS => Neutre --- fil noir

======> CHANGEMENT DES FILS BOUTONS QUI NOW SONT RELIES DIRECTEMENT AU NANO


BUTTON_2 => D7
BUTTON_1 => D6
BUTTON_4 => D5
BUTTON_3 => D4
Zone MOINS => GND =>  à cause du SENSORINTERRUPT on met le NEUTRE sur D3 (cf déclaration en setup)

ATTENTION
Sur NANO :
sensorInterrupt = 0 (ou 1 si sensorpin = 3)
sensorPin = 2 (ou 3) uniquement

*/

// PROGRAMME


#include <EEPROM.h>
#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// on rajoute pour les boutons du LCD Shield Key de Freetronics
#define BUTTON1 6
#define BUTTON2 7
#define BUTTON3 4
#define BUTTON4 5
int VAL;
const int inPinButton2 = BUTTON2;
const int inPinButton4 = BUTTON4;
const int inPinButton3 = BUTTON3;
const int inPinButton1 = BUTTON1;

void initHardware(){
  pinMode(inPinButton1, INPUT_PULLUP);
  pinMode(inPinButton2, INPUT_PULLUP);
  pinMode(inPinButton3, INPUT_PULLUP);
  pinMode(inPinButton4, INPUT_PULLUP);  
  }
float resto; // reste eau
float data;
byte sensorInterrupt = 0;
byte sensorPin       = 2;
float calibrationFactor = 6;  // was 4.5
volatile byte pulseCount;  
float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres = 0.00;
unsigned long oldTime;

void setup()
{
   Serial.begin(9600);
   EEPROM.get(0, resto);
/////////// Ecran Principal /////////
  lcd.clear();
  lcd.begin(20,4);
  lcd.backlight();
  lcd.setCursor(2,0); //Start at character 2 on line 0
  lcd.print("RESTE EAU DOUCE : ");
  lcd.setCursor(5,1);  
  lcd.print(resto,2);
  lcd.print("  LITRES");
  lcd.setCursor(0,3);
  lcd.print("SI PLEIN REFAIT => 2");
//////////////////////////////////////////
  pinMode(sensorPin, INPUT_PULLUP);
  digitalWrite(sensorPin, HIGH);
  pinMode(3, OUTPUT); // pour le 0v des boutons enfiches de d3 a d7 avec le d3 en neutre
  digitalWrite(3,LOW);
  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);   
  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0.0;
  totalMilliLitres  = 0.0;
  oldTime           = 0;
 
  initHardware();
}
void loop()
{
 //////////////  CONSO EAU ////////////
    totalMilliLitres = 0.0;
    if((millis() - oldTime) > 1000)    // un comptage par seconde
     {
    detachInterrupt(sensorInterrupt);
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    oldTime = millis();
    flowMilliLitres = (flowRate / 60) * 1000;
    totalMilliLitres += flowMilliLitres;  
    data = (totalMilliLitres/1000.0);
    resto = resto - data;
    EEPROM.put(0, resto);
    lcd.setCursor(5,1);  
    lcd.print(resto,2);
    pulseCount = 0;
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
   }
 
 //////  BOUTONS /////////////
  VAL = digitalRead(inPinButton1);
  if(VAL == LOW){
  EEPROM.get(0, resto);
  lcd.clear();
  lcd.setCursor(2,0); //Start at character 2 on line 0
  lcd.print("RESTE EAU DOUCE :");
  lcd.setCursor(5,1);  
  lcd.print(resto,2);
  lcd.print(" LITRES");  
  lcd.setCursor(0,3);
  lcd.print("SI PLEIN REFAIT => 2");
      }
 VAL = digitalRead(inPinButton2);
  if(VAL == LOW){
  lcd.clear();
  lcd.setCursor(0,0); //Start at character 2 on line 0
  lcd.print("PLEIN A ETE REFAIT ?");
  lcd.setCursor(2,2);
  lcd.print("SI OUI = TOUCHE 3");
  lcd.setCursor(2,3);
  lcd.print("SI NON = TOUCHE 1");  
}
  VAL = digitalRead(inPinButton3);
  if(VAL == LOW){
    resto = 360.00;  
    EEPROM.put(0, resto);                      
    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("RESERVOIR REMPLI");    
    lcd.setCursor(1,1);
    lcd.print("VOLUME REMIS A 360");
    lcd.setCursor(1,2);  
    lcd.print("RETOUR AUTOMATIQUE");
    lcd.setCursor(3,3);
    lcd.print("VERS ECRAN PPAL");     
    delay(2500);
    
//Voir pour le faire retourner à l'écran 1
//Pour l'instant affiche en suivant

  EEPROM.get(0, resto);
  lcd.clear();
  lcd.setCursor(2,0); //Start at character 2 on line 0
  lcd.print("RESTE EAU DOUCE :");
  lcd.setCursor(5,1);  
  lcd.print(resto,2);
  lcd.print(" LITRES");
  lcd.setCursor(0,3);
  lcd.print("SI PLEIN REFAIT => 2");
    }
  VAL = digitalRead(inPinButton4);
  if(VAL == LOW){
  lcd.clear();
  lcd.setCursor(3,0); //Start at character 2 on line 0
  lcd.print("MERCI DE NE PAS");
  lcd.setCursor(1,1);
  lcd.print("TRIPOTER CET ECRAN");
  lcd.setCursor(1,2);
  lcd.print("RETOUR AUTOMATIQUE");
  lcd.setCursor(3,3);
  lcd.print("VERS ECRAN PPAL");     
  delay(2500);
 
//Voir pour le faire retourner à l'écran 1
//Pour l'instant affiche en suivant
  lcd.clear();
  lcd.setCursor(2,0); //Start at character 2 on line 0
  lcd.print("RESTE EAU DOUCE :");
  lcd.setCursor(5,1);  
  lcd.print(resto,2);
  lcd.print(" LITRES");
  lcd.setCursor(0,3);
  lcd.print("SI PLEIN REFAIT => 2");
    }
 /////////////////  impressions sur PC, pour controler ////////////////
 
    Serial.println("-------------------------------------------- ");    
    Serial.println(" ");    
    Serial.print("Reste eau dans loop : ");
    Serial.println(resto);
    Serial.println(" ");
    Serial.println("flowMilliLitres : ");
    Serial.println(flowMilliLitres);
    Serial.println(" ");           
    Serial.println("totalMilliLitres : ");
    Serial.println(totalMilliLitres);
    Serial.println(" ");
    Serial.println("totalMilliLitres/1000.0 : ");    
    Serial.println(totalMilliLitres/1000.0);
    Serial.println(" ");
    Serial.println("FLOWRATE : ");
    Serial.println(flowRate);
    Serial.println(" ");   
    Serial.println("IMPULSIONS = ");    
    Serial.print(pulseCount, DEC);
    Serial.println("  ");
    Serial.println("-------------------------------------------- ");
}
void pulseCounter()
{
  // Increment the pulse counter
  pulseCount++;
  }

Depuis la publication du programme, j'ai rajouté une ligne pour faire une sortie du "reste eau" du NANO vers la carte "MEGA-FUEL", d'où cette donnée sera retransmise en format NMEA0183 pour être affichée dans le LOGBOOK d'OpenCPN.wink


Date de création : 29/10/2018 12:12
Catégorie : ArduiBato -
Page lue 2040 fois


Réactions à cet article


Personne n'a encore laissé de commentaire.
Soyez donc le premier !

Dans plaisance, il y a plaisir...

Romans policiers

Mes Polars
 
Pour découvrir mes
romans policiers ....

et/ou lire des extraits...

(nouvelle fenêtre)
biggrin