[Tuto] Utiliser un bargraph avec un Arduino Uno

Posted On: nov. 18, 2013

Categories: Arduino

Tags: arduino , bargraphe , capteur , led , tuto , uno

Utiliser un bargraph

Le but de ce montage est de découvrir comment utiliser le bargraph. Le bargraph est un ensemble de LED très utile pour visualiser des informations sous forme d'échelle (puissance sonore, niveau d'eau...). Dans cet exemple, nous allons utiliser un capteur de type photo resistance mais vous pouvez utiliser n'importe quel capteur analogique pour le remplacer.

Composants nécessaires :

Un Arduino

Un câble USB

Un bargraph

Un capteur

Une Breadboard

Des fils de connexions

 
composants

Le montage consiste à relier le bargraph à 10 sorties numériques du Arduino et le capteur sur une entrée analogique comme sur le schéma ci-dessous :Principe du montage :

Bargraphe_schéma

Montage

Programmation du montage:

Le programme va lire le capteur et transposer sa valeur en allumant un nombre de LED proportionnel à sa valeur. On pourra aussi avoir la valeur lue par l'interface série.

#define SENS_PIN 0 // Pin utilisée pour le capteur
#define LED_COUNT 10 // Nombre de LEDs utiliséesnndouble sens;// Variable comprenant la valeur du capteurndouble V_IN =5.0;// Variable de la tension d'alimentation
double R1 =10000;// Valeur de la resistance en parallele
int ledPins[]={0,1,2,3,4,5,6,7,8,9};// Tableau comprenant les références des pins utiliséesn
void setup(){
Serial.begin(9600);
for(int thisLed =0; thisLed < LED_COUNT; thisLed++){
pinMode(ledPins[thisLed], OUTPUT);// Boucle pour définir les pin utilisees comme sorties
}
}
void loop(){sens = analogRead(SENS_PIN);// Lecture de la valeur du capteur
Serial.print("Valeur mesuree = ");
Serial.print(sens);// Affichage de la valeur mesurée de 0 à 1024
Serial.print("n");
int ledLevel = map(sens,0,1023,0, LED_COUNT);// Creation d'une valeur en 0 et LED_COUNT fonction de la mesure
for(int thisLed =0; thisLed < LED_COUNT; thisLed++){
// Si la valeur est inferieur a LED_COUNT on allume la LED
if(thisLed < ledLevel){
digitalWrite(ledPins[thisLed], HIGH);
}
// turn off all pins higher than the ledLevel:
else{
digitalWrite(ledPins[thisLed], LOW);
}
}
// Pause de 1 seconde
delay(1000);
}

Il reste à brancher le Arduino pour compiler le programme et le téléverser.

Une fois terminé cela nous donne :

ON 1

ON 2

Pour aller plus loin : Il sera ensuite possible d'optimiser l'échelle, de mettre en parallèle plusieurs bargraph...

