Для управления переключением реле в 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);
}
Заранее спасибо.
@Abhishekh Aaron, 👍-2
Обсуждение3 ответа
Я считаю этот метод неэффективным. Потому что 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
Это мой обновленный код для отображения температуры и влажности на дисплее 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
Есть более простой способ вывести температуру на дисплей и вызвать кнопку 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
}
- Esp8266 Vin контакт
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Программаторы для этой платы отсутствуют - Программирование ESP32 Cam с помощью Ardunio IDE
- Установка значения float до двух знаков после запятой
- ESP32-CAM первый: 0x8 TG1WDT_SYS_RESET загрузочный цикл
- esp32 Stack canary watchpoint срабатывает
- Проверка размера во флэш-памяти Esp32
- Ошибка Cast from 'char*' to 'uint8_t {aka unsigned char}' loses precision [-fpermissive]
Что такое класс 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