插件窝 干货文章 用 Lua 控制你的树莓派

用 Lua 控制你的树莓派

local GPIO periphery 树莓 285    来源:    2025-04-20

使用Lua控制树莓派

Lua是一种轻量级脚本语言,非常适合在资源有限的设备(如树莓派)上使用。以下是使用Lua控制树莓派的全面指南:

1. 安装Lua环境

首先在树莓派上安装Lua:

sudo apt update
sudo apt install lua5.3

验证安装:

lua -v

2. 安装GPIO库

要控制树莓派的GPIO引脚,需要安装Lua的GPIO库:

sudo apt install lua-gpio

或者使用LuaRocks安装更强大的库:

sudo apt install luarocks
sudo luarocks install luasocket  # 网络功能
sudo luarocks install lua-periphery  # GPIO控制

3. 基本GPIO控制示例

控制LED灯

local periphery = require('periphery')
local gpio = periphery.GPIO

-- 设置GPIO18为输出模式
local led = gpio(18, "out")

-- 闪烁LED
for i = 1, 10 do
    led:write(true)  -- 打开LED
    gpio.sleep(0.5)  -- 等待0.5秒
    led:write(false) -- 关闭LED
    gpio.sleep(0.5)
end

led:close()

读取按钮输入

local periphery = require('periphery')
local gpio = periphery.GPIO

-- 设置GPIO17为输入模式(下拉电阻)
local button = gpio(17, "in", "pull_down")

print("按下按钮测试(CTRL+C退出)...")

while true do
    if button:read() then
        print("按钮被按下!")
    end
    gpio.sleep(0.1)  -- 防抖延迟
end

button:close()

4. 高级功能

PWM控制(软件模拟)

local periphery = require('periphery')
local gpio = periphery.GPIO

local pwm_pin = gpio(18, "out")

function pwm(pin, frequency, duty_cycle)
    local period = 1.0 / frequency
    local on_time = period * duty_cycle
    local off_time = period - on_time

    while true do
        pin:write(true)
        gpio.sleep(on_time)
        pin:write(false)
        gpio.sleep(off_time)
    end
end

-- 启动PWM (1kHz, 50%占空比)
pwm(pwm_pin, 1000, 0.5)

I2C通信

local periphery = require('periphery')
local i2c = periphery.I2C

-- 初始化I2C (设备1, 地址0x48)
local dev = i2c("/dev/i2c-1")
dev:setslave(0x48)

-- 读取2字节数据
local data = dev:read(2)
print(string.format("读取的数据: 0x%02X 0x%02X", data:byte(1), data:byte(2)))

dev:close()

5. 实用项目示例

温度监控系统

local periphery = require('periphery')
local gpio = periphery.GPIO
local socket = require('socket')

-- DS18B20温度传感器路径
local sensor_path = "/sys/bus/w1/devices/28-*/w1_slave"

-- 读取温度函数
function read_temperature()
    local file = io.popen("cat " .. sensor_path)
    local content = file:read("*all")
    file:close()

    local temp = content:match("t=(%d+)")
    return tonumber(temp) / 1000.0
end

-- 主循环
while true do
    local temp = read_temperature()
    print(string.format("当前温度: %.2f°C", temp))

    -- 每5秒读取一次
    socket.sleep(5)
end

Web控制界面

local socket = require('socket')
local periphery = require('periphery')
local gpio = periphery.GPIO

-- 设置GPIO
local led = gpio(17, "out")

-- 创建HTTP服务器
local server = socket.bind('0.0.0.0', 8080)
print("服务器运行在 http://localhost:8080")

while true do
    local client = server:accept()
    local request = client:receive()

    -- 简单路由
    if request:match("GET /on") then
        led:write(true)
        client:send("HTTP/1.1 200 OK\r\n\r\nLED已打开")
    elseif request:match("GET /off") then
        led:write(false)
        client:send("HTTP/1.1 200 OK\r\n\r\nLED已关闭")
    else
        client:send("HTTP/1.1 200 OK\r\n\r\n<h1>树莓派控制</h1><a href='/on'>打开LED</a> | <a href='/off'>关闭LED</a>")
    end

    client:close()
end

6. 性能优化技巧

  1. 使用局部变量:Lua中局部变量比全局变量访问更快

    local print = print  -- 将常用函数本地化
    
  2. 避免频繁的GPIO操作:批量操作比单次操作更高效

  3. 使用协程:处理多个任务而不阻塞

    local co = coroutine.create(function()
       while true do
           -- 执行任务
           coroutine.yield()
       end
    end)
    
  4. 预加载模块:在脚本开始处加载所有需要的模块

7. 常见问题解决

问题1: Lua无法找到GPIO模块 - 解决方案: 确保已正确安装库,并检查Lua路径 lua package.path = package.path .. ';/usr/local/share/lua/5.3/?.lua'

问题2: 权限不足 - 解决方案: 将用户加入gpio组 bash sudo usermod -a -G gpio $USER

问题3: 性能问题 - 解决方案: 使用LuaJIT替代标准Lua bash sudo apt install luajit

通过以上方法,你可以充分利用Lua的轻量级特性来控制树莓派的各种功能,从简单的GPIO控制到复杂的物联网项目。