Go Down

Topic: Bargraph qui pose des problèmes (Read 898 times) previous topic - next topic

EGT59

j'ai modifié le setup mais ça n'a pas résolu le problème.

En faisant des tests, beaucoup de tests, et encore des tests ..... j'ai constaté que si j'avais plusieurs leds oranges sur les segment de 5 à 12 du bargraphe ça mettait le bord.. et ça bloquait tout.

Pourquoi , ça je ne sais pas, je ne suis pas assez calé dans le domaine.

J'ai donc modifié mes couleurs de bargraphe à partir du niveau 8 et c'est bon ça fonctionne. je sais c'est une solution pour contourner le problème mais bon faut bien tricher des fois  :)

Voici le code modifié :

Code: [Select]
#include <SPI.h>

#define LOAD          10   // Entrée LOAD du MAX72219
#define DISPLAY_TEST  0x0F // Registre Display-Test
#define SHUTDOWN      0x0C // Registre Shutdown
#define DECODE_MODE   0x09 // Registre Decode-mode
#define SCAN_LIMIT    0x0B // Registre Scan-limit
#define INTENSITY     0x0A // Registre Intensity
#define DIGIT0        0x01 // Registre Digit 0
#define DIGIT1        0x02 // Registre Digit 1
#define DIGIT2        0x03 // Registre Digit 2
const int m = 1000;

void setup() {
  pinMode(LOAD, OUTPUT);
  digitalWrite(LOAD, HIGH);
  SPI.begin();
 
  writeRegister(DISPLAY_TEST, 0x00); /* Normal operation */
  writeRegister(DECODE_MODE, 0x00);  /* No decode */
  writeRegister(SCAN_LIMIT, 0x02);   /* Display digits 0, 1, 2 */
  writeRegister(INTENSITY, 0x04);    /* LED brightness, max=0x0F */
  writeRegister(SHUTDOWN, 0x01);     /* Normal operation */
  delay(500);
}

void writeRegister(byte thisRegister, byte thisValue) // Écrire dans un registre du MAX7219
{
  SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0));
  // Mettre l'entrée LOAD à l'état bas
  digitalWrite(LOAD, LOW);

  SPI.transfer(thisRegister); // Adresse du registre
  SPI.transfer(thisValue); // Contenu du registre

  // Basculer l'entrée LOAD à l'état haut pour verrouiller et transférer les données
  digitalWrite(LOAD, HIGH);
  SPI.endTransaction();
}

void niveau1() {
  byte red = 0x00;
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0x00); // 0000 0000
  writeRegister(DIGIT2, 0x00); // 0000 0000

  for (int i = 0; i < 4; i++) {
    red |= (1 << i);
    writeRegister(DIGIT0, red); // scan du premier digit en rouge
    delay(500);
  }
  for (int i = 0; i < 5; i++) {
    writeRegister(DIGIT0, 0x0F);
    delay(100);
    writeRegister(DIGIT0, 0x00);
    delay(100);
  }
}

void niveau2() {
  writeRegister(DIGIT0, 0xCF); // 1100 1111
  writeRegister(DIGIT1, 0xF0); // 1111 0000
  writeRegister(DIGIT2, 0xF0); // 1111 0000
}

void niveau3() {
  writeRegister(DIGIT0, 0xCE); // 1100 1110
  writeRegister(DIGIT1, 0xF0); // 1111 0000
  writeRegister(DIGIT2, 0xF0); // 1111 0000
}
void niveau4() {
  writeRegister(DIGIT0, 0xCC); // 1100 1100
  writeRegister(DIGIT1, 0xF0); // 1111 0000
  writeRegister(DIGIT2, 0xF0); // 1111 0000
}
void niveau5() {
  writeRegister(DIGIT0, 0x88); // 1000 1000
  writeRegister(DIGIT1, 0xF0); // 1111 0000
  writeRegister(DIGIT2, 0xF0); // 1111 0000
}
void niveau6() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0xF0); // 1111 0000
  writeRegister(DIGIT2, 0xF0); // 1111 0000
}
void niveau7() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0xE0); // 0000 1110
  writeRegister(DIGIT2, 0xF8); // 1111 1000
}
void niveau8() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0xC0); // 1100 0000
  writeRegister(DIGIT2, 0x7E); // 0111 1110
}
void niveau9() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0x80); // 1000 0000
  writeRegister(DIGIT2, 0x1F); // 0001 1111
}
void niveau10() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0x00); // 0000 0000
  writeRegister(DIGIT2, 0x0E); // 0000 1110
}

void niveau11() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0x00); // 0000 0000
  writeRegister(DIGIT2, 0x0C); // 0000 1100
}

void niveau12() {
  writeRegister(DIGIT0, 0x10); // 0001 0000
  writeRegister(DIGIT1, 0x00); // 0000 0000
  writeRegister(DIGIT2, 0x0C); // 0000 1000
}

