[RESOLU]Bargraph qui ne fonctionne pas

Bonjour,

j’ai une NANO qui pilote un bargraph en SPI. L’alimentation de la NANO et du module Bargraph sont gérés par une MEGA via deux relais.

Le téléversement est ok. Je débranche les câbles USB. je mets l’ensemble sous tension. Le bargraph ne fait rien. Je rebranche le cordon USB sur la NANO, je le débranche aussitôt et là ça fonctionne. j’ai fait la manip plusieurs fois et je dois à chaque fois rebrancher/débrancher l’USB de la NANO pour relancer le bon fonctionnement.

le code de la MEGA :

#include <Wire.h>
#include <RTClib.h>

// Variables et broches pour la RTC DS3231 & la gestion du temps
RTC_DS3231 rtc; // Pour DS3231
int hh, mn;

// Variables pour la Nano du contrôle de niveau
const byte relaisAlimNano = 44;  // Pilote le relais 2-1 d'alimentation en 9V de la Nano
const byte relaisAlimBargraph = 45; // pilote le relais 2-2 d'alimentation 5v du bargraph
boolean nano = 0;

// Variables pour le programme
int heureProg = 0; int heureProgDebut = 1200; int heureProgFin = 2145;
const byte Minute = 0;


void setup() {

  pinMode(relaisAlimNano, OUTPUT); digitalWrite(relaisAlimNano, HIGH);
  pinMode(relaisAlimBargraph, OUTPUT); digitalWrite(relaisAlimBargraph, HIGH);
  Wire.begin();
  Serial.begin(115200);
}

void loop() {

  // Calcul heureProg
  DateTime now = rtc.now();
  hh = now.hour(); mn = now.minute();
  heureProg = (hh * 100) + mn; 
  // allumage-Extinction de l'écran
  {
    if (heureProg >= heureProgDebut - 500 &&  heureProg <= heureProgFin + 155) {
      if (!nano) {
        digitalWrite(relaisAlimNano, LOW); delay(500);
        digitalWrite(relaisAlimBargraph, LOW);
        nano = 1;
      }
    }
    else {
      if (nano) {
        digitalWrite(relaisAlimBargraph, HIGH);
        digitalWrite(relaisAlimNano, HIGH);
        nano = 0;
      }
    }
  }
}

le code la NANO

#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

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, 0x00);    /* LED brightness, max=0x0F */
  writeRegister(SHUTDOWN, 0x01);     /* Normal operation */
  
  Serial.begin(115200);

}

void loop() {
 
  niveau5();
  delay(1500);
  niveau4();
  delay(1500);
  niveau3();
  delay(1500);
  niveau2();
  delay(1500);
  niveau1();
  delay(1500);

}

void writeRegister(byte thisRegister, byte thisValue) { // Écrire dans un registre du MAX7219
  SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0));
  digitalWrite(LOAD, LOW); // Met l'entrée LOAD à l'état bas
  SPI.transfer(thisRegister); // Adresse du registre
  SPI.transfer(thisValue); // Contenu du registre
  digitalWrite(LOAD, HIGH); // Met à l'état haut pour verrouiller et transférer les données
  SPI.endTransaction();
}

void niveau1() {
  writeRegister(DIGIT0, 0x11); // 0001 0001
  writeRegister(DIGIT1, 0x00); // 0000 0000
  writeRegister(DIGIT2, 0x00); // 0000 0000
}

void niveau2() {
  writeRegister(DIGIT0, 0x13); // 0001 0011
  writeRegister(DIGIT1, 0x00); // 0000 0000
  writeRegister(DIGIT2, 0x00); // 0000 0000
}

void niveau3() {
  writeRegister(DIGIT0, 0x66); // 0110 0110
  writeRegister(DIGIT1, 0x00); // 0000 0000
  writeRegister(DIGIT2, 0x00); // 0000 0000
}
void niveau4() {
  writeRegister(DIGIT0, 0xC8); // 1100 1000
  writeRegister(DIGIT1, 0x01); // 0000 0001
  writeRegister(DIGIT2, 0x00); // 0000 0000
}
void niveau5() {
  writeRegister(DIGIT0, 0x00); // 0000 0000
  writeRegister(DIGIT1, 0x33); // 0011 0011
  writeRegister(DIGIT2, 0x00); // 0000 0000
}

Le schéma de l’ensemble

Merci de votre aide

Dans le setup() de la Mega, il y a ça

void setup() {

  pinMode(relaisAlimNano, OUTPUT); digitalWrite(relaisAlimNano, HIGH);
  pinMode(relaisAlimBargraph, OUTPUT); digitalWrite(relaisAlimBargraph, HIGH);

Voir peut-être à permuter l'ordre de mise sous tension du bargraph et de la nano. Voir même à ajouter un délai entre les 2 allumages. En effet si le bargraph est un petit peu long à démarrer peut-être ne voit-il pas la séquence d'initialisation que la nano lui envoi. Le branchement de l'USB réinitialise la nano qui recommence le setup() et renvoi ainsi la séquence d'initialisation cela pourrait expliquer le dysfonctionnement que tu constates.

Ça ressemble à un souci de timing. Avez vous essayé d’alimenter le bar graph avant la nano (le delay 500 fait que la nano boot et exécute son setup et sans doute même un bout de loop avant que le bar graph ne soit sous tension.)

Essayez en changeant

      if (!nano) {
        digitalWrite(relaisAlimNano, LOW); delay(500);
        digitalWrite(relaisAlimBargraph, LOW);
        nano = 1;
      }

en

      if (!nano) {
        digitalWrite(relaisAlimBargraph, LOW); 
        delay(10); // s’assurer que le bargraph est prêt avant d’allumer la nano, ajuster 10 
        digitalWrite(relaisAlimNano, LOW); 
        nano = 1;
      }

ÉDIT: les grands esprits se rencontrent :)

Merci aux GRANDS ESPRITS fdufnews & J-M-L :)

Je vais faire les tests dans ce sens et vous tiendrais au courant des résultats

Encore Merci

Les modifications sont faites et ça fonctionne très bien. :) :) :)

Encore merci pour l'aide

super :)