嵌入式Go 控制 GPIO 完整示例

嵌入式Go

Go 更适合运行在 带有操作系统(尤其是 Linux)的嵌入式设备 上,而不是资源极度受限的裸机单片机(如 STM32F103 这类只有几十 KB RAM 的 MCU)。

🔧 开发效率高 语法简洁,标准库丰富,支持现代编程范式。
⚡ 并发能力强 Goroutine + Channel 轻松实现高并发,适合处理传感器、网络、事件等多任务。
🔄 跨平台支持好 支持 ARM、ARM64、MIPS、RISC-V 等多种架构
📦 静态编译,无依赖 GOOS=linux GOARCH=arm go build 可生成独立二进制文件,无需外部运行时

✅ 适用场景包括:
嵌入式 Linux 设备(如 Raspberry Pi、BeagleBone、工业网关)
边缘计算设备
IoT 网关或数据中心
智能家居控制器
工业网关、数据采集终端。
如果是 小资源 MCU,建议使用 TinyGo。

树莓派上用 Go 控制 GPIO 完整示例

Go 语言 控制 GPIO 的完整示例,功能包括:

  • 使用 periph.io 库控制 GPIO 引脚(点亮 LED)
  • 启动一个简单的 Web 服务器
  • 通过 HTTP 接口远程开关 LED

安装 periph.io 库(用于 GPIO 控制)

periph.io 是 Go 中最流行的硬件 I/O 库,支持树莓派 GPIO。

go install periph.io/x/periph/cmd/periph-linux-arm@latest

或直接在代码中 go get

go get -u periph.io/x/periph/v4/...

完整 Go 程序代码

// main.go
package main

import (
    "log"
    "net/http"
    "sync"
    "time"

    "periph.io/x/periph/v4/host"
    "periph.io/x/periph/v4/host/rpi"
    "periph.io/x/periph/v4/conn/gpio"
    "periph.io/x/periph/v4/conn/gpio/gpioreg"
)

// 全局变量:LED 引脚
var led gpio.PinOut
var mu sync.Mutex

func main() {
    // 1. 初始化 periph 系统
    if _, err := host.Init(); err != nil {
        log.Fatal("无法初始化 periph:", err)
    }

    // 2. 获取 GPIO18 引脚(树莓派物理引脚 12)
    led = gpioreg.ByName("18")
    if led == nil {
        log.Fatal("无法找到 GPIO18")
    }

    // 3. 设置为输出模式
    if err := led.Out(gpio.Low); err != nil {
        log.Fatal("设置 GPIO18 失败:", err)
    }

    log.Println("✅ GPIO18 初始化成功,LED 准备就绪")

    // 4. 启动 Web 服务器
    http.HandleFunc("/", indexHandler)
    http.HandleFunc("/on", ledOnHandler)
    http.HandleFunc("/off", ledOffHandler)
    http.HandleFunc("/blink", blinkHandler)

    log.Println("🌍 服务器启动:http://<树莓派IP>:8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

// 首页
func indexHandler(w http.ResponseWriter, r *http.Request) {
    html := `
    <html>
    <body>
        <h1>树莓派 GPIO 控制</h1>
        <p><a href="/on">🟢 开灯</a></p>
        <p><a href="/off">🔴 关灯</a></p>
        <p><a href="/blink">✨ 闪烁 5</a></p>
    </body>
    </html>
    `
    w.Header().Set("Content-Type", "text/html; charset=utf-8")
    w.Write([]byte(html))
}

// 开灯
func ledOnHandler(w http.ResponseWriter, r *http.Request) {
    mu.Lock()
    defer mu.Unlock()

    if err := led.Out(gpio.High); err != nil {
        http.Error(w, "开灯失败: "+err.Error(), 500)
        return
    }
    log.Println("💡 LED 已打开")
    http.Redirect(w, r, "/", http.StatusSeeOther)
}

// 关灯
func ledOffHandler(w http.ResponseWriter, r *http.Request) {
    mu.Lock()
    defer mu.Unlock()

    if err := led.Out(gpio.Low); err != nil {
        http.Error(w, "关灯失败: "+err.Error(), 500)
        return
    }
    log.Println("💡 LED 已关闭")
    http.Redirect(w, r, "/", http.StatusSeeOther)
}

// 闪烁 5 次
func blinkHandler(w http.ResponseWriter, r *http.Request) {
    mu.Lock()
    defer mu.Unlock()

    log.Println("✨ 开始闪烁 5 次")
    go func() {
        for i := 0; i < 5; i++ {
            led.Out(gpio.High)
            time.Sleep(300 * time.Millisecond)
            led.Out(gpio.Low)
            time.Sleep(300 * time.Millisecond)
        }
    }()
    http.Redirect(w, r, "/", http.StatusSeeOther)
}

▶️ 编译与运行

  1. 编译(在树莓派上直接编译)
go build -o led-server main.go

sudo ./led-server

例如:http://192.168.1.100:8080
点击按钮控制 LED:
“开灯” → LED 亮
“关灯” → LED 灭
“闪烁” → LED 闪烁 5 次(不阻塞页面)

交叉编译(从 Mac/Linux 编译后拷贝到树莓派)如果你不想在树莓派上装 Go,可以在本地编译:

GOOS=linux GOARCH=arm GOARM=6 go build -o led-server main.go
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芳心村

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值