Перейти к содержанию
GPIO Extender uLua: примеры кода

GPIO Extender uLua: примеры кода

Примеры кода для GPIO Extender uLua: кнопка и реле, порог АЦП и термостат с DHT22. Подключение, код и изменяемые параметры.

Эти примеры можно запустить без изучения всего справочника uLua. Каждый файл решает одну типовую задачу и использует только возможности, доступные в прошивке GPIO Extender uLua.

Как запустить пример

  1. Откройте uLua веб-IDE и подключите устройство.
  2. Нажмите «Стоп», если в контроллере уже выполняется программа.
  3. Скопируйте код выбранного примера в редактор.
  4. Сначала нажмите «Скомпилировать и запустить» и проверьте схему.
  5. Только после проверки нажмите «Записать», чтобы программа запускалась после включения питания.

Во всех примерах выход hw.p1 выключен при старте. Они рассчитаны на релейный модуль с логическим входом 3,3 В, который включается уровнем 1. Для модуля с активным уровнем 0 поменяйте местами значения 0 и 1 в вызовах hw.gpio_set.

К GPIO нельзя подключать катушку реле, двигатель или другую силовую нагрузку напрямую. Используйте релейный либо транзисторный модуль и соедините GND схемы с GND контроллера.

Кнопка переключает реле

Подключите кнопку между hw.p6 и GND, а логический вход релейного модуля — к hw.p1. У входа hw.inp включена внутренняя подтяжка: отпущенная кнопка читается как 1, нажатая — как 0. Каждое нажатие меняет состояние реле; ожидание отпускания и пауза 30 мс подавляют дребезг контактов.

Открыть исходник gpio-button-relay.lua

local BUTTON_PIN = hw.p6
local RELAY_PIN = hw.p1
local relay_on = false

hw.gpio_init(RELAY_PIN, hw.out)
hw.gpio_set(RELAY_PIN, 0)
hw.gpio_init(BUTTON_PIN, hw.inp)

while true do
    if hw.gpio_get(BUTTON_PIN) == 0 then
        relay_on = not relay_on

        if relay_on then
            hw.gpio_set(RELAY_PIN, 1)
        else
            hw.gpio_set(RELAY_PIN, 0)
        end

        while hw.gpio_get(BUTTON_PIN) == 0 do
            hw.delay_ms(10)
        end
        hw.delay_ms(30)
    end

    hw.delay_ms(10)
end

Чтобы использовать другой вход или выход, измените только BUTTON_PIN и RELAY_PIN в первых строках.

Аналоговый датчик включает выход по порогу

Подайте сигнал 0–3,3 В на hw.p5, подключите вход релейного модуля к hw.p1 и объедините земли. АЦП возвращает значение от 0 до 1023. При значении 700 и выше реле включается, а при снижении до 650 выключается. Разница между порогами не даёт выходу быстро переключаться около одной точки.

Открыть исходник gpio-adc-threshold.lua

local SENSOR_PIN = hw.p5
local RELAY_PIN = hw.p1
local ON_LEVEL = 700
local OFF_LEVEL = 650
local relay_on = false

hw.gpio_init(RELAY_PIN, hw.out)
hw.gpio_set(RELAY_PIN, 0)
hw.adc_start(SENSOR_PIN, 20)
hw.delay_ms(100)

while true do
    local value = hw.adc_read(SENSOR_PIN)

    if not relay_on and value >= ON_LEVEL then
        relay_on = true
        hw.gpio_set(RELAY_PIN, 1)
        hw.cdc_write("relay on, adc=" .. value .. "\n")
    elseif relay_on and value <= OFF_LEVEL then
        relay_on = false
        hw.gpio_set(RELAY_PIN, 0)
        hw.cdc_write("relay off, adc=" .. value .. "\n")
    end

    hw.delay_ms(100)
end

Задайте свои пороги в ON_LEVEL и OFF_LEVEL. Сообщения о переключениях можно увидеть в CDC-терминале IDE.

Термостат с DHT22

Подключите DATA датчика DHT22/AM2302 к hw.p6, VCC — согласно исполнению датчика, GND — к GND. Если на модуле нет собственной подтяжки, поставьте резистор 4,7–10 кОм между DATA и питанием. Релейный модуль подключите к hw.p1.

Открыть исходник gpio-dht-thermostat.lua

local SENSOR_PIN = hw.p6
local RELAY_PIN = hw.p1
local ON_TEMP = 300
local OFF_TEMP = 270
local relay_on = false
local last_sample = 0

hw.gpio_init(RELAY_PIN, hw.out)
hw.gpio_set(RELAY_PIN, 0)
hw.gpio_init(SENSOR_PIN, hw.dht22)

while true do
    local sample = hw.dht_ts(SENSOR_PIN)

    if sample ~= 0 and sample ~= last_sample then
        last_sample = sample
        local temperature = hw.dht_temp(SENSOR_PIN)

        if not relay_on and temperature >= ON_TEMP then
            relay_on = true
            hw.gpio_set(RELAY_PIN, 1)
        elseif relay_on and temperature <= OFF_TEMP then
            relay_on = false
            hw.gpio_set(RELAY_PIN, 0)
        end

        hw.cdc_write("temperature x10=" .. temperature .. "\n")
    end

    hw.delay_ms(100)
end

Температура задаётся в десятых долях градуса: 300 означает 30,0 °C, а 270 — 27,0 °C. Программа ждёт первый корректный пакет DHT22, включает выход при ON_TEMP и выключает при OFF_TEMP.

Если нужно изменить сценарий