potentiomètre et 74hc595

Bonjours, à tous
J’ai un problème de codage me semble t’il. J’ai réalisé un montage dans le cadre d’un projet plus complexe . J’ai 3 potentiomètre relié à une arduino mega. Et j’ai 3 bargraphes 10 leds relié mon arduino par l’intermédiaire de 3 composants 74hc595 (soit 24 leds sur 30 connectés et les 6 dernières directement à l’arduino par les broches de 8 à 13). Voici un schéma du câblage des 74hc595 (les masses, alimentations, et connexion à l’Arduino ne sont pas représenté par soucis de lisibilité) :

Et le programme :

//Broche connectée au ST_CP du 74HC595
const int verrou = 3;
//Broche connectée au SH_CP du 74HC595
const int horloge = 4;
//Broche connectée au DS du 74HC595
const int donnees = 2;
const int potpui = A0;  //  potard puissance
const int potfan = A1;  // potard ventillateur
const int pothyd = A2;  // potard hydrogene
int potp;
int potf;
int poth;
int led=0; // variable pour donnée à envoyer au 74hc
int led1=0;
int led2=0;
int led3=0;
int led4=0;
int ledbleu=8; // leds connecté directement à la carte
int ledbleu1=9;
int ledbleu2=10;
int ledbleu3=11;
int ledbleu4=12;
int ledbleu5=13;

void setup()
{
 
   pinMode(donnees, OUTPUT);
   pinMode(verrou, OUTPUT);
   pinMode(horloge, OUTPUT);
   
   pinMode(potpui, INPUT);
   pinMode(potfan, INPUT);
   pinMode(pothyd, INPUT);  
   
   pinMode(ledbleu, OUTPUT);
   pinMode(ledbleu1, OUTPUT);
   pinMode(ledbleu2, OUTPUT);
   pinMode(ledbleu3, OUTPUT);
   pinMode(ledbleu4, OUTPUT);
   pinMode(ledbleu5, OUTPUT);
}

void loop(){
  
    potp = analogRead (potpui);
    potf = analogRead (potfan);
    poth = analogRead (pothyd);
  checkp();//gestion du bargraphe vert
  checkf();//gestion du bargraphe orange
  checkh();//gestion du bargraphe bleu


digitalWrite(verrou, LOW); // envoie des données au 74hc
shiftOut(donnees, horloge, MSBFIRST, ~led);
shiftOut(donnees, horloge, MSBFIRST, ~led1);
shiftOut(donnees, horloge, MSBFIRST, ~led2);
shiftOut(donnees, horloge, MSBFIRST, ~led3);
shiftOut(donnees, horloge, MSBFIRST, ~led4);
digitalWrite(verrou, HIGH);}


void checkp (){
  if(potp <= 10 ){
 led = 0b00000000;
 led1 = 0b00;}
  if (potp > 10 && potp <= 102){
  led = 0b10000000;
  led1 = 0b00;}
  if(potp > 102 && potp <= 204 ){
 led = 0b11000000;
 led1 = 0b00;}
  if(potp > 204 && potp <= 306 ){
 led = 0b11100000;
 led1 = 0b00;}
  if(potp > 306 && potp <= 408){
 led = 0b11110000;
 led1 = 0b00;}
  if(potp > 408 && potp <= 510){
 led = 0b11111000;
 led1 = 0b00;}
  if(potp > 510 && potp <= 612){
 led = 0b11111100;
 led1 = 0b00;}
  if(potp > 612 && potp <= 714){
 led = 0b11111110;
 led1 = 0b00;}
  if(potp > 714 && potp <= 816){
 led = 0b11111111;
 led1 = 0b00;}
  if(potp > 816 && potp <= 918){
 led = 0b11111111;
 led1 = 0b10;}
  if(potp > 918 && potp <= 1023){
 led = 0b11111111;
 led1 = 0b11;}}
 
 void checkf (){
  if(potf <= 10 ){
 led2 = 0b000000;
 led3 = 0b0000;}
  if (potf > 10 && potf <= 102){
  led2 = 0b100000;
  led3 = 0b0000;}
  if(potf > 102 && potf <= 204 ){
 led2 = 0b110000;
 led3 = 0b0000;}
  if(potf > 204 && potf <= 306 ){
 led2 = 0b111000;
 led3 = 0b0000;}
  if(potf > 306 && potf <= 408){
 led2 = 0b111100;
 led3 = 0b0000;}
  if(potf > 408 && potf <= 510){
 led2 = 0b111110;
 led3 = 0b0000;}
  if(potf > 510 && potf <= 612){
 led2 = 0b111111;
 led3 = 0b0000;}
  if(potf > 612 && potf <= 714){
 led2 = 0b111111;
 led3 = 0b1000;}
  if(potf > 714 && potf <= 816){
 led2 = 0b111111;
 led3 = 0b1100;}
  if(potf > 816 && potf <= 918){
 led2 = 0b111111;
 led3 = 0b1110;}
  if(potf > 918 && potf <= 1023){
 led2 = 0b111111;
 led3 = 0b1111;}}

