Utiliser un seul bouton ==> deux états

Bonjour à tous, je me suis mis il y a deux trois mois à Arduino et je découvre la joie du DIY, que cela soit dans le code ou l'électronique.

Je suis coincé sur mon code actuellement, car je voudrais un bouton pour lancer une animation sur une MAX7219 (LED matrix) et la garder active (l'animation continue de bouger) jusqu'à appuyer à nouveau sur ce même bouton (ce qui lancera une animation standard).

J'ai essayé plein de codes trouvés du côté anglais ou sur ce même forum (en adaptant évidemment au mien), mais rien n'y fait. Je suis certain que quelque chose me manque, du coup je viens demander ici. Car c'est seulement ça qui me bloque actuellement.

Alors je ne sais pas si c'est le fait d'utiliser une librairie pour la MAX7219 qui fait que c'est différent.

Merci de m'avoir lu.

Pour simplifier votre gestion des boutons, éventuellement utilisez la librairie de @bricoleau

ensuite il faut bien sûr tester l'état du bouton souvent, donc si votre code d'animation est "bloquant", ça ne va pas le faire...

Merci pour le lien, je vais essayer sur le champs !

Je viens de faire les exemples, la librairie est intéressante et je pense du coup l'utiliser. Malheureusement, je n'ai rien trouvé sur mon problème.

Je voudrais appuyer une fois sur le bouton ==> cela lance l'animation, en continue ==> j'appuie sur le bouton à nouveau (10s ou 1h après) ==> l'animation s'enlève.

Ou alors je n'ai pas bien compris la librairie. :p

votre animation est elle bloquante ?

une bonne animation fait un “pas” quand il faut (en utilisant millis()) lors d’un tour de loop c’est tout.

Au prochain tour de loop, vous regardez le bouton et s’il est appuyé vous arrêtez le mode animation, sinon vous regardez si c’est le moment de faire un nouveau “pas” dans votre animation…

Posez votre code en utilisant les balises de code…

Ci-dessous, j’ai laissé le void loop comme il état au départ fourni avec la librairie.

Pour le millis(), je n’ai pas encore bien compris le principe, j’ai essayé un ou deux codes trouvés, mais j’avais obtenu des trucs pas comme je voulais.

#include <MD_MAX72xx.h>
//#include <SPI.h>
#include "simpleBouton.h"


// Turn on debug statements to the serial output
#define  DEBUG  1

#if  DEBUG
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTD(x) Serial.println(x, DEC)

#else
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTD(x)

#endif

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
int HARDWARE_TYPE {MD_MAX72XX::ICSTATION_HW};
const int MAX_DEVICES = 11;

int CLK_PIN = 13;  // or SCK
int DATA_PIN = 11;  // or MOSI
int CS_PIN = 10;  // or SS


// SPI hardware interface
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// Arbitrary pins
// MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

// We always wait a bit between updates of the display
#define  DELAYTIME 40  // in milliseconds



void setup() {
 pinMode(11,OUTPUT);

mx.begin();

#if  DEBUG
  Serial.begin(57600);
#endif
  PRINTS("\n[MD_MAX72XX Test & Demo]");
//  scrollText("MD_MAX72xx Test  ");

}


void rien()
{
  uint8_t rrr[COL_SIZE] =
  {
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00010000,
    0b00000000,
    0b00000000,
    0b00000000,
  };

  MD_MAX72XX::transformType_t  t[] =
  {
    MD_MAX72XX::TSL, //MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL,
    MD_MAX72XX::TSL, //MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL,
    MD_MAX72XX::TSL, //MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL,
    MD_MAX72XX::TSL, //MD_MAX72XX::TSL, MD_MAX72XX::TSL, MD_MAX72XX::TSL,
   
  };
  PRINTS("\nrien");
  mx.clear();
  
  mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
  for (uint8_t j=0; j<mx.getDeviceCount(); j++)
    mx.setBuffer(((j+1)*COL_SIZE)-1, COL_SIZE, rrr);
  mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
  delay(DELAYTIME/2);

//  // run through the transformations
  mx.control(MD_MAX72XX::WRAPAROUND, MD_MAX72XX::ON);
  for (uint8_t i=0; i<(sizeof(t)/sizeof(t[0])+4); i++)
  {
    mx.transform(t[i]);
    delay(DELAYTIME);
   }
  mx.control(MD_MAX72XX::WRAPAROUND, MD_MAX72XX::OFF);
}


void loop()
{
 #if 1
  //scrollText("Transform");
  transformation1();
#endif

}

L’animation ne devrait pas être bloquante.

c'est quoi transformation1 ??

Ha pardon, une erreur, ce n'est pas transformation1() mais rien(). J'ai oublié de rechanger.

postez un code sans les trucs superflus..

Que dois-je poster du coup ? Car pour comprendre mon souci, il faut que je poste le tout non ? Je pense avoir donner l’essentiel là : la fonction “rien()” qui fait l’animation, et le loop qui vérifie que ça marche.

Du coup, j’ai aussi enlevé le buttonPin, pour mon interrupteur.

"Pour le millis(), je n'ai pas encore bien compris le principe," millis() consulte (fait une copie fidèle) le nombre de millisecondes écoulées depuis la mise sous tension de l'arduino et permet de faire des délais non blocants. Un exemple ultra simple à comprendre est donné avec l'IDE dans Fichiers -> Exemples->...-> BlinkWithoutDelay Le faible nombre de lignes fait qu'il est le plus simple possible... et qu'il m'a appris beaucoup

dbrion06: "Pour le millis(), je n'ai pas encore bien compris le principe," millis() consulte (fait une copie fidèle) le nombre de millisecondes écoulées depuis la mise sous tension de l'arduino et permet de faire des délais non blocants. Un exemple ultra simple à comprendre est donné avec l'IDE dans Fichiers -> Exemples->...-> BlinkWithoutDelay Le faible nombre de lignes fait qu'il est le plus simple possible... et qu'il m'a appris beaucoup

Merci pour l'éclaircissement, je vois un peu ce que c'est du coup. Je vais aller mater aussi l'exemple que tu me donnes.

Après, je ne crois pas que cela soit ce millis() qui soit la solution à mon souci ici, c'est surtout en rapport avec le bouton je pense.

Ce n'est pas LA solution; c'est une partie de La solution (et de solutions à d'autres problèmes) qui nécessite d'être comprise....à long therme.

votre fonction rien() contient des delay(DELAYTIME); et deux boucles for.

--> il faut les virer et restructurer la fonction pour que vous rendiez la main à la loop()

décomposez la fonction rien en "étapes" rapides, à chaque tour faites une étape si c'est le bon moment

Pour un tuto sur comment faire plusieurs choses en même temps avec un arduino, voir le message épinglé en haut du forum anglais sur le question de programmation...

Merci à vous pour les pistes, je vais aller réexaminer ça du coup.