Projet télémetre

Bonjour,
actuellement en réalisation d'un système télémètre, je rencontre un soucis.
je dispose du matériel nécessaire pour réaliser ce montage.
Mon problème est le suivant, en suivant le tutoriel d'Eskimon sur le télémètre, j'ai réalisé la programmation, la simulation arduino me donne en effet des valeurs précise mais rien ne s'affiche sur le LCD, seul la première ligne de sans caractère apparaît.

Voici mon programme:

#include "LiquidCrystal.h"
#define VITESSE 340

// VÉRIFIEZ AVEC VOS PROPRES BROCHES
LiquidCrystal lcd(6,7,5,4,3,2); //liaison 4 bits de données
const int USTrig = 9; // Déclencheur sur la broche 8
const int USEcho = 10; // Réception sur la broche 9

void setup() {
  lcd.begin(2, 16); // Initialisation de l’écran (2 lignes 16 caractères pour ma part)

   pinMode(USTrig, OUTPUT);
   pinMode(USEcho, INPUT);

   lcd.print(" TELEMETRE ");
digitalWrite(USTrig, LOW);

   Serial.begin(9600);
}

void loop() {
  // 1. Un état haut de 10 microsecondes est mis sur la broche "Trig"
  digitalWrite(USTrig, HIGH);
  delayMicroseconds(10); //on attend 10 µs
  // 2. On remet à l'état bas la broche Trig
  digitalWrite(USTrig, LOW);

  // 3. On lit la durée d'état haut sur la broche "Echo"
  unsigned long duree = pulseIn(USEcho, HIGH);

  if(duree > 30000)
  {
     //si la durée est supérieure à 30ms, l'onde est perdue
     lcd.clear();
     lcd.home(); // Replace le curseur en haut à gauche
     lcd.print("Onde perdue :(");
     lcd.setCursor(0,1);
     lcd.print("Mesure echouee !");
  }
  else
  {
     // 4. On divise cette durée par deux pour n'avoir qu'un trajet
     duree = duree/2;

     // 5. On calcul la distance avec la formule d=v*t
float temps = duree/1000000.0; //on met en secondes
     float distance = temps*VITESSE; //on multiplie par la vitesse, d=t*v    
    
     // 6. On affiche
     Serial.print("Duree = ");
     Serial.println(temps); //affiche le temps de vol d'un trajet en secondes
     Serial.print("Distance = ");
     Serial.println(distance); //affiche la distance mesurée (en mètres)
    
     lcd.clear();
     lcd.home(); // Replace le curseur en haut à gauche
     char message[16] = "";
     sprintf(message, " Dist : %4d mm", distance);
     lcd.print(message);
     sprintf(message, "Temps : %4d us", duree);
     lcd.setCursor(0,1);
     lcd.print(message);
  }
  delay(250); // Petite pause
}

Si quelqu’un pourrait m'aider a trouver la cause,
en vous remerciant,
cordialement