void checkh ()
{
  if(poth <= 10 ){
 led4 = 0b0000;
 digitalWrite(ledbleu,LOW);
 digitalWrite(ledbleu1,LOW);
 digitalWrite(ledbleu2,LOW);
 digitalWrite(ledbleu3,LOW);
 digitalWrite(ledbleu4,LOW);
 digitalWrite(ledbleu5,LOW); }
  if(poth >10 && poth <= 102){
 led4 = 0b0000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,LOW);
 digitalWrite(ledbleu2,LOW);
 digitalWrite(ledbleu3,LOW);
 digitalWrite(ledbleu4,LOW);
 digitalWrite(ledbleu5,LOW);}
  if(poth >102 && poth <= 204 ){
 led4 = 0b0000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,LOW);
 digitalWrite(ledbleu3,LOW);
 digitalWrite(ledbleu4,LOW);
 digitalWrite(ledbleu5,LOW);}
  if(poth >204 && poth <= 306 ){
 led4 = 0b0000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,LOW);
 digitalWrite(ledbleu4,LOW);
 digitalWrite(ledbleu5,LOW);}
  if(poth >306 && poth <= 408){
 led4 = 0b0000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,LOW);
 digitalWrite(ledbleu5,LOW);}
  if(poth >408 && poth <= 510){
 led4 = 0b0000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,HIGH);
 digitalWrite(ledbleu5,LOW);}
  if(poth >510 && poth <= 612){
 led4 = 0b0000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,HIGH);
 digitalWrite(ledbleu5,HIGH);}
  if(poth >612 && poth <= 714){
 led4 = 0b1000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,HIGH);
 digitalWrite(ledbleu5,HIGH);}
  if(poth >714 && poth <= 816){
 led4 = 0b1100;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,HIGH);
 digitalWrite(ledbleu5,HIGH);}
  if(poth >816 && poth <= 918){
  led4 = 0b1110;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,HIGH);
 digitalWrite(ledbleu5,HIGH);}
  if(poth >918 && poth <= 1023){
  led4 = 0b1111;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,HIGH);
 digitalWrite(ledbleu5,HIGH);}
 }

Le but de mon programme et d’affiché la valeur (entre 0 et 10 leds) de chaque potard sur un bargraphe. Or pour l’instant l’affichage et aléatoire sur certain et décalé sur d’autre . Donc avant de me pencher plus en avant sur la câblage (qui me semble correct pour l’instant) . Mon code vous semble t’il juste ?

Perso j'aurais mis au ponit avec un seul registre et quand cela aurait fonctionné correctement j'aurais étendu à trois regitres. La méthode des petits pas est tèés efficace.

Bonjour,

Personnellement j'aurais affecté les 8 leds de poids faible de chaque barregraphe à chaque 74HC595 et les 2 bits de poids fort aux sorties directes. Ce qui aurait permit de créer une fonction unique pour afficher sur un barregraphe ce qui outre que ça raccourci le code permet de faire facilement ce que suggère 68tjs et que je plussoie, c'est à dire mettre au point avec un barregraphe, les autres en découlant sans problème.

