Problema Nextion Cambio de pagina

hola buenas a todos soy nuevo en el foro y en esto de programar en C++ estoy empezando a dar los primeros pasos y me he adentrado en hacer un proyecto el cual pueda gestionar varias salidas digitales, un par de sondas y unos niveles.

Actualmente tengo dos problemas

1- Despues de realizar la programacion de 3 salidas digitales aun no esta terminado en total serian 6 salidas, he encontrado que al cambiar de pagina en la Nextion se activan estas salidas cuando no las he activado con el boton de estado dual y no entiendo el motivo si podeis orientarme en como solucionar este fallo seria de gran ayuda

2- Despues de hacer prueba en aislado la parte de los botones Rojo y Azul para incrementar o restar a n3 un valor este funciona, cuando lo uno todo en el loop con las demas funciones este deja de funcionar

#include <doxygen.h>
#include <NexButton.h>
#include <NexCheckbox.h>
#include <NexConfig.h>
#include <NexCrop.h>
#include <NexDualStateButton.h>
#include <NexGauge.h>
#include <NexGpio.h>
#include <NexHardware.h>
#include <NexHotspot.h>
#include <NexNumber.h>
#include <NexObject.h>
#include <NexPage.h>
#include <NexPicture.h>
#include <NexProgressBar.h>
#include <NexRadio.h>
#include <NexRtc.h>
#include <NexScrolltext.h>
#include <NexSlider.h>
#include <NexText.h>
#include <NexTimer.h>
#include <Nextion.h>
#include <NexTouch.h>
#include <NexUpload.h>
#include <NexVariable.h>
#include <NexWaveform.h>

#define RT0 10000   // Ω
#define B 3977      // K
#define VCC 5    //Supply voltage
#define R 10000  //R=10KΩ
float RT, VR, ln, TX, T0, VRT;
float sensorPin = A0;    // seleccionar la entrada para el sensor
float sensorValue;       // variable que almacena el valor raw (0 a 1023)
int progress = 0;    // variable de proceso barra
int setpoint = 22;
NexDSButton bt0 = NexDSButton(0, 1, "bt0");
NexDSButton bt1 = NexDSButton(0, 2, "bt1");
NexDSButton bt2 = NexDSButton(0, 3, "bt2");
NexButton b2 = NexButton(2, 3, "b2");
NexButton b1 = NexButton(2, 2, "b1");
NexNumber n1 = NexNumber(2, 5, "n1" );
NexNumber n0 = NexNumber(2, 4, "n0" );
NexNumber n2 = NexNumber(2, 6, "n2" );
NexNumber n3 = NexNumber(2, 7, "n3" );
NexProgressBar j0(0, 1, "j0");
char buffer[100] = {0};
NexTouch *nex_listen_list[] =
{
  &b2,
  &b1,
  &bt0,
  &bt1,
  &bt2,
  NULL
};
void b2PushCallback(void *ptr)
{
  setpoint = setpoint + 1;

  Serial.print("n3.val=");
  Serial.print(setpoint);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
}





void b1PushCallback(void *ptr)
{
  setpoint = setpoint - 1;

  Serial.print("n3.val=");
  Serial.print(setpoint);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
}
void setup (void)
{
  
  Serial.begin(9600);
  b2.attachPush(b2PushCallback, &b2);
  b1.attachPush(b1PushCallback, &b1);
  nexInit();
  pinMode (13, OUTPUT);
  pinMode (12, OUTPUT);
  pinMode (11, OUTPUT);
  T0 = 25 + 273.15;
}
void loop (void) {
  nexLoop(nex_listen_list);
  bomba();
  rele();
  boiler();
  sucias();
  temperaturaboiler();
}
void sucias () {
  sensorValue = analogRead(sensorPin); // realizar la lectura
  sensorValue = map(sensorValue, 380, 1000, 0, 100);
  if (sensorValue > 1) {
    progress = 100;
  }
  if (sensorValue > 7) {
    progress = 90;
  }
  if (sensorValue > 13) {
    progress = 80;
  }
  if (sensorValue > 17) {
    progress = 70;
  }
  if (sensorValue > 21) {
    progress = 60;
  }
  if (sensorValue > 24) {
    progress = 50;
  }
  if (sensorValue > 30) {
    progress = 40;
  }
  if (sensorValue > 35) {
    progress = 30;
  }
  if (sensorValue > 50) {
    progress = 20;
  }
  if (sensorValue > 90) {
    progress = 0;
  }

  j0.setValue(progress);
  n1.setValue(progress);

  delay(100);


}

