IF non funziona..ci risiamo..Nextion funziona tutto tranne l'if..

Rieccomi.. ora fin qui tutto ok.. ho inserito un semplice IF da far si che il valore della temperatura e quello dello schermo accendono un relè di controllo. Solo che lo schermo ora dopo un paio di numeri si resetta e l'if non funziona.

[/[code]
#include "Nextion.h"
#include "DHT.h"

#define DHTPIN 2

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

const int led =8;

long valore;
int temperatura;


void n0PopCallback(void *ptr);
void b0PopCallback(void *ptr);
void b1PopCallback(void *ptr);

/*
 * 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(0);

}

/*
 * 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;
    
    dbSerialPrintln("b0PopCallback");

    n0.getValue(&number);
    
    number += 1;
    valore = number;
    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;
    
    dbSerialPrintln("b1PopCallback");

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

void setup(void)
{
    /* Set the baudrate which is for debug and communicate with Nextion screen. */
    nexInit();
    dht.begin();
    pinMode(led,OUTPUT);
    /* 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.
     */
    temperatura = dht.readTemperature();
    nexLoop(nex_listen_list);
    
    



    if(valore >= temperatura)
    {
      digitalWrite(led,HIGH);
    }
    else
    {
      digitalWrite(led,LOW);
    }


}

code]

nel primo codice una volta l if arrivato a 25 funzionava benissimo il led, ma a me serviva fare che in base alla temperatura funzionasse

il codice di prima

[/[code]
#include "Nextion.h"


const int led =8;

int valore;



void n0PopCallback(void *ptr);
void b0PopCallback(void *ptr);
void b1PopCallback(void *ptr);

/*
 * 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(0);

}

/*
 * 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;
    
    dbSerialPrintln("b0PopCallback");

    n0.getValue(&number);
    
    number += 1;
    
    n0.setValue(number); 
    valore = 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;
    
    dbSerialPrintln("b1PopCallback");

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

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

    pinMode(led,OUTPUT);
    /* 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(valore >= 25)
    {
      digitalWrite(led,HIGH);
    }
    else
    {
      digitalWrite(led,LOW);
    }


}

code]

....omissis
mi chiedevo se si potrebbe salvare quella variabile su di una eeprom esterna, così da tenere i valori quando spengo arduino.

Grazie mille ancora sei stato gentilissimo e utilissimo

buona serata

per favore non contattarmi in privato per problemi che comunque possono interessare a tutti (come anche da regolamento :wink: )

2 cose:
primo
il fatto che lo schermo si resetti.... non credo centri molto con l'if o comunque con il codice, a meno che non ci sia qualche problema di overflow di qualche dato (sul programma che gira sul nexion intendo)

secondo
la temperatura è un float cioè è un numero con la virgola e poi ho visto che valore l'hai messo a long, perchè? la temperatura massima che avrai non sarà certo intorno ai 2 milioni di gradi.... spero :slight_smile:
dal reference:
Long variables are extended size variables for number storage, and store 32 bits (4 bytes), from -2,147,483,648 to 2,147,483,647.

per quanto riguarda il salvataggio su eeprom del valore
prova ad aprire e studiarti gli esempi presenti sotto:
esempi->esempi per arduino/genuino uno->eeprom ci sono sia la scrittura che la lettura :wink:

ancora una cosa...
la libreria dht usa gli interrupt durante la lettura dei valori, non lo so ma potrebbe essere anche questo il problema del nexion

>cncduino: ... come vedi nel REGOLAMENTO (... che ti consiglio di rileggere con molta attenzione), al punto 12 ... messaggi privati per richieste di aiuto sono proibiti. Ti prego di tenerne conto per il futuro. Grazie.

Guglielmo

Si mi scuso per la richiesta in privato, ma non era in senso cattivo. Il fatto della eeprom era per salvare il valore impostato dallo schermo, cosi che se spengo il tutto e lo riaccendo mi restano i valori salvati. A dire il vero ho provato un po' di tutto ma con un numero mi funziona e invece con la temperatura non mi funziona.
riproverò.. e studierò.. ma per ora nulla.

la temperatura è un numero....
però è un valore con la virgola, forse ti verrebbe più semplice se lo moltiplichi per 10 e poi lo salvi, ovvio che quando lo leggi lo devi dividere la stessa quantità..

se temperatura è 23.5

int valore= temperatura*10

valore sarà 235 :wink:

Si per quello avevo pensato una cosa del genere..Il problema cmq resta l 'if che non funziona, innutile ora andare avanti con la eeprom se non mi funziona l'if.

non ha senso che il primo codice funzioni e il secondo no!

prova a stampare a seriale i valori di temperatura e valore!

se lo imposto vicino al IF per leggere i dati mi da "read fail" sia sulla temperatura che valore

:o
posta il programma con il controllo....

Ho pure inserito una lettura del DHT22.

[/[code]
#include "Nextion.h"
#include "DHT.h"


#define DHTPIN 2

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

const int led =8;

long valore;
int temperatura;


void n0PopCallback(void *ptr);
void b0PopCallback(void *ptr);
void b1PopCallback(void *ptr);

/*
 * 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)
{
    
    n0.setValue(0);

}

/*
 * 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;
    valore = number;
    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;
    valore = number;
    n0.setValue(number);
    
}

void setup(void)
{
    /* Set the baudrate which is for debug and communicate with Nextion screen. */
    nexInit();
    dht.begin();
    pinMode(led,OUTPUT);
    Serial.begin(9600);
    /* 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);

    
}

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.
     */
    temperatura = dht.readTemperature();
    nexLoop(nex_listen_list);
    Serial.println("inizio");
    Serial.println(temperatura);
    Serial.println(valore);
    Serial.println(dht.readTemperature());
    Serial.println("fine");
    if(valore >= temperatura)
    {
      digitalWrite(led,HIGH);
    }
    else
    {
      digitalWrite(led,LOW);
    }


}

