Petit soucie sur arduino/nextion

Bonjour à toutes et à tous !!

Je me familiarise progressivement sur l’écran Nextion et le Arduino et j’essaye de trouver par moi même les façons de faire pour que ça fonctionne comme je le souhaite et j’arrive déjà à faire pas mal de chose mais il y en a une qui me résiste : en effet je n’arrive pas à commander un relais avec une touche tactile de l’écran nommé bt1 dans l’IDE Nextion, et j’ai essayé tellement de fois que là je plante total…

voici le code que j’ai fait , il contrôle une « progressbar » et ça, ça va, elle fonctionne comme je le veux en ce mettant de vert à rouge après la valeur de 200, le problème est que je n’arrive pas à commander le relais qui est situé à la broche digit 2 du Arduino mega2560, je pensais qu’en mettant « bt1.val=1 » il (bt1 est le nom du « dualstatebutton » ) avec ce code je reçois que le relais est piloté et l’écran me l’indique en effet, mais j’ai beau appuyé sur le bt1 rien n’y fait… je sais que le code arduino n'est pas fini, mais avant de tout "dérégler" je préfère avoir vos lumières...

sint pin_value = A0;
int progress_value;

const int relais = 2;
int relaisValue = 0;

void setup() {
Serial.begin(9600);
pinMode(relais, OUTPUT);
}

void loop() {
pin_value = analogRead(A0);
if(progress_value != pin_value){
  progress_value = pin_value;
  Serial.print("j0.val=" + String(progress_value));
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  if(progress_value < 50){
     Serial.print("j0.pco=1024");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  }else if(progress_value < 200){
  Serial.print("j0.pco=63488");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  }
}  // c'est ici que ça déconne :
  Serial.print("bt1.val=1");
  digitalWrite(relaisValue, LOW);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
}

J'espère que vous pourrez me venir en aide !! merci !!

relaisValue doit etre a 2 si pin2

je viens d'essayer et c'est pareil, par contre comme ma technique c'est de coller des bout de code sans en avoir toujours compris à 100% j'ai rajouté ça :

if (Serial.print("bt1.val=1")){
  digitalWrite(relaisValue, LOW);
  Serial.print("\"");
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);

au moins là je n'ai pas de défaut sur l'écran et le "bt1" se met à zéro ou à un suivant que je le manipule ou pas, mais le relais lui ne fonctionne toujours pas...

Ce ne serait pas plutôt relais la pin qui commande le relais.

Non, mais j'ai essayer plusieurs truc et rien ne marche, je suis dépité !! peut être cette semaine je trouverai comment faire, j'espère que j'arriverai à dormir...

Parce que là, relaisValue vaut 0. Donc le digitalWrite(relaisValue, LOW); met D0 de l'Arduino à l'état bas et comme D0 de l'Arduino c'est Rx de la liaison série.
C'est vraiment ça que tu veux faire?

Ce que je veux faire c'est juste commander un relais avec un bp (donc sans accroche) ou un bpdoublestate (donc avec) sur le nextion, j'arrive à mettre des potentiomètres, des cadrans, sliders et autres, mais je n'arrive pas à trouver comment faire pour commander un relais avec, par exemple b0 ou bt0... c'est fou, et à mon avis c'est pas grand chose mais ça me met en échec et c'est pas cool et j'y été arrivé mais à mon avis, il est bien possible, sur même, que je fait une erreur avec le nextion, voir avec l'arduino si quelqu'un aurai un bout de programme pour les deux ce serai super et bien sur je publierai quand ça marche... merci.

Bonjour photongris

Le problème vient du fait que, dans ton programme, tu ne lis jamais ton écran Nextion.
Le plus simple serait d'utiliser une bibliothèque, il y en a plusieurs à disposition, recherches Nextion

Si non mets moi ton programme Nextion (à zipper)

A+
Cordialement
jpbbricole

Merci, ça me met déjà sur une voie ! c'est claire envoyer du texte ou des données sur le Nextion, ça va, mais faire le contraire c'est plus compliqué, je vais voir avec les bibliothèques arduino fournies .
Je vous dirais

J'ai essayé des bibliothèque mais il y a toujours un problème, j'ai copier le message d'erreur et ça donne çà :

In file included from c:\Users\hnhyd\OneDrive\Documents\Arduino\libraries\NeoNextion/NextionPage.h:6:0,
                 from C:\Users\hnhyd\AppData\Local\Temp\.arduinoIDE-unsaved2026223-20132-1ui1kol.0liu\DualStateButton\DualStateButton.ino:2:
