Для управления переключением реле в nextion с помощью микроконтроллера esp32

Я разработал код для управления включением/выключением реле с помощью дисплея nextion и esp32. Но всякий раз, когда я нажимаю кнопку двойного состояния на дисплее nextion, происходит некоторая задержка, и мне нужно непрерывно нажимать кнопку двойного состояния на дисплее nextion в течение примерно 10–15 секунд, чтобы включить/выключить реле.

Я застрял в этой работе и ищу помощи. Мне нужно включить / выключить реле одним нажатием кнопки двойного состояния на дисплее nextion. Ниже я прикрепил свой код,

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

#define DHTPIN 27
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);
int R1 = 2;
uint32_t dual_state ;

NexText tTempC = NexText(0, 4, "tTempC");
NexText tHumidity = NexText(0, 6, "tHumidity");
NexDSButton bt0 = NexDSButton(0, 8, "bt0");

char buffer[100] = {0};

NexTouch *nex_listen_list[] =
{
    &bt0,
    NULL
};

void bt0PopCallback(void *ptr)
{
  uint32_t dual_state;
  NexDSButton *btn = (NexDSButton *)ptr;

  dbSerialPrintln("bt0PopCallback");
  dbSerialPrint("ptr=");

  dbSerialPrintln((uint32_t)ptr);
  memset(buffer, 0, sizeof(buffer));

  bt0.getValue(&dual_state);

  if(dual_state>0)
  {
    digitalWrite(R1, LOW);
  }
  else
  {
    digitalWrite(R1, HIGH);
  }
}

void setup(void) {
   dht.begin();
   Serial.begin(9600);
   pinMode(R1, OUTPUT);

   nexInit();
   bt0.attachPop(bt0PopCallback, &bt0);

   Serial.println("DHT Sensor Reading");
   dbSerialPrintln("setup done");
}

void loop(void) {
  nexLoop(nex_listen_list);
  float t = dht.readTemperature();
  float h = dht.readHumidity();

  if (isnan(h) || isnan(t)) {
    Serial2.println(F("Failed to read from DHT sensor!"));
    return;
  }

  static char temperatureCTemp[10];
  dtostrf(t, 6, 2, temperatureCTemp);
  tTempC.setText(temperatureCTemp);

  char hTemp[10] = {0};
  utoa(int(h), hTemp, 10);
  tHumidity.setText(hTemp);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print("°C ");
  //Serial2.print(F("tTempC.txt="));

  //Серийный.принт("");
  //Serial.print(F("tHumidity.txt:\ "));
  //Серийный.принт(ч);
  //Serial.write(0xff);
  //Serial.write(0xff);
  //Serial.write(0xff);
}

Заранее спасибо.

, 👍-2

Обсуждение

Что такое класс NexDualStateButton? Это определено Nextion? А что такое Nextion?, @Duncan C

Если я не включил NexDualStateButton в оператор включения, я получаю сообщение об ошибке, поскольку NexDSButton не был объявлен. Так что только я включил NexDualStateButton в оператор include, @Abhishekh Aaron

Кроме того, я загрузил библиотеку стабильной среды nextion (Nextion 7.0.0) и добавил ее в Arduino IDE. Я не могу добавить нестабильную версию Nextion, которая содержит библиотеку кнопок с двумя состояниями., @Abhishekh Aaron

Это не отвечает на мой вопрос. Что это за класс? Я понимаю, что он вам нужен, но что он делает? Вы используете классы, не объясняя, откуда они взялись, для чего они нужны или где они задокументированы., @Duncan C

Если я включу этот класс, моя кнопка с двойным состоянием будет работать. Библиотека Nextion не так стабильна., @Abhishekh Aaron

Вы не предоставляете достаточно информации, чтобы мы могли вам помочь. Я проголосовал за то, чтобы закрыть ваш вопрос., @Duncan C