void loop()

{
  niveau1();  delay(m);
  niveau2();  delay(m);
  niveau3();  delay(m);
  niveau4();  delay(m);
  niveau5();  delay(m);
  niveau6();  delay(m);
  niveau7();  delay(m);
  niveau8();  delay(m);
  niveau9();  delay(m);
  niveau10();  delay(m);
  niveau11();  delay(m);
  niveau12();  delay(m);
}


@ J-M-L

Un grand merci pour l'aide apportée. la modif du setup améliore l'exécution de la boucle.


J-M-L

Je pense que c'est aussi le SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0)); et le SPI.endTransaction(); qui manquaient plus que le setup()
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

al1fch

#17
Nov 15, 2018, 06:47 am Last Edit: Nov 15, 2018, 07:49 am by al1fch
Bonjour
Quote
. j'ai constaté que si j'avais plusieurs leds oranges sur les segment de 5 à 12 du bargraphe ça mettait le bord.. et ça bloquait tout.
Une led 'orange' compte pour 2, cette couleur est obtenue en allumant deux leds.

Il semble donc que la piste de la consommation excessive soit à conserver en compte vu les symptomes.

EGT59

Bonjour,

@ J-M-L

oui effectivement, encore merci.

@alfch

Quote
Une led 'orange' compte pour 2, cette couleur est obtenue en allumant deux leds.
C'est donc pour ça que ne trouve pas de led orange dans le bargraph  :)  :)  :)

La consommation a déjà été évoquée par JML. L'ensemble bargraph est alimenté par du 5V (stable) 2A.


Quote
j'ai constaté que si j'avais plusieurs leds oranges sur les segment de 5 à 12 du bargraphe
Je dis bien "5 à 12".

Quand je code 12 leds oranges (donc 12 vertes et 12 rouges  :) ) ça fonctionne.

L'alimentation n'est, enfin je crois, pas en cause.


J-M-L

#19
Nov 15, 2018, 09:30 am Last Edit: Nov 15, 2018, 09:32 am by J-M-L
C'est donc pour ça que ne trouve pas de led orange dans le bargraph  :)  :)  :)
oui si vous suivez le tuto que vous avez pointé il a de jolis dessins qui expliquent comment allumer le vert et rouge et donc obtenir du orange.

 
La consommation a déjà été évoquée par JML. L'ensemble bargraph est alimenté par du 5V (stable) 2A.
L'alimentation n'est, enfin je crois, pas en cause.
En pratique sur la consommation énergétique, avec la technique du multiplexage seulement huit LED au maximum seront allumées simultanément.

La encore dans le tuto c'est expliqué:
Quote
Le courant maximal traversant chaque LED étant fixé grâce à la résistance RSET, et sachant que dans le fonctionnement multiplexé seules huit LED peuvent être allumées simultanément : 8 x 20 = 160 mA, auxquels on rajoute environ 10 mA consommés par le MAX7219, soit environ 170 mA. Si on prend en compte la consommation propre de la carte Arduino, environ 40 mA, l'alimentation générale de votre dispositif doit pouvoir fournir jusqu'à 210 mA pour fonctionner correctement.
==> Le soucis n'est pas la capacité de votre alimentation à fournir assez de courant pour cela, avec 5V 2A vous êtes largement tranquille

2 questions:

Vous dites
Quote
Pour R, j'ai au max 10 leds vertes et 4 rouges allumées en même temps (2 rouges, 2 oranges et 8 vertes), j'ai donc mis une R de 22.9K (27+2.2).
Votre calcul sur le nombre de LED n'est pas correct mais c'est pas très grave :) la résistance que vous prenez sert à définir le courant max fourni par le MAX7219 (à mettre entre ISET et V+). comme expliqué dans le tuto la résistance à prendre dépend des caractéristiques des LED rouge et verte du bargraphe. Avez vous vérifié que vos LEDs ont les même caractéristiques que celles du tuto?

Autre question: votre alimentation 5V 2A, où est elle branchée sur votre arduino Nano (Vin ou 5V) ? et avez vous aussi le câble Mini-B USB branché ?


Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

EGT59

les caractéristiques des leds sont bien identiques. (Pour les leds oranges j'avais compris  :) )

Pour l'alim de la nano, j'ai du 9V sur Vin provenant de l'alim de la méga qui sert à autre chose. Le 5V 2A ne sert que pour l'ensemble bargraphe. Toutes les masses sont reliées.

La mini USB reste branchée pour les tests niveau par niveau lors de l'écriture du code, je l'enlève pour vérifier que le code fonctionne bien en situation normale.


 

J-M-L

Pour l'alim de la nano, j'ai du 9V sur Vin provenant de l'alim de la méga qui sert à autre chose. 
se pourrait-il que ces 9V s'effondrent ? avez vous essayé avec une alim dédiée?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up