Nextion Дисплеи

ProstoAlex
Offline
Зарегистрирован: 21.01.2015

буквально пару минут наткнулся на это, но споткнулся вот с чем:

запись типа page1.t3.text работает для объектов,

а для комманд должно быть что-то типа page 1.add s0,0,13

но тут как ни изгалялся, "подобрать" синтаксис не смог (

ProstoAlex
Offline
Зарегистрирован: 21.01.2015

похоже, это не бага, а фича:

http://support.iteadstudio.com/support/discussions/topics/11000008874/page/last

типа, мы тут еще в нашем дисплее что-то накрутили.

получился график. случайно. правда. пользоваться им нельзя - куча ограничений, выглядит убого, нужного почти ничего нет. но зато звучит круто.

Что-нибудь исправим. Потом. Может быть. Когда-нибудь. Если захотим. И если железо позволит.

 

в общем. весь дисплй у меня вызывает такое ощущение ( - идея супер, реалиация - на 3 с минусом.

- от команд их и описания, от реализации в железе, до техподдержки, посылающей в открытую.

за потраченное на изучение и борьбу время уже давным-давно нарисовал бы все силами Меги.

derill
Offline
Зарегистрирован: 07.05.2017

Проблемму с рускими шрифтами на TJC решил так:

Генерирую шрифт в Nextion Editor и загружаю его а USART Editor. И на китайском экране все отлично выводится на русском

Vanishing
Offline
Зарегистрирован: 26.01.2017

Добрый день.

Столкнулся с такой проблемой: чем больше код аруино тем больше потерь посылок от экрана в частности от кнопок в плоть до полной потери. Есть ли решение данной проблемы? Пользуюсь библиотекой nextion-master.

Каримов
Offline
Зарегистрирован: 24.05.2017

Привет ВСЕМ. Может кто подскажет:

 

В программе NEXTION пропало окно EVENT. И как его вытащить-не могу понять

 

d_tramp
Offline
Зарегистрирован: 15.05.2017

Всем привет!

Только начинаю все изучать и сразу уперся в проблему и не могу сдвинуться...

Есть Arduino Due и дисплейчик Nextion NX4832K035_011.

На дисплее создал 2 текстовых окна "t0" и "t1"

Из примеров взял датчик температуры DHT11.

Проверил его - работает, теперь хочу эти данные вывести на дисплей.

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

Помогите разобраться - "допилите" мне скетч, и главное, какую именно библиотеку использовать и где конткретно ее взять.

#include <DHT.h>

#define DHTPIN 2     // вывод, к которому подключается датчик
#define DHTTYPE DHT11   
 
DHT dht(DHTPIN, DHTTYPE);
    dht.begin();
 
void loop() {
 delay(1000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
//to.setText("h"); // как я понимаю, примерно такой надо вывести данные
//t1.setText("t"); // но не выводится...
}
 
СПАСИБО!!!
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

допиливать нечего, скетча нет.  очередной вопрос из разряда "сделайте за меня". 

alex_r61
alex_r61 аватар
Offline
Зарегистрирован: 20.06.2012

Результат надо преобразовать в строку и вывести как Text или разбить на целую и дробную части и вывести как  Number. А "допилить" это другая тема.

Seva1800
Offline
Зарегистрирован: 18.12.2015

Для того, чтобы не терять сообщения от дисплея, например, нажатия кнопок, вешайте его на аппаратный uart. И используйте функцию SerialEvent. В этом случае если с дисплея пришли данные программа перейдет в эту функцию. Там вы и обработаете, то что прислал вам дисплей. Не знаю будет ли работать с программным портом при использовании SoftwareSerial. Правда, я не пользуюсь библиотеками для nextion. Так что, тоже не подскажу как их увязать.
В принципе можно дисплей вешать и на программный порт. Там также используются прерывания, но тут есть вероятность, если какой то длинный заморгченный код, получить от дисплея еще сообщения и тогда в буфере соберутся несколько сообщений. Это тот случай когда используетсяв коде проверка типа if (Serial.aveliable > 0) и дальша читаете буфер.

ProstoAlex
Offline
Зарегистрирован: 21.01.2015

вот мой код, пользуйся: )

(у меня - зардваре сериал. считаю это это правильнее чем софт)

для отправки на дисплей:

void SendFFtoNextion() {
Serial2.write(0xff); 
Serial2.write(0xff);
Serial2.write(0xff);  }
 
// стартуем порт Nextion
Serial2.begin(9600); Serial2.print("baud=57600"); SendFFtoNextion(); Serial2.end(); // закрытие порта
Serial2.begin(57600); Serial2.print("baud=57600"); SendFFtoNextion();
 
------------ loop^
// отправляем температуру с датчика
Serial2.print("t0.txt="); Serial2.write(0x22); Serial2.print(round (DSTemp1/10)); Serial2.write(0x22); SendFFtoNextion();
// рисуем графики t
        Serial2.print("add 46,0,"); Serial2.print(round (DSTemp1 * 0.4)); SendFFtoNextion();

для приемки с диспоея

  // READ NEXTION PORT
 
  if (Serial2.available()){ //Is data coming through the serial from the Nextion?
    
    inBytes[numMessages] = Serial2.read();
    delay (01);
    numMessages = numMessages + 1;
    } else    { //port is empty
     
   // 113 30 0 0 0 255 255 255 - прислали температуру для котла: SetTemp
        if ( inBytes[0] == 113 && inBytes[2] == 0 && inBytes[3] == 0 && inBytes[4] == 0 && inBytes[5] == 255 && inBytes[6] == 255 && inBytes[7] == 255 ) {
      // NEXTION CHANGED TEMP!!!!!!!!!!!!!!!!!!!!!!!!!!
      SetTemp = inBytes[1];
      Serial.print("SetTemp="); Serial.println(SetTemp);
      tone(45,4800,1500);
      Serial.print("inBytes="); for (i = 0; i < 8; i = i + 1) { Serial.print(inBytes[i]); } Serial.println();
      }
 
d_tramp
Offline
Зарегистрирован: 15.05.2017

ProstoAlex! Спасибо за помощь!

Ожидаемо не компиллится!

Я могу как-то напрямую связаться с тобой?

Мне просто надо хотя бы одну температуру вывести на экран, чтобя Я ПОНЯЛ как это делается. :))))

дальше буду сам. 

напиши мне пустое письмо d_tramp@mail.ru

Skype: d_tramp

Один этот пример разберем, больше беспокоить не буду.

Спасибо. Жду! :)

ProstoAlex
Offline
Зарегистрирован: 21.01.2015

Привет!

а что не компилится?

навскидку - надо переменные указать.

 

письмо не уходит - адрес недоступен

d_tramp
Offline
Зарегистрирован: 15.05.2017
Вот очень просто пример:
 
#include <Wire.h>
#include <SoftwareSerial.h>
#include <Nextion.h>
 
SoftwareSerial nextion(2, 3);// Nextion TX to pin 2 and RX to pin 3 of Arduino
Nextion myNextion(nextion, 9600); //create a Nextion object named myNextion using the nextion serial port 
    int t=10;
 
void setup() 
  {
    Serial.begin(9600);
    myNextion.init();
 
  }
void loop() 
{
 
//выводим значения напряжения в текстовое поле t3
    myNextion.setComponentText("t3", String(t)); 
    delay(100);
  }
 
Но не компилируется:
Arduino: 1.8.2 (Windows 7), Плата:"Arduino Due (Programming Port)"
 
sketch\UpdateText.ino.cpp.o: In function `__static_initialization_and_destruction_0':
 
5: undefined reference to `SoftwareSerial::SoftwareSerial(unsigned char, unsigned char, bool)'
 
6: undefined reference to `SoftwareSerial::~SoftwareSerial()'
 
libraries\nextion-master\Nextion.cpp.o: In function `Nextion::Nextion(SoftwareSerial&, unsigned long)':
 
42: undefined reference to `SoftwareSerial::begin(long)'
 
collect2.exe: error: ld returned 1 exit status
 
exit status 1
Ошибка компиляции для платы Arduino Due (Programming Port).

 

Barmaley67
Offline
Зарегистрирован: 25.12.2015

Здравствуйте.

Вот решил немного с данным дисплеем заняться. С библиотекой связываться не хочу, не планирую использовать с Arduino (ПИКи как-то ближе), решил разобраться посылая команды с терминалки (использую Putty). Ответ от ЖКИ приходит, а вот отправить команду на него не могу, на нажатия клавиш клавиатуры вообще не реагирует, остается черное поле. Может есть какой-то нюанс? Буду благодарен за пинок в нужном направлении.

P.S. В эмуляторе Nextion Editor устройство (Nextion Device) подключается и команды вводятся без проблем.

Каримов
Offline
Зарегистрирован: 24.05.2017

без трех FF в конце команды NEXTION не поймет.

Barmaley67
Offline
Зарегистрирован: 25.12.2015

Каримов пишет:

без трех FF в конце команды NEXTION не поймет.

так в том то и дело, что вообще ничего написать нельзя. Просто как будто клавиатура не подключена. Нажимаешь любую клавишу и ничего. Прием данных с дисплея идет. Хотя в Nextion Editor'е в режиме отладчика дисплей подключается, команды вводятся и отрабатываются дисплеем. Если ввести неправильную команду, то с дисплея приходит 0х00 0xff 0xff 0xff. Никаких вопросов, все как и должно быть. Просто мне удобнее с Putty работать. Вот и спрашиваю, может где в настройках Putty какой-нибудь пункт надо отметить/включить.

alex_r61
alex_r61 аватар
Offline
Зарегистрирован: 20.06.2012

В «Terminal 1.9b» создаёте макросы и отправляете их. Ещё удобнее в Proteus, без железа всё можно отлаживать.

Barmaley67
Offline
Зарегистрирован: 25.12.2015

alex_r61 пишет:

В «Terminal 1.9b» создаёте макросы и отправляете их.

а можно пример макроса? Например переключение на страницу 1. Пробовал и так

page 1 0xff 0xff 0xff

и так

page 1 0xFF 0xFF 0xFF

и без пробелов между  0xFF, никакой реакции...

alex_r61
alex_r61 аватар
Offline
Зарегистрирован: 20.06.2012
page 1$ff$ff$ff

 

Barmaley67
Offline
Зарегистрирован: 25.12.2015

alex_r61 пишет:

page 1$ff$ff$ff

а ведь я пробовал похоже, только я все символы заменял на их коды. Да еще подумал что то что отправляется со строки "SEND" аналогично отправленному с ""SEND MACRO". Попробовал Ваш пример сначала просто как "ОТПРАВИТЬ" - не работает. Пробую с макроса - не работает, но приходит ответ неправильный ID страницы. Нажимаю еще раз... страница переключилась. Вытираю поле отправленного и страница переключилась как положено с первого раза.

Спасибо огромное. Теперь можно разбираться дальше.

Barmaley67
Offline
Зарегистрирован: 25.12.2015

Немного поигрался. Коду 0xFF в таблице Win-1251 соответствует буква "я". Попробовал набрать "page 1яяя" в строке "SEND", все прекрасно сработало. Проверил на нескольких других командах - работает.

stambylov
stambylov аватар
Offline
Зарегистрирован: 10.05.2012

d_tramp пишет:

Всем привет!

Только начинаю все изучать и сразу уперся в проблему и не могу сдвинуться...

Есть Arduino Due и дисплейчик Nextion NX4832K035_011.

На дисплее создал 2 текстовых окна "t0" и "t1"

Из примеров взял датчик температуры DHT11.

Проверил его - работает, теперь хочу эти данные вывести на дисплей.

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

Помогите разобраться - "допилите" мне скетч, и главное, какую именно библиотеку использовать и где конткретно ее взять.

#include <DHT.h>

#define DHTPIN 2     // вывод, к которому подключается датчик
#define DHTTYPE DHT11   
 
DHT dht(DHTPIN, DHTTYPE);
    dht.begin();
 
void loop() {
 delay(1000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
//to.setText("h"); // как я понимаю, примерно такой надо вывести данные
//t1.setText("t"); // но не выводится...
}
 
СПАСИБО!!!

Вот сделал небольшой урок для тебя и всех, кто пока незнает как работает отправка данных на Nextion

// Arduino Mega
// Разработал stambylov@ya.ru для новичков

#include <DHT.h>        // Объявление библиотеки для датчиков температуры-влажности (DHT 21 (AM2301))

// Состав компонентов
#define TE1 11          // Датчик температуры и влажности
//ПОдключение Nextion к Arduino Mega (используем порт №2 для Serial, т.к. порт №1 может понадобится для наладки программы)
//Nextion     Arduino
// tx           rx(pin19)
// rx           tx(pin18)

// Объявление датчиков температуры
#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht1(TE1, DHTTYPE);

// Объявление Переменных
float h = 0;
float t = 0;
String Temperature1 = ""; // переменная, хранящая температуру до десятых
String Humidity1 = "";    // переменная, хранящая влажность

String temp = ""; // переменная, хранящая все что угодно

void setup()
{
  // Датчики температуры и влажности, Стартуем!
  dht1.begin();
}


void loop() {
  Serial1.begin(9600);  // Открываем порт Сериал для Nextion
  SendDatchik();        // переходим в функцию отправки данных
  delay(5000);          // Ждем 5 секунд
}


// Отправка данных на Nextion
void SendDatchik()
{
  // Читаем данные с датчика
  h = dht1.readHumidity();    //читаем влажность с датчика
  t = dht1.readTemperature(); //читаем температуру с датчика
  if (isnan(t) || isnan(h)) { //если данные не получили с датчика, то
      Temperature1 = "Err!";  // Если вдруг датчик вышел из строя, то пишем в перемунную Ошибку
      Humidity1 = "Err!";     // Если вдруг датчик вышел из строя, то пишем в перемунную Ошибку
  } else {                    // если получили данные с датчика, то
    temp = t;                 //Передаем данные температуры из формата float(переменная t) в формат String(переменная temp)
    Temperature1 = temp[0];   //Передаем переменной Temperature1 по байтам значение 0 из переменной temp
    Temperature1 += temp[1];  //Добавляем переменной Temperature1 по байтам значение 1 из переменной temp
    Temperature1 += temp[2];  //Добавляем переменной Temperature1 по байтам значение 2 из переменной temp (это точка)
    Temperature1 += temp[3];  //Добавляем переменной Temperature1 по байтам значение 3 из переменной temp
    Temperature1 += "'C ";    //Добавляем переменной Temperature1 символ температуры
    temp = h;                 //Передаем данные влажности из из формата float(переменная t) в формат String(переменная temp)
    Humidity1 = temp[0];      //Передаем переменной Humidity1 по байтам значение 0 из переменной temp
    Humidity1 += temp[1];     //Добавляем переменной Humidity1 по байтам значение 1 из переменной temp
    Humidity1 += "%";         //Добавляем переменной Humidity1 символ влажности
  }
  // Все другие символы обязательны(такие как \ )
  SendData("page1.t0.txt", "\"" + Temperature1 + "\""); //Передаем данные для отправки на Nextion в функцию SendData
  SendData("page1.t1.txt", "\"" + Humidity1 + "\"");    //Передаем данные для отправки на Nextion в функцию SendData
  Temperature1 = "";          // Очищаем переменную
  Humidity1 = "";             // Очищаем переменную
  temp = "";                  // Очищаем переменную
}

// отправка на Nextion (номер экрана, название переменной) + данные
void SendData(String dev, String data)
{
  Serial1.print(dev);   // Отправляем данные dev(номер экрана, название переменной) на Nextion
  Serial1.print("=");   // Отправляем данные =(знак равно, далее передаем сами данные) на Nextion 
  Serial1.print(data);  // Отправляем данные data(данные) на Nextion
  Serial1.write(0xff);  // Отправляем данные 0xff(значение показывающее Nextion конец передачи) на Nextion
  Serial1.write(0xff);  // Отправляем данные 0xff(значение показывающее Nextion конец передачи) на Nextion
  Serial1.write(0xff);  // Отправляем данные 0xff(значение показывающее Nextion конец передачи) на Nextion
  dev = "";    // Очищаем переменную
  data = "";   // Очищаем переменную
}

 

alex_r61
alex_r61 аватар
Offline
Зарегистрирован: 20.06.2012

Отправку FF лучше выделить в отдельную процедуру.

void Nextion::sendFFF()
{
  Serial.write(0xFF);
  Serial.write(0xFF);
  Serial.write(0xFF);
}

И всю работу с Nextion в отдельную библиотеку.

d_tramp
Offline
Зарегистрирован: 15.05.2017

Вот бы еще с часами разобраться от этого дисплея... Я то я так и использую внешний DS3231.

Кто пробовал с часами разбираться?

alex_r61
alex_r61 аватар
Offline
Зарегистрирован: 20.06.2012

А чего там разбираться, батарейку вставил и всё. Обращаться к rtc0 to rtc6. В Nextion Instruction Set всё есть.

stambylov
stambylov аватар
Offline
Зарегистрирован: 10.05.2012

d_tramp пишет:

Вот бы еще с часами разобраться от этого дисплея... Я то я так и использую внешний DS3231.

Кто пробовал с часами разбираться?

Вот код для новичков, у кого дисплей не имеет встроенные часы реального времени

// Arduino Mega + Nextion + DS3231
// Отправка данных времени, даты и номера недели на дисплей, если дисплей не имеет встроенные часы
// Разработал stambylov@ya.ru для новичков


//Библиотеки
#include <DS3231.h> //часы реального времени

// Объявление часов реального времени
// Часы SCL - SCL Arduino mega pin 21
// Часы SDA - SDA Arduino mega pin 20
DS3231  rtc(SDA, SCL);

//ПОдключение Nextion к Arduino Mega (используем порт №2 для Serial, т.к. порт №1 может понадобится для наладки программы)
//Nextion     Arduino
// tx           rx(pin19)
// rx           tx(pin18)

// Объявление Переменных
// переменные для хранения даты и времени
String DateRTC = "";
String TimeRTC = "";
String WeekRTC = "";


// переменные для отправки времени, даты и номера дня на дисплей
unsigned long currentMillisReadTime = 0;  //время в милисекундах настоящее
unsigned long previousMillisReadTime = 0; //время в милисекундах сохраненное из настоящего
unsigned long IntervalReadTime = 50000;   //время через которое выполняем функцию

void setup() {
  Serial1.begin(9600);   // Сериал для Nextion
  rtc.begin();           // Инициализация часов реального времени
}

void loop() {
  // Отправка времени на Nextion каждые 5 секунд
    currentMillisReadTime = millis(); //присваиваем время переменной
    if(currentMillisReadTime - previousMillisReadTime > IntervalReadTime) { // если время - сохраненное время > заданного времени
      previousMillisReadTime = currentMillisReadTime;     //присваеваем настоящее время сохраненному
      DateRTC = "\"" + String(rtc.getDateStr()) + "\"";   //формтруем сообщение для отправки на Nextion даты
      TimeRTC = "\"" + String(rtc.getTimeStr()) + "\"";   //формтруем сообщение для отправки на Nextion времени
      WeekRTC = "\"" + String(rtc.getDOWStr()) + "\"";    //формтруем сообщение для отправки на Nextion дня недели
      //Отправка на дисплей
      SendData("page0.Date.txt", DateRTC);      //на странице 0 Nextion создаем текстовое поле с названием Date
      SendData("page0.Time.txt", TimeRTC);      //на странице 0 Nextion создаем текстовое поле с названием Time
      SendData("page0.Week.txt", WeekRTC);  //на странице 0 Nextion создаем текстовое поле с названием Week
    }

}

// отправка на Nextion (номер экрана, название переменной) + данные
void SendData(String dev, String data)
{
  Serial1.print(dev);   // Отправляем данные dev(номер экрана, название переменной) на Nextion
  Serial1.print("=");   // Отправляем данные =(знак равно, далее передаем сами данные) на Nextion 
  Serial1.print(data);  // Отправляем данные data(данные) на Nextion
  Serial1.write(0xff);  // Отправляем данные 0xff(значение показывающее Nextion конец передачи) на Nextion
  Serial1.write(0xff);  // Отправляем данные 0xff(значение показывающее Nextion конец передачи) на Nextion
  Serial1.write(0xff);  // Отправляем данные 0xff(значение показывающее Nextion конец передачи) на Nextion
  dev = "";             // Очищаем переменную
  data = "";            // Очищаем переменную
}

 

alex_r61
alex_r61 аватар
Offline
Зарегистрирован: 20.06.2012

В Enhanced всё куда проще. Создаём переменные Number для часов и даты. Запускаем таймер на 1000мс и в его событии пишем:

n0.val=rtc3
n1.val=rtc4
n2.val=rtc5
n3.val=rtc2
n4.val=rtc1
n5.val=rtc0

И выкидываем DS3231.

d_tramp
Offline
Зарегистрирован: 15.05.2017

хм... не так все просто получается...

отправляю

get rtc0

получаю типа

0x71 0xE1 0x07 0x00 0x00 0xFF 0xFF 0xFF

как мне это конвертировать в значение, чтобы на экран отправить?

int n6.val=rtc6; // week 0-6 (Sun-Sat)
int n5.val=rtc5; // Second 0-59
int n4.val=rtc4; // Minute 0-59
int n3.val=rtc3; // Hour 0-23
int n2.val=rtc2; // Day 1-31
int n1.val=rtc1; // month 1-12
int n0.val=rtc0; // Year
get rtc0;
get rtc1;
get rtc2;
get rtc3;
get rtc4;
get rtc5;
get rtc6;
 
Serial3.print ("t7.txt="); Serial3.write(0x22); Serial3.print (n3.val); Serial3.write(0x22); Serial3.write(0xff); Serial3.write(0xff); Serial3.write(0xff);
 
Кто подскажет как это дописать?
СПАСИБО!!!
alex_r61
alex_r61 аватар
Offline
Зарегистрирован: 20.06.2012

Не совсем понял. Получить время с Nextion и отправить его опять в Nextion?

d_tramp
Offline
Зарегистрирован: 15.05.2017

Alex! привет! я может еще не понял логику, но Ардуине надо же тоже время знать, чтобы работать с расписаниями. Значит с дисплея врмя надо запросить. А вот отдавать дисплею может и не надо, он сам у себя его забрать может. 

Я не правильно понимаю?

alex_r61
alex_r61 аватар
Offline
Зарегистрирован: 20.06.2012

Дисплей, особенно расширенная версия, может многие функции взять на себя. МК, когда ему нужно, может запрашивать необходимые данные у дисплея, в том числе и время. Ещё дисплей может сам инициировать передачу, например при касании экрана. Т.е. они работают параллельно, иногда обмениваясь данными, получается асинхронный обмен. Решить проблему удалось переведя обмен на прерывания.

d_tramp
Offline
Зарегистрирован: 15.05.2017

Это как раз я понимаю, ты помоги с запросом времени у дисплея, я привел кусок кода. Как допилить его, чтобы Arduino время знала. причем в понятном формате. Как ответ от дисплея в нормальный види перевести? :)

alex_r61
alex_r61 аватар
Offline
Зарегистрирован: 20.06.2012

По запросу get rtc'x' приходит нужный результат из 4х байт, я беру младший и загоняю в буфер часов и даты(uint8_t TimeDateBuf[7];).  Просто при первом включении или смены батарейки надо выставить правильные значения. 7E1 это 2017 год, здесь надо брать два байта, так что работает.

d_tramp
Offline
Зарегистрирован: 15.05.2017

Я понял тебя... буду дальше по DS3231 время получать :)