На самом деле я новичок в программировании Arduino, и все, чем я занимаюсь, похоже на метод проб и ошибок. Класс #include "NexDualStateButton.h" используется для объявления библиотеки кнопки NextionDualState., @Abhishekh Aaron


3 ответа


1

Я считаю этот метод неэффективным. Потому что ESP32 постоянно отслеживает состояние кнопки.

Вы попробуете этот метод. Работаю на меня.

int R1 = 2;
NexDSButton bt0 = NexDSButton(0, 8, "bt0");
uint32_t dual_state=0;

void setup(){
nexInit();
pinMode(R1, OUTPUT);
}
void loop(){
bt0.getValue(&dual_state);

if(dual_state==1) //When pressed dual state button dual_state =1
  {
    digitalWrite(R1, HIGH);
  }
  else if(dual_state==0)
  {
    digitalWrite(R1,LOW ); 
  }

}
,

Я использую для получения состояния кнопки в моем случае. Не используйте, если вы не хотите его использовать. Его ожидание после принятия состояния кнопки 200 мс и введите условие if. Иногда возникает задержка между arduino и nextion, я жду из-за этого., @Alper Aslan

эта задержка не для этого. в моем проекте я меняю dual_state на 0 после условия if. Это для моего случая. Если вы не хотите использовать его, то не используйте его., @Alper Aslan

ты слишком остро реагируешь, @Alper Aslan

Спасибо Альпер Аслан. Я проверю ваш код и сообщу вам в ближайшее время., @Abhishekh Aaron

Нет, Юрай прав. Не включайте в свой ответ код, который не имеет смысла для большинства пользователей. Вы говорите: «Я использую для получения состояния кнопки в моем случае». Это говорит о том, что большинству пользователей не нужна или не нужна эта задержка, поэтому отредактируйте свой ответ и удалите его. Функция delay() вызывает всевозможные проблемы, и ее следует использовать только в особых случаях., @Duncan C

Хорошо, ребята, я отредактирую, вы правы, спасибо за совет, @Alper Aslan

@AbhishekhAaron, пожалуйста, я использую этот код в своем проекте и работаю правильно, его не слушаю все время. Просто слушайте, когда нажата кнопка, и принимайте состояние кнопки., @Alper Aslan

Спасибо ребята. Мой код работает. Alper Aslan Я использовал ваш код для кнопки с двойным состоянием, и теперь он работает. Ниже я прикрепил свой код,, @Abhishekh Aaron

@AbhishekhAaron, какие хорошие новости :), @Alper Aslan

@AbhishekhAaron, каково значение переменной dual_state, если оно не равно 1?, @Juraj

@Juraj Извините, я не понял вашего вопроса?, @Abhishekh Aaron

Это написано, если условие равно нулю, @Alper Aslan

Я пытаюсь понять разницу между рассматриваемым кодом и кодом в ответе. они выглядят эквивалентно., @Juraj

@Juraj в вопросе с кодом bt0 постоянно слушает Esp32. В объекте NexTouch nex_listen_list., @Alper Aslan

Я не вижу, какая строка отличается, @Juraj

буфер символов [100] = {0}; NexTouch *nex_listen_list[] = { &bt0, НУЛЕВОЙ };, @Alper Aslan

хорошо. извините, я сравнил коды в обоих ответах не с вопросом., @Juraj


0

Это мой обновленный код для отображения температуры и влажности на дисплее Nextion, а также для управления переключением реле на дисплее Nextion. Это работает хорошо.

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

#define DHTPIN 27
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

int R1 = 2;
NexDSButton bt0 = NexDSButton(0, 8, "bt0");
NexText tTempC = NexText(0, 4, "tTempC");
NexText tHumidity = NexText(0, 6, "tHumidity");
uint32_t dual_state=0;

void setup(){
  dht.begin();  
  nexInit();
  pinMode(R1, OUTPUT);
}