void temperaturaboiler () {
  VRT = analogRead(A2);              //Acquisition analog value of VRT
  VRT = (5.00 / 1023.00) * VRT;      //Conversion to voltage
  VR = VCC - VRT;
  RT = VRT / (VR / R);               //Resistance of RT

  ln = log(RT / RT0);
  TX = (1 / ((ln / B) + (1 / T0))); //Temperature from thermistor

  TX = TX - 273.15;
  n2.setValue(TX);               //Conversion to Celsius

}

void bomba () {
  uint32_t botonbomba;
  bt0.getValue(&botonbomba);
  if (botonbomba) {
    digitalWrite(13, HIGH);
  }
  else {
    digitalWrite(13, LOW);
  }
}
void rele () {
  uint32_t botonrele1;
  bt1.getValue(&botonrele1);
  if (botonrele1) {
    digitalWrite(12, HIGH);
  }
  else {
    digitalWrite(12, LOW);
  }
}
void boiler () {
  uint32_t botonboiler;
  bt0.getValue(&botonboiler);
  if (botonboiler) {
    digitalWrite(11, HIGH);
  }
  else {
    digitalWrite(11, LOW);
  }
}

Me gustaria subir el archivo HMI pero al ser usuario nuevo no me es posible, ante todo muchas gracias a todos los que su intencion sea de ayudar, Un saludo

https://drive.google.com/file/d/1FMD7C0MlBsUSTsvvfjaMoeuViHKgu9RG/view?usp=sharing
Intento compartirlo por drive

Realmente necesitas tantas librerías? Me parece un exceso. Por el bien de tu Arduino comenta con // las que no esten en uso.

Observa que tienes varias salidas digitales colgadas de esto

bt0.getValue(&botonboiler);

al cambiar de página el estado de botonboiler cambia y por ende cambia la salida que esta permanentemente actualizada.
Crea variables globales que se actualicen cuando estes en la página correspondiente, algo que deberas detectar y que luego conserven el cambio ( lo harán por ser globales).

Hola buenas Surbyte muchas gracias por ayudarme en este problema he corregido el codigo tanto lo comentado como otro parametro de las condiciones If te lo cito


#include <Nextion.h>
#define RT0 10000   // Ω
#define B 3977      // K
#define VCC 5    //Supply voltage
#define R 10000  //R=10KΩ
float RT, VR, ln, TX, T0, VRT;
float sensorPin = A0;    // seleccionar la entrada para el sensor
float sensorValue;       // variable que almacena el valor raw (0 a 1023)
int progress = 0;    // variable de proceso barra
int setpoint = 0;
NexDSButton bt0 = NexDSButton(0, 1, "bt0");
NexDSButton bt1 = NexDSButton(0, 2, "bt1");
NexDSButton bt2 = NexDSButton(0, 3, "bt2");
NexButton b2 = NexButton(2, 3, "b2");
NexButton b1 = NexButton(2, 2, "b1");
NexNumber n1 = NexNumber(2, 5, "n1" );
NexNumber n0 = NexNumber(2, 4, "n0" );
NexNumber n2 = NexNumber(2, 6, "n2" );
NexNumber n3 = NexNumber(2, 7, "n3" );
NexProgressBar j0(0, 1, "j0");
char buffer[100] = {0};
NexTouch *nex_listen_list[] =
{
  &b2,
  &b1,
  &bt0,
  &bt1,
  &bt2,
  NULL
};
void b2PushCallback(void *ptr)
{
  setpoint = setpoint + 1;

  n3.setValue (setpoint);
}