Comments

  • Laurent
    janv. 25, 2016
    Oui c'est fonctionnelle merci &agrave; vous ! Le soucis maintenant c'est qu'a un moment pendant les tests, j'ai le sonar qui bloque ou qui d&eacute;conne il mesure entre 4 et 6cm et bloque sur cette valeur... impossible d'en sortir. Tr&egrave;s bizarre enfin je vais chercher. Merci encore
  • admin
    janv. 25, 2016
    Pour inverser la logique, je vous propose de changer if(thisLed &lt; ledLevel) en if(thisLed &gt; ledLevel)
  • Laurent
    janv. 25, 2016
    merci pour votre retour, c'est bien ce que j'avais au d&eacute;but, mais dans ce cas j'ai les leds qui s'allume lorsque j'ai 200cm et qui se coupe lorsque je me rapproche. C'est l'inverse que je cherche &agrave; faire... Donc quand je suis proche de 0cm les leds devraient s'allumer (10 led ON) et plus j'augmente la distance plus les leds devraient s'&eacute;teindre... et ensuite augmenter quand je reviens vers 0cm... C'est compliqu&eacute; je sais :-(
  • admin
    janv. 25, 2016
    L'erreur est au niveau de votre boucle for vous devriez avoir thisLed &lt; LED_COUNTnnhttps://www.arduino.cc/en/Reference/For
  • Laurent
    janv. 25, 2016
    le voici, ne faites pas attention au DHT11 !nnnn#include // LIBRAIRIE DU DHT11 nn#define LED_COUNT 10 // Nombre de LEDs utilis&eacute;esn#define VITESSE 34000 //vitesse du son 340 m/s + 2 zeron#define TRIG 12 // Vert pin D6 - TRIG du HC-SR04n#define ECHO 13 // orange pin D7 - ECHO du HC-SR04n#define dht_dpin A0 // port digital 0 pour l'entr&eacute; du DHT11nnint ledPins[]={0,1,2,3,4,5,6,7,8,9};// Tableau comprenant les r&eacute;f&eacute;rences des pins utilis&eacute;esnint Buzzer = 0;ndht DHT;n nnvoid setup() {n n // On &eacute;tablis la liaison a 9600 Baudsn Serial.begin (9600); n Serial.println(&quot;Liaison s&eacute;rie en ligne&quot;); n //for(int thisLed =0; thisLed LED_COUNT; thisLed++){n pinMode(ledPins[thisLed], OUTPUT);// Boucle pour d&eacute;finir les pin utilisees comme sortiesn //digitalWrite(ledPins[thisLed], HIGH);n //delay(3000);n n}n n //On d&eacute;finie les entr&eacute;es/Sortiesn pinMode(TRIG, OUTPUT);n pinMode(ECHO, INPUT);n pinMode(Buzzer, OUTPUT); // Buzer en sortien digitalWrite(TRIG, LOW);n n n}nnvoid loop() { nnSerial.println(&quot;Boucle en cours&quot;);n n //__________________________________________________________________________n n DHT.read11(dht_dpin);nn Serial.print(&quot;Humidite = &quot;);n Serial.print(DHT.humidity);n Serial.println(&quot;% &quot;);n Serial.print(&quot;temperature = &quot;);n Serial.print(DHT.temperature); n Serial.println(&quot;C &quot;);n n //__________________________________________________________________________nn // lecture sonarn delay(5000);n digitalWrite(TRIG, HIGH);n delayMicroseconds(10);n digitalWrite(TRIG, LOW);n unsigned long duree = pulseIn(ECHO, HIGH); //On lit la dur&eacute;e d&rsquo;&eacute;tat haut sur la broche &quot;Echo&quot;n //delay(3000);n n duree = (duree/2); // On calcule je /divise par deux pour n'avoir qu'un trajetn n //On calcule la distance avec la formule d=v*tn float temps = duree/1000000.0; //on met en secondesn float distance = temps*VITESSE; //on multiplie par la vitesse, d=t*vnn //On affiche la distancen //Serial.print(&quot;Duree = &quot;);n //Serial.println(temps); //affiche le temps de vol d'un trajet en secondesn Serial.println(&quot; &quot;); //saute une lignen Serial.print(&quot;Distance= &quot;);n Serial.print(distance); //affiche la distance mesur&eacute;e (en m&egrave;tres)n Serial.println(&quot; cm&quot;);nn // METTRE PROFONDEUR MAX (ICI 200 TEST)n int NiveauInverse = map(distance,15,200,200,15);n Serial.println(NiveauInverse);n n int ledLevel = map(NiveauInverse,0,200,0,LED_COUNT);n Serial.println(ledLevel);n nn for(byte thisLed =0; thisLed &amp;gt; LED_COUNT; thisLed++){n// Si la valeur est sup&eacute;rieur a LED_COUNT on &eacute;teint la LEDn if(thisLed &amp;lt; ledLevel)n { digitalWrite(ledPins[thisLed], LOW); }n n else{ digitalWrite(ledPins[thisLed], HIGH); } n }nnn}
  • admin
    janv. 25, 2016
    Pourriez-vous mettre l'ensemble de votre sketch?
  • Laurent
    janv. 25, 2016
    C'est bien &ccedil;a. Le nombre de LED dans mon cas, c'est un bargraphe de 10led !nnM&ecirc;me avec cette boucle je n'arrive pas. les LED ne s'allume plus ! Je bloque vraiment, sur cette affichage qui parait tout b&ecirc;te &agrave; r&eacute;aliser ! Les leds devraient &ecirc;tre toujours allum&eacute;es et diminuer suivant la distance.
  • admin
    janv. 25, 2016
    Je ne suis pas s&ucirc;r d'avoir compris ce &agrave; quoi correspond LED_COUNT. Est-ce bien le nombre de LEDs disponible dans votre bargraph?nnPour la boucle For je l'aurai &eacute;crit de cette mani&egrave;re:nfor(byte thisLed =0; thisLed &gt; LED_COUNT; thisLed++){n// Si la valeur est sup&eacute;rieur a LED_COUNT on &eacute;teint la LEDnif(thisLed &lt; ledLevel){ndigitalWrite(ledPins[thisLed], LOW);n}else{ndigitalWrite(ledPins[thisLed], HIGH);n}n}
  • Laurent
    janv. 25, 2016
    Merci pour cette rapide r&eacute;ponse. Voil&agrave; ce que j'avais fait:nn int NiveauInverse = map(distance,10,200,200,10);n Serial.println(NiveauInverse);n n int ledLevel = map(NiveauInverse,0,200,0,LED_COUNT);n Serial.println(ledLevel);nnDans le premier cas j'inverse (NiveauInverse) la distance qui va de 10cm &agrave; 200cm et donc change en 200cm &agrave; 10cm. En retour &ccedil;a fonctionne bien. Imaginons une cuve, J'ai l'affichage de ce qui reste dans le fond et plus la distance !nnEnsuite je modifie (tout comme vous) la valeur en cm vers une plage de 0 &agrave; 10 (LED). Pareil en retour j'ai un fractionnement par 10 de ma distance. nnLa ou je cale c'est plut&ocirc;t dans l'affichage. j'ai modifi&eacute; votre code pour avoir &agrave; les LED du bargraph 0% = 1Led &amp;gt;&amp;gt; 100% = 10 LED allum&eacute;e... Je ne vois pas mes erreurs et je sais qu'il y en &agrave; !nn for(int thisLed =10; thisLed &amp;gt; LED_COUNT; thisLed--){ n // Si la valeur est sup&eacute;rieur a LED_COUNT on &eacute;teint la LEDn n if(thisLed &amp;lt; ledLevel){n digitalWrite(ledPins[thisLed], LOW);n }nn else{n digitalWrite(ledPins[thisLed], HIGH);n }
  • admin
    janv. 25, 2016
    Bonjour,nnPour inverser une valeur je vous conseille d'utiliser la fonction map &lt;a href=&quot;https://www.arduino.cc/en/Reference/Map&quot; rel=&quot;nofollow&quot;&gt;https://www.arduino.cc/en/Reference/Map&lt;/a&gt;nnVous pouvez par exemple le coder de la mani&egrave;re suivante:nmap(MaMesure, 0, 200, 200, 0);nnCela vous permettra d'inverser la mesure sur une &eacute;chelle de 0 &agrave; 200.
  • Laurent
    janv. 25, 2016
    Bonjour,nnJe me permet de vous contacter car je bloque sur ce projet. Je m'en suis inspir&eacute; (et donc merci &agrave; vous) pour mon afficheur bargraph + sonar. Mais j'aimerais rentrer une valeur en centim&egrave;tre (de 0 &agrave; 200cm par exemple) et faire l'inverse donc avoir l'affichage complet &agrave; 0cm et le faire diminuer au fur et &agrave; mesure que les &quot;cm&quot; augmente. J'ai r&eacute;ussi &agrave; faire comme vous mais l'inversion me pose probl&egrave;me. Apr&egrave;s 3h de bidouilles je me retourne vers vous pour envisager votre aide.nnMerci d'avance

Leave a comment

Sign in