Ecran Nextion Info

Bonjour , désoler de faire un nouveau post qui aurais déjà étais traité ailleurs , mais je ne parvient pas à faire une recherche sur le site , sa chargé et après Timeout.

je cherche des personne qui utilisé les Écran Nextion qui pourrait m’aider pour faire la sauvegarde des valeur sur le nextion .

explication :
j'ai 4 page :
1- screen d'accueil (image puis passage sur une nouvelle page )
2- Home
3- menu1
4- menu2

j'ai des boutons et des SLider , quand je règle un slider sur 60 par expl. et que je vais sur la page " menu2" et que je revient sur "menu1" les valeur sont revenue par défaut et ne sont pas garder . comment faire pour sauvegarder ces réglage ? et peut t'on les sauvegarder quand la machine et éteinte par exemple ?

==> En gros donc il vous faut avoir un "miroir" de toutes les valeurs de chaque écran dans votre programme Arduino.

Quand vous chargez un nouvel écran, vous devez envoyer les valeurs à afficher (à lire dans les variables "miroir")

Quand elles sont modifiées sur le Nextion, vous modifiez une variable "miroir" côté arduino associé à l'objet qui est modifié (par exemple la valeur du slider quand vous recevez la notification de modification).

Le plus simple est de créer une structure avec toutes les données pertinentes affichées / modifiables sur l'écran, ce qui vous permet aussi très simplement d'archiver cette structure en EEPROM. comme cela si votre Arduino perd son alimentation, vous pouvez relire l'EEPROM pour retrouver les dernières valeurs.

Henri (@hbachetti) a documenté sur son site une approche de cette sauvegarde automatique en cas de coupure

Merci pour ta réponse je pensais effectivement faire quelque chose dans ce style ou un renvoie de la valeur dans une variable.

merci pour votre lien je vais regardez sa. pour quelqu'un qui ne l’utilise pas (cause : Linux) vous avez quand même quelque connaissance :slight_smile: .

:wink:

j'ai lu la doc par curiosité - leur bibliothèque n'est pas top d'ailleurs...

oui je trouve quelle n'es pas très facile de compréhension pour un novice et la programmation Nextion / Arduino et pas simple. j'ai peut être pas choisi le mieux comme écran tactile pour mon projet.

j'ai jeter un oeil sur le lien que vous avez mis et je trouve sa un peut .... lourd comme mise en place pour seulement garder en mémoire 4 ou 5 valeurs .
peut on le faire plus facilement par l'intermédiaire de la mini SD de l'arduino ?

la mini SD de l'arduino

quel Arduino ? généralement il n'y en a pas d'intégrée. (mais Oui sur SD ça marche aussi mais ça fait un composant en plus )

Oui désoler dans ma tête j'étais sur la RPI :confused: .

EDIT : quelqu’un qui utilisé cette écran pourrais m'aider à récupérer les valeur retourné ?

Merci

acidenitr0s:
j'ai jeter un oeil sur le lien que vous avez mis et je trouve sa un peut .... lourd comme mise en place pour seulement garder en mémoire 4 ou 5 valeurs .
peut on le faire plus facilement par l'intermédiaire de la mini SD de l'arduino ?

La solution présentée par hbachetti est "compliquée" car elle cherche à réaliser une sauvegarde automatique en cas de coupure de l'alimentation.

Si tu n'es pas dans ce cas là, tu peux très bien faire des écritures dans l'EEPROM à la demande de l'utilisateur par exemple avec un bouton sauvegarder les paramètres.

oui en cherchent comment faire ma sauvegarde je suit tombé sur cette façon de faire (mais pas tester) d’où l’édition de mon post précédent sur le problème de récupération des valeurs .

Pour obtenir la valeur d’un champ qui est visible (dans la page courante) il me semble qu’il faut appeler getValue() sur l’instance.

Éventuellement jetez un oeil sur Enhanced Nextion Library with multi display instance support, Elle est peut être mieux que celle officielle

Bonjour , oui ces avec la commande getValue() , mais quand je veut utilisé ma variable dans ma boucle loop, j’ai un message d’erreur comme quoi il n’es pas déclaré.

je n’es pas encore eu le temps de jeté un oeil à t’on lien J-M-L.

