Matrix Led 16x16

Bonjour à tous,

Nouveau depuis trois jours dans le monde de l'arduino.

J'ai créé un petit code pour faire fonctionner une matrice led 32x8 avec plusieurs animations déclenchées depuis des relais externes.

Quand mon relais se ferme ( 1 seconde ) mon animation se lance une seconde. Je souhaiterais mettre un délai sur la pin pour pouvoir jouer l'animation complètement. Si j'utilise la fonction délai mon animation reste en pause.

Merci de vos retours,

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define PIN 11

const int Gauche = 7;     // Numéro de la broche à laquelle est connecté le bouton poussoir 1
const int Ok = 6;     // Numéro de la broche à laquelle est connecté le bouton poussoir 2
const int Arret = 5;     // Numéro de la broche à laquelle est connecté le bouton poussoir 3

int etatGauche = 0;         // variable qui sera utilisée pour stocker l'état du bouton 1
int etatOk = 0;         // variable qui sera utilisée pour stocker l'état du bouton 2
int etatArret = 0;         // variable qui sera utilisée pour stocker l'état du bouton 3
 
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, PIN,
  NEO_MATRIX_TOP    + NEO_MATRIX_LEFT +
 NEO_MATRIX_ROWS + 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)};
 
void setup() {

  pinMode(Gauche, INPUT);
  pinMode(Ok, INPUT);
  pinMode(Arret, INPUT); 
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(010);
  matrix.setTextColor(colors[0]);
}
 
int x    = matrix.width();
int pass = 0;


void loop() {
  // lit l'état du bouton et stocke le résultat dans etatBouton
  etatGauche = digitalRead(Gauche);
  etatOk = digitalRead(Ok);
  etatArret = digitalRead(Arret);

  if (etatGauche == HIGH) {

 
const uint16_t colors[] = {
matrix.Color(0, 255, 0)};

  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(5);
  matrix.setTextColor(colors[0]);
    matrix.fillScreen(0);
    matrix.setCursor(x, 0);
    matrix.print(F("OK <<<<<<<")); //Defilement

    if (--x < -25
       ) {
      x = matrix.width();
    matrix.setTextColor(colors[pass]);

    }
    matrix.show();
    delay(50);

  }
  else if (etatOk == HIGH) {
    
const uint16_t colors[] = {
 matrix.Color(255, 0, 0) };

  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(5);
  matrix.setTextColor(colors[0]);
   matrix.fillScreen(0);
  matrix.setCursor(1, 0);
  matrix.print(F("XXXXX"));   // ARRET
  if(--x < -30) {
    x = matrix.width();
    matrix.setTextColor(colors[pass]);
  }
  matrix.show();
  delay(20);
  }
  else if (etatArret == HIGH) {

const uint16_t colors[] = {
 matrix.Color(255, 0, 0) };

  matrix.begin();
    matrix.setBrightness(5);
  matrix.drawLine(5, 1, 9, 1, matrix.Color(255, 0, 0));
  matrix.drawLine(4, 2, 10, 2, matrix.Color(255, 0, 0));
  matrix.drawLine(3, 3, 11, 3, matrix.Color(255, 0, 0));
  matrix.drawLine(2, 4, 12, 4, matrix.Color(255, 0, 0));
  matrix.drawLine(1, 5, 13, 5, matrix.Color(255, 0, 0));
  matrix.drawLine(1, 6, 13, 6, matrix.Color(255, 0, 0));
  matrix.drawLine(1, 7, 13, 7, matrix.Color(255, 0, 0));
  matrix.drawLine(1, 8, 13, 8, matrix.Color(255, 0, 0));
  matrix.drawLine(1, 9, 13, 9, matrix.Color(255, 0, 0));
  matrix.drawLine(2, 10, 12, 10, matrix.Color(255, 0, 0));
  matrix.drawLine(3, 11, 11, 11, matrix.Color(255, 0, 0));
  matrix.drawLine(4, 12, 10, 12, matrix.Color(255, 0, 0));
  matrix.drawLine(5, 13, 9, 13, matrix.Color(255, 0, 0));
   matrix.show();
  delay(20);
  }
  else {

const uint16_t colors[] = {
matrix.Color(0, 255, 0)};
   matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(5);
  matrix.setTextColor(colors[0]);

    matrix.fillScreen(0);
    matrix.setCursor(0, 0);
    matrix.print(F("<<<<<"));  // Fixe

    if (--x < -30
       ) {
      x = matrix.width();
    matrix.setTextColor(colors[pass]);

    }
    matrix.show();
    delay(0);

  }
  }

Bonjour

Il faudrait utilisé un drapeau pour l'etatGauche et actionné le relais au début de :
if (etatGauche == HIGH) {
et arreter le relais et baissé le drapeau en fin de programme.

Bonjour jul13n, merci de ta réponse, malheureusement le relais en place n'est pas commandé par l'arduino mais une carte électronique externe. Du coup pour toi il faudrait rajouter un second relais avec une tempo ?

Bonjour,

Une façon simple serait d'utiliser une tempo qui serait initialisée lorsque le relais est à HIGH.
Comme ceci

void loop() {
  // lit l'état du bouton et stocke le résultat dans etatBouton
  etatGauche = digitalRead(Gauche);
  etatOk = digitalRead(Ok);
  etatArret = digitalRead(Arret);

  const unsigned long dureeAnimation=5000;
  static unsigned long debutGauche=millis()+dureeAnimation;
  if (etatGauche == HIGH || millis()-debutGauche<dureeAnimation) {
    if (etatGauche==HIGH)
      debutGauche=millis();       // mémorise le temps de début
      
    const uint16_t colors[] = {
      matrix.Color(0, 255, 0)
    };
...

Cependant il y a un autre problème dans ton code: l'amination ne commence jamais au même moment car la valeur de x est variable quand on entre dans l'animation.

Je n'ai pas non plus compris à quoi servent ces tableaux de constantes à un seul élément

    const uint16_t colors[] = {
      matrix.Color(255, 0, 0)
    };
1 Like