
我的第一个 TinyGo 项目ESP32-C3 DHT11 SSD1306前言最近开始学习 TinyGo这是我的第一个 TinyGo 嵌入式项目。作为一个 Go 语言爱好者能用熟悉的语法来编写嵌入式程序这种感觉非常奇妙。项目已开源在 Gitee 上https://gitee.com/magic_dragon/esp32-c3_dht11_ssd1306为什么选择 TinyGoTinyGo 是 Go 语言的一个编译器子集专门针对微控制器和 WebAssembly 等资源受限环境。相比 C/C它有这些吸引我的地方语法熟悉— 如果你已经会 Go上手几乎零成本垃圾回收— 不用手动管理内存嵌入式开发也能享受 GC 的便利Goroutine— 虽然在 MCU 上用得不多但并发模型依然可用丰富的驱动库—tinygo.org/x/drivers提供了大量常见传感器的驱动项目简介这个项目使用 ESP32-C3 开发板搭配 DHT11 温湿度传感器和 SSD1306 OLED 显示屏实现了一个简单的环境监测小装置每 2 秒读取一次 DHT11 的温度和湿度数据将温湿度及 LED 状态实时显示在 OLED 屏幕上通过按钮中断控制 LED 开关带软件消抖硬件连接外设ESP32-C3 引脚说明LEDGPIO2通过 330Ω 电阻接 LED 正极按钮GPIO3一端接 GPIO3另一端接 GNDDHT11 DATGPIO4DHT11 模块的数据引脚OLED SDAGPIO5I2C 数据线OLED SCLGPIO6I2C 时钟线核心代码解读1. I2C 总线与 OLED 初始化i2c.Configure(machine.I2CConfig{SCL:machine.GPIO6,SDA:machine.GPIO5,Frequency:400_000,})dispssd1306.NewI2C(i2c)disp.Configure(ssd1306.Config{Width:128,Height:64,Address:0x3C,})SSD1306 通过 I2C 总线通信配置为 400kHz 快速模式。128x64 分辨率的屏幕使用 0x3C 地址。2. DHT11 传感器读取dhtSensordht.New(machine.GPIO4,dht.DHT11)dhtSensor.Configure(dht.UpdatePolicy{UpdateTime:2*time.Second,UpdateAutomatically:true,})DHT11 数据手册要求最小读取间隔为 2 秒设置UpdateAutomatically后调用TemperatureFloat/HumidityFloat会自动触发读取非常方便。3. 按钮中断与消抖button.SetInterrupt(machine.PinFalling,func(p machine.Pin){iftime.Since(lastPress)50*time.Millisecond{return}lastPresstime.Now()led.Set(!led.Get())})机械按钮按下时触点会弹跳产生多次快速电平变化。通过记录上次触发时间忽略 50ms 内的重复触发实现软件消抖。4. 超级循环模式for{err:dhtSensor.ReadMeasurements()iferr!nil{show(DHT11 Error,,)}else{temp,_:dhtSensor.TemperatureFloat(dht.C)hum,_:dhtSensor.HumidityFloat()show(fmt.Sprintf(T:%.1fC,temp),fmt.Sprintf(H:%.1f%%,hum),fmt.Sprintf(LED:%v,led.Get()),)}time.Sleep(2*time.Second)}嵌入式程序的核心结构无限循环中不断读取传感器、处理数据、刷新显示。注意main函数不能退出否则设备会重启。踩坑记录DHT11 读取间隔— 刚开始频繁读取导致数据全是错误后来才注意到数据手册要求至少间隔 2 秒OLED 地址— 128x64 的屏幕地址是 0x3C128x32 是 0x3D搞混了屏幕不会亮按钮消抖— 不加消抖逻辑的话按一次按钮 LED 会翻转多次50ms 的消抖阈值实测效果不错main 不能退出— 嵌入式程序的 main 函数必须保持运行退出后芯片会自动重启编译与烧录# 编译并烧录到 ESP32-C3tinygo flash-targetesp32c3.# 仅编译生成固件tinygo build-targetesp32c3-ofirmware.bin.总结作为第一个 TinyGo 项目虽然功能简单但覆盖了嵌入式开发的几个核心知识点GPIO 控制、I2C 通信、传感器驱动、中断处理。TinyGo 的开发体验确实不错Go 的简洁语法让嵌入式编程也变得优雅起来。接下来打算尝试接入 WiFi把温湿度数据上报到服务器尝试 MQTT 协议用 Goroutine 实现更复杂的并发逻辑如果你也对 TinyGo 感兴趣欢迎交流项目地址https://gitee.com/magic_dragon/esp32-c3_dht11_ssd1306