voici ma variable ( il me semble si j’ai compris le truc) sa serait “numberRE” qui es associé à h0 (mon élément dans l’écran)

//H0
//changement du texte du slider retard etiq
void h0PopCallback (void *ptr) {
  uint32_t numberRE = 0;
  char temp[1] = {0};
  h0.getValue (&numberRE);
  utoa(numberRE, temp, 0);
  //analogWrite(2, numberRE); 
}

donc dans le loop je veut ajouté ce “retard” , j’ai fais comme suit : (delay)

void loop() {
 
  CelulleOn = digitalRead(ETIQON);
  nexLoop (nex_listen_list);
  
 if (CelulleOn == HIGH){
  do{
    Serial.println("Detection d'un flacon");
    // Faites tourner le moteur pas à pas d'un tour:
    for (int i=1; i<=NombPas; i++){ // sens horaire
      delay(numberRE);
      digitalWrite(dirPin, HIGH);
      stepper.step(1);  // (1) nombre de tour du moteur PAP
      CelulleOFF = digitalRead(ETIQOFF); // lit l'etat de la cellule off
    }
  }
  while (CelulleOFF == LOW); //arret moteur quand cellule off detecte un creux d'etiquette .
TimerEtiq = millis();
millis () - TimerEtiq < 1000;
TimerEtiq;
 }      
    //Serial.println("---ATTENTE---");
    
}

voici mon code complet :

#include "NexButton.h"
#include "NexText.h"
#include "NexSlider.h"
#include <Nextion.h>
#include <Arduino.h>
#include <Stepper.h>
#include <AccelStepper.h>
#include <SoftwareSerial.h>

//Pin des cellules etiquete
const int ETIQON = 7;
const int ETIQOFF = 5;

//etat des cellules
int CelulleOn= LOW;
int CelulleOFF = LOW;

//pin etiqueteuse ON/OFF
#define Etiq 12

//patie Nextion
SoftwareSerial nextionSerial(17, 16);
#define nexSerial Serial2

//definie les pin moteur et le setp pour le moteur
const int dirPin = 9; //DIR+
const int stepPin = 8; //PULL+
const int NombPas = 6400; //pas moteur - switch parametrer sur le driver sur 1600 STEPS ON/OFF/ON/ON
Stepper stepper(NombPas,8,9);

//gestion du temps
unsigned long TimerEtiq = millis();

//declaration des elements nextion - exemple :( page ID = 0, element ID= 1, name = "b0")

//----PAGE 1----
NexText t0 = NexText(1,1, "t0"); // etiqueteuse
NexButton b0 = NexButton(1, 2, "b0"); //on
NexButton b1 = NexButton(1, 3, "b1"); //off

NexText t1 = NexText(1,4, "t1"); //retard etiquette
NexText t5 = NexText(1,8, "t5"); //valeur
NexSlider h0 = NexSlider(1,5, "h0"); //slider valeur

NexText t2 = NexText(1,6, "t2"); //retard stop etiquette
NexText t6 = NexText(1,9, "t6"); //valeur
NexSlider h1 = NexSlider(1,7, "h1"); //slider valeur

NexText t8 = NexText(1,10, "t8"); // vitesse etiquette
NexText t3 = NexText(1,11, "t3"); //valeur
NexSlider h2 = NexSlider(1,12, "h2"); //slider valeur

//----PAGE 2----
NexText t9 = NexText(2,1, "t9"); //tapis lissage
NexButton b2 = NexButton(2, 2, "b2"); //on
NexButton b3 = NexButton(2, 3, "b3"); //off

NexText t10 = NexText(2,4, "t10"); //vitesse tapis lissage
NexText t11 = NexText(2,6, "t11"); //valeur
NexSlider h3 = NexSlider(2,5, "h3"); //slider valeur

//registre des boutons
NexTouch *nex_listen_list[]={
  &b0,&h0,
  &b1,&h1,
  &b2,&h2,
  &b3,&h3,
  NULL  
};

