(Résolu)Programmer 2 délais d'affichage différents ds un même code matrice LED

Bonjour,

J’ai besoin d’aide pour faire défiler du texte affichage de température sur une matrice Led.
J’utilise comme matrice le WS2812 et comme sonde de température/humidité le DHT11 avec un Arduino Nano (de chez Elegoo). J’ai mis un code ensemble (en googlant à gauche à droite) qui fonctionne, sauf pour le défilement du texte que je n’arrive pas à programmer comme je le voudrais, à savoir :

Étape 1 : La sonde relève la température. (sous-fonction void mesure() )

Étape 2 : La température est affichée sur la matrice (sous-fonction void affichage() ) pendant 4000ms.

Étape 3 : La température est scrollée rapidement vers le bas (sous fonction void defilement()) et retour à l’Etape 1 pour une nouvelle mesure et réaffichage.

Mon problème est que l’affichage Etape 1 et le scroll Etape 3 sont toujours à la même vitesse. Je n’arrive pas à programmer 2 vitesses différentes.

J’ai essayé de placer un delay(4000) juste après la déclaration de la sous fonction affichage, mais ça ne fonctionne pas, car le scroll passe lui aussi à 4000ms. Il semble que si j’ajoute plusieurs fonctions delay dans le code, uniquement la plus lente est prise en compte. Donc soit tout l’affichage s’exécute à une vitesse 4000s soit à 150s . (en commentant delay(4000).

Je voulais savoir si l’utilisation de delay est correcte ou s’il y a une autre fonction semblable qui fera le job. Si vous avez une indication pour modifier le code, elle est la bienvenue 

Je joins mon code, c’est la partie void loop qui pose problème.
Grand merci pour tout tuyau.

#include <Adafruit_NeoMatrix.h>
#include <gamma.h>
#include <Adafruit_GrayOLED.h>
#include <gfxfont.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <dht_nonblocking.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11
#include "DHT.h"

#define PIN 3 //PIN D3 on Arduino Nano towards Led Matrix
#define DHTPIN 2 // PIN D2 on Arduino Nano towards DHT
#define DHTTYPE DHT11 
DHT dht(DHTPIN, DHTTYPE); // on indique la broche et le type de capteur

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, PIN,
  NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);
const uint16_t colors[] = {
matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(255, 255, 0),matrix.Color(0, 0, 255), matrix.Color(255, 0, 255), matrix.Color(0, 255, 255), matrix.Color(255, 255, 255)};

//parameters DHT
static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );  

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
 dht.begin(); // initialisation du capteur
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(5);
//matrix.setTextColor(matrix.Color(80,255,0));
matrix.setTextColor(colors[0]);
}

// temperature = readTemperature ();
int x = matrix.width();
int pass = 4;
float temp;
float hum;
int z = 1;
int y = -1;

void loop() 
{

mesure();
affichage();
//delay(4000);
defilement();  
}

void mesure() 
{
hum = dht.readHumidity(); // lecture de la valeur de l'humidité
temp = dht.readTemperature(); // lecture de la valeur de la température
  if (isnan(temp) || isnan(hum)) Serial.println( "Lecture impossible !"); // test erreur
  else
  
   Serial.print("Humidite :");  // affichage message
   Serial.print(hum);             // affichage valeur humidité
   Serial.print(" %\t");
   Serial.print("Temperature :");// affichage message
   Serial.print(temp);              // affichage valeur température
   Serial.println(" *C");
 

 // Serial.print( "T = " );
 //   Serial.print( temperature, 1 );
   // Serial.print( " deg. C, H = " );
    //Serial.print( humidity, 1 );
    //Serial.println( "%" );
    }

void affichage() 
{
matrix.setCursor(z, y);
    matrix.setTextColor(colors[pass]);
    matrix.print((temp));
    delay(4000);
}

void defilement()  
{
    matrix.setCursor(z, y);
    matrix.setTextColor(colors[pass]);
    matrix.print((temp));
    y = y+1;
    if(y >= 10) y = 0;
    matrix.fillScreen(0);
    matrix.setCursor(z, y);
    //matrix.print((temp));
   // if( --x < -30 ) 
    //{
    //x = matrix.width();

    //if(++pass >= 0) pass = 0;
    matrix.setTextColor(colors[pass]);
    matrix.print((temp));
     // delay(150);  }
   matrix.show();
  }

Une technique de programmation : les automates à états finis. Intégrer ce genre de chose à votre code :

#define DEBUT 0
#define MES 1
#define AFF 2
#define ATT 3
#define DEF 4
#define TDE 5
#define FIN 6

    byte state ;
    unsigned long chronoStart ;
    int y ;

void setup () {
    state = DEBUT ;
}

