Bonjour à tous:
Je possède des plusieurs cuves opaques afin de limiter les algues, dans lesquelles je collecte l'eau de pluie.
Je désir faire un appareil portatif qui ne restera pas en extérieur hors utilisation et donc portable sur chaque cuve.
En cherchant sur le Net et sur le forum, j'ai réussi à afficher la distance restante entre le HC-SR04 et le niveau d'eau restant, tout ceci sur la première ligne du LCD.
Là ou je suis bloqué, sur la seconde ligne, je désir afficher:
Volume: et le nombre de litres restants dans la cuve.
La formule élaborée dans Excel est la suivante:
Sachant que le HC_SR04 sera positionné à 110 cm du fond de la cuve, il y aura donc 10 cm de vide à déduire sur les mesures.
la formule Excel = (hauteur ou se trouve le HC_SR- la mesure trouvée par le HC_SR)x10
pour une mesure trouvée de 10 cm
en chiffres:
110-10*10 = 1000 L
Je fais appel à votre aide car je n'arrive pas à écrire la suite du code, malgré mes nombreux éssais et surtout, je ne sais pas transcrire la formule en C++
Pouvez-vous me venir en aide SVP
Merci
//*Prise de niveau cuve 1000 litres*//
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
int trig = 8;
int echo = 9;
long lecture_echo;
long cm;
long Litres;
void setup(){
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
Serial.begin(9600);
lcd.begin(16,2);
lcd.setCursor(3,0);// écrit à partir de la 4 éme case
lcd.print ("Niveau cuve");// écrit Niveau cuve
delay (3000);// pendant 3 secondes
lcd.clear();// efface le LCD
}
void loop(){
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo,HIGH);
cm = lecture_echo /58;
Serial.print("Distance en cm :");
Serial.println(cm);
lcd.setCursor (0,0);// commence l'écriture à la 1 ére case
lcd.print ("Distance: ");// écrit Distance:
lcd.setCursor (10,0);// continue à la 10 éme case ligne 1 pour écrir la distance trouvée
lcd.print (cm);// écrit cm
lcd.setCursor (14,0);// continue à la 14 éme case case ligne 1
lcd.print ("Cm");// écrit Cm
// Transformer les cm en litres
// pour l'nstant incertain quand à l'écriture de la formule Litres = 110 cm (haut ou est le HC_SR moins la mesure trouvée par le HC_SR multiplié par 100
// A savoir, 1 cm d'eau = 10 Litres
//lcd.print ("Volume: ")// écrit Volume:
//lcd.setCursor (17,0); // sur la ligne 2 et ensuite écrire le résultat de la formule
delay(800);// pendant 8 secondes
lcd.clear();// efface le LCD
}
Re bonjour,
J'ai oublié, carte arduino nano.
Peut être ai-je trouvé un début de piste/
Si je crée de variables
HC_SRpos qui serait la position fixe
HC_SRres qui serait la mesure trouvée
Difposres=HC_SRpos-HC_SRres
Resultat Difposres*10
j'ai commencé mes variables comme ceci:
int resultat = 0, HCSRpos = 0, HCSRres = 0, Vol1 = 0, Volres = 0;
Vol1 = HCSRpos - HCSRres
Volres = Vol1 x 10
Qu'en pensez-vous et surtout comment s'écrit le code et ou le positionner dans ce qui est déjà fait ?
Merci à tous
Robert
J'éssaie d'avancer, à la compilation du code, pas d'anomalie, je l'ai téléversé sur l'arduino et je n'ai que la première ligne qui s'affiche Distance x cm.
Rien sur la seconde ligne.
Le code:
//*Prise de niveau cuve 1000 litres*//
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
int trig = 8;
int echo = 9;
long lecture_echo;
long cm;
long Litres;
int resultat = 0, HCSRpos = 0, HCSRres = 0, Vol1 = 0, Volres = 0,Conv = 10;
void setup(){
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
Serial.begin(9600);
lcd.begin(16,2);
lcd.setCursor(3,0);// écrit à partir de la 4 éme case
lcd.print ("Niveau cuve");// écrit Niveau cuve
delay (3000);// pendant 3 secondes
lcd.clear();// efface le LCD
}
void loop(){
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo,HIGH);
cm = lecture_echo /58;
Serial.print("Distance en cm :");
Serial.println(cm);
lcd.setCursor (0,0);// commence l'écriture à la 1 ére case
lcd.print ("Distance: ");// écrit Distance:
lcd.setCursor (10,0);// continue à la 10 éme case ligne 1 pour écrir la distance trouvée
lcd.print (cm);// écrit cm
lcd.setCursor (14,0);// continue à la 14 éme case case ligne 1
lcd.print ("Cm");// écrit Cm
//====================================================
// Transformer les cm en litres
Vol1 = HCSRpos - HCSRres;
Volres = Vol1 * Conv;
Serial.println("Volume: ");
lcd.setCursor (18,1);
lcd.print ("Volume: ");
lcd.setCursor (24,1);
lcd.print (Volres);
lcd.setCursor (29,1);
lcd.print ("L");
// pour l'nstant incertain quand à l'écriture de la formule Litres = 110 cm (haut ou est le HC_SR moins la mesure trouvée par le HC_SR multiplié par 100
// A savoir, 1 cm d'eau = 10 Litres
//lcd.print ("Volume: ")// écrit Volume:
//lcd.setCursor (17,0); // sur la ligne 2 et ensuite écrire le résultat de la formule
delay(800);// pendant 8 secondes
lcd.clear();// efface le LCD
}
Merci de me répondre.
Arduino uno et quand le projet sera ok ça ira sur une nano.
LCD 16.02A
Il y a du progrès. J'arrive à afficher Volume: et L
Mes formules ne fonctionnent pas j'ai 0
// Transformer les cm en litres
Vol1 = HCSRpos - HCSRres;
Volres = Vol1 * Conv;
Serial.print("Volume: ");
Serial.println("Volume: ");
lcd.setCursor (1,1);
lcd.print ("Volume: ");
lcd.setCursor (9,1);
lcd.print (Volres);
lcd.setCursor (14,1);
lcd.print ("L");
@+
Robert
Bonjour j'ai programmé ce code pour ma cuve et tout fonctionne tu peux l'adapter pour ta cuve.
Le voici:
/* code module ultrason simple */
/* constantes pour les broches */
const byte TRIGGER = 12; // broche TRIGGER
const byte ECHO = 11; // broche ECHO
/* Constantes pour le timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = 8m à 340m/s
/* Vitesse du son dans l'air en mm/us */
const float SOUND_SPEED = 340.0 / 1000;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);// initialisation LCD en mode 4 bits
void setup() { /*code pour module ultrason HCSR04 */
lcd.init(); // initialisation de l'afficheur
delay(10); // pause rapide pour laisser le temps initialisation
lcd.backlight();/* active retro-eclairage
sans cette ligne pas de retro-eclairage */
Serial.begin(115200);
pinMode(8, OUTPUT); //led rouge buzer
digitalWrite(8, LOW);
pinMode(9, OUTPUT); //led verte
digitalWrite(9, HIGH);
/* ATTENTION SUR ECRAN SERIAL MONITOR , il faudra choisir 115200 baud dans menu deroulant */
pinMode(TRIGGER, OUTPUT);
digitalWrite(TRIGGER, LOW);
pinMode(ECHO, INPUT);
}
void loop() {
/* 1 envoie une impulsion HIGH de 20 us sur broche trigger pas 10 sinon on a des zeros */
digitalWrite(TRIGGER, HIGH);
delayMicroseconds(20);
digitalWrite(TRIGGER, LOW);
/* 2 Mesure le temps entre l'envoi de l'impulsion et son echo */
long measure = pulseIn(ECHO, HIGH, MEASURE_TIMEOUT);
/* 3 calcul la distance a partir du temps mesuré */
float distance_mm = measure / 2.0 * SOUND_SPEED;
Serial.println("distance ");
Serial.print(distance_mm / 10.0, 2);
Serial.print("cm, ");
Serial.print(distance_mm / 1000.0, 2);
Serial.print("mm ");
//code LCD
//-------------------------------
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Haut_vid");
lcd.setCursor(9,0);
lcd.print(distance_mm / 10.0, 2);
lcd.print("cm, ");
lcd.setCursor(0,1);
lcd.print("Niv L ");
lcd.setCursor(6,1);
/*caractéristiques de ma citerne
diam interieur 2m39 haut 1m96 + 20cm (haut du capteur) soit un total
de 2m16 => 216cm pour 8793litres x2 pcq 2 citernes soit 17586 L
Pour 1cm la formule est 17586 / 216 = 81,417 litre par cm
la formule est 216cm - (haut du vid / 10) *81,417
*/
lcd.print((216-(distance_mm / 10.0))*81.417);
//fin code LCD
//-------------
if (distance_mm < 400)
{
digitalWrite(8, LOW); //led rouge buzer OFF distance plus grand que 1 metre
digitalWrite(9, HIGH); //led verte ON
}
else
{
digitalWrite(8, HIGH); //led rouge buzer ON distance plus petit que 1 metre
digitalWrite(9, LOW); //led verte OFF
}
delay(2000);
}
Voilà bien sur il faut l'adapter suivant ta citerne...
A bientôt
Boby71C:
Bonjour 68tjs
Désolé, je suis novice dans le domaine donc je suis mal organisé et je ne comprends pas très bien votre réponse.
Justement si tu es novice (on l'a tous été un jour) c'est encore plus utile.
Actuellement , a ce que j'ai compris, tu as deux problèmes : la "formule" ne donne pas le bon résultat et l'affichage se fait mal et tu essaye de résoudre les deux dans le même programme.
Quand je suis dans cette situation (je ne suis pas un grand programmeur) je sépare les problème pour n'en traiter qu'un à la fois.
Si j'étais à ta place je m'occuperais en premier de la "formule" et j'écrirai un premier programme pour ne m'ocuper que de la validité des calculs.
Pour cela j'utiliserai un outil de sortie qui fonctionne tout seul : les sorties texte sur le moniteur de l'IDE. Je pense que tu sais ce que c'est, sinon précipite toi sur le tuto d'Eskimon dont le lien d'accès est donné dans le message épinglé "Règles du forum francophone".
Les sorties sur le moniteur sont ultra simples et ultra rapide à mettre en place. La seule chose à savoir c'est qu'il n'accepte pas les lettres accentuées : donc pas d'accent.
Une fois la formule réglée j'écrirai un autre programme où je m'apprendrai à écrire sur l'écran LCD.
Puis j'appliquerai ce que j'ai appris dans le programme définitif.
Raisonner sur quelques lignes est bien plus facile que sur un code de plusieurs dizaines de ligne plus ou moins complexe.
C'est ça le sens de mon intervention : résoudre un problème à la fois sur des applications les plus simples possibles.
C'est loin d'être une perte de temps, au contraire on en gagne.
Bonjour à tous
didiersee, merci pour le code. Malheureusement il ne fonctionne pas sur ma uno. Je vais éssayer de chercher pourquoi .
68tjs, merci pour vos conseils. Je ne trouve pas le lien dans "règles du forum francophone".
Je pense que je vais aller acheter un livre sur la programmation en C pour essayer de m'améliorer car pour l'instant, c'est compliqué pour moi et je n'arrive pas à terminer mon petit projet.
Si le code ne fonctionne pas tu pourrais le placer ici on pourrait déjà "degrossir" les problèmes. comme te conseil 68tjs un problème à la fois... Et que dit le programme ?quelles sont les messages d'erreur ?
Bonjour à tous,
Malgré mes recherches et mes nombreux essais, toujours pas le résultat attendu.
Il y a de l'amélioration, j'arrive à afficher:
Haut eau 112 Cm
Volume 0,00 L
Il y a certainement une erreur dans ma formule ou la déclaration des variables, mais je sèche lamentablement.
J'ai suivi les conseils de jt68 mais le résultat final n'y est pas. Ça m'a quant même permis de mieux comprendre l'ordre des lignes de code. Je pense que malgré cela, ça ne doit pas être au top
Mon dernier code.
//*Prise de niveau cuve 1000 litres*//
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
int trig = 8;
int echo = 9;
long lecture_echo;
long Cm;
long Litres;
double HautEau = 0,HCSRpos = 0, HCSRres = 0;
double Resultat;
void setup(){
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
Serial.begin(9600);
lcd.begin(16,2);
lcd.setCursor(3,0);// écrit à partir de la 4 éme case
lcd.print ("Niveau cuve");// écrit Niveau cuve
delay (3000);// pendant 3 secondes
lcd.clear();// efface le LCD
}
void loop(){
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo,HIGH);
Cm = lecture_echo /58;
Serial.print("Hauteur d' eau: ");
Serial.println(Cm);
Serial.print("Cm ");
lcd.setCursor (0,0);// commence l'écriture à la 1 ére case
lcd.print ("Haut eau: ");// écrit Haut eau:
lcd.setCursor (10,0);// continue à la 10 éme case ligne 1 pour écrir la distance trouvée
lcd.print (Cm);// écrit la valeur de la mesure trouvée
lcd.setCursor (14,0);// continue à la 14 éme case ligne 1
lcd.print ("CM");// écrit CM
lcd.setCursor (0,1);// commence l'écriture à la 1 ére case de la ligne 2
lcd.print ("Volume: ");// écrit Volume:
lcd.setCursor (8,1);// continue à la 8 éme case ligne 1 de la ligne 2 pour écrir Volume:
Serial.print("Volume d' eau: ");
//==========partie qui ne fonctionne pas. Affiche 0,00==========
//HautEau = 112-25;
HautEau = HCSRpos-HCSRres;// Calcul la hauteur d'eau restante ( haut ou est positionné le HCSR moins haut mesurée )ceci nous donne la haut d'eau dans la cule
// sachant que 1 cm d'eau représente 10 Litres
Resultat = HautEau*10;// Calcul le résultat final en multipliant par 10 Litres
lcd.print (Resultat);// ?? pour l'instant n'affiche que 0,00 ??
lcd.print (" L");// écrit L pour Litres
//Serial.println(Litres);
Serial.println(Resultat);
Serial.print("Litres ");
delay(2000);// rafraichissement toutes les 2 secondes
lcd.clear();// efface le LCD
}
HautEau = HCSRpos-HCSRres;// Calcul la hauteur d'eau restante ( haut ou est positionné le HCSR moins haut mesurée )ceci nous donne la haut d'eau dans la cule
// sachant que 1 cm d'eau représente 10 Litres
Resultat = HautEau*10;// Calcul le résultat final en multipliant par 10 Litres
lcd.print (Resultat);// ?? pour l'instant n'affiche que 0,00 ??
Comment peut tu discerner si c'est le calcul qui est faux ou l'affichage qui ne fonctionne pas ?
J'avais dit pas de LCD.
Conseil :
//Ajout
Serial.print("HCSRpos = );
Serial.println(HCSRpos");
Serial.print(HCSRres = ");
Serial.println(HCSRres);
// fin ajout
HautEau = HCSRpos-HCSRres;// Calcul la hauteur d'eau restante ( haut ou est positionné le HCSR moins haut mesurée )ceci nous donne la haut d'eau dans la cule
//Ajout
Serial.print("Hauteur = ");
Serial.println(HautEau);
// fin ajout
// sachant que 1 cm d'eau représente 10 Litres
Resultat = HautEau*10;// Calcul le résultat final en multipliant par 10 Litres
//Ajout
Serial.print(" Resultat = ");
Serial.println(Resultat);
//fin ajout
Là tu saura si le calcul est bon ou faux.
Pour le LCD le meilleur moyen de le maîtriser est de commencer avec les exemples fournis avec la bibliothèque.
PS : les puristes te feront remarquer que les noms de variables commencent toujours par une minuscule, je ne suis pas puriste mais il faut reconnaître qu'ils n'ont pas tord c'est plus facile à lire et surtout à relire.
J'ai fait un essai avec des chiffres, vous pouvez voir dans mon code:
//HautEau = 112-25;
là, ça fonctionne. D’où ma remarque d’amateur, je n'arrive pas à discerner si ça vient de mes variables ou de la formule.
Dans ma petite logique peut être totalement fausse
HCSRpos est la position fixe de module HC-SR04
HCSRres est la hauteur du niveau d'eau restante
Si HCSRpos 110 cm - HCSRres 90 cm Resultat = 20 cm
Resultat 20 cm * 10 = 200 L puisque 1 cm = 10 Litres
savonario t'a aidé, moi je te laissais découvrir tout seul c'est plus formateur.
Donc HCSRpos ne semble pas avoir reçu une valeur pendant le déroulement du programme et reste à sa valeur de définition.
A ce niveau tu va perdre ton temps à trouver des erreurs.
Tu gagnera du temps à tout réécrire à partir de zéro : j'ai bien dit réécrire et surtout pas de coupé/collé.
Ce n'est pas la meilleure façon de programmer mais pour débuter déclare les variables en globale, tu te prendra moins la tête.
Code :
Je travail exclusivement avec moniteur série et rien n'y fait.
J'arrive à trouver la distance entre le HC-SR et l'obstacle mais à l'écran je voudrais la différence entre 110 cm et hcsrres et le résultat m'affiche le distance entre HC-SR et obstacle
je ne comprends pas ou est ce que je fais une erreur.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
int trig = 8;
int echo = 9;
long lecture_echo,Litres = 0, Cm;
//double hcsrpos = 110, hcsrres = 0, HautEau = 0,Resultat = 0;
int hcsrpos = 110, hcsrres = 0, HautEau = 0,Resultat = 0;
void setup() {
pinMode(trig, OUTPUT);//ok
Serial.begin(9600);
delay (5000);// pendant 5 secondes
}
void loop() {
digitalWrite(trig, HIGH);
digitalWrite(trig, LOW);
lecture_echo = pulseIn(echo,HIGH);
Cm = lecture_echo /58;
Serial.print("Hauteur d' eau: ");//ok
Serial.print("CM ");//ok
Serial.println(Cm);//ok
Cm = 110 - hcsrres;
delay(5000);// rafraichissement toutes les 5 secondes
Tu as déclaré Cm comme un entier long.
Tu le divise par 58 qui est un entier.
Le résultat sera une division entière et non pas la division décimale à laquelle tu t'attend.
int a = 5;
int b = 2;
int c;
Si tu fait a div b tu obtient 2 pour le quotient et 1 pour le reste.
La division décimale aurait donné 2,5 comme résultat.
Déclare cM en float et écrit 58.0 au lieu de 58 tout court.
float a = 5.0;
float b = 2.0;
float c ;
c = a/b donnera 2.5 comme résultat.
Un langage de programmation (C et C++ ici) ne fera que ce que tu lui demande de faire.