Vi prego AIUTO PER NEXTION DISPLAY

Ciao qualcuno potrebbe aiutarmi? ho quasi finito il progetto ma non riesco a far funzionare i dualstatebutton. Qualcuno sarebbe così cortese da darmi una mano? Se si scrivetemi e invio tutto il progetto grazie mille veramente..

Ciao , prova a dire a me anche io sto utilizzando nextion.

Il mio problema è che ho creato quasi tutto quello che mo serve. cioe lettura sensori orologio ecc. però non riesco ad inserire i comandi dualstatebutton nello sketch.. divento matto perchè manca solo quello. Utilizzo arduino uno. Se credi di potermi dare una mano posto lo sketch. Grazie mille per l'aiuto..

ciao...non sono un esperto ma googolando ho visto che ....nel NEXTION assegni due immagini a seconda dello stato del bit relativo al "button"...contestualmente dovresti includere un'istruzione di "invio comando da seriale" verso arduino al variare, appunto, del suo stato.

lato arduino, ovviamente, devi verificare se stanno arrivando dati nella seriale e decodificare il comando ricevuto...

in quale dei due "lati" hai problemi...non sai o non riesci ad inviare il comando o non sai non riesci a ricevere il comando?

Se vuoi posta il tuo schetch non è difficile utilizzare il dual state.

ti posto quello che utilizzo io :
arduino mega
seriale 1

#include <Nextion.h>
#include <NextionPage.h>
#include <NextionDualStateButton.h>
Nextion nex(Serial1);


NextionDualStateButton P_VENTOLAMANDRINO(nex, 7, 4, "ventolama");  //  5 = PAGINA 8=ID pulsante dual state

int ventolamandrino = 48;

void setup()
{
 Serial.begin(9600);
 Serial1.begin(9600);
 pinMode(ventolamandrino, OUTPUT);
 nex.init();

P_VENTOLAMANDRINO.attachCallback(&callbackVENTOLA_MANDRINO);  //  ASSEGNAZIONE PULSANTE AL CALLBACK CHE SI INTENDE UTILIZZARE.
}

void loop()
{
nex.poll();

}

void callbackVENTOLA_MANDRINO(NextionEventType type, INextionTouchable *widget)
{
 if (type == NEX_EVENT_POP)
 {
   if (widget->getNumberProperty("val") == 0)
     digitalWrite(ventolamandrino, HIGH);
   else
     digitalWrite(ventolamandrino, LOW);
 }
}

>rikivergani: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie.

Guglielmo

chiedo scusa, non lo sapevo, modifico subito.

Il mio sketch e il seguente… Però manca tutta la parte del dual state, cioè questa è la versione funzionante la quale il dual state button non mi funziona e non capisco perché…Ma cmq uso arduino uno io. Per la parte del Nextion mi arrangio da quel lato me la cavo bene.
Grazie mille

#include <Nextion.h>
#include <NextionPage.h>
#include <NextionDualStateButton.h>
#include <SoftwareSerial.h>
#include "DHT.h"
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <RTClib.h>

#define DHTPIN 2  
#define DHTTYPE DHT22 

char buffer1[20];
char buffer2[20];

float temperature = 2.3f;
float humidity = 3.3f;
float Co2 = 4.3f;
float Mbar = 0.0f;
float HumiditySoil = 7.3f;
float Time = 0.3f;
float Date = 0.4f;

int output_value;

boolean statepin = 0;

const int setpin = 6;

DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;

RTC_DS1307 RTC;

SoftwareSerial nextionSerial(10, 11); // RX, TX

Nextion nex(nextionSerial);
NextionPage pgDsButton(nex, 9, 4, "page9");
NextionDualStateButton button(nex, 9, 4, "bt0");

void setup()
{
  Serial.begin(9600);
  pinMode(8, OUTPUT);
  nextionSerial.begin(9600);
  nex.init();
  Serial.println(pgDsButton.show());
  Serial.println(button.attachCallback(&callback));
  Serial.println(button.isActive());
  Serial.println(button.setActive(true));
  Serial.println(button.isActive());
  Serial.begin(9600);
  dht.begin(); 
  bmp.begin();
  RTC.begin();
  pinMode(6, INPUT);
  digitalWrite(6, HIGH);
  
if (! RTC.isrunning()) {

RTC.adjust(DateTime(__DATE__, __TIME__));
}
}