Alors merci à tous,
cela fonctionne grosso modo (fonctionnement logique) sauf la dernière led bleu (premier 74HC595) qui ne s’allume pas, mais je penche pour un problème de contact.
L’allumage de l’ensemble des leds n’a pas la même intensité je me demande à quoi cela peut être dû ? A la réinscription en continu des ports, un défaut des 74h595, j’ai vérifié les résistance sont bien connecté au bonne leds, un manque d’ampérage de la pile (j’utilise une pile 9V pour alimenter l’ensemble du système) ?

Pareil pour comprendre mon erreur, du fait que j’utilisais plusieurs shiftout que ce passais t’il ? les données sur 4 bits était convertit en 8 bits ? (1111 devenait 11110000 ?)

pour ceux comme moi qui passerais par la voici le code fonctionnel :

//Broche connectée au ST_CP du 74HC595
const int verrou = 3;
//Broche connectée au SH_CP du 74HC595
const int horloge = 4;
//Broche connectée au DS du 74HC595
const int donnees = 2;
const int potpui = A0;  //  potard puissance
const int potfan = A1;  // potard ventillateur
const int pothyd = A2;  // potard hydrogene
int potp;
int potf;
int poth;
int led=0; // variable pour donnée à envoyer au 74hc
int led1=0;
int led2=0;
int led3=0;
int led4=0;
int ledbleu=8; // leds connecté directement à la carte
int ledbleu1=9;
int ledbleu2=10;
int ledbleu3=11;
int ledbleu4=12;
int ledbleu5=13;

void setup()
{
 
   pinMode(donnees, OUTPUT);
   pinMode(verrou, OUTPUT);
   pinMode(horloge, OUTPUT);
   
   pinMode(potpui, INPUT);
   pinMode(potfan, INPUT);
   pinMode(pothyd, INPUT);  
   
   pinMode(ledbleu, OUTPUT);
   pinMode(ledbleu1, OUTPUT);
   pinMode(ledbleu2, OUTPUT);
   pinMode(ledbleu3, OUTPUT);
   pinMode(ledbleu4, OUTPUT);
   pinMode(ledbleu5, OUTPUT);
}

void loop(){
  
    potp = analogRead (potpui);
    potf = analogRead (potfan);
    poth = analogRead (pothyd);
  checkp();//gestion du bargraphe vert
  checkf();//gestion du bargraphe orange
  checkh();//gestion du bargraphe bleu


digitalWrite(verrou, LOW); // envoie des données au 74hc
shiftOut( donnees, horloge, MSBFIRST, led );
shiftOut( donnees, horloge, MSBFIRST, (led1<<6) | led2 );
shiftOut( donnees, horloge, MSBFIRST, (led3<<4) | led4 );
digitalWrite(verrou, HIGH);
}


void checkp (){
  if(potp <= 10 ){
 led = 0b00000000;
 led1 = 0b00;}
  if (potp > 10 && potp <= 102){
  led = 0b10000000;
  led1 = 0b00;}
  if(potp > 102 && potp <= 204 ){
 led = 0b11000000;
 led1 = 0b00;}
  if(potp > 204 && potp <= 306 ){
 led = 0b11100000;
 led1 = 0b00;}
  if(potp > 306 && potp <= 408){
 led = 0b11110000;
 led1 = 0b00;}
  if(potp > 408 && potp <= 510){
 led = 0b11111000;
 led1 = 0b00;}
  if(potp > 510 && potp <= 612){
 led = 0b11111100;
 led1 = 0b00;}
  if(potp > 612 && potp <= 714){
 led = 0b11111110;
 led1 = 0b00;}
  if(potp > 714 && potp <= 816){
 led = 0b11111111;
 led1 = 0b00;}
  if(potp > 816 && potp <= 918){
 led = 0b11111111;
 led1 = 0b10;}
  if(potp > 918 && potp <= 1023){
 led = 0b11111111;
 led1 = 0b11;}}
 
 void checkf (){
  if(potf <= 10 ){
 led2 = 0b000000;
 led3 = 0b0000;}
  if (potf > 10 && potf <= 102){
  led2 = 0b100000;
  led3 = 0b0000;}
  if(potf > 102 && potf <= 204 ){
 led2 = 0b110000;
 led3 = 0b0000;}
  if(potf > 204 && potf <= 306 ){
 led2 = 0b111000;
 led3 = 0b0000;}
  if(potf > 306 && potf <= 408){
 led2 = 0b111100;
 led3 = 0b0000;}
  if(potf > 408 && potf <= 510){
 led2 = 0b111110;
 led3 = 0b0000;}
  if(potf > 510 && potf <= 612){
 led2 = 0b111111;
 led3 = 0b0000;}
  if(potf > 612 && potf <= 714){
 led2 = 0b111111;
 led3 = 0b1000;}
  if(potf > 714 && potf <= 816){
 led2 = 0b111111;
 led3 = 0b1100;}
  if(potf > 816 && potf <= 918){
 led2 = 0b111111;
 led3 = 0b1110;}
  if(potf > 918 && potf <= 1023){
 led2 = 0b111111;
 led3 = 0b1111;}}

