Bonsoir,
Je me suis lancé dans la réalisation d'un indicateur de niveau constitué d'un bargraph de 12 segments bicolores et géré par un MAX 7219, tout ça avec une Nano.
Je me suis inspiré du tuto suivant :
les exemples fournis fonctionnent à merveille, ce qui me laisse penser que mon câblage est ok.
Le code suivant :
#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 = 2000;
void setup() {
pinMode(LOAD, OUTPUT);
digitalWrite(LOAD, HIGH);
SPI.begin();
SPI.setBitOrder(MSBFIRST); /* bits de poids fort en premier */
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 */
}
void writeRegister(byte thisRegister, byte thisValue) // Écrire dans un registre du MAX7219
{
// 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);
}
/*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); // 1110 0000
writeRegister(DIGIT2, 0xF0); // 1111 0000
}
void niveau8() {
writeRegister(DIGIT0, 0x00); // 0000 0000
writeRegister(DIGIT1, 0xC0); // 1100 0000
writeRegister(DIGIT2, 0xFF); // 1111 1111
}
void niveau9() {
writeRegister(DIGIT0, 0x00); // 0000 0000
writeRegister(DIGIT1, 0x80); // 1000 0000
writeRegister(DIGIT2, 0x7F); // 0111 1111
}
void niveau10() {
writeRegister(DIGIT0, 0x00); // 0000 0000
writeRegister(DIGIT1, 0x00); // 0000 0000
writeRegister(DIGIT2, 0x2E); // 0010 1110
}
void niveau11() {
writeRegister(DIGIT0, 0x00); // 0000 0000
writeRegister(DIGIT1, 0x00); // 0000 0000
writeRegister(DIGIT2, 0x0C); // 0000 1100
}
void niveau12() {
writeRegister(DIGIT0, 0xCF); // 1100 1111
writeRegister(DIGIT1, 0xF0); // 1111 0000
writeRegister(DIGIT2, 0xF0); // 1111 0000
}
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);
}
que j'ai créé en m'inspirant des exemples ne fonctionne pas correctement.
De "niveau2()" à "6", les segments s'éteignent ou changent de couleur selon mon code mais à la fonction "niveau7()", tout s'éteint sans tenir compte des autres niveaux et le code cesse de fonctionner.
La loop ne redémarre plus.
je ne trouve pas de quoi ça vient.
Merci d'avance pour votre aide.