
衡山派开发板SHT20温湿度传感器驱动移植与RT-Thread应用实战最近在做一个环境监测的小项目用到了Sensirion的SHT20温湿度传感器。这个传感器精度高、体积小用I2C通信特别适合嵌入式系统。我把它成功移植到了衡山派HSPI开发板上并且在RT-Thread操作系统里跑起来了。整个过程踩过一些坑也总结了不少经验今天就跟大家分享一下从驱动移植到实际应用的全过程。如果你手头也有衡山派开发板和SHT20模块想快速上手或者想学习如何在RT-Thread下开发传感器驱动这篇教程应该能帮到你。1. 认识SHT20传感器SHT20是Sensirion公司推出的一款数字温湿度传感器它有几个特点很适合咱们嵌入式项目精度不错温度精度±0.3°C湿度精度±3%RH对于大多数环境监测应用足够了。接口简单标准的I2C接口只需要两根线SDA和SCL就能通信节省MCU引脚。功耗低工作电流非常小适合电池供电的设备。体积小巧封装很小方便集成。它的基本工作参数如下参数规格工作电压2.1V ~ 3.6V工作电流0.1 ~ 1000 uA温度测量范围-40°C ~ 125°C温度精度±0.3°C湿度测量范围0% ~ 100% RH湿度精度±3% RH输出方式I2C引脚数量4 Pin (VCC, GND, SDA, SCL)注意SHT20的I2C设备地址是0x407位地址这个地址在后面的驱动代码里会用到。通信方面它支持两种模式主机模式和非主机模式。简单理解主机模式MCU发送测量命令后传感器会主动把时钟线SCL拉低直到测量完成才释放。这段时间MCU不能干别的只能等着。非主机模式MCU发送命令后可以继续处理其他I2C通信任务过一会儿再来查询数据是否准备好。咱们的驱动用的是非主机模式这样更灵活。测量温度的命令是0xF3测量湿度的命令是0xF5。传感器返回的数据是2个字节16位需要按照数据手册里的公式转换成实际的温度和湿度值。2. 驱动移植准备工作2.1 获取驱动代码包首先你需要拿到SHT20的驱动代码。原始资料里提供了一个驱动代码文件包。访问衡山派开发板的资料下载中心。在“资料下载中心 - 模块移植资料下载”部分找到“该章节压缩包”并下载。解压后你会得到一个驱动代码文件夹。2.2 将驱动文件放入工程接下来要把驱动文件放到你的RT-Thread工程里。衡山派的标准工程路径结构一般是这样的luban-lite/ └── application/ └── rt-thread/ └── helloworld/ └── user-bsp/ -- 用户BSP代码放在这里你需要把下载的驱动代码文件夹比如叫sht20-temp-humi-sensor整个复制到luban-lite/application/rt-thread/helloworld/user-bsp/目录下。提示如果你在工程里没找到user-bsp这个文件夹说明你还没进行模块移植的前置配置。需要先参考衡山派手册中的“必要操作”部分进行配置。2.3 修改Kconfig文件为了让RT-Thread的配置系统能识别咱们的SHT20驱动需要修改工程的Kconfig文件。用VSCode或其他编辑器打开文件luban-lite/application/rt-thread/helloworld/Kconfig在这个文件的末尾#endif语句的前面添加下面这行代码# SHT20温湿度传感器 source application/rt-thread/helloworld/user-bsp/sht20-temp-humi-sensor/Kconfig这行代码的作用是告诉配置系统去我们刚放进去的驱动文件夹里找它的Kconfig配置项。3. 使用menuconfig配置工程现在我们可以通过图形化界面来启用SHT20驱动了。首先进入luban-lite文件夹双击运行win_env.bat脚本打开RT-Thread的env工具。在env命令行中输入以下命令列出所有可用的默认配置scons --list-def选择衡山派开发板的默认配置。通常名为d13x_JLC_rt-thread_helloworld。你可以用编号或全名来应用它scons --apply-def7或者scons --apply-defd13x_JLC_rt-thread_helloworld_defconfig这两个命令作用是一样的一个用文件编号一个用文件名。应用完默认配置后输入以下命令进入图形化配置菜单scons --menuconfig在menuconfig界面中用方向键找到并选中Porting code using the LCKFB module这个选项按Y键选中。按回车键进入Porting code using the LCKFB module的子菜单。在子菜单里找到Using SHT20 temperature and humidity sensor选项按Y键选中它。选中后前面会出现一个*号。最后按左右方向键选择Save保存配置然后一路退出menuconfig。4. 编译与烧录配置保存好后就可以编译工程了。在env命令行中输入编译命令scons如果你的电脑CPU核心多可以加-j参数加快编译速度比如scons -j16-j后面的数字表示使用的编译核心数可以根据自己电脑的情况调整。数字越大编译越快但别超过你CPU的实际核心数。编译成功后会在luban-lite/output/d13x_JLC_rt-thread_helloworld/images/目录下生成一个d13x_JLC_v1.0.0.img镜像文件。接下来你需要使用烧录工具如PhoenixSuit, Allwinner提供的工具等将这个img文件烧录到衡山派开发板中。具体的烧录教程请参考衡山派官方文档中的“镜像烧录”部分。5. 驱动代码解析烧录完成开发板启动后咱们来看看驱动代码具体是怎么工作的。理解代码有助于你后续的修改和调试。5.1 核心驱动文件 bsp_sht20.c这个文件实现了SHT20的初始化和数据读取函数。关键点1I2C总线与设备地址#define I2C_BUS_NAME i2c0 /* I2C总线设备名称 */ #define SLAVE_ADDR 0x40 /* 器件地址 */这里定义了SHT20连接在哪个I2C总线上i2c0以及它的设备地址0x40。你需要根据自己板子的实际硬件连接来确认这些信息。关键点2I2C读写函数驱动封装了两个基础的I2C读写函数write_data和read_data。它们内部调用了RT-Thread的rt_i2c_transfer接口这是RT-Thread的标准I2C设备操作函数屏蔽了底层硬件差异让驱动更具可移植性。关键点3初始化函数 SHT20_Init这个函数很简单就是通过设备名称i2c0在RT-Thread的设备框架中找到对应的I2C总线设备并获取它的操作句柄i2c_bus。如果找不到就会报错。关键点4数据读取函数 SHT20_Read这是最核心的函数。它的流程是发送温度测量命令0xF3。等待约100msaicos_mdelay(100)因为SHT20测量需要时间。从传感器读取2个字节的原始温度数据。使用公式原始数据 / 65536.0 * 175.72 - 46.85将原始值转换为实际温度值单位°C。同样的流程发送湿度命令0xF5等待读取并用公式原始数据 / 65536.0 * 125.0 - 6转换为实际湿度值单位%RH。注意这里的等待时间100ms是保守值确保测量完成。实际根据数据手册温度测量最长时间约85ms湿度约29ms。5.2 应用示例文件 test_sht20_temp_humi_sensor.c这个文件展示了如何在RT-Thread的多线程环境中使用SHT20驱动。它主要做了几件事创建线程test_sht20_sensor函数负责创建一个名为sht20_thread1的线程线程入口函数是sht20_thread_entry。线程工作在线程入口函数里先初始化SHT20然后进入一个无限循环。在循环中每隔1秒调用一次SHT20_Read函数读取温湿度并通过串口打印出来。命令导出使用MSH_CMD_EXPORT将test_sht20_sensor和test_exit_sht20_sensor这两个函数导出为FinSH shell命令。这样你就能在串口终端里通过输入命令来启动和停止传感器数据读取了。循环控制代码里有个while_count计数器每循环100次会提示用户可以通过输入test_exit_sht20_sensor命令来退出读取循环。6. 上机验证一切就绪让我们看看实际效果。将开发板通过USB转TTL模块连接到电脑以便进行串口调试。具体接线和串口工具设置请参考衡山派文档的“串口调试”部分。串口波特率默认为115200。给开发板上电在串口终端工具如Putty、MobaXterm等中你会看到RT-Thread的启动信息和命令行提示符msh 。在命令行中输入以下命令来启动SHT20数据读取线程test_sht20_sensor小技巧输入tes后按TAB键系统会自动补全命令为test_sht20_sensor。如果一切正常你将看到类似下面的输出find device: i2c0 Start Loop !! Read [SHT20] Temperature 25.60 Read [SHT20] Humidity 45.30数据会每秒更新一次。如果想停止读取输入命令test_exit_sht20_sensor线程会被删除并打印退出成功的消息。看到这里恭喜你你已经成功在衡山派开发板和RT-Thread系统上驱动了SHT20温湿度传感器。整个过程从获取驱动、配置工程、编译烧录到最终验证算是走完了一个完整的传感器移植流程。在实际项目中你可以参考这个线程模型把传感器数据通过Wi-Fi/蓝牙发送到云端或者结合其他传感器做出更复杂的应用。