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

После декомпиляции видна логика программы, но не исходный файл: комментарии, форматирование и первоначальные имена переменных и функций не восстанавливаются. Если код защищён, прочитать его через обычный 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