Édite ton message pour mettre le code entre balises CODE (touche </> lorsque tu modifies le message. Ca doit ressembler à ça :

#include "LiquidCrystal.h"
#define VITESSE 340

// VÉRIFIEZ AVEC VOS PROPRES BROCHES
LiquidCrystal lcd(6,7,5,4,3,2); //liaison 4 bits de données
const int USTrig = 9; // Déclencheur sur la broche 8

Merci

Essaye avec

lcd.begin(16,2);

j'ai essayer, rien ne change, une info que j'ai oublier de préciser : rétro éclairage actif mais pas de caractère qui s'affiche

#include "LiquidCrystal.h"
#define VITESSE 340

// VÉRIFIEZ AVEC VOS PROPRES BROCHES
LiquidCrystal lcd(6,7,5,4,3,2); //liaison 4 bits de données
const int USTrig = 9; // Déclencheur sur la broche 8
const int USEcho = 10; // Réception sur la broche 9
 
void setup() {
   lcd.begin(16,2); // Initialisation de l’écran (2 lignes 16 caractères pour ma part)

    pinMode(USTrig, OUTPUT);
    pinMode(USEcho, INPUT);

    lcd.print("-+ Eskimetre +-");
digitalWrite(USTrig, LOW);

    Serial.begin(9600);
}

void loop() {
   // 1. Un état haut de 10 microsecondes est mis sur la broche "Trig"
   digitalWrite(USTrig, HIGH);
   delayMicroseconds(10); //on attend 10 µs
   // 2. On remet à l'état bas la broche Trig
   digitalWrite(USTrig, LOW);

   // 3. On lit la durée d'état haut sur la broche "Echo"
   unsigned long duree = pulseIn(USEcho, HIGH);

   if(duree > 30000)
   {
      //si la durée est supérieure à 30ms, l'onde est perdue
      lcd.clear();
      lcd.home(); // Replace le curseur en haut à gauche
      lcd.print("Onde perdue : ");
      lcd.setCursor(0,1);
      lcd.print("Mesure echouee !");
   }
   else
   {
      // 4. On divise cette durée par deux pour n'avoir qu'un trajet
      duree = duree/2;

      // 5. On calcul la distance avec la formule d=v*t
      float temps = duree/1000000.0; //on met en secondes
      float distance = temps*VITESSE; //on multiplie par la vitesse, d=t*v    
     
      // 6. On affiche
      Serial.print("Duree = ");
      Serial.println(temps); //affiche le temps de vol d'un trajet en secondes
      Serial.print("Distance = ");
      Serial.println(distance); //affiche la distance mesurée (en mètres)
     
      lcd.clear();
      lcd.home(); // Replace le curseur en haut à gauche
      char message[16] = "";
      sprintf(message, " Dist : %4d mm", distance);
      lcd.print(message);
      sprintf(message, "Temps : %4d us", duree);
      lcd.setCursor(0,1);
      lcd.print(message);
   }
      delay(250); // Petite pause
}

Ca peut venir du branchement. Essaye ça :

 The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * LCD VSS pin to ground
 * LCD VCC pin to 5V

et

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

Quand je parlais des balises, c'était pour que tu édites ton premier message...

Peux-tu fournir une référence de ton écran, voire une photo ? Y a-t-il un potentiomètre pour régler le rétro-éclairage ?

Décidément ces écrans sont relous!

hello corrige ton premier post!
mets ton code entre balises

ensuite tu remplaceras la ligne d'init du lcd dans le setup par celle ci:

lcd.begin(16, 2);

Voila la modification de mon pemier post

merci
et la ligne à remplacer?

alors oui, en effet je dispose un potentiomètre qui me permettrai de jouer avec le rétro éclairage pour m'afficher les caractères ce qu'il ne fait pas.

mon écran numérique est le suivant : LCD 1602 1PC
image : https://ibb.co/bSdc7o
(un des LCD les plus basique)

concernant la ligne que tu souhaite que je modifie, tu parle de celle-ci ?

void setup() {
   lcd.begin(16,2); // Initialisation de l’écran (2 lignes 16 caractères pour ma part)

se trouvant dans void setup(); ?

voici une image de mon montage qui selon moi reste correct :

On apperçoit bien que le rétro éclairage est actif mais rien d’autre s’affiche, ni le message :
→ lcd.print("-+Eskimètre±");

ni les valeur de distance que me fournit l’ultrason, ces valeurs sont bien visible sur le moniteur de série sur le logiciel arduino

oui, tu as inversé les lignes et les colonnes.
tu initialises le ldc pour 2 colonnes et 16 lignes.
ta librairie doit bien te proposer un exemple, vérifie la façon dont l'init du lcd est faite

j'ai modifié l'ordre du lcd.begin en (2,16) au lieu de (16,2)

 lcd.begin(2,16); // Initialisation de l’écran (2 lignes 16 caractères pour ma part)

Mais toujours le même probleme.

Le lcd est peut être défectueux ou peu probable ?
avez vous vérifié mon programme ? je suis que débutant dans arduino, l'érreur vien peut être de la :confused:

kammo:
Décidément ces écrans sont relous!

Je suis bien d’accord, la première fois que j’ai essayé, j’ai ramé pendant un bon moment avant de le faire marcher…

Florentin, il faut que tu donnes toutes les informations possibles, même si 50% ne serviront pas :

  • Quel Arduino utilises-tu ?
  • Quelle est la référence de l’écran ?
  • Peux-tu poster une photo recto et une photo verso, avec si possible un zoom sur ce qui est écrit près des pins ?
  • Quelle bibliothèque utilises-tu ? Où l’as-tu trouvée ? Comment l’as-tu installée ?
  • Décris précisément tes branchements, par exemple sous forme d’un tableau :
Ecran     Arduino
 RS         11
etc...

La bibliothèque LiquidCrystal est ici , l’appel du begin se fait comme suit :
void LiquidCrystal::begin(uint8_t cols, uint8_t lines, uint8_t dotsize)begin(colonnes, lignes) donc 16,2 pour toi.

L’exemple le plus simple de la bibli est un simple affichage de “Hello World” sur la première ligne et du temps écoulé sur la seconde :

/*
  LiquidCrystal Library - Hello World
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 This sketch prints "Hello World!" to the LCD
 and shows the time.
  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * LCD VSS pin to ground
 * LCD VCC pin to 5V
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe
 modified 7 Nov 2016
 by Arturo Guadalupi
 This example code is in the public domain.
 http://www.arduino.cc/en/Tutorial/LiquidCrystalHelloWorld
*/

// include the library code:
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}

Je te conseille de le tester, avec les branchements conseillés dans le code. Si tu arrives déjà à faire fonctionner ça, ce sera bien. Tu pourras passer à la suite.

Dans ce listing, je ne comprends pas ces lignes :

 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

si quelqu’un en sait plus…

hello
le mieux est de téléverser un exemple donné avec la librairie.
s'il fonctionne , c'est ton code à toi qui n'est pas bon, s'il ne fonctionne pas, il faudra regarder du coté des branchements.

vas dans le menu gauche "fichiers", puis "exemples", "LiquidCristal" et sélectionnes "hello World".
tu compiles et téléverses et tu constates: fonctionne ou ne fonctionne pas

tu peux aussi vérifier ton branchement en 1er

voici un lien ou tu trouveras la correspondance des pinoches du LCD
et voici l'ordre dans lequel tu dois les déclarer.
il te suffit de vérifie si c'est bien ce que tu as cablé.
les pinoches du LCD
et l'ordre de declaration
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

de mémoire, il faut cabler "R/W" à GND

edit: grillé par le sept :slight_smile:

D'accord :

J'utilise comme carte : la UNO R3 Controller board 1PC.
Images : --> https://ibb.co/eSZTXo
--> https://ibb.co/c3SnQ8

Mon écran est : le LCD 1602 Module
Images : --> https://ibb.co/djW8Xo
--> https://ibb.co/kjWgk8

En me renseignant, j'ai installer la blibliothèque LiquidCrystal, que j'ai compresser pour insérer le dossier dans : Ce PC > DISQUE C: > Program Files (x86) > Arduino > libraries.

Une fois sur le logiciel arduino je l'ai insérer dans mon programme en parcourant croquis > inclure une blibliothèque > LiquidCrystal

Pour mes branchement :

ECRAN        ARDUINO 

vss      -->   GND
vdd     -->    5V
vo       -->    sortie potentiomètre
rs        -->    12
rw       -->    GND
E         -->    11
D4      -->     5
D5      -->     4
D6      -->     3
D7      -->     2
A        -->     5v
k        -->     GND



ULTRASON       ARDUINO

Vcc           -->    5v
Trig           -->    9
Echo         -->    10
Gnd          -->    Gnd


POTENTIOMETRE      ARDUINO        ECRAN

       +       -->      5v
       -        -->     Gnd
    sortie                   -->  V0

J'ai effectivement pensé a téléversé un exemple du logiciel Arduino afin de vérifié l'activité de l'écran, mais lors de la validation, sur tous les exemples ce la m'affiche un message d'erreur du type:

HelloWorld:42: error: redefinition of 'LiquidCrystal lcd'

j'ai pourtant navigué sur le net pour trouver la cause de ce message mais je n'y parvient pas.

Tu as installé 2 versions de la librairie LiquidCrystal.h ?

Non je l'ai remplacé par l'ancienne

Le message d'erreur dit que la ligne 42 contient une instanciation du lcd : a priori la ligne

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

et qu'elle apparaît déjà avant dans ton code. C'est bizarre : peux-tu vérifier ?

Après recherche, ça peut venir d'autres lignes qui renverraient vers celle-ci (voir ici) : poste ton code...

J’ai trouver la cause du problème, il ne s’agit pas du code mais de l’emplacement du potentiomètre, celui-ci été mal positionné sur la bord, désormais l’écran s’affiche, mais s’etait trop beau pour que tout fonctionne …

j’ai un autre soucis, l’orsque que aucun objet est devant l’éméteur ultrason, l’afficheur affiche ondes perdue : Mesure echouee !

Mais lorsque je place quelque chose devant l’éméteur et que je varie la distance entre ces deux, les valeurs de distance s’affiche bien sur le logiciel Arduino mais l’afficheur, lui n’affiche plus rien

à savoir que lorsque je téléverse le programme, l’afficheur affiche la distance mais s’éteint 2 à 3 secondes apres.

serait-il un probleme dans mon code ?

je re-post celui-ci

#include <LiquidCrystal.h>
#define VITESSE 340

// VÉRIFIEZ AVEC VOS PROPRES BROCHES
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7); //liaison 4 bits de données
const int USTrig = 9; // Déclencheur sur la broche 8
const int USEcho = 10; // Réception sur la broche 9
 
