Чтение данных с nextion дисплея

artcorer

✩✩✩✩✩✩✩
31 Окт 2019
11
0
Здравствуйте. Пытаюсь получить данные Nextion > ESP32. Как отправлять данные на дисплей я понял, всё работает. Но вот получить событие нажатой клавиши на дисплее — нет. Не работает именно вот этот кусок кода:
C++:
  String message = myNextion.listen(); //check for message
  if(message == "66 00 FF FF FF "){ // if a message is received...
    setupWiFi();
    myNextion.setComponentText("page1.t0", "Test");
Код полностью:
C++:
#include <Arduino.h>
#include <WiFi.h>
#include "time.h"
#include <iarduino_RTC.h>
#include <SoftwareSerial.h>
#include <Nextion.h>

SoftwareSerial nextion(17, 16);
iarduino_RTC watch(RTC_DS3231);
Nextion myNextion(nextion, 9600);

char* ssid     = "ds-4535";
char* password = "577544tr";
char servername[]="ntppool.org";
char* ntpServer = "de.pool.ntp.org";
long  gmtOffset_sec = 7200;
int   daylightOffset_sec = 3600;
int second, minute, hour, day, month, year, weekday, rem2;
String rem;
long current;
struct tm timeinfo;
uint32_t myTimer1, myTimer2;

WiFiClient client;

void setupWiFi() {
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);
  Serial.println();
  Serial.print("Подключение к WiFi..");
  myNextion.setComponentText("page1.connectwifi", "Connecting to WiFi...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
    if (millis() - myTimer1 >= 10000) {
        Serial.println(".");
        Serial.println("Попытка подключения к WiFi не удалась");
        myNextion.setComponentText("page1.connectwifi", "Connecting to WiFi error");
        myTimer1 = millis();
        WiFi.disconnect();
        Serial.println("Отключение от WiFi");
        myNextion.setComponentText("page1.connectwifi1", "WiFi to disconnected");
        break;
    } else {
      if (WiFi.status() == WL_CONNECTED) {
        if (client.connect(servername, 80)) {
          Serial.println(".подключено!");
          myNextion.setComponentText("page1.connectwifi1", ".connected!");
          Serial.println("Соединение с интернетом установленно");
          myNextion.setComponentText("page1.connectwifi2", "Internet connected");
          Serial.print("Хост: ");
          Serial.println(servername);
          myNextion.setComponentText("page1.connectwifi3", servername);
          Serial.println("IP address: ");
          Serial.println(WiFi.localIP());
          int LIP = WiFi.localIP();
          myNextion.setComponentText("page1.connectwifi4", String (LIP));
        } else {
           Serial.println(".");
           Serial.println("Соединение с WiFi установленно, но");
           Serial.println("отсутствует соединение с интернетом");
           myNextion.setComponentText("page1.connectwifi1", "WiFi connected but not Internet");
           WiFi.disconnect();
           Serial.println("Отключение от WiFi");
           myNextion.setComponentText("page1.connectwifi2", "WiFi to disconnected");
           break;
        }
      }
    }
  }
}

void timeSync() {
  if (client.connect(servername, 80)) {
    getLocalTime(&timeinfo);
    second = timeinfo.tm_sec;
    minute = timeinfo.tm_min;
    hour = timeinfo.tm_hour;
    day = timeinfo.tm_mday;
    month = timeinfo.tm_mon + 1;
    year = timeinfo.tm_year + 1900;
    rem = year;
    rem.remove(0, 1);
    rem2 = rem.toInt();
    watch.settime(second, minute, hour, day, month, rem2);
    Serial.println("Время синхронизированно");
    Serial.print("Сервер синхронизации: ");
    Serial.println(ntpServer);
  } else {
    Serial.println("Ошибка получения данных с интернета");
    Serial.println("Запись времени не была произведена");
  }

}

void setup() {
   Serial.begin(115200);
   setupWiFi();
   myNextion.init();
   configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
   watch.begin();
   timeSync();
}

void loop() {
  if (client.connect(servername, 80)) {
      getLocalTime(&timeinfo);
      second = timeinfo.tm_sec;
      minute = timeinfo.tm_min;
       hour = timeinfo.tm_hour;
      day = timeinfo.tm_mday;
      month = timeinfo.tm_mon + 1;
      year = timeinfo.tm_year + 1900;
      weekday = timeinfo.tm_wday + 8;
      Serial.print("Синхронизированное время:   ");
      Serial.print(day);
      Serial.print("/");
      Serial.print(month);
      Serial.print("/");
      Serial.print(year);
      Serial.print(" --- ");
      Serial.print(hour);
      Serial.print(":");
      Serial.print(minute);
      Serial.print(":");
      Serial.println(second);
  } else {
      Serial.println("Время не синхронизированно");
  }
  Serial.print("Записанное время:           ");
  Serial.println(watch.gettime("d/m/Y, H:i:s"));
  myNextion.setComponentText("time", watch.gettime("H:i:s"));
  myNextion.setComponentText("date", watch.gettime("d/m/Y"));


  String message = myNextion.listen(); //check for message
  if(message == "66 00 FF FF FF "){ // if a message is received...
    setupWiFi();
    myNextion.setComponentText("page1.t0", "Test");
  }

  delay(800);                                 
}
Может кто сталкивался с проблемой? Прикрепляю используемую библиотеку.
 

Вложения

b707