void b1PushCallback(void *ptr)
{
  setpoint = setpoint - 1;

  n3.setValue (setpoint);
}
void setup (void)
{

  Serial.begin(9600);
  nexInit();
  b2.attachPush(b2PushCallback, &b2);
  b1.attachPush(b1PushCallback, &b1);
  pinMode (13, OUTPUT);
  pinMode (12, OUTPUT);
  pinMode (11, OUTPUT);
  T0 = 25 + 273.15;
}
void loop (void) {
  nexLoop(nex_listen_list);
  bomba();
  rele();
  boiler();
  sucias();
  temperaturaboiler();
}
void sucias () {
  sensorValue = analogRead(sensorPin); // realizar la lectura
  sensorValue = map(sensorValue, 380, 1000, 0, 100);
  if (sensorValue > 1) {
    progress = 100;
  }
  if (sensorValue > 7) {
    progress = 90;
  }
  if (sensorValue > 13) {
    progress = 80;
  }
  if (sensorValue > 17) {
    progress = 70;
  }
  if (sensorValue > 21) {
    progress = 60;
  }
  if (sensorValue > 24) {
    progress = 50;
  }
  if (sensorValue > 30) {
    progress = 40;
  }
  if (sensorValue > 35) {
    progress = 30;
  }
  if (sensorValue > 50) {
    progress = 20;
  }
  if (sensorValue > 90) {
    progress = 0;
  }

  j0.setValue(progress);
  n1.setValue(progress);


}

void temperaturaboiler () {
  VRT = analogRead(A2);              //Acquisition analog value of VRT
  VRT = (5.00 / 1023.00) * VRT;      //Conversion to voltage
  VR = VCC - VRT;
  RT = VRT / (VR / R);               //Resistance of RT

  ln = log(RT / RT0);
  TX = (1 / ((ln / B) + (1 / T0))); //Temperature from thermistor

  TX = TX - 273.15;
  n2.setValue(TX);               //Conversion to Celsius

}

void bomba () {
  uint32_t  botonbomba;
  bt0.getValue(&botonbomba);
  if (botonbomba == 1) {
    digitalWrite(13, HIGH);
  }
  else if (botonbomba == 0) {
    digitalWrite(13, LOW);
  }
}
void rele () {
  uint32_t botonrele1;
  bt1.getValue(&botonrele1);
  if (botonrele1 == 1) {
    digitalWrite(12, HIGH);
  }
  else  if (botonrele1 == 0) {
    digitalWrite(12, LOW);
  }
}
void boiler () {
  uint32_t botonboiler;
  bt2.getValue(&botonboiler);
  if (botonboiler == 1) {
    digitalWrite(11, HIGH);
  }
  else if (botonboiler == 0) {
    digitalWrite(11, LOW);
  }
}

parece que el problema numero 1 lo he solucionado modificando el codigo, ademas de modificar en el Nextion Editor que los botones pasen en la opcion vscope local > global es esto lo que me comentabas en el anterior mensaje ?

el problema numero dos sigo sin poder resolverlo, la prueba que he realizado es montar este codigo el cual si me funciona


#include <Nextion.h>
#define RT0 10000   // Ω
#define B 3977      // K
#define VCC 5    //Supply voltage
#define R 10000  //R=10KΩ
float RT, VR, ln, TX, T0, VRT;
float sensorPin = A0;    // seleccionar la entrada para el sensor
float sensorValue;       // variable que almacena el valor raw (0 a 1023)
int progress = 0;    // variable de proceso barra
int setpoint = 0;
NexDSButton bt0 = NexDSButton(0, 1, "bt0");
NexDSButton bt1 = NexDSButton(0, 2, "bt1");
NexDSButton bt2 = NexDSButton(0, 3, "bt2");
NexButton b2 = NexButton(2, 3, "b2");
NexButton b1 = NexButton(2, 2, "b1");
NexNumber n1 = NexNumber(2, 5, "n1" );
NexNumber n0 = NexNumber(2, 4, "n0" );
NexNumber n2 = NexNumber(2, 6, "n2" );
NexNumber n3 = NexNumber(2, 7, "n3" );
NexProgressBar j0(0, 1, "j0");
char buffer[100] = {0};
NexTouch *nex_listen_list[] =
{
  &b2,
  &b1,
  &bt0,
  &bt1,
  &bt2,
  NULL
};
void b2PushCallback(void *ptr)
{
  setpoint = setpoint + 1;

  n3.setValue (setpoint);
}

void b1PushCallback(void *ptr)
{
  setpoint = setpoint - 1;

  n3.setValue (setpoint);
}
void setup (void)
{

  Serial.begin(9600);
  nexInit();
  b2.attachPush(b2PushCallback, &b2);
  b1.attachPush(b1PushCallback, &b1);
  pinMode (13, OUTPUT);
  pinMode (12, OUTPUT);
  pinMode (11, OUTPUT);
  T0 = 25 + 273.15;
}
void loop (void) {
  nexLoop(nex_listen_list);
}

