Кнопка двойного состояния Nextion

У меня возникла проблема с моим дисплеем Nextion. Я загрузил следующий код через Arduino IDE на Arduino MEGA 2560.

Мой редактор Nextion показывает кнопку как ID: 9 на странице 0 с именем floor. Я не совсем уверен, что приведенный ниже код верен. У меня была одна проблема, из-за которой загрузка с ноутбука на Mega не завершалась, но мне удалось обойти эту проблему, отключив Nextion и заменив кабели RX и TX от Nextion во время загрузки. Не знаете, как еще я мог бы решить эту проблему? (Если у кого-нибудь есть какие-то идеи, ха-ха)

Все, что должно произойти, - это когда изменяется состояние с двумя кнопками, встроенный индикатор LED_BUILTIN устанавливается на ВЫСОКИЙ, а если он находится во втором состоянии, устанавливается на НИЗКИЙ.

код

#include "Nextion.h"


NexDSButton bt0 = NexDSButton(0, 9, "floor");


int ledPin = LED_BUILTIN;


char buffer[100] = {0};


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



void bt0PopCallback(void *ptr)
{
    uint32_t dual_state;
    NexDSButton *btn = (NexDSButton *)ptr;
    dbSerialPrintln("b0PopCallback");
    dbSerialPrint("ptr=");
    dbSerialPrintln((uint32_t)ptr); 
    memset(buffer, 0, sizeof(buffer));

    if(dual_state) 
    {
        digitalWrite(ledPin, HIGH);
    }
    else
    {
        digitalWrite(ledPin, LOW);
    }
}

void setup(void)
{    
    nexInit();

    bt0.attachPop(bt0PopCallback, &bt0);
    
    dbSerialPrintln("setup done"); 
    pinMode(ledPin, OUTPUT);
}

void loop(void)
{   
    nexLoop(nex_listen_list);
}

Моя проблема заключается в том, что MEGA идентифицирует событие касания (поскольку индикатор TX на MEGA мигает), однако он не включает встроенный встроенный светодиод MEGA.

Любая помощь будет очень признательна!

, 👍0

Обсуждение

Вы выбрали аппаратный последовательный порт для nexSerial? Вы видите текст "настройка завершена"? Вы видите текст "b0PopCallback"? Вы включили это событие в редакторе nextion? Пожалуйста, дополните свой первоначальный вопрос дополнительной информацией., @Jot

Я не делал никакого кодирования в редакторе Nextion, так как думал, что Arduino IDE обрабатывает все кодирование. Как бы я мог включить событие в Nextion?, @Anake.me

Признаю, что я загрузил этот код из образца скетча, предоставленного Nextion, однако я использовал ТОЛЬКО код и никогда не заглядывал в .Файл HMI. Я мог бы просмотреть это и попытаться понять, что вы имеете в виду, включив событие в Nextion :), @Anake.me

В обратном вызове, где он присваивает значение dual_state ?, @Delta_G


2 ответа


1

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

void b19PopCallback(void *ptr) //Вытяжной вентилятор
{
  NexButton *btn = (NexButton *)ptr;
  memset(buffer, 0, sizeof(buffer));
  btn->getText(buffer, sizeof(buffer));

  if (strcmp(buffer, "ON"))
  {
    //ВОЗВРАЩАЕТСЯ КАК FALSE (0), ЕСЛИ ОБЕ СТРОКИ СОВПАДАЮТ
    digitalWrite(b_motor, LOW);
    strcpy(buffer, "ON");
    btn->setText(buffer);
  }

  else 
  {
    digitalWrite(b_motor, HIGH);
    strcpy(buffer, "OFF");
    btn->setText(buffer);
  }  

}
,

strcmp не возвращает true или false, поэтому ваш комментарий о том, что он возвращает FALSE, если обе строки совпадают, немного вводит в заблуждение. См. [strcmp](http://www.cplusplus.com/reference/cstring/strcmp /) - strcmp предназначен для возврата числа < 0 if string1 is less than string2, 0 if they are the same, and >0, если string1 больше string2 (в последовательности сортировки)., @Nick Gammon

Независимо от ошибки в описании возвращаемого типа strcmp, я считаю, что это действительно то, чего не хватает OP. Код в OP никогда не проверяет строку и не присваивает любое значение dual_state ., @Delta_G


1

Вы можете попробовать использовать int ledPin=13 вместо led_builtin . Встроенный светодиод подключается 13-контактным разъемом. Большинство Arduino имеют встроенный светодиод, которым вы можете управлять. На UNO, MEGA и ZERO он подключается к цифровому контакту 13. Попробуй вот это.

#include "Nextion.h"
int ledPin = 13;
NexDSButton bt0 = NexDSButton(0, 1, "bt0");
uint32_t dual_state=0;

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

if(dual_state==1) //При нажатии кнопки двойного состояния dual_state =1
  {
    digitalWrite(ledPin, HIGH);
  }
  else if(dual_state==0)
  {
    digitalWrite(ledPin,LOW ); 
  }

}
,