Перейти к содержанию

Interpreter

Interpreter — это встроенный скриптовый язык для управления работой контроллера без необходимости изменения и перекомпиляции его прошивки. Возможности встроенного языка ограничены, но он позволяет выполнять типовые действия, такие как управление GPIO, вывод на дисплей данных, отправка GET запросов и т. д., что значительно расширяет функционал прошивки и позволяет пользователям решать их задачи.

Interpreter

Редактирование содержания скрипта происходит в веб-интерфейсе прошивки, а сам скрипт запускается на исполнение с нужной пользователю периодичностью (обычно 1-10 сек.).

По умолчанию размер скрипта составляет до 500 байт. Этот размер может быть изменён в конфигураторе прошивок, максимальное значение — 8192 байта.

Скриптовый язык

Скриптовый язык очень прост и состоит из набора специализированных функций, которые позволяют управлять встроенным оборудованием (GPIO, вывод на дисплей и т. д.) и логических операторов (if-else-endif) при помощи которых пользователь может описать требуемую логику работы системы.

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

В случае возникновения ошибок в работе выдаются сообщения с соответствующими кодами, что позволяет отлаживать работу скрипта и устранять возникшие ошибки.

Работа скриптов с диска

Возможна работа со скриптами, находящимися на SD или SPIFFS дисках. В этом случае количество строк в файле не ограничено, но длина одной строки должна быть не более 1 кБ.

Загружается скрипт командой load(имя файла).

load(/SPIFFS/script.txt)

После выполнения файла скрипта управление передается обратно скрипту в окне-редакторе, если не встречен оператор end.

Примечания

В дальнейшем при описании функций и операторов будут использоваться примечания «*» и «**», которые уточняют возможность работы с переменными и математическими выражениями:

* — можно использовать переменные

** — поддерживаются математические выражения

Условный оператор if

if(условие*)

Поддерживаются операторы сравнения == , != , <, > , >= , <=. Допустима вложенная математика и скобки внутри оператора if.

Поддерживаются также операторы И (&&) и ИЛИ (||)

if(second==0||second==30)
if(second>=10&&second<=30)

else — необязательный оператор. После него выполняется код если условие if не выполнилось.

endif — этим оператором должна заканчиваться секция оператора if.

Пример:

if(условие)
функции, когда условие выполнено
endif

Пример с else:

if(условие)
функции, когда условие выполняется
else
функции, когда условие не выполняется
endif

Оператор безусловного перехода goto

goto XXX — переход к строке по ссылке :XXX.

Пример:

:testm
функции
goto testm

Завершение скрипта

end — завершение выполнения скрипта происходит либо после выполнения последней его строки, либо после выполнения интерпретатором команды end.

Комментарии

// — строки, начинающиеся «//», считаются комментариями (можно также использовать во время отладки для временного отключения работы отдельных строк).

Базовые функции

delay(x) — задержка работы скрипта на указанное количество миллисекунд (на работу самого контроллера это не влияет, а также на это время не происходит запуск по интервалу).

reboot() — перезагрузка контроллера.

debug(х) — включает или отключает отладку в UART (1/0).

sleep(x) — перевод контроллера в спящий режим на х секунд (требуется установка опции спящего режима).

mqttsend(топик,значение) — отправка данных в mqtt (значение может содержать шаблоны и метрики).

stepper(х,у*) — управление степпером.

Работа с GPIO

gpioset(x,y*) — установка состояния GPIO.

gpioset(5,1)

Примечание. Не рекомендуется использовать vgpio и d2d номера GPIO при небольшом интервале выполнения скрипта

pwmset(x,y)** — установка уровня ШИМ, где x — номер ШИМ пина, y — значение ШИМ.

pwmset(1,200)

Работа с переменными

valset(x,y*) — установка значения y глобальной переменной x, номер переменой считается от 1. Устаревшая функция, используйте приравнивание (см. пример 16 в конце статьи).

valmath(X,Y+Z) — математическое действие. Устаревшая функция, используйте приравнивание (см. пример 16).

Вывод данных

Прошивка Lavritech поддерживает вывод данных на различные устройства и дисплеи — главную страницу веб-интерфейса, UART, дисплеи LCD, OLED, TFT, LED, Nextion, индикаторы на MAX7219 и т. д.

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

В функциях printw, printd, printm и пр. вместо текста можно указывать номер шаблона в виде « #1» конструктора строк или сразу текстовые метрики в виде «printw(_DATE_ _TIME_)» .

На дисплеях, отмеченных звездочкой, используются числовые переменные.

Вывод на главную страницу

printw(текст) — вывод текста на главную страницу (поддерживаются html теги).

Вывод в UART

printuart(текст) — вывод строки в UART при помощи опции UART bridge.

Вывод на LCD

printd(номер строки,текст) — вывод текста на LCD дисплей.

Вывод на OLED и TFT

printd(номер строки,номер шрифта,текст) — вывод текста на OLED и TFT дисплеи.

imageprint(путь_до_файла) — вывод картинки на TFT дисплей.

Вывод на LED

printm(скорость строки, текст) — вывод бегущей строки на LED матрицу.

matrixbr(уровень яркости) — установка яркости LED матриц (значение 100 выключает матрицу).

Вывод на Nextion

printn(id,текст) — вывод текста на дисплей Nextion.

printn(d0,_TIMES_)

printnraw(raw дата) — вывод «сырых» данных на дисплей Nextion.

Вывод на MAX7219

printmx(x,y,z*) — функция вывода на 7-сегментный индикатор на MAX7219, где x — знакоместо, y — тип вывода(0..3), z — значение.

segsetbr(x) — управление яркостью 7-сегментного индикатора на MAX7219.

Вывод на TM1637

printmt(z*) — функция вывода на TM1637.

tmsetbr(x) — управление яркостью TM1637.

Вывод на E-Ink

printei(z,x,y,текст) — Вывод текста на E-Ink LILYGO T5 (подробнее см. в документации на дисплей).

Управление WS2812

rgbsend(hex строка) — управление WS2812 (см. подробности в документации).

rgb16send(hex строка) — управление WS2812 (см. подробности в документации).

Работа со звуком