void setup() {
  
   lcd.begin(16,2 ); // Initialisation de l’écran (2 lignes 16 caractères pour ma part)

    pinMode(USTrig, OUTPUT);
    pinMode(USEcho, INPUT);

    lcd.print("-+ Eskimetre +-");
digitalWrite(USTrig, LOW);

    Serial.begin(9600);
}

void loop() {
   // 1. Un état haut de 10 microsecondes est mis sur la broche "Trig"
   digitalWrite(USTrig, HIGH);
   delayMicroseconds(10); //on attend 10 µs
   // 2. On remet à l'état bas la broche Trig
   digitalWrite(USTrig, LOW);

   // 3. On lit la durée d'état haut sur la broche "Echo"
   unsigned long duree = pulseIn(USEcho, HIGH);

   if(duree > 3000)
   {
      //si la durée est supérieure à 30ms, l'onde est perdue
      lcd.clear();
      lcd.home(); // Replace le curseur en haut à gauche
      lcd.print("Onde perdue : ");
      lcd.setCursor(0,1);
      lcd.print("Mesure echouee !");
   }
   else
   {
      // 4. On divise cette durée par deux pour n'avoir qu'un trajet
      duree = duree/2;

      // 5. On calcul la distance avec la formule d=v*t
      float temps = duree/1000000.0; //on met en secondes
      float distance = temps*VITESSE; //on multiplie par la vitesse, d=t*v    
     
      // 6. On affiche
      Serial.print("Duree = ");
      Serial.println(temps); //affiche le temps de vol d'un trajet en secondes
      Serial.print("Distance = ");
      Serial.println(distance); //affiche la distance mesurée (en mètres)
     
      lcd.clear();
      lcd.home(); // Replace le curseur en haut à gauche
      char message[16] = "";
      sprintf(message, " Dist : %4d mm", distance);
      lcd.print(message);
      sprintf(message, "Temps : %4d us", duree);
      lcd.setCursor(0,1);
      lcd.print(message);
   }
      delay(250); // Petite pause
}

jai changer la valeur ms en m et us en s et sa fonctionne, l’écran affiche ou l'erreur et les valeurs quand je positionne un objet devant, les valeurs sont complètement fausse mais cela vient peut être de l'emeteur ultra son, mais en ce qui me concerne,
je voulais me perfectionner sur le lcd et ça fonctionne :smiley: