
GPIO Extender uLua: программирование и первый запуск
Подключение GPIO Extender uLua, работа с веб-IDE, запись автономной программы и ограничения GPIO, ШИМ, АЦП, UART, WS2812 и DHT22.
GPIO Extender uLua исполняет программу в самом контроллере: он может опрашивать датчики, реагировать на входы, управлять ШИМ, обмениваться по UART и выполнять задачи по таймеру без постоянно запущенной программы на ПК.
Это отдельное исполнение устройства. Код uLua нельзя загрузить в GPIO Extender-2 или GPIO Extender-F.
Если вы будете разрабатывать с помощью ИИ, скопируйте промпт для uLua.
Первый запуск в IDE
- Подключите контроллер к USB и откройте uLua веб-IDE. Настольная версия доступна в разделе uLua-Editor.
- Нажмите «Подключить», выберите USB CDC-порт и остановите старую программу кнопкой «Стоп».
- Вставьте код, нажмите «Скомпилировать», затем «Скомпилировать и запустить». Этот запуск временный и исчезнет после отключения питания.
- Проверьте входы и выходы с безопасной нагрузкой. После проверки нажмите «Записать», чтобы программа запускалась при включении.

| Кнопка IDE | Действие |
|---|---|
| Подключить | открыть последовательный порт через Web Serial |
| Скомпилировать | проверить код без отправки в устройство |
| Скомпилировать и запустить | запустить код без записи во флеш-память |
| Стоп | остановить текущую программу |
| Записать | сохранить код во флеш-память |
| Прочитать | прочитать сохранённый байткод, декомпилировать его и показать восстановленный код в редакторе |
| Очистить сохранённый код | удалить код из флеш-памяти |
| Защитить сохранённый код | запретить чтение сохранённого кода |
После декомпиляции видна логика программы, но не исходный файл: комментарии, форматирование и первоначальные имена переменных и функций не восстанавливаются. Если код защищён, прочитать его через обычный API или IDE нельзя.
Возможности и ограничения
Поддерживаются локальные переменные int32, арифметика и битовые операции,
if, while, repeat, for, функции, строки и библиотеки для GPIO, ШИМ, АЦП,
измерения частоты и коэффициента заполнения, UART, WS2812, DHT22 и таймеров.
Не поддерживаются таблицы, сборщик мусора (GC), замыкания, типы данных кроме
строк и int32, а также динамический require.
| Задача | API | Ограничение |
|---|---|---|
| GPIO | hw.gpio_init, hw.gpio_set, hw.gpio_get | перед сменой занятой роли верните вывод в hw.inp |
| ШИМ (PWM) | hw.pwm_init, hw.pwm_set | hw.p2, hw.p3, hw.p6, hw.p7; частота общая |
| АЦП | hw.adc_start, hw.adc_read | один аналоговый вход одновременно; диапазон 0–1023 |
| Частота и коэффициент заполнения | hw.capture_freq, hw.capture_duty | hw.p4, hw.p5, hw.p9 |
| UART | hw.uart_setup, hw.uart_read, hw.uart_write | TX — hw.p2, RX — hw.p6 |
| WS2812 | hw.ws2812_write | только hw.p4 |
| DHT22 | hw.dht_temp, hw.dht_hum, hw.dht_ts | одна конфигурация; нельзя совмещать с обработчиком hw.gpio_watch на одном выводе |
Первая автономная программа
Пример переключает реле на hw.p1 каждым нажатием кнопки на hw.p6. Вход
подтянут внутри контроллера: нажатие на GND читается как 0. Сначала проверяйте
схему со светодиодом или логическим входом релейного модуля.
local RELAY_PIN = hw.p1
local BUTTON_PIN = hw.p6
local relay = 0
hw.gpio_init(RELAY_PIN, hw.out)
hw.gpio_init(BUTTON_PIN, hw.inp)
hw.gpio_set(RELAY_PIN, relay)
while true do
if hw.gpio_get(BUTTON_PIN) == 0 then
relay = 1 - relay
hw.gpio_set(RELAY_PIN, relay)
while hw.gpio_get(BUTTON_PIN) == 0 do
hw.delay_ms(10)
end
hw.delay_ms(30)
end
hw.delay_ms(10)
end