void loop() {

  readSensor();
  sendHumidityToNextion();
  sendTemperatureToNextion();
  sendCo2ToNextion();
  sendMbarToNextion();
  sendHumiditySoilToNextion();
  sendTimeToNextion();
  sendDateToNextion();
  delay(500);
  
  statepin = digitalRead (setpin);

if (statepin == LOW)

{
RTC.adjust(DateTime(__DATE__, __TIME__));
}

DateTime now = RTC.now();

sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());

}

void readSensor()
{
 humidity = dht.readHumidity();
 temperature = dht.readTemperature();
 Co2 = analogRead(A0);
 Mbar = (bmp.readPressure())/100;
 HumiditySoil = map(analogRead(A1),550,0,0,100);
 
}

void sendHumidityToNextion()
{
  String command = "umid.txt=\""+String(humidity,1)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendTemperatureToNextion()
{
  String command = "temp.txt=\""+String(temperature,1)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendCo2ToNextion()
{
  String command = "anid.txt=\""+String(Co2,0)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendMbarToNextion()
{
  String command = "t3453.txt=\""+String(Mbar)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendHumiditySoilToNextion()
{
  String command = "umte.txt=\""+String(HumiditySoil,0)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendTimeToNextion()
{
  String command = "time.txt=\""+String(buffer1)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendDateToNextion()
{
  String command = "date.txt=\""+String(buffer2)+"\"";
  Serial.print(command);
  endNextionCommand();
}



void callback(NextionEventType type, INextionTouchable *widget)
{
  if (type == NEX_EVENT_PUSH)
  {
    digitalWrite(8, HIGH);
  }
  else if (type == NEX_EVENT_POP)
  {
    Serial.println(button.isActive());
    digitalWrite(8, LOW);
  }
}
void endNextionCommand()
{
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  

}

> cncduino: … ma hai visto il post di rikivergani (post #5) ? ? ? :o … perché è proprio un esempio d’uso di NextionDualStateButton, quindi guarda li e cerca di come lo usa … ::slight_smile:

Guglielmo

Si proverò ma avevo sentito che per arduino uno la programmazione era differente da arduino mega, per via della trasmissione dati. Ora cmq verificherò il tutto. grazie mille

In effetti il serial1 non lo sopporta arduino uno, non riesco a comprendere il passaggio per inserire il dualstate in arduino uno. Una volta capito quello poi me la cavo a modificarlo ecc..

Vi chiedo scusa della mia insistenza però mi manca solo quello per terminare il progetto.

Grazie mille a tutti

Sulla UNO, non avendo più seriali, immagino che dovrai usare una seriale virtuale creata con la SoftwareSerial ...

Guglielmo

è più semplice di quello che credi !! Ti ho evidenziato tutto quello che ho aggiunto, provalo dovrebbe funzionare.

#include <Nextion.h>
#include <NextionPage.h>
#include <NextionDualStateButton.h>
#include <SoftwareSerial.h>
#include "DHT.h"
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <RTClib.h>

#define DHTPIN 2  
#define DHTTYPE DHT22 

char buffer1[20];
char buffer2[20];

float temperature = 2.3f;
float humidity = 3.3f;
float Co2 = 4.3f;
float Mbar = 0.0f;
float HumiditySoil = 7.3f;
float Time = 0.3f;
float Date = 0.4f;

int output_value;

boolean statepin = 0;

const int setpin = 6;

DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;

RTC_DS1307 RTC;

SoftwareSerial nextionSerial(10, 11); // RX, TX

Nextion nex(nextionSerial);
NextionPage pgDsButton(nex, 9, 4, "page9");

////////////////////////////////////////////////////////////////////////
[color=yellow]NextionDualStateButton button(nex, 9, 4, "bt0"); // assicurati che id e pagina siano corretti : nex, pagina , id, nome 
int ventolamandrino = 13; // pin a caso[/color]
//////////////////////////////////////////

void setup()
{
  Serial.begin(9600);
  pinMode(8, OUTPUT);
  nextionSerial.begin(9600);
  nex.init();
  Serial.println(pgDsButton.show());
  Serial.println(button.attachCallback(&callback));
  Serial.println(button.isActive());
  Serial.println(button.setActive(true));
  Serial.println(button.isActive());
  Serial.begin(9600);
  dht.begin(); 
  bmp.begin();
  RTC.begin();
  pinMode(6, INPUT);
  digitalWrite(6, HIGH);
[color=yellow]//////////////////////////////////////////////////
 
 pinMode(ventolamandrino, OUTPUT); 
button.attachCallback(&callbackbutton);
//////////////////////////////////////////////////[/color]
  
if (! RTC.isrunning()) {

RTC.adjust(DateTime(__DATE__, __TIME__));
}
}

void loop() {
[color=yellow]///////////////////////

nex.poll();
//////////////////////[/color]

  readSensor();
  sendHumidityToNextion();
  sendTemperatureToNextion();
  sendCo2ToNextion();
  sendMbarToNextion();
  sendHumiditySoilToNextion();
  sendTimeToNextion();
  sendDateToNextion();
  delay(500);
  
  statepin = digitalRead (setpin);

if (statepin == LOW)

{
RTC.adjust(DateTime(__DATE__, __TIME__));
}

DateTime now = RTC.now();

sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());

}

////////////////////////////////////////////////////////////////

[color=yellow]void callbackbutton(NextionEventType type, INextionTouchable *widget)
{
 if (type == NEX_EVENT_POP)
 {
   if (widget->getNumberProperty("val") == 0)
     digitalWrite(ventolamandrino, LOW);
   else
     digitalWrite(ventolamandrino, HIGH);
 }
}[/color]

///////////////////////////////////////////////////////////////////

void readSensor()
{
 humidity = dht.readHumidity();
 temperature = dht.readTemperature();
 Co2 = analogRead(A0);
 Mbar = (bmp.readPressure())/100;
 HumiditySoil = map(analogRead(A1),550,0,0,100);
 
}

void sendHumidityToNextion()
{
  String command = "umid.txt=\""+String(humidity,1)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendTemperatureToNextion()
{
  String command = "temp.txt=\""+String(temperature,1)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendCo2ToNextion()
{
  String command = "anid.txt=\""+String(Co2,0)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendMbarToNextion()
{
  String command = "t3453.txt=\""+String(Mbar)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendHumiditySoilToNextion()
{
  String command = "umte.txt=\""+String(HumiditySoil,0)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendTimeToNextion()
{
  String command = "time.txt=\""+String(buffer1)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendDateToNextion()
{
  String command = "date.txt=\""+String(buffer2)+"\"";
  Serial.print(command);
  endNextionCommand();
}



void callback(NextionEventType type, INextionTouchable *widget)
{
  if (type == NEX_EVENT_PUSH)
  {
    digitalWrite(8, HIGH);
  }
  else if (type == NEX_EVENT_POP)
  {
    Serial.println(button.isActive());
    digitalWrite(8, LOW);
  }
}
void endNextionCommand()
{
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  

}

Ci ho provato un paio di volte ma nulla.. mi dispiace di farvi aver perso tempo.. ci rinuncio... Faccio dei bottoni manuali e nextion lo uso solo per leggere i dati...

Ancora grazie a tutti e buona giornata.

Non funziona lo schetck che ti ho fatto ?

no, non mi funziona quando premo il bottone. In nextion gli dico da inviare i dati dal bottone però nulla..

prova a mettere dei timer agli aggiornamenti, perchè se aggiorni in continuazione i number o i test la seriale si intasa e in pratica non riceve il comando, o meglio il display lo legge cambia di stato sul nextion ma arduino non riceve niente, ti posto un’esempio di quello che uso io. Prova a metterlo nel tuo schketch e fammi sapere.
ciao

#include <Nextion.h>
#include <NextionPage.h>
#include <NextionDualStateButton.h>
#include <SoftwareSerial.h>
#include "DHT.h"
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <RTClib.h>

#define DHTPIN 2  
#define DHTTYPE DHT22 

char buffer1[20];
char buffer2[20];

float temperature = 2.3f;
float humidity = 3.3f;
float Co2 = 4.3f;
float Mbar = 0.0f;
float HumiditySoil = 7.3f;
float Time = 0.3f;
float Date = 0.4f;

int output_value;

boolean statepin = 0;

const int setpin = 6;

DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;

RTC_DS1307 RTC;

SoftwareSerial nextionSerial(10, 11); // RX, TX

Nextion nex(nextionSerial);
NextionPage pgDsButton(nex, 9, 4, "page9");

////////////////////////////////////////////////////////////////////////
NextionDualStateButton button(nex, 9, 4, "bt0"); // assicurati che id e pagina siano corretti : nex, pagina , id, nome 
int ventolamandrino = 13; // pin a caso

unsigned long tm_ORARIO;
//////////////////////////////////////////


void setup()
{
  Serial.begin(9600);
  pinMode(8, OUTPUT);
  nextionSerial.begin(9600);
  nex.init();
  Serial.println(pgDsButton.show());
  Serial.println(button.attachCallback(&callback));
  Serial.println(button.isActive());
  Serial.println(button.setActive(true));
  Serial.println(button.isActive());
  Serial.begin(9600);
  dht.begin(); 
  bmp.begin();
  RTC.begin();
  pinMode(6, INPUT);
  digitalWrite(6, HIGH);
  tm_ORARIO = millis();
//////////////////////////////////////////////////
 
 pinMode(ventolamandrino, OUTPUT); 
button.attachCallback(&callbackbutton);
//////////////////////////////////////////////////[/color]
  
if (! RTC.isrunning()) {

RTC.adjust(DateTime(__DATE__, __TIME__));
}
}

void loop() {
///////////////////////

nex.poll();
//////////////////////

  readSensor();
  if (millis() - tm_ORARIO > (unsigned long)(6000)) {
  sendHumidityToNextion();
  sendTemperatureToNextion();
  sendCo2ToNextion();
  sendMbarToNextion();
  sendHumiditySoilToNextion();
  sendTimeToNextion();
  sendDateToNextion();
  delay(500);
  
  statepin = digitalRead (setpin);

if (statepin == LOW)

{
RTC.adjust(DateTime(__DATE__, __TIME__));
}

DateTime now = RTC.now();

sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
}
}

////////////////////////////////////////////////////////////////

void callbackbutton(NextionEventType type, INextionTouchable *widget)
{
 if (type == NEX_EVENT_POP)
 {
   if (widget->getNumberProperty("val") == 0)
     digitalWrite(ventolamandrino, LOW);
   else
     digitalWrite(ventolamandrino, HIGH);
 }
}

///////////////////////////////////////////////////////////////////

void readSensor()
{
 humidity = dht.readHumidity();
 temperature = dht.readTemperature();
 Co2 = analogRead(A0);
 Mbar = (bmp.readPressure())/100;
 HumiditySoil = map(analogRead(A1),550,0,0,100);
 
}

void sendHumidityToNextion()
{
  String command = "umid.txt=\""+String(humidity,1)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendTemperatureToNextion()
{
  String command = "temp.txt=\""+String(temperature,1)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendCo2ToNextion()
{
  String command = "anid.txt=\""+String(Co2,0)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendMbarToNextion()
{
  String command = "t3453.txt=\""+String(Mbar)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendHumiditySoilToNextion()
{
  String command = "umte.txt=\""+String(HumiditySoil,0)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendTimeToNextion()
{
  String command = "time.txt=\""+String(buffer1)+"\"";
  Serial.print(command);
  endNextionCommand();
}

void sendDateToNextion()
{
  String command = "date.txt=\""+String(buffer2)+"\"";
  Serial.print(command);
  endNextionCommand();
}



void callback(NextionEventType type, INextionTouchable *widget)
{
  if (type == NEX_EVENT_PUSH)
  {
    digitalWrite(8, HIGH);
  }
  else if (type == NEX_EVENT_POP)
  {
    Serial.println(button.isActive());
    digitalWrite(8, LOW);
  }
}
void endNextionCommand()
{
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  

}

Ciao, nulla da fare...Male estremi estremi rimedi... ho comperato arduino mega.. Ora mi devo studiare solo come comunica con nextion...Ho fatto doppia spesuccia.. arduino genuino mega ed nuovo nextion 7pollici.. ora vedremo..da quello che ho capito ora non si usa piu TX e RX e la libreria serial. Ci studierò su. grazie mille di tutto sei gentilissimo..