void loop(){
  bt0.getValue(&dual_state);

  if(dual_state==1) //При нажатии кнопки двойного состояния dual_state =1
  {
    digitalWrite(R1, HIGH);
  }
  else if(dual_state==0)
  {
    digitalWrite(R1,LOW ); 
  }
  float t = dht.readTemperature();
  float h = dht.readHumidity();

  if (isnan(h) || isnan(t)) {
    Serial2.println(F("Failed to read from DHT sensor!"));
    return;
  }

  static char temperatureCTemp[10];
  dtostrf(t, 6, 2, temperatureCTemp);
  tTempC.setText(temperatureCTemp);

  char hTemp[10] = {0}; 
  utoa(int(h), hTemp, 10);
  tHumidity.setText(hTemp);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print("°C ");

}
,

Можно принять свой собственный ответ как решение проблемы., @VE7JRO


0

Есть более простой способ вывести температуру на дисплей и вызвать кнопку BT без использования библиотеки Nextion. В этом примере я использую TCA9548A, потому что использую 2 BMP280.

void TEMP() {
  delay(125);
  TCA9548A(0);
  HMISerial10.print("t8.txt=\"");
  HMISerial10.print((bmp.readTemperature() * 1.8) + 32);
  HMISerial10.print("\"");
  HMISerial10.write(0xff);
  HMISerial10.write(0xff);
  HMISerial10.write(0xff);
  Serial.print("Inside Temp: ");
  Serial.println((bmp.readTemperature() * 1.8) + 32);

  TCA9548A(1);
  HMISerial10.print("t7.txt=\"");
  HMISerial10.print((bmp.readTemperature() * 1.8) + 32);
  HMISerial10.print("\"");
  HMISerial10.write(0xff);
  HMISerial10.write(0xff);
  HMISerial10.write(0xff);
  Serial.print("Outside Temp: ");
  Serial.println((bmp.readTemperature() * 1.8) + 32);
}

Вот он у меня ищет кнопку от Nextion

void dfd_listen() {


  delay(30);
  dfd = ""; //dfd означает данные с дисплея
  while (HMISerial5.available()) { // Это будет проверять, не поступило ли что-то от Nextion
    dfd += char(HMISerial5.read());
  }

  if (dfd.substring(1, 4) == "bt4" && dfd.substring(0, 1) == "0") {
    digitalWrite(R6, LOW);   // Крышные фонари
    HMISerial5.write(0xff);  // Мы всегда должны отправлять эти три строки после каждой команды, отправленной на дисплей nextion.
    HMISerial5.write(0xff);
    HMISerial5.write(0xff);
    Serial.println("Roof Lights OFF");
  } else if (dfd.substring(1, 4) == "bt4" && dfd.substring(0, 1) == "1") {
    digitalWrite(R6, LOW);   // Крышные фонари
    HMISerial5.write(0xff);  // Мы всегда должны отправлять эти три строки после каждой команды, отправленной на дисплей nextion.
    HMISerial5.write(0xff);
    HMISerial5.write(0xff);
    Serial.println("Roof Lights ON");
  }

  if (dfd.substring(1, 4) == "b17") {
    HMISerial5.print("page 1");
    HMISerial5.write(0xff);  // Мы всегда должны отправлять эти три строки после каждой команды, отправленной на дисплей nextion.
    HMISerial5.write(0xff);
    HMISerial5.write(0xff);
    Serial.println("Change to Page 1");
    dfd = "";
    delay(100);
  }

Теперь отображаются кнопки BT и B. HMISerial — это мои последовательные порты, к которым подключен Nextion. "dfd"; задается как строка перед вашей настройкой. Для кнопки Nextion вам просто нужно добавить значение и установить его в виде строки, в данном случае мое значение — va11. Затем на кнопку события нажатия вы бы поместили что-то вроде этого.

  if(bt4.val==1)
{
  cov bt4.val,va11.txt,1
  va11.txt+="bt4"
  print va11.txt
  t4.pco=17576
}else if(bt4.val==0)
{
  cov bt4.val,va11.txt,1
  va11.txt+="bt4"
  print va11.txt
  t4.pco=57033
}
,