void checkh ()
{
  if(poth <= 10 ){
 led4 = 0b0000;
 digitalWrite(ledbleu,LOW);
 digitalWrite(ledbleu1,LOW);
 digitalWrite(ledbleu2,LOW);
 digitalWrite(ledbleu3,LOW);
 digitalWrite(ledbleu4,LOW);
 digitalWrite(ledbleu5,LOW); }
  if(poth >10 && poth <= 102){
 led4 = 0b0000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,LOW);
 digitalWrite(ledbleu2,LOW);
 digitalWrite(ledbleu3,LOW);
 digitalWrite(ledbleu4,LOW);
 digitalWrite(ledbleu5,LOW);}
  if(poth >102 && poth <= 204 ){
 led4 = 0b0000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,LOW);
 digitalWrite(ledbleu3,LOW);
 digitalWrite(ledbleu4,LOW);
 digitalWrite(ledbleu5,LOW);}
  if(poth >204 && poth <= 306 ){
 led4 = 0b0000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,LOW);
 digitalWrite(ledbleu4,LOW);
 digitalWrite(ledbleu5,LOW);}
  if(poth >306 && poth <= 408){
 led4 = 0b0000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,LOW);
 digitalWrite(ledbleu5,LOW);}
  if(poth >408 && poth <= 510){
 led4 = 0b0000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,HIGH);
 digitalWrite(ledbleu5,LOW);}
  if(poth >510 && poth <= 612){
 led4 = 0b0000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,HIGH);
 digitalWrite(ledbleu5,HIGH);}
  if(poth >612 && poth <= 714){
 led4 = 0b1000;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,HIGH);
 digitalWrite(ledbleu5,HIGH);}
  if(poth >714 && poth <= 816){
 led4 = 0b1100;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,HIGH);
 digitalWrite(ledbleu5,HIGH);}
  if(poth >816 && poth <= 918){
  led4 = 0b1110;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,HIGH);
 digitalWrite(ledbleu5,HIGH);}
  if(poth >918 && poth <= 1023){
  led4 = 0b1111;
  digitalWrite(ledbleu,HIGH);
 digitalWrite(ledbleu1,HIGH);
 digitalWrite(ledbleu2,HIGH);
 digitalWrite(ledbleu3,HIGH);
 digitalWrite(ledbleu4,HIGH);
 digitalWrite(ledbleu5,HIGH);}
 }

Pour le câblage différent proposé par kamill, c’est pas bête bon mon circuit est déjà souder mais si je devait manquer de place pour le reste de mon programme je le modifierais comme tu la proposé (quoi que pour gérer l’ensemble j’espère que 258 000 octets seront suffisant quand même).

Intensité lumineuse : Le Seuil des dels dépend de la couleur, les rouges ont le plus faible seuil et les bleues le seuil le plus élevé. Ce que tu contaste est donc normal. Tu peux le contrôler avec un voltmètre. Si c'est gênant tu peux ajuster la valeur des résistances pour rétablir les courants.

L'œil ne perçoit pas non plus les couleurs de manière uniforme.

En effet pepe cela ressemblais assez à ce que j’avais. Et cela m’éclaire.
En parlant de lumière :grinning: , 68tjs j’entendais une différence de lumière entre des leds d’un même bargraphe. Pas entre mes trois bargraphe. Cela m’intrigue

As tu mesuré les tensions aux bornes des résistances séries pour déterminer si les courants sont homogènes ? Et puis toutes les tensions accessibles comme les sorties des reg à dec.