★✩✩✩✩✩✩
4 Июн 2020
54
18
Здравствуйте. Пытаюсь получить данные Nextion > ESP32. Как отправлять данные на дисплей я понял, всё работает. Но вот получить событие нажатой клавиши на дисплее — нет. Не работает именно вот этот кусок кода:
C++:
  String message = myNextion.listen(); //check for message
  if(message == "66 00 FF FF FF "){ // if a message is received...
    setupWiFi();
    myNextion.setComponentText("page1.t0", "Test");
а вы в библиотеку заглядывали? в вашей библиотеке метод listen() не возвращает строчек типа "66 00 FF FF FF ", он их сначала преобразовывает в зависимости от типа сообщкения, например в случае нажатия кнопки он возвращает только номер кнопки. то есть вместо "66 00 FF FF FF " на выходе у вас будет только "0" и ничего больше

Смотрите исходный код метода listen() в файле Nextion.cpp.
 

delin

✩✩✩✩✩✩✩
22 Дек 2024
3
0
Товарищи! Прошу помощи.
Отправляю с дисплея
C++:
print "spup"
prints x0.val,0
Получаю значение x0.val по признаку "spup" на ардуино
C++:
if (nDisp.available()){
char inc;
int t1;
int setp = 0;
char test;
int temp1;
  for (int i = 0; i < 4; i++){
    inc = nDisp.read();
    str += inc;
    
        Serial.print("param:"); // для отладки
        Serial.println(str); //для отладки
    if (str=="spup"){
      Serial.println("VSE OKAY");
      for (int i = 0; i < 4; i++){
      t1 =  nDisp.read();
      data += t1;
    Serial.print("temperature=");
      Serial.print(data[0], HEX);
      Serial.print(", ");
      Serial.print(data[1], HEX);
      Serial.print(", ");
      Serial.print(data[2], HEX);
      Serial.print(", ");
      Serial.print(data[3], HEX);
      Serial.print(", ");
      Serial.print(data[4], HEX);
      Serial.print(", ");
      Serial.println(data[5], HEX);
      }
      Serial.print("data=");
      Serial.println(data);
     }
    }
     str = "";
    data = "";
}
На выходе получаю следующее при значении переменной x.0 = 230:
param:spup

VSE OKAY

temperature=32, 33, 30, 0, 0, 0

temperature=32, 33, 30, 30, 0, 0

temperature=32, 33, 30, 30, 30, 0

temperature=32, 33, 30, 30, 30, 30

data=230000
//
Но если значение переменной больше 255 (в случае примера, значение x0.val = 273, то получаю на выходе ерунду:
param:spup

VSE OKAY

temperature=31, 37, 0, 0, 0, 0

temperature=31, 37, 31, 0, 0, 0

temperature=31, 37, 31, 30, 0, 0

temperature=31, 37, 31, 30, 30, 0

data=17100

Подскажите пожалуйста куда копать.
 

Zuker

★✩✩✩✩✩✩
10 Янв 2024
61
12
У вас происходит переполнение байта (255). Вам нужно пересматривать свой алгоритм сбора Serial.
Попробуйте собирать t1 в строку, а затем конвертируйте в toInt()
 
Изменено:

delin

✩✩✩✩✩✩✩
22 Дек 2024
3
0
Если я правильно понимаю, то я так и делаю, ведь str и data это String (извиняюсь, не указал это в исходном вопросе). Если ошибаюсь, приведите пожалуйста пример кода
 

Zuker

★✩✩✩✩✩✩
10 Янв 2024
61
12
Попробуйте отправлять с дисплея, конвертируя число в строку. Для этого создайте на страничке Nextion переменную типа строка convStr
C++:
print "spup"
covx x0.val,convStr.txt,0,0
print convStr.txt
 

delin

✩✩✩✩✩✩✩
22 Дек 2024
3
0
У вас происходит переполнение байта (255). Вам нужно пересматривать свой алгоритм сбора Serial.
Попробуйте собирать t1 в строку, а затем конвертируйте в toInt()
Спасибо! Навели на правильную мысль.
Выше из ситуации так:
C++:
if (str=="spup"){ //ПРИЕМ УСТАВКИ
      Serial.println("VSE OKAY");
      int r_spup = 0;
    r_spup += (int(nDisp.read()) << 0);
    r_spup += (int(nDisp.read()) << 8);
      spup = r_spup;
      Serial.print("spup1=");
      Serial.println(spup);
      }
 

Zuker

★✩✩✩✩✩✩
10 Янв 2024
61
12
У меня в проекте используется Arduino Mega Pro. На память пофиг, все построено на разборе строки, без использования библиотек. Любое кол-во данных передаю через запятую (до 20).

C++:
//Nextion
//отправляем данные на Arduino ("n1.val" конвертируем в объект-строку "valConvStr")
print "cmd,"
covx n1.val,valConvStr.txt,0,0
print valConvStr.txt
printh 0d 0a
C++:
//слушаем
void nextion_serialListen() {
    if (Serial1.available()) {
        char inc = Serial1.read();
        static String displayStr = "";
        displayStr += inc;
        if (inc == 0x0A) { //конец команды
            nextion_serialListenResponse(displayStr); //разбираем данные
            displayStr = "";
        }
    }
}

//разбираем данные
void nextion_serialListenResponse(String displayStr) {

    static byte bufferArrayCount; //разбор полученной строки
    static String bufferArray[20]; //разбор полученной строки
    bufferArrayCount = 0;

    //разбиваем строку в буферный массив (перечисление через запятую)
    while(displayStr.length() > 0) {
        byte index = displayStr.indexOf(',');
        if (index == -1) {
            bufferArray[bufferArrayCount++] = displayStr;
            break;
        }
        else {
            bufferArray[bufferArrayCount++] = displayStr.substring(0, index);
            displayStr = displayStr.substring(index+1);
        }
    }
    bufferArrayCount = 0;

    ///////
    //ЗАПРОС: ВЫПОЛНИТЬ ТЕСТОВУЮ КОМАНДУ
    ///////

    if ((bufferArray[0].indexOf(F("cmd")) >= 0)) {

        if (bufferArray[1].toInt() == 1) {  } //n1.val

    }
}