Nextion RISOLTO

Rieccomi ho trovato esempi e studiato.
Ho un problema di richiamo del valore che non capisco quale devo prendere.
Nel progetto ho messo un if che a numero 25 accende un led.. ma non funziona

[/
```
**#include "Nextion.h"

void n0PopCallback(void *ptr);
void b0PopCallback(void *ptr);
void b1PopCallback(void ptr);
const int led = 8;
/

  • Declare a number object [page id:0,component id:3, component name: "n0"].
    */
    NexNumber n0 = NexNumber(0, 3, "n0");

/*

  • Declare a button object [page id:0,component id:1, component name: "b0"].
    */
    NexButton b0 = NexButton(0, 1, "b0");

/*

  • Declare a button object [page id:0,component id:2, component name: "b1"].
    */
    NexButton b1 = NexButton(0, 2, "b1");

char buffer[100] = {0};

/*

  • Register object n0, b0, b1, to the touch event list. 
    */
    NexTouch *nex_listen_list =
    {
        &n0,
        &b0,
        &b1,
        NULL
    };

/*

  • number component pop callback function.
    */
    void n0PopCallback(void *ptr)
    {
        dbSerialPrintln("n0PopCallback");
        n0.setValue(50);
    }

/*

  • Button0 component pop callback function.
  • In this example,the value of the number component will plus one every time when button0 is released.
    */
    void b0PopCallback(void *ptr)
    {
        uint32_t number;

n0.getValue(&number);
   
    number += 1;
   
    n0.setValue(number);
}

/*

  • Button1 component pop callback function.
  • In this example,the value of the number component will minus one every time when button1 is released.
    */
    void b1PopCallback(void *ptr)
    {
        uint32_t number;

n0.getValue(&number);
   
    number -= 1;
   
    n0.setValue(number);
}

void setup(void)
{
    pinMode(led,OUTPUT);
    /* Set the baudrate which is for debug and communicate with Nextion screen. */
    nexInit();

/* Register the pop event callback function of the current number component. */
    n0.attachPop(n0PopCallback);

/* Register the pop event callback function of the current button0 component. */
    b0.attachPop(b0PopCallback);

/* Register the pop event callback function of the current button1 component. */
    b1.attachPop(b1PopCallback);

dbSerialPrintln("setup done");
}

void loop(void)
{
    /*
    * When a pop or push event occured every time,
    * the corresponding component[right page id and component id] in touch event list will be asked.
    */
    nexLoop(nex_listen_list);
   
    if (n0.attachPop == 25){
      digitalWrite(led,HIGH);
    }
    else{
    digitalWrite(led,LOW);}

}**
```
b]

se n0 è il pulsante per accendere il led allora nel setup

n0.attachPop(n0PopCallback, &n0);

e poi la callback diventa

void n0PopCallback(void *ptr) {
     digitalWrite(led1, HIGH);
}

... seguendo l'esempio...

n0 è il testo che mi da il valore, b0 e b1 i tasti per aumentare o diminuire il valore. Una volta premuti i tasti imposto sul display un valore, ma non riesco a prendere quel valore per fare un if. Esempio se imposto 20 sul display a 20 vorrei fare un if == per accendere il led.

Hai visto il programma di cui ti avevo fornito il link nella tua discussione originale? Secondo me lì trovi la soluzione.
Aiuto Nextion e cambio variabile..

aaaa ok
stai seguendo l'esempio incluso nella libreria :slight_smile:
l'ho trovato.

Il tuo problema è che tutte le variabili sono locali alle funzioni callback
quindi la cosa più semplice sarebbe quella di definire una variabile globale nella quale salvi il valore di n0 e poi nel loop esegui l'accensione e spegnimento in funzione del suo valore ma così facendo in quegli istanti sei fuori dal controllo del display, per cui la cosa più logica è spostare le istruzioni dal loop alle funz b0 e b1 popcallback

void b0PopCallback(void *ptr)
{
    uint32_t number;
    n0.getValue(&number);
    number += 1;
    n0.setValue(number);

    if ( n0.getValue(&number) == 25){  // o anche semplicemente if (number) == 25)
      digitalWrite(led,HIGH);
    }
    else{
    digitalWrite(led,LOW);}
}

/*
 * Button1 component pop callback function.
 * In this example,the value of the number component will minus one every time when button1 is released.
 */
void b1PopCallback(void *ptr)
{
    uint32_t number;
    n0.getValue(&number);
    number -= 1;
    n0.setValue(number);

   if ( n0.getValue(&number) == 25){  // o anche semplicemente if (number) == 25)
      digitalWrite(led,HIGH);
    }
    else{
    digitalWrite(led,LOW);}
}

quindi il loop ritorna come in origine

void loop(void)
{
    /*
     * When a pop or push event occured every time, 
     * the corresponding component[right page id and component id] in touch event list will be asked.
     */
    nexLoop(nex_listen_list);
}

boh? forse funge :slight_smile:
prova un po

No non funziona. Ma non capisco come poter salvare il valore su una variabile per por richiamarlo nel if.De quello che ho capito manca il comando che legge dallo schermo il valore per poi inserirlo in una variabile per poi averlo a disposizione. Una volta trovato questo passaggio sarei a posto perché posso fare sia termostati che timer e controlli ph.

Grazie mille.

mi pare strano che non vada....
prova a usare la seriale per fare un po di debug....

comunque l'altro modo era questo:

tra le righe iniziali imposti la variabile globale

const int led = 8;
int mioValoreDaSalvare=0;
...
...

nelle 2 callback b0 e b1

    number += 1;           // nell'altra number -=1;
    n0.setValue(number);
    mioValoreDaSalvare=number;
...
...

e poi nel loop la tua if

void loop(void)
{
    /*
     * When a pop or push event occured every time,
     * the corresponding component[right page id and component id] in touch event list will be asked.
     */
    nexLoop(nex_listen_list);
   
    if (miaVariabileDaSalvare == 25){
      digitalWrite(led,HIGH);
    }
    else{
    digitalWrite(led,LOW);}

}

avevo già provato ma anche così non funziona...

Riprovato sembra funzionare ho visto un errore pure sul display dava variabile globale e non locale ora così va… grazie mille :slight_smile: