Nextion и "кодоводство" в ней

Добавляем панель кодами(програмками/скриптами)

Использование дисплеев и обсуждение пользовательских блоков к ним
Ответить
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Nextion и "кодоводство" в ней

#1

Сообщение Sancho » 09.01.2019{, 16:49}

Данная тема - чисто экспериментальная, не претендующая на учебно-справочный материал.
Вот хорошая тема с вопросами и ответами.
Недавно мне на пробу SSSergeich дал поиграться 3,5 Nextion.
До этого я вообще никогда Nextion не занимался. Совсем.
Всё началось с того, что у него в проекте много кнопок, и как следствие - куча переменных от них.
Начали уменьшать - вместо 24 получилась одна :) но появился код в панели. Не мало.
СпойлерПоказать
Panel_test_v1_04.flp
(77.57 КБ) 87 скачиваний
bool_byte_v10_01.HMI
Много кода, универсален.
(3.36 МБ) 95 скачиваний
Для теста используется переменная va0, id - уточняйте в каждом конкретном проекте...
Это самая, одна из самых, больших засад - привязка в проекте. И имя, и id, и страница...
Далее.
Для нормального приёма в версиях 4.2.3 и ниже(дальше не знаю что будет), необходимо немного пролечить полученный код в Ардуино IDE
СпойлерПоказать
Sancho писал(а):
06.01.2019{, 11:49}
Нашёл существенную ошибку в блоке приёма с панели Nextion числовых данных:
При отключении связи с панелью переменная сбрасывается в 0, при соединении - восстанавливается.
Ошибка здесь:
if(_nextionTempLissen.code = 'q') {_nextionGetValue1_outputValue = _nextionTempLissen.number;};
Необходимо:
if(_nextionTempLissen.code == 'q') {_nextionGetValue1_outputValue = _nextionTempLissen.number;};
if(_nextionTempLissen.code == 'q') {_nextionGetValue1_outputValue = _nextionTempLissen.number;};
и,
Найти строку в IDE, внизу программы,
temp.number = (cmd[4] << 24) | (cmd[3] << 16) | (cmd[2] << 8) | (cmd[1]);
Заменить на
temp.number = uint32_t(cmd[4]) << 24 | uint32_t(cmd[3]) << 16 | uint32_t(cmd[2]) << 8 | uint32_t(cmd[1]);
описано здесь

Отправлено спустя 16 минут 55 секунд:
Далее стало интересно, а как уменьшить ещё.
Вариант next, который требует одного - у всех кнопок id друг за другом, подряд.
Переменная та-же, va0, id другой...
Короче, простым языком -
Сначала делаем коцепцию проекта.
Далее, с чистого листа стараемся сделать всё по очереди, id подряд - сначала кнопки, потом индикацию, потом ....
После этого делаем проект в flprog.
Изменим какой-нибудь элемент в nextion, удалим/восстановим - порядок id нарушается :(
Ок, версия супер лайт :)
СпойлерПоказать
Test_v01_05.HMI
(56.3 КБ) 87 скачиваний
Кнопок всего 31, так как 32 влияет на знак числа и editor матерится :)
На очереди - отправка в панель статусов. Как Вы догадались, "пакетом" :)
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

SSSergeich
Капитан
Сообщения: 708
Зарегистрирован: 06.02.2016{, 11:01}
Репутация: 37
Откуда: Ярославль
Имя: Сергей

Nextion и "кодоводство" в ней

#2

Сообщение SSSergeich » 09.01.2019{, 23:22}

Sancho писал(а):
09.01.2019{, 17:06}
Ок, версия супер лайт :)
СпойлерПоказать
Кнопок всего 31, так как 32 влияет на знак числа и editor матерится :)
Теперь еще нужно открывать рубрику, аля дискавери "как это работает" :smile171: :shok:
А то из серии "смотрю в книгу - вижу фигу" )) Вижу что работает и замечательно работает, а вот как.... :smile469:

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Nextion и "кодоводство" в ней

#3

Сообщение Sancho » 10.01.2019{, 12:14}

SSSergeich писал(а):
09.01.2019{, 23:22}
Теперь еще нужно открывать рубрику, аля дискавери "как это работает"
Ок, о сути.
В первом, большом варианте, универсальном:
Несколько таймеров, выполняющихся периодически tm1, 2, 3 c одинаковыми, почти, кодами:
СпойлерПоказать

Код: Выделить всё

sys0=0 // берём системную переменную, которую не нужно объявлять, обнуляем.
if(bt0.val==1) // если нужная кнопка в 1
{
  sys0|=1 // заносим в правый, нулевой, Bit0, младший бит 1 посредством побитового ИЛИ
}
if(bt3.val==1) // если нужная кнопка в 1
{
  sys0|=2  // заносим Bit1 1 посредством побитового ИЛИ, т.е. 2 = 00000010
}
if(bt6.val==1)  // и так далее
{
  sys0|=4
}
if(bt9.val==1)
{
  sys0|=8
}
if(bt12.val==1)
{
  sys0|=16
}
if(bt15.val==1)
{
  sys0|=32
}
if(bt18.val==1)
{
  sys0|=64
}
if(bt21.val==1) // если 1 то
{
  sys0|=128 // заносим в Bit7 1 c помощью побитового ИЛИ, т.е. 128 = 10000000
}
va1.val=sys0 // присваиваем переменной чего получилось
Тоже проводим и для других кнопок в tm2 и tm3
Далее собираем, в данном случае 3, байты в long в таймере tm0
Процесс, порядок выполнения, приоритеты команд - это нечто!!!

Код: Выделить всё

sys1=va3.val<<8 // берём одну переменную, присваиваем, сдвигаем влево на восемь бит
sys1|=va2.val<<8 // сначала побитовое ИЛИ, а потом!!!! сдвигаем на восемь
sys1|=va1.val // просто побитовое ИЛИ
n1.val=sys1  // отправим на индикатор
va0.val=sys1  // присвоим переменной, которую считаем
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

Nextion и "кодоводство" в ней

#4

Сообщение Max » 13.01.2019{, 21:28}

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

SSSergeich
Капитан
Сообщения: 708
Зарегистрирован: 06.02.2016{, 11:01}
Репутация: 37
Откуда: Ярославль
Имя: Сергей

Nextion и "кодоводство" в ней

#5

Сообщение SSSergeich » 13.01.2019{, 21:35}

Max писал(а):
13.01.2019{, 21:28}
Подскажите, как можно передать значение одной глобальной переменной с одной страницы в текстовое поле на другой странице?
Как я понимаю, можно через системную переменную.

А можно через передачу значения от переменной к переменной
Я передаю так:
Прописываю на второй странице, во вкладке "выполнить перед инициализацией"
page1.bt0.val=page0.bt0.val - присвоить переменной bt0.val страницы 1 значение переменной bt0.val со страницы 0

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Nextion и "кодоводство" в ней

#6

Сообщение Sancho » 14.01.2019{, 09:32}

Max, Если обе текстовые - если нет ни одного таймера - создаёшь, свойство - глобальный.
В него вставляешь всё что нужно. Выполняется, по умолчанию, раз в 400 мс - более чем достаточно.
Переменные должны быть глобальные.
Если значение в текст - то ещё выполнить конверсию.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Nextion и "кодоводство" в ней

#7

Сообщение Sancho » 14.01.2019{, 11:14}

Продолжим.
Рассмотрим вариант 2, версия супер лайт.
Код:

Код: Выделить всё

  sys2=0 // берём системную переменную, обнуляем
  for(sys0=0;sys0<31;sys0++) // задаём цикл на 31 "оборот"
  {
    if(p[0].b[sys0+1].val==1) // Считываем состояние кнопки по её id, все кнопки имеют id от 1 до 32,
    {  // поэтому прибавляем 1, так-же можно было просто указать sys0=1;sys0<32;sys0++
      sys1=1<<sys0  // если получили от кнопки 1 то сдвигаем единицу на номер "оборота"
      sys2|=sys1  //  и присваиваем пром. результату побитовым ИЛИ
    }
  }
}
n0.val=sys2 // отправим на индикатор
va0.val=sys2 // присвоим переменной для дальнейшего считывания ардуиной
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Nextion и "кодоводство" в ней

#8

Сообщение Sancho » 14.01.2019{, 12:02}

Далее.
Определим, что панель - слэйв, а ардуино мастер. Панель можно отключать, например для использования с несколькими ардуино.
Соответственно, нужно запоминать настройки и отправлять их на панель при её подключении, иначе сразу-же получим нули по всем каналам.
Выберем тип опознания связи - бит 30. Если в 1, значит панель на месте. То-же и для панели - если бит в 1 - пред-устанавливаем кнопки. Их осталось 30 - на одну переменную :)

Код: Выделить всё

if(va1.val>=1073741824) //если приняли из ардуино, и бит 30 в 1(проверьте на win калькуляторе в режиме программист)
{
  if(va1.val!=va2.val)//детектор изменения, если принятая не равна старой, в начале - ноль
  {
    for(sys0=0;sys0<30;sys0++)// запускаем цикл
    {
      sys1=1<<sys0// сдвигаем 1 на количество номера цикла
      sys2=sys1&va1.val// побитовое И с принятым значением
      if(sys2>0)// если результат отличается от нуля
      {
        p[0].b[sys0+1].val=1// присваиваем кнопке значение 1
      }else
      {
        p[0].b[sys0+1].val=0// иначе 0
      }
    }
    va2.val=va1.val// запоминаем состояние в "старую" переменную, va2
  }
  sys2=0// уже описывал
  for(sys0=0;sys0<30;sys0++)
  {
    if(p[0].b[sys0+1].val==1)
    {
      sys1=1<<sys0
      sys2|=sys1
    }
  }
	sys1=1<<30
	sys2|=sys1// выставляем 30 бит в 1
}else
{
	va2.val=va1.val // запомним переменную
}
n0.val=sys2
va0.val=sys2
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

SSSergeich
Капитан
Сообщения: 708
Зарегистрирован: 06.02.2016{, 11:01}
Репутация: 37
Откуда: Ярославль
Имя: Сергей

Nextion и "кодоводство" в ней

#9

Сообщение SSSergeich » 14.01.2019{, 20:30}

Для полноты понимания не хватает flp кода)

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

Nextion и "кодоводство" в ней

#10

Сообщение Max » 16.01.2019{, 20:52}

Подскажите еще одну операцию. Например, есть несколько переменных, как их поместить в компонент Текст (строка) да еще с разделителями, например косая черта, или двоеточие? Все находится на одном экране.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Nextion и "кодоводство" в ней

#11

Сообщение Sancho » 16.01.2019{, 20:55}

Ув. Max, Завтра.
Позже перенесу Ваши вопросы и ответы в выше указанную тему - она информативнее.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

SSSergeich
Капитан
Сообщения: 708
Зарегистрирован: 06.02.2016{, 11:01}
Репутация: 37
Откуда: Ярославль
Имя: Сергей

Nextion и "кодоводство" в ней

#12

Сообщение SSSergeich » 16.01.2019{, 22:22}

Max писал(а):
16.01.2019{, 20:52}
Подскажите еще одну операцию. Например, есть несколько переменных, как их поместить в компонент Текст (строка) да еще с разделителями, например косая черта, или двоеточие? Все находится на одном экране.
Пару месяцев назад делал такое. Что-то не могу код найти. я делал так, конвертировал переменные в текстовые, а дальше собирал типа такого:
t0.txt=t1.txt+”:”t2.txt+”:”t3.txt+”:”t4.txt
Но это так, по ламерски.)

Ответить

Вернуться в «Дисплеи и индикаторы»