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

400litres.jpg eau rempli.jpg

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_fuel0.jpg

eau_fuel1.jpg eau_fuel2.jpg

Eau_affich_colonne.jpg
 

____________________________________________

PROGRAMME ARDUINO

Je mets ici en C/C le programme arduino, avec mes commentaires et autres fariboles.

A chacun de piocher et trouver ce dont il a besoin...cool


/*
 * Water Flow Gauge
 *  
    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 => D5
BUTTON_1 => D4
BUTTON_4 => D3
BUTTON_3 => D2
Zone MOINS => GND

CARTE SD
CS = D4  ON CHANGE SUR D10 ????
MOSI = D11
MISO = D12                  
SCK = D13

*/

// (c) Michael Schoeffler 2016, http://www.mschoeffler.de
#include <SD.h> //Load SD library
#include <SPI.h>
#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

File eau; // fichier eau.txt

int chipSelect = 10; //chip select pin for the MicroSD Card Adapter

// on rajoute pour les boutons du LCD Shield Key de Freetronics

#define BUTTON1 4
#define BUTTON2 5
#define BUTTON3 2
#define BUTTON4 3

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);  

  pinMode(chipSelect, OUTPUT);
}

//variable longues et positives
int reservoir;
int resto; // reste eau
int controle1;
int data;

byte sensorInterrupt = 2;// was 0 ai changé suivant le msg dans https://www.instructables.com/id/How-to-Use-Water-Flow-Sensor-Arduino-Tutorial/
byte sensorPin       = 6;// on branche sur D6 le signal du hall-sensor (CHANGEMENT)

// The hall-effect flow sensor outputs approximately 4.5 pulses per second per
// litre/minute of flow.
float calibrationFactor = 4.5;

volatile byte pulseCount;  

float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres = 0.00;
unsigned long oldTime;

void setup()
{
   Serial.begin(9600);
 
  pinMode(chipSelect, OUTPUT); // chip select pin must be set to OUTPUT mode
  if (!SD.begin(chipSelect)) {
    Serial.println("Could not initialize SD card.");
  }
 
  if (SD.exists("eau.txt")) {
    Serial.println("File exists.");
  }  
    eau = SD.open("eau.txt", FILE_READ); // on ouvre eau.txt
    while (eau.available()) {
    String list = eau.readStringUntil('\r');
    data = list.toInt();
    eau.close(); // close file
       }
//data = 123;
///// Ecran Principal ////
  lcd.clear();
  lcd.begin(20,4);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(2,0); //Start at character 2 on line 0
  lcd.print("RESTE EAU DOUCE : ");
  lcd.setCursor(6,1);  
  lcd.print(data);
  lcd.print("  LITRES");
  lcd.setCursor(0,3);
  lcd.print("SI PLEIN REFAIT => 2");
 
  pinMode(sensorPin, INPUT_PULLUP);    //  was  pinMode(sensorPin, INPUT_PULLUP);
  digitalWrite(sensorPin, HIGH);

  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;

  attachInterrupt(sensorInterrupt, pulseCounter, FALLING); // sinon tester avec RISING²
 
  initHardware();
}

void loop()
{
 
//////////////  CONSO EAU ////////////

  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;  
    // RAZ du compteur pour recommencer à compter
  //    pulseCount = 0;
    // on remet le capteur à l'écoute
   //   attachInterrupt(sensorInterrupt, pulseCounter, FALLING);

      resto = (totalMilliLitres / 1000);
      data = data - resto;
      
     SD.remove("eau.txt");
      eau = SD.open("eau.txt", FILE_WRITE);
      if(eau){      
      eau.print(data); // write number to file
      eau.close(); // close file
   }

//////  BOUTONS /////////////
   
  VAL = digitalRead(inPinButton1);
  if(VAL == LOW){
  lcd.clear();
  lcd.setCursor(2,0); //Start at character 2 on line 0
  lcd.print("RESTE EAU DOUCE :");
  lcd.setCursor(5,1);  
  lcd.print(data);
  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){
    
     SD.remove("eau.txt");
      data = 360;
      eau = SD.open("eau.txt", FILE_WRITE); // on recréé et ouvre eau.txt
      if (eau){        
      eau.print(data); // write number to file
      eau.close(); // close file
      }
    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
  lcd.clear();
  lcd.setCursor(2,0); //Start at character 2 on line 0
  lcd.print("RESTE EAU DOUCE :");
  lcd.setCursor(5,1);  
  lcd.print(data);
  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(data);
  lcd.print(" LITRES");
  lcd.setCursor(0,3);
  lcd.print("SI PLEIN REFAIT => 2");
    }
        
 /////////////////  impressions sur PC, pour controler ////////////////
 
    Serial.println("Data saisie : ");
    Serial.println(data);
    Serial.println(" ");            
    Serial.println("totalMilliLitres : ");
    Serial.println(totalMilliLitres);
    Serial.println("total Litres : ");
    Serial.println(totalMilliLitres/1000.0);
    Serial.println(" ");
    Serial.println("flowMilliLitres : ");
    Serial.println(flowMilliLitres);
    Serial.println(" ");
    Serial.println("Reste Eau : ");
    Serial.println(resto);
    Serial.println(" ");
    Serial.println("FLOWRATE : ");
    Serial.println(flowRate);
    Serial.println(" ");   

    // Reset the pulse counter so we can start incrementing again
    pulseCount = 0;
    
    // Enable the interrupt again now that we've finished sending output
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
}
void pulseCounter()
{
  // Increment the pulse counter
  pulseCount++;
 
}

 


Date de création : 29/10/2018 12:12
Catégorie : ArduiBato -
Page lue 1760 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