//MARCHE ARRET ETIQUETEUSE
//B0
//changement etat du bouton ON etiqueteuse
void b0PushCallback (void *ptr){
  b0.setText("-ON-");
  digitalWrite(Etiq, HIGH);
}
//B1
//changement etat du bouton OFF etiqueteuse
void b1PushCallback (void *ptr){
  b1.setText("-OFF-");
  digitalWrite(Etiq, LOW);
}

//H0
//changement du texte du slider retard etiq
void h0PopCallback (void *ptr) {
  uint32_t numberRE = 0;
  char temp[1] = {0};
  h0.getValue (&numberRE);
  utoa(numberRE, temp, 0);
  //analogWrite(2, numberRE); 
}

////H1
////changement du texte du slider stop etiq
//void h1PopCallback (void *ptr) {
//  uint32_t numberSTE = 0;
//  char temp[1] = {0};
//  h1.getValue (&numberSTE);
//  utoa(numberSTE, temp, 0);
//  //analogWrite(2, numberSTE); 
//}

void setup(void) {
  Serial.begin(9600);
  Serial2.begin(9600);
  
  // Nexion
  nexInit();

  //etiqueteuse info - Nextion  
  b0.attachPush(b0PushCallback, &b0); //bouton On Nexion
  b1.attachPush(b1PushCallback, &b1); //bouton Off Nexion
  //b2.attachPop(b2PopCallback, &b2);
  //b3.attachPop(b3PopCallback, &b3);
  h0.attachPop(h0PopCallback, &h0); //slide retard etiquette
//  h1.attachPop(h1PopCallback, &h1); //slider stop etiquette
  //h2.attachPop(h2PopCallback, &h2);

  //vitesse moteur
  stepper.setSpeed(150); // vitesse du moteur en Dur
  //stepper.setSpeed(variant du bouton dans nexion); // vitesse moteur regler via Nexion

  // declaration des pins etiqueteuse
  pinMode(ETIQON, INPUT);  //entrer
  pinMode(ETIQOFF, INPUT); //entrer
  //Serial.println("Cellule initialisé");
  
  // declaration des pins moteur
  pinMode(dirPin, OUTPUT); // Sortie
  pinMode(stepPin, OUTPUT); // Sortie  
}

void loop() {
 
  CelulleOn = digitalRead(ETIQON);
  nexLoop (nex_listen_list);
  
 if (CelulleOn == HIGH){
  do{
    Serial.println("Detection d'un flacon");
    // Faites tourner le moteur pas à pas d'un tour:
    for (int i=1; i<=NombPas; i++){ // sens horaire
      digitalWrite(dirPin, HIGH);
      stepper.step(1);  // (1) nombre de tour du moteur PAP
      CelulleOFF = digitalRead(ETIQOFF); // lit l'etat de la cellule off
    }
  }
  while (CelulleOFF == LOW); //arret moteur quand cellule off detecte un creux d'etiquette .
TimerEtiq = millis();
millis () - TimerEtiq < 1000;
TimerEtiq;
 }      
    //Serial.println("---ATTENTE---");
    
}

ce sont des NexNumber que vous utilisez ?

sinon vous n'avez pas assez de place dans temp pour stocker la valeur

  char temp[1] = {0};
  h0.getValue (&numberRE);
  utoa(numberRE, temp, 0);

il faut autant de char que vous aurez de caractères ascii dans la représentation plus 1 pour ne '\0' de la fin. là vous n'avez qu'un seul char donc ça va déborder.

bonjour , ha... ok . donc le "[1]" correspond au nombre de caractères utilisé ou retourné par l'écran.
non j'utilise un NexSlider .

je vais modifier mon code avec ces infos .
Merci

EDIT : toujours pareil j'ai changé la valeur de temp à "[4]" , mon NexSlider va de 0 à 100 donc 3 caractères +1. et j'ai toujours le message d'erreur .

exit status 1
'numberRE' was not declared in this scope

'numberRE' was not declared in this scope

où l'avez vous déclaré ?

je l’ai déclarer ici ( au début avant le Setup ):
voici tous ce qui correspond à mon Nexslider :

NexText t1 = NexText(1,4, "t1"); //retard etiquette
NexText t5 = NexText(1,8, "t5"); //valeur
NexSlider h0 = NexSlider(1,5, "h0"); //slider valeur