cuando uno ambos codigo en un mismo programa deja de funcionar la parte de botones espero haberme explicado lo suficiente un saludo y muchas gracias a todos

adjunto nuevo archivo de nextion

https://drive.google.com/file/d/1t2a5mdAqxU5_04Ciq0fcNxea8dGnygrD/view?usp=sharing

Te sugiero un cambio
En lugar de comparar lo valores de menor a mayor

  if (sensorValue > 1) {
    progress = 100;
  }
  if (sensorValue > 7) {
    progress = 90;
  }
  if (sensorValue > 13) {
// etc..

hacerlo de mayor a menor y con else

  if (sensorValue > 90) {
    progress = 0;
  }
  else if (sensorValue > 50) {
    progress = 20;
  }
  else if (sensorValue > 35) {
// etc..

así no hace tantas comparaciones ni cambia en cada una el valor de progress hasta encontrar la comparación correcta.

Incluso podrías poner todos los valores en un array y hacer algo así

int valores[10][2] = {{90, 0}, {50, 20}, {35, 30}, // etc..

// luego a la hora de las comparaciones

for (byte i = 0; i < 10; i++) {
  if (sensorValue > valores[i][0]) {
    progress = valores[i][1];
    break;
  }
}

Saludos

No era eso porque lo desconozco. Si ahora has hecho tus variables nextion globales y asi se resolvió el punto 1, déjalo asi.

Y como sabemos nosotros donde esta el boton Azul y el Rojo?
Revisa esto en ejemplos y mira como funciona determinado ejemplo y que hay diferente en el tuyo

b2.attachPush(b2PushCallback, &b2);
  b1.attachPush(b1PushCallback, &b1);

hola gatul muchas gracias por la sugerencias he modificado el codigo con else ademas de eliminar el comando map ya que no tiene mucho sentido cosas de novatos sin ideas, poco a poco voy entendiendo el lenguaje y la forma de implementarlo ahora queda algo asi:

sensorValue = analogRead(sensorPin); // realizar la lectura
  if (sensorValue > 950) {
    progress = 0;
  }
  else if (sensorValue > 700) {
    progress = 20;
  }
  else if (sensorValue > 620) {
    progress = 30;
  }
  else if (sensorValue > 560) {
    progress = 40;
  }
  else if (sensorValue > 520) {
    progress = 50;
  }
  else if (sensorValue > 500) {
    progress = 60;
  }
  else if (sensorValue > 475) {
    progress = 70;
  }
  else if (sensorValue > 440) {
    progress = 80;
  }
  else if (sensorValue > 410) {
    progress = 90;
  }
  else if (sensorValue > 380) {
    progress = 100;
  }

  j0.setValue(progress);
  n1.setValue(sensorValue);


}

lo de crear un array no termino de comprenderlo y no quiero seguir desarrollando mi programacion a base de copiar y pegar, puedes explicarme como funciona esa parte, o puedes enlazarme con algun tutorial donde se explique para poder comprenderlo gracias

Y como sabemos nosotros donde esta el boton Azul y el Rojo?
Revisa esto en ejemplos y mira como funciona determinado ejemplo y que hay diferente en el tuyo

buenas, el tema del boton Azul y rojo esta en la visualizacion con la pantalla Nextion, entiendo que si solo se esta visualizando el codigo de arduino no estas viendo el entorno grafico de la nextion, aun asi agradezco tu ayuda.
He revisado varias veces los ejemplos que aparecen en github junto con la libreria de Nextion pero no encuentro donde puede estar esa diferencia pues no lo encuentro, de hecho si cargo en el arduino esa parte solo el sketch del boton Azul y Rojo me funciona bien pero si cargo el codigo completo deja de funcionar esa parte

Para ver el diseño de la pantalla adjunta el HMI.
Estas continuamente enviándole información a la pantalla y la librería de Nextion esta mal programada, muy probablemente estés perdiendo eventos de botón pulsado por eso, envía la información o recíbela solo cuando necesite un cambio o cada x segundos.
Si tienes cambios de pagina contrólalo para saber que enviar o recibir, haz que el botón de cambio de página te cambie una variable o con el comando "sendme" la pantalla te va a enviar en que página se encuentra pero yo no llegué a conseguir recogerlo con su librería.

Yo acabé haciendo mi propio código por que la librería oficial es muy lenta y ocupa mucha memoria, si tu proyecto es pequeño no creo que te de muchos problemas el mío tiene 12 páginas.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.