speakline(строка) — воспроизведение MP3 из конструктора фраз (можно указать как номер шаблона в виде «#1», так и сам шаблон).

mp3cmd(команда,параметр) — управление MP3 UART плеером (см. документацию на плеер).

playwav(путь_до_файла) — проигрывание MP3/WAV файла.

beep(x,y) — генерация частоты через опцию beeper, где x — время, y — частота.

Работа с IR

irsendraw(hex данные) — отправка «сырых» ИК команд.

irsend(режим,команда) — отправка ИК команды.

Управление термостатом

thermoset(x,y)** — управление термостатом, где x - номер термостата, у - установка термостата (см. пример в документации термостата).

Отправка GET запросов

httpget(url) — отправка данных по сети (без авторизации). Поддерживаются указание номера порта и текстовые метрики вида ХХХ.

Примеры:

httpget(api.thingspeak.com/update?кey=<ключ>&field1=_BMPT_&field2=_BMPP_&field3=_DHTT1_&field4=_DHTH1_) 

httpget(192.168.1.100:8080/json.htm?param=udevice&type=command&idx=55&nvalue=0&svalue=_BMPT_)

Отправка уведомлений

sendsms(текст сообщения) — отправка уведомлений через подключённые сервисы (Telegram, ICQ, Email, SMS GSM, SMS.RU, SMSC.RU).

sendsms(текст) // отправка текста 
sendsms(#1) // отправка шаблона #1
sendsms(_DATE_  _TIME_) // отправка метрик

resetsms() — сброс флага отправки, применяется для защиты от циклической отправки (см. пример 6).

Переменные

Система поддерживает работу с переменными. Некоторые из них приведены ниже, остальные можно посмотреть на вкладке Metrics веб-интерфейса контроллера.

gpioX — чтение состояния GPIO (ранее gpioget(х)).

pwmX — чтение состояния PWM (ранее pwm[x]).

second, minute, hour, mday, month, week, minutesperday, secondsperday — переменные для работы со временем.

Работа с глобальными переменными

В скриптах возможно использовать глобальные переменные, которые доступны на чтение и запись. Количество глобальных переменных задается в конструкторе прошивок, тип переменных — int32 (см. примеры 7 и 8).

Для чтения переменной используется intvalX, считая от 1.

Для вывода переменных используется макрос _INTVALx_, считая от 1.

Установка переменной intvalX может задаваться через знак равно (замена функций valset(x,y) и valmath(x,y+z)).

intval1=5
intval1=5+dsw1

Переменные вида intvalfX и intvaleepX сохраняют свои значения во flash и eeprom (опция должна быть включена в конструкторе прошивок). Эти переменные работают только с целыми числами, их установка и чтение аналогичны intvalX. Сохранение происходит только если значение переменной изменилось (см. пример 16).

Расширенная математика

Эта опция позволяет использовать сложную и вложенную математику (по умолчанию выключена). Допустимо использовать любые выражения и их комбинации, включая скобки для установки приоритета выполнения операций.

Поддерживаются следующие переменные и функции:

pi — число Пи.

e — число e.

x^y — возведение в степень y числа x

map(x,ind,inu,outd,outp) — приведение значения.

map(adc,0,4095,0,3.3) // приведение данных АЦП к значению 3,3 В

ceil(x) — округляет x в большую сторону.

valmath(0,ceil(dsw1))

floor(x) — округляют аргумент x до наибольшего целого числа.

abs(x) — модуль числа х.

sqrt(x) — квадратный корень числа x.

exp(x) — значение экспоненты от x.

ln(x) — натуральный логарифм от x.

log10(x) — десятичный логарифм от x.

Тригонометрия:

sin(x), cos(x), tan(x), sinh(x), cosh(x), tanh(x), atan(x), asin(x), acos(x).

Работа с таймерами

Поддерживается работа с таймерами. По умолчанию они отключены, задать нужное количество таймеров можно в конструкторе прошивок. Рекомендуется использовать таймеры только при необходимости — большое их количество сильно нагружает систему.

timer(x,y) — многократный запуск таймера номер x, на время y (секунды).

timerone(x,y) — однократный запуск таймера номер x , на время y (секунды).

timerstop(x) — остановка таймера х.

Если требуется перезапустить таймер, то перед вызовом timer() или timerone() нужно остановить его при помощи функции timerstop(). Пока таймер запущен, повторный его вызов игнорируется.

Вызов таймера происходит через условие if, внутри которого указывается событие таймера timereventX, где Х — номер таймера. Для точности срабатывания таймера в 1 секунду требуется устанавливать интервал запуска скрипта равным так же 1 секунде (см. примеры 14, 15, 18).

gpio event

Эта опция позволяет запускать действие только после изменения состояния GPIO, а не постоянно как при обычном сравнении состояния GPIO в условии if (по умолчанию отключено).

gpioint(x,y,z) — запуск контроля события номер x на GPIO y с режимом z, где z может принимать значения any (любое изменение), neg (отрицательное изменение), pos (положительное изменение), none (выключить контроль).

Контроль происходит через условие if, внутри которого вызывается событие gpio gpioeventX, где X — номер события. Для быстрой реакции требуется установка минимального интервала исполнения скрипта в 1 секунду или зацикливание исполнения кода через goto (см. примеры 17, 18, 19).

Обратите внимание: при использовании gpio event лишние пробелы и другие знаки недопустимы, каждый оператор должен быть в отдельной строке.

Сообщения об ошибках

1 — ошибка синтаксиса
2 — ошибка синтаксиса
3 — превышен лимит переходов
4 — не найдена переменная в условии
5 — ожидается условие (== , != , < , > , >= , <=)
6 — не найдена функция
7 — не найдена точка перехода у оператора goto
8 — слишком малое значение delay
9 — ошибка номера шаблона в конструкторе строк
10 — ошибка в математической функции
11 — нет переменной с указанным номером
12 — попытка деления на ноль
21 — использование операторов else или endif без if
22 — невозможно загрузить файл скрипта с диска
23 — превышено количество вложений if
24 — нумерация переменной изменена (считается от 1)

Примеры кода

Пример 1. Термостат с управлением по GPIO14 и индикацией режимов.

if(gpio14==0)
printw(выключено)
else
if(dsw1<30.5)
gpioset(16,1)
printw(холодно)
else
gpioset(16,0)
printw(горячо)
endif
endif

Пример 2. Мигалка GPIO с выводом состояния на главную страницу.

:testm
printw(Тик)
gpioset(16,1)
delay(1000)
printw(Так)
gpioset(16,0)
delay(1000)
goto testm

Пример 3. Мигалка GPIO с выводом состояния на главную страницу и выключением через GPIO14.

:testm
if(gpio14==0)
printw(выключено)
gpioset(16,0)
delay(1000)
else
printw(Тик)
gpioset(16,1)
delay(1000)
printw(Так)
gpioset(16,0)
delay(1000)
endif
goto testm

Пример 4. Поочередный вывод данных из конструктора строк на LCD дисплей.

printd(1,#1)
delay(2000)
printd(1,#2)
delay(2000)
printd(1,#3)

Пример 5. Включение GPIO16 если GPIO14 включен и температура на DS18B20 ниже 30 градусов.

if(gpio14==1&&dsw1<30.5)
gpioset(16,1)
else
gpioset(16,0)
endif

Пример 6. Мониторинг GPIO12 и отправки SMS и email при появлении высокого уровня на нём.

if(gpio12==1)
sendsms(Тревога!)
else
resetsms()
endif

Пример 7. Условие со встроенной математикой внутри if с расчетом среднего значения трёх датчиков.

if((dsw1+dsw2+dsw3)/3<30.5)
gpioset(16,1)
else
gpioset(16,0)
endif

Пример 8. Мигание светодиодом раз в 5 секунд.

if(secondsperday%5==0)
gpioset(19,1)
delay(500)
gpioset(19,0)
endif

Пример 9. Мигание светодиодом по 5 раз каждые 10 секунд.

if(secondsperday%10==0)
intval2=0
:testf
if(intval2>=5)
end
endif
gpioset(16,1)
delay(500)
gpioset(16,0)
delay(500)
intval2=intval2+1
goto testf
endif

Пример 10. Планировщик времени включения с 7 по 21 час.

if(hour>=7&&hour<21)
gpioset(16,1)
else
gpioset(16,0)
endif

Пример 11. Включения GPIO на заданное время.

if(gpio16==1)
delay(2000)
gpioset(16,0)
endif

Пример 12. Включения GPIO на заданное время (не мешает действиям других условий в скрипте), время задается period*X.

if(gpio12==1)
valmath(1,intval1+1)
if(intval1>Х)
gpioset(12,0)
endif
else
valset(1,0)
endif

Пример 13. Цикл goto с периодом 100мс (delay обязателен).

:testm
свой код
delay(100)
goto testm

Пример 14. Мигание светодиодом каждые 10 секунд с включением на 3 секунды, используются два таймера, один из которых работает с однократным запуском.

timer(1,10)
if(timerevent1)
gpioset(16,1)
timerone(2,3)
endif
if(timerevent2)
gpioset(16,0)
endif

Пример 15. Включение GPIO на заданное время с использованием таймера (не мешает действиям других условий в скрипте). См. примеры 11 и 12.

if(gpio16==1)
timerone(1,2)
endif
if(timerevent1)
gpioset(16,0)
endif

Пример 16. Приравнивание переменной через знак равно (см. пример 7) .

intval1=(dsw1+dsw2+dsw3)/3
printw(_INTVAL1_)

Пример 17. Мониторинг состояния GPIO16 через gpio event. Отсылка уведомления через SMS, отправка GET запроса и установка GPIO12.

gpioint(1,16,neg)
if(gpioevent1)
resetsms()
sendsms(Тревога!)
httpget(192.168.1.42/testget)
gpioset(12,1)
endif

Пример 18. Использование gpio event и таймера. Мониторинг GPIO15 (датчик движения) и включение GPIO16 на 60 секунд. timerstop() сбрасывает отчет и не дает выключить GPIO16 при постоянном изменении состояния на GPIO15.

gpioint(1,15,pos)
if(gpioevent1)
gpioset(16,1)
timerstop(1)
timerone(1,60)
endif
if(timerevent1)
gpioset(16,0)
endif

Пример 19. Использование gpio event в качестве кнопок для управления GPIO. Пример на 2 кнопки. Реализован цикл через goto с паузой для быстрой реакции. Замена опции gpio key для нестандартных случаев.

:loop

gpioint(1,16,neg)
if(gpioevent1)
gpioset(12,2)
endif

gpioint(2,17,neg)
if(gpioevent2)
gpioset(14,2)
endif

delay(100)
goto loop

Связанные темы

Настройка прошивки
Страница Hardware

Где купить

Купить оборудование Lavritech можно в официальном интернет-магазине.