c:\Users\hnhyd\OneDrive\Documents\Arduino\libraries\NeoNextion/Nextion.h:31:7: error: redefinition of 'class Nextion'
 class Nextion
       ^~~~~~~
In file included from C:\Users\hnhyd\AppData\Local\Temp\.arduinoIDE-unsaved2026223-20132-1ui1kol.0liu\DualStateButton\DualStateButton.ino:1:0:
c:\Users\hnhyd\OneDrive\Documents\Arduino\libraries\Nextion/Nextion.h:75:7: note: previous definition of 'class Nextion'
 class Nextion {
       ^~~~~~~
C:\Users\hnhyd\AppData\Local\Temp\.arduinoIDE-unsaved2026223-20132-1ui1kol.0liu\DualStateButton\DualStateButton.ino:8:26: error: no matching function for call to 'Nextion::Nextion(SoftwareSerial&)'
 Nextion nex(nextionSerial);
                          ^
In file included from C:\Users\hnhyd\AppData\Local\Temp\.arduinoIDE-unsaved2026223-20132-1ui1kol.0liu\DualStateButton\DualStateButton.ino:1:0:
c:\Users\hnhyd\OneDrive\Documents\Arduino\libraries\Nextion/Nextion.h:109:5: note: candidate: Nextion::Nextion(uint8_t, uint8_t)
     Nextion(uint8_t rx, uint8_t tx);
     ^~~~~~~
c:\Users\hnhyd\OneDrive\Documents\Arduino\libraries\Nextion/Nextion.h:109:5: note:   candidate expects 2 arguments, 1 provided
c:\Users\hnhyd\OneDrive\Documents\Arduino\libraries\Nextion/Nextion.h:75:7: note: candidate: Nextion::Nextion(const Nextion&)
 class Nextion {
       ^~~~~~~
c:\Users\hnhyd\OneDrive\Documents\Arduino\libraries\Nextion/Nextion.h:75:7: note:   no known conversion for argument 1 from 'SoftwareSerial' to 'const Nextion&'
c:\Users\hnhyd\OneDrive\Documents\Arduino\libraries\Nextion/Nextion.h:75:7: note: candidate: Nextion::Nextion(Nextion&&)
c:\Users\hnhyd\OneDrive\Documents\Arduino\libraries\Nextion/Nextion.h:75:7: note:   no known conversion for argument 1 from 'SoftwareSerial' to 'Nextion&&'
C:\Users\hnhyd\AppData\Local\Temp\.arduinoIDE-unsaved2026223-20132-1ui1kol.0liu\DualStateButton\DualStateButton.ino: In function 'void setup()':
C:\Users\hnhyd\AppData\Local\Temp\.arduinoIDE-unsaved2026223-20132-1ui1kol.0liu\DualStateButton\DualStateButton.ino:18:7: error: 'class Nextion' has no member named 'init'
   nex.init();
       ^~~~
C:\Users\hnhyd\AppData\Local\Temp\.arduinoIDE-unsaved2026223-20132-1ui1kol.0liu\DualStateButton\DualStateButton.ino: In function 'void loop()':
C:\Users\hnhyd\AppData\Local\Temp\.arduinoIDE-unsaved2026223-20132-1ui1kol.0liu\DualStateButton\DualStateButton.ino:31:7: error: 'class Nextion' has no member named 'poll'
   nex.poll();
       ^~~~
Plusieurs bibliothèque trouvées pour "Nextion.h"
  Utilisé: C:\Users\hnhyd\OneDrive\Documents\Arduino\libraries\Nextion
  Non utilisé: C:\Users\hnhyd\OneDrive\Documents\Arduino\libraries\NeoNextion
exit status 1

Compilation error: no matching function for call to 'Nextion::Nextion(SoftwareSerial&)'

Quel exemple tu as essayé et passes-moi ton programme Nextion.

Je ne sais pas comment zipper le programme nextion ! c'est fou !! j'avoue que je n'ai jamais eu à utiliser ça c'est pourquoi je ne sais pas, mais si j'y arrive, je vais regarder des tutos, je le ferai ok... mais j'ai mis un script de mon crue où on peut lire sur l'écran la valeur d'une entrée analogique sur deux page (la page deux et trois et sur une "progressbar" et sur un nombre sur la troisième page j'ai le relais qui ne me sert pas pour l'instant, mais que j'aimerai bien que je puisse l'actionner avec un bouton tactile de l'écran... j'ai mis entre deux // les chose que je maitrise et celle que je me plante, j'aimerai bien un exemple de relais ou led ou quoi que ce soit piloté à partir de l"écran Nextion...

Pour ce qui est du zip je le posterai où ? (désolé mais je début avec le nextion, et le zip^je n'ai jamais utilisé...


```cpp
int pin_value = A0; // mise en place pin analogique A0 appelé pin_value
int progress_value; // mise en place pour la progress bar

 const int relais = 13; // mise en place relais sur I/O digital 13
 int relaisValue = 0;  // mise à zero du relais

void setup() {
Serial.begin(9600);  // initialisation du port serie de la carte(pas de numéro de port)
pinMode(relais, OUTPUT); // mise en sortie de la broche  qui commande le relais (13)
}

void loop() {
 pin_value = analogRead(A0);   // lecture de la broche analogique 0 (en pin_value)
 if(progress_value != pin_value){  // si la progress n'est pas egale à la pin 0
  progress_value = pin_value; //
  Serial.print("j0.val=" + String(progress_value));
  Serial.write(0xff);  // trois fois 255 en hexa
  Serial.write(0xff);
  Serial.write(0xff);
  if(progress_value < 50){ // si la progress est inférieur à 50
     Serial.print("j0.pco=1024"); //la valeur dela couleur de j0 sera de 1024 (vert foncé)
  Serial.write(0xff);  // trois fois 255 en hexa
  Serial.write(0xff);
  Serial.write(0xff);
  }else if(progress_value < 200){ // et si elle dépasse les 200 
  Serial.print("j0.pco=63488"); // j0 change de couleur en rouge (63488)
  Serial.write(0xff);  // trois fois 255 en hexa
  Serial.write(0xff);
  Serial.write(0xff);
  }
 }
 Serial.print("x0.val=" + String(progress_value)); // sur la deuxième page je rajoute une valeur à mon compteur x0 (déjà utilisé (progress...)) 
  Serial.write(0xff);  // trois fois 255 en hexa
  Serial.write(0xff);
  Serial.write(0xff);

// partie non comprise : je prend une valeur de bt1 de l'écran Nextion et je le veux dire à l'ARDUINO
// Mais ça ne passe pas, j'ai beau essayer plusieurs script rien ne fonctionne 
// et avec les d2, d8, ou d13 en essais c'est pareil donc c'est pas le relais

  Serial.write("bt1.val=");  // lecture de l'objet bt1
   if("bt0"==1){  // si bt0 est égal à 1
  digitalWrite(relais, HIGH);  // le relais passera à haut (1)
  Serial.write(0xff);  // trois fois 255 en hexa
  Serial.write(0xff);
  Serial.write(0xff);
 }else{  // sinon 
  digitalWrite(relais, LOW); // le relais se relache 
  Serial.print("\"");  // pas compris mais fonctionne avec certain script
  Serial.write(0xff);  // trois fois 255 en hexa
  Serial.write(0xff);
  Serial.write(0xff);
  }
 }




J'arrive maintenant à commander le relais quand la broche A0 est supérieur à 50% je peux, bien sur, entrer n'importe quelle valeur à la place de 50, il doit y avoir une petite chose qui me laisse pantois !!
voici le changement qui fait ça :

 Serial.write("bt1.val=1");  // lecture de l'objet bt1
    if(progress_value < 50){ // si la progress est inférieur à 50
  digitalWrite(relais, HIGH);  // le relais passera à haut (1)
  Serial.write(0xff);  // trois fois 255 en hexa
  Serial.write(0xff);
  Serial.write(0xff);
 }else{  // sinon 
  digitalWrite(relais, LOW); // le relais se relache 
  Serial.print("\"");  // pas compris mais fonctionne avec certain script
  Serial.write(0xff);  // trois fois 255 en hexa
  Serial.write(0xff);
  Serial.write(0xff);
  }

Ce n'est pas une petite chose, bien au contraire!
Si tu veux presser bt1 et que ton relais tire, tu dois lire ce qui vient de Nextion, avec ton programme tu ne le fais pas.

Encore une fois, passes moi ton programme Nextion

Ce ne fait rien, tu envoies ça à Nextion.

Bon, ben j'ai essayé le "zippage" je n'ai point réussit !! je demanderai à un copain de me dire comment faire exactement, ensuite je le met dans les fichier sur le forum c'est bien ça ??

et j'ai trouvé un site ou ils explique comment allumer ou éteindre une led mais c'est pas évident !!

c'est ici : Allumer une Led Arduino (+ pilotage Écran Tactile) - programme et schéma

je pensais à un truc plus simple, mais là il est tard je coupe tout, peut être que demain j’étudierais un peu plus en profondeur le site avec l'allumage/extinction de led...et après il n'y aura qu'a multiplier les sortie !!

Voilà, j'ai trouvé comment faire je met le programme (pas de moi) pour info mais s'il y a des droit d'auteur on pourra le supprimer je n'y connais rien dans ce domaine...

Mais c'est beaucoup plus compliqué que ce que je pensais mais ça fait le job...


```cpp
#define SERIAL_BAUDRATE 9600
#define NB_BYTES_MSG 7            // Exemple : 65 00 01 01 FF FF FF (bouton "allumer led") ou bien 65 00 03 01 FF FF FF (bouton "éteindre led")
#define NUM_BROCHE_LED 11         // Indique quelle broche de l'arduino sera utilisée pour y brancher la LED à piloter

unsigned char incomingByte;       // variable de stockage des données entrantes (1 octet à la fois)
unsigned char msg[NB_BYTES_MSG];  // variable qui contiendra le message entier
bool msgEnCours = false;          // indique si oui ou non il y a un message en cours de réception
int idx = 0;                      // index

void setup() {
  pinMode(NUM_BROCHE_LED, OUTPUT);      // définition de la broche n°NUM_BROCHE_LED en sortie
  digitalWrite(NUM_BROCHE_LED, LOW);    // extinction de la led
  Serial3.begin(SERIAL_BAUDRATE);       // Vitesse de transmission série (vers ECRAN LCD)
  Serial.begin(SERIAL_BAUDRATE);        // Vitesse de transmission série (vers PC)
  delay(10);                            // Attente (en milli-secondes)
  Serial3.flush();                      // Vide le buffer de réception de données du port série (côté écran tactile)
}

void loop() {

  if(Serial3.available() > 0) {              // Test si quelque chose en attente de lecture sur le port série 3 (côté écran LCD)
    
    incomingByte = (char)Serial3.read();     // Lit 1 octet de ce qu'il y a en attente

    // Affichage de l'octet lu sur le port série de l'ECRAN pour l'afficher sur le port série du PC
    Serial.print("Octet reçu (HEX) = ");
    Serial.println(incomingByte, HEX);

    // Test si c'est le début d'une chaine (commence par 65)
    if(incomingByte == 0x65) {
      msg[0] = 0x65;
      msgEnCours = true;       
      idx = 1;
    }
    else
    {
      // Si c'est la suite, on enregistre
      if(msgEnCours == true) {
        msg[idx] = incomingByte;
        idx++;
      }
  
      // On regarde si on est au bout du message ou pas
      if(idx == NB_BYTES_MSG) {
        afficheResultat();
        msgEnCours = false;
        idx = 0;
      }    
    }
  }
}

void afficheResultat() {
  // Affichage
  Serial.print("Message reçu (HEX) : ");
  Serial.print(msg[0], HEX);    
  Serial.print(":");
  Serial.print(msg[1], HEX);
  Serial.print(":");
  Serial.print(msg[2], HEX);
  Serial.print(":");
  Serial.print(msg[3], HEX);
  Serial.print(":");
  Serial.print(msg[4], HEX);
  Serial.print(":");
  Serial.print(msg[5], HEX);
  Serial.print(":");
  Serial.println(msg[6], HEX);

  // Test si bouton 1 appuyé
  if(msg[0]==0x65 && msg[1]==0x00 && msg[2] == 0x01) {    // On regarde si le message commence par 65 00 01 (bouton "ALLUMER LED")
    digitalWrite(NUM_BROCHE_LED, HIGH);                   // si c'est ça, on allume la LED connectée à l'arduino
    Serial.println("Allumage de la LED !");
    Serial.println("----------------------------------------");
  }

  // Test si bouton 2 appuyé
  if(msg[0]==0x65 && msg[1]==0x00 && msg[2] == 0x03) {    // On regarde si le message commence par 65 00 03 (bouton "ETEINDRE LED")
    digitalWrite(NUM_BROCHE_LED, LOW);                    // si c'est ça, on éteint la LED connectée à l'arduino
    Serial.println("Extinction de la LED.");
    Serial.println("----------------------------------------");
  }
}
un petit ouf de soulagement, maintenant il faudra le changer pour plus d'usage que simplement un relais ou une led, mais ça je gérerais je pense !!

merci pour votre patience !!

Bonsoir photongris

C'est jamais simple, mais quand on a compris, ça ouvre de belles possibilités :wink:

Bonne continuation.

Cordialement
jpbbricole

Oui merci !! j'ai donc un moyen de piloter un objet (led, relais etc...) et de mettre un potentiomètre qui sera lu sur une "progress bar" et sur un "number" avec trois page que je change quand j'ai envie, et c'est vraiment cool, je me demande pas pourquoi je n'ai jamais utiliser ces écrans, parce que c'est pas super évident, mais à force de tutos/forum/amis, ça roule !!

encore merci à tous !!