J'ai essayé d'optimiser le code mais je n'ai pas ce qu'il faut pour le tester. Il est certainement encore améliorable, mais je pense que déjà les bugs de lecture des messages devraient trouver ici une solution. Ligne 48, il faut retraiter la valeur retournée pour retrouver une valeur de bouton sélectionné dans une plage de [0] à [16].
En fin de programme, il est mieux de passer par la fonction millis() qui est "non bloquante" que delay(). Mais ça ne conditionne pas le fonctionnement du programme, on pourra le faire plus tard.
#include <SoftwareSerial.h>
#include <Nextion.h>
#define YES !1
#define NO !0
#define NBRE_MOTEURS 16
#define DUREE_IMPULS_MOTEUR 100
SoftwareSerial nextion(10, 11);
Nextion myNextion(nextion, 9600);
const byte relais[] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52};
const byte pinOut[] = {23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53};
bool buttonState[NBRE_MOTEURS];
// int recv, trxv; -> mis en commentaire car ne semble pas être utilisé !!!
String message;
void setup()
{
Serial.begin(9600);
myNextion.init();
for ( int i = 0; i < NBRE_MOTEURS; i++) {
buttonState[i] = 0;
pinMode(pinOut[i], OUTPUT);
digitalWrite(pinOut[i], LOW); // Toutes les pins sont mises à LOW
pinMode((relais[i]), OUTPUT);
digitalWrite((relais[i]), NO);
}
while (!Serial) {};
Serial.println("Serial On");
int brightness = 255;
int bright = map(brightness, 0, 1024, 0, 100);
String dim = "dim=" + String(bright);
myNextion.sendCommand(dim.c_str());
} // Fin Setup
void loop()
{
String message = myNextion.listen(); //check for message
if (message != "") {
Serial.println(message, HEX);
int val = atoi(message);
// val = val..... (retraiter ici la vraie valeur retournée)
buttonState[val] = !buttonState[val];
digitalWrite(relais[val], buttonState[val]);
digitalWrite(pinOut[val], HIGH);
// mais ne faut-il pas remettre pinOut[val] à LOW après quelques secondes
// je crois que ce type de moteur ne nécessite qu'une très courte impulsion de courant
// aussi faudrait-il écrire...
delay(DUREE_IMPULS_MOTEUR); // mettre ici le temps désiré
digitalWrite(pinOut[val], LOW);
// Il serait cependant mieux de passer par une fonction millis()
}
} // Fin Loop