//registre des boutons
NexTouch *nex_listen_list[]={
  &b0,&h0,
  &b1,&h1,
  &b2,&h2,
  &b3,&h3,
  NULL  
};

//H0
//slider retard etiq
void h0PopCallback (void *ptr) {
  uint32_t numberRE = 0;
  char temp[4] = {0};
  h0.getValue (&numberRE);
  utoa(numberRE, temp, 0);
  //analogWrite(2, numberRE); 
}

dans le “Setup” :

// Nexion
  nexInit();

//etiqueteuse info - Nextion  
h0.attachPop(h0PopCallback, &h0); //slide retard etiquette

dans le “Loop” :

void loop () {
nexLoop (nex_listen_list);  
 if (CelulleOn == HIGH){
  do{
    Serial.println("Detection d'un flacon");
    // Faites tourner le moteur pas à pas d'un tour:
delay(numberRE);
    for (int i=1; i<=NombPas; i++){ // sens horaire
      digitalWrite(dirPin, HIGH);
      stepper.step(1);  // (1) nombre de tour du moteur PAP
      CelulleOFF = digitalRead(ETIQOFF); // lit l'etat de la cellule off
    }
  }
  while (CelulleOFF == LOW); //arret moteur quand cellule off detecte un creux d'etiquette .
TimerEtiq = millis();
millis () - TimerEtiq < 1000;
TimerEtiq;
 }      
Serial.println(&numberRE);
}

donc avec ce code j’ai le message d’erreur cité plus haut.

si dans ma partie “Loop” je change comme ceci : ajoutant un “int” qui ce réfère au NexSlider h0 (je pense que ces bon, je suit novice au niveau du codage).

void loop() { 
  CelulleOn = digitalRead(ETIQON);
  nexLoop (nex_listen_list);  

int nombreRetardEtiquette = &h0;
  
 if (CelulleOn == HIGH){
  do{
    Serial.println("Detection d'un flacon");
    // Faites tourner le moteur pas à pas d'un tour:
    delay(nombreRetardEtiquette);
    for (int i=1; i<=NombPas; i++){ // sens horaire
      digitalWrite(dirPin, HIGH);
      stepper.step(1);  // (1) nombre de tour du moteur PAP
      CelulleOFF = digitalRead(ETIQOFF); // lit l'etat de la cellule off
    }
  }
  while (CelulleOFF == LOW); //arret moteur quand cellule off detecte un creux d'etiquette .
TimerEtiq = millis();
millis () - TimerEtiq < 1000;
TimerEtiq;
 }      
    Serial.println(nombreRetardEtiquette);    
}

j’ai sa comme retour sur le moniteur serie : (67 , ces le nombre qui ce trouve sur mon NexSlider), mais le 1870 je sait pas ou il le trouve .

13:18:48.827 -> 1870
13:18:48.827 -> 1870
13:18:48.827 -> 1870
13:18:48.827 -> 1870
13:18:48.874 -> 1870
13:18:48.920 -> [1870:1,5,h0]
13:18:48.967 -> recvRetNumber :67
13:18:48.967 -> 1870
13:18:48.967 -> 1870
13:18:48.967 -> 1870
13:18:48.967 -> 1870
13:18:48.967 -> 1870
13:18:49.013 -> 1870

vous l'avez déclarée dans une fonction, c'est donc une variable locale à cette fonction, elle est inconnue en dehors de h0PopCallback()

void h0PopCallback (void *ptr) {
  uint32_t numberRE = 0;
...

petite question.
a tu verifié que les variables soit bien en "vscope global" et non en "local".?

imaljl:
petite question.
a tu verifié que les variables soit bien en "scope global" et non en "local".?

cf réponse #15...

bonjour ,

imaljl : dans le logiciel nextion les paramètre des éléments son sur “Vscope Global”.
donc il y à peut être un soucie à ce niveau aussi ? mais j’avais (il me semble) déjà essayé avec les réglages “Vscope local”.
Mais le code es peut être pas bon du coup .

J-M-L : ok du coup je ne sait pas comment récupérer le résultat .

comme vous le faites, mais vous déclarez la variable numberRE en variable globale si vous comptez l'utiliser dans plusieurs fonctions