code]

ho modificato le 2 variabili (temperatura e valore e ho aggiunto un delay di 2 secondi tra 2 letture del dht...

dov'è che ti scriveva read fail?

#include "Nextion.h"
#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

const int led = 8;

int valore = 0;
float temperatura;

void n0PopCallback(void *ptr);
void b0PopCallback(void *ptr);
void b1PopCallback(void *ptr);

/*
 * 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) {
   n0.setValue(0);
}

/*
 * 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;
   valore = number;
   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;
   valore = number;
   n0.setValue(number);
}

void setup(void) {
   /* Set the baudrate which is for debug and communicate with Nextion screen. */
   nexInit();
   dht.begin();
   pinMode(led, OUTPUT);
   Serial.begin(9600);
   /* 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);

}

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);
  delay(2000)
  temperatura = dht.readTemperature();
  Serial.println("inizio");
  Serial.print("temperatura: ");
  Serial.println(temperatura);
  Serial.print("valore: ");
  Serial.println(valore);
  //Serial.println(dht.readTemperature());
   Serial.println("fine");
   if (valore >= temperatura) {
      digitalWrite(led, HIGH);
   } else {
      digitalWrite(led, LOW);
   }
}

i copia incolla...brutta abitudine

perché? era uno sketch già fatto e lo stavo modificando, mi sembrava inutile riscriverlo tutto no?

comunque mi scrive così

Read failinizio
temperatura: nan
valore: 1
fine

Sinceramente parlando

e prendila per un consiglio di uno che ha compiuto 1Anno la settimana scorsa su Arduino........è meglio che te la riscrivi capendo cosa vuoi dal TUO schetc.

bè non è il primo che faccio. lo sketch era già fatto la mia modifica era inserire un if che dal valore mi accendesse un relè. Non lo trovo poi così sbagliato..
Però se dici così vuol dire che hai capito dov'è l'errore..

io ho un DHT11 e(pu non amando le librerie a priori,....ma qui è megli usarla), partito dalle basi ho dovuto aggiungere alcune variabili mie,per ottenere ciò che volevo.
(scritte in italiano cosi le capisco almeno io).

Dunque secondo te è la DHT22 il problema? cioè la libreria? se ti spiegassi meglio :slight_smile:

NO non ho capito dove stà il tuo errore...ne ho già abbastanza dei miei.
Ti hi dato un consiglio...riscrivilo e verificalo passo-passo.