void loop () {
  Serial.print ("Etat automate : \r\n) ; Serial.println (state) ; // pour debug
  switch (state) {
    case DEBUT :
      // faire quelque chose
      state = MES ; break ;
    case MES :
      mesure ;
      state = AFF ; break ;
    case AFF : 
      affichage();
      chronoStart = millis () ;
      state = ATT ; break ;
    case ATT :
      if (millis() - chronoStart < 4000) break ;
      y = 1 ;
      state = DEF ; break ;
    case DEF :
      defilement(); // un pas de défilement, met à jour la variable y
      chronoStart = millis () ;
      state = TDEF ; break ;
    case TDEF :
      if (millis() - chronoStart < 150) break ;
      if (y < LASTLINE) state = DEF ;
      else state = FIN ;
      break ;
    case FIN :
      // faire quelque chose...
      state = DEB ; break ;
    default : 
      Serial.println ("Woops, état interdit") ;
      while (true) ; // harakiri
   }
}

Vous noterez qu’il n’y a plus d’appel à la fonction DELAY. Vous pouvez empiler des automates (des switch …) autant que vous voulez dans votre code et, pendant que votre arduino gère l’afficheur, il peut préparer le café, etc.

Bonjour,

Je n’ai pas bien compris ce que tu veux faire.
Tu veux que ton message défile rapidement pour l’effacer?
Dans ce cas c’est très simple, il suffit d’appeler defilement() le nombre de fois qui va bien avec le delai qui va bien

void loop()
{
  mesure();
  affichage();
  //delay(4000);
  for (byte i=0; i<10; i++)
  {
    defilement();
    delay(100);
  }
}

Merci pour vos retours, je vais regarder les automates à états finis.

@kamill, je veux que la température reste figée et centrée pendant 4 secondes, ensuite qu'elle se mette à descendre (rapidement) vers le bas pour disparaître complètement de l'écran.
Ensuite une nouvelle température est lue et affichée 4s (la même t° ou pas), puis elle redescend et ainsi de suite.

Pour le moment si je programme 4 secondes, la température reste figée 4 secondes (c'est ok), puis elle descend d'une ligne toutes les 4 secondes, ce qui est très long jusqu'à ce qu'elle ait disparue complètement (il y a 8 lignes et ça fait très saccadé).

Re,
je m’en suis finalement sorti en utilisant un do…while et en bidouillant un peu. Ma fonction initiale void affichage() était complétement ignorée, j’ai donc couper-coller son contenu et collé à la fin de ma fonction void defilement (). Si je la colle au début de la fonction de défilement (void defilement ()), elle est ignorée également :o.

La mise en route du Arduino débute donc par un scroll rapide suivi d’un affichage plus long. Mais c’est pas dérangeant car ça va vite.

Voici le code brouillon qui marche pour moi:

#include <Adafruit_NeoMatrix.h>
#include <gamma.h>
#include <Adafruit_GrayOLED.h>
#include <gfxfont.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <dht_nonblocking.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11
#include "DHT.h"

#define PIN 3 //PIN D3 on Arduino Nano towards Led Matrix
#define DHTPIN 2 // PIN D2 on Arduino Nano towards DHT
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE); // on indique la broche et le type de capteur

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, PIN,
  NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);
const uint16_t colors[] = {
matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(255, 255, 0),matrix.Color(0, 0, 255), matrix.Color(255, 0, 255), matrix.Color(0, 255, 255), matrix.Color(255, 255, 255)};

//parameters DHT
static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE ); 

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
 dht.begin(); // initialisation du capteur
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(5);
//matrix.setTextColor(matrix.Color(80,255,0));
matrix.setTextColor(colors[0]);
}

// temperature = readTemperature ();
int x = matrix.width();
int pass = 4;
float temp;
float hum;
int z = 1;
int y = -1;

void loop()
{
mesure();
defilement(); 
}

void mesure()
{
hum = dht.readHumidity(); // lecture de la valeur de l'humidité
temp = dht.readTemperature(); // lecture de la valeur de la température
  if (isnan(temp) || isnan(hum)) Serial.println( "Lecture impossible !"); // test erreur
  else
 
   Serial.print("Humidite :");  // affichage message
   Serial.print(hum);             // affichage valeur humidité
   Serial.print(" %\t");
   Serial.print("Temperature :");// affichage message
   Serial.print(temp);              // affichage valeur température
   Serial.println(" *C");
 

 // Serial.print( "T = " );
 //   Serial.print( temperature, 1 );
   // Serial.print( " deg. C, H = " );
    //Serial.print( humidity, 1 );
    //Serial.println( "%" );
    }

void defilement() {
 do {
    matrix.setCursor(z, y);
    matrix.setTextColor(colors[pass]);
    matrix.print((temp));
        //y = y+1;
    if(y++ >= 9) y = 0;
    matrix.fillScreen(0);
    matrix.setCursor(z, y);
    
    matrix.setTextColor(colors[pass]);
    matrix.print((temp));
      
   matrix.show();
   delay(200);
   
   } while (y <=8);
   matrix.setCursor(1, 0);
    matrix.setTextColor(colors[5]);
    matrix.print((temp));
     matrix.show();
    delay(6000);
  }

Merci encore pour les propositions de solution.

Ta fonction d’affichage était ignorée pour deux raisons

  • à l’appel y est en dehors de la zone affichage
  • il n’y a pas de show

Pourquoi il y a deux print dans le while du défilement? Quelle est la valeur de y en entrant dans le while? Il aurait beaucoup mieux valu utiliser un for (y=0;y<=8;y++)

kamill:
Ta fonction d’affichage était ignorée pour deux raisons

  • à l’appel y est en dehors de la zone affichage
  • il n’y a pas de show

Pourquoi il y a deux print dans le while du défilement? Quelle est la valeur de y en entrant dans le while? Il aurait beaucoup mieux valu utiliser un for (y=0;y<=8;y++)

Re kamill,
Oui, le premier print du defilement ne sert à rien. je l’ai enlevé. merci pour la remarque. Je laisse avec le do while, car cela fonctionne maintenant. La première valeur de y pour débuter tout en haut de la matrice est -1 chez moi. La logique aurait été 0, mais bon.

y ne vaut -1 que lors du premier appel à defilement. Lors de tous les autres appels il vaut 9.

kamill:
y ne vaut -1 que lors du premier appel à defilement. Lors de tous les autres appels il vaut 9.

Merci encore pour tes remarques, je suis satisfait du résultat. J’ai ajouté un effet scroll bas et haut :D. Par la suite je souhaite ajouter d’autres fonctionnalités: heure, notifications email, etc pilotables avec bouton(s)-poussoir .

Voici le code:

#include <Adafruit_NeoMatrix.h>
#include <gamma.h>
#include <Adafruit_GrayOLED.h>
#include <gfxfont.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <dht_nonblocking.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11
#include "DHT.h"

#define PIN 3 //PIN D3 on Arduino Nano towards Led Matrix
#define DHTPIN 2 // PIN D2 on Arduino Nano towards DHT
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE); // on indique la broche et le type de capteur

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, PIN,
  NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);
const uint16_t colors[] = {
matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(255, 255, 0),matrix.Color(0, 0, 255), matrix.Color(255, 0, 255), matrix.Color(0, 255, 255), matrix.Color(255, 255, 255)};

//parameters DHT
static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE ); 

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
 dht.begin(); // initialisation du capteur
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(5);
//matrix.setTextColor(matrix.Color(80,255,0));
matrix.setTextColor(colors[0]);
}

// temperature = readTemperature ();
int x = matrix.width();
int pass = 6;
float temp;
float hum;
int z = 1;
int y = -1;

void loop()
{
mesure();
defilement(); 
}

void mesure()
{
hum = dht.readHumidity(); // lecture de la valeur de l'humidité
temp = dht.readTemperature(); // lecture de la valeur de la température
  if (isnan(temp) || isnan(hum)) Serial.println( "Lecture impossible !"); // test erreur
  else
 
   Serial.print("Humidite :");  // affichage message
   Serial.print(hum);             // affichage valeur humidité
   Serial.print(" %\t");
   Serial.print("Temperature :");// affichage message
   Serial.print(temp);              // affichage valeur température
   Serial.println(" *C");
 

 // Serial.print( "T = " );
 //   Serial.print( temperature, 1 );
   // Serial.print( " deg. C, H = " );
    //Serial.print( humidity, 1 );
    //Serial.println( "%" );
    }

void defilement() {
  matrix.fillScreen(0);
 matrix.setCursor(1, 0);
    matrix.setTextColor(colors[2]);
    matrix.print((temp));
     matrix.show();
    delay(3000);
  
 //vers le bas 
 do {
    matrix.setCursor(z, y);
    if(y++ >= 9) y = 9;
    matrix.fillScreen(0);
    matrix.setCursor(z, y);
    matrix.setTextColor(colors[pass]);
    matrix.print((temp));
    matrix.show();
    delay(200);
   } while (y <=8);
   
 //vers le haut
  do {
    matrix.fillScreen(0);
  matrix.setCursor(z, y);
   if(y-- <= 0) y = 1;
  matrix.setCursor(z, y);
 matrix.setTextColor(colors[2]);
 matrix.print((temp));
  matrix.show();
 delay(200);
  } while (y >0);
  }

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.