通过查阅D1s相关的资料,以及Linux开发的资料,经过测试,完成了SHT30温湿度传感器(I2C)数据读取的实例,现分享给大家。
一、硬件材料:
- D1s开发板:DongshanPI-D1s开发板
- SHT30温湿度传感器:I2C接口
- 连接线:杜邦线若干,需要2.0转2.54线;手头没有转接线,直接用测试钩
SHT30温湿度传感器:
二、原理图:
通过查看DongshanPI-D1s开发板的原理图,了解到I2C接口:
在上图的左下角,可以看到:
PE12:SCL
PE13:SDA
需要注意的是,默认系统中,开启的是I2C2。
三、接线:
VCC、GND使用3.3V、GND即可:
I2C的PE12、PE13在2.0引脚区域:
在正面接线:
四、编译固件:
默认的固件,已经开启了I2C,我们需要安装i2c-tools方便进行i2c设备的检测。
参考: DongshanPI-D1s开发板使用基础文档【编译、烧录、adb、gpio-led、c】 建议编译环境,及进行基础编译、打包、烧录。
在make之前,执行make menuconfig
,然后在Utilities
中开启i2c-tools:
然后就可以make FORCE_UNSAFE_CONFIGURE=1
,再pack
打包即可。
再使用 PhoeniSuit 烧录,就可以进行I2C的实际测试了。
五、I2C设备检测
DongshanPI-D1s开发板启动后,参考 DongshanPI-D1s开发板使用基础文档【编译、烧录、adb、gpio-led、c】 使用OTG接口通过adb连接,再进行下面的操作。
- 执行
i2cdetect -l
查看当前的I2C控制器:
可以看到,当前可用的i2c设备为i2c-2 - 执行
i2cdetect -r -y 2
,查看识别的I2C外部设备:
可以看到,温湿度传感器的地址0x44被识别出来了。
不同的传感器,设备地址可能不同,请仔细查阅所用设备的说明。
后续代码中,也要做对应的处理。
如果在列表中,没有看到传感器的地址,请仔细检查传感器的I2C的接线是否正常。
如果因为程序错误,导致I2C设备打开后,进入busy状态,那就把开发板断电,然后重新上电启动,再次进行检查。
六、编写代码,读取SHT30温湿度传感器(I2C)数据
原始代码,来自于: ControlEverythingCommunity/SHT30: Humidity and Temperature Sensor
然后,在编译tina固件的环境中,编写如下代码sht30_test3.c:
#include <stdio.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <fcntl.h>
void main()
{
// Create I2C bus
int file;
char *bus = "/dev/i2c-2";
if ((file = open(bus, O_RDWR)) < 0)
{
printf("Failed to open the bus. \n");
exit(1);
}
// Get I2C device, SHT30 I2C address is 0x44(68)
ioctl(file, I2C_SLAVE, 0x44);
// Send measurement command(0x2C)
// High repeatability measurement(0x06)
while(1)
{
char config[2] = {0};
config[0] = 0x2C;
config[1] = 0x06;
write(file, config, 2);
sleep(1);
// Read 6 bytes of data
// Temp msb, Temp lsb, Temp CRC, Humididty msb, Humidity lsb, Humidity CRC
char data[6] = {0};
if(read(file, data, 6) != 6)
{
printf("Erorr : Input/output Erorr \n");
}
else
{
// Convert the data
int temp = (data[0] * 256 + data[1]);
float cTemp = -45 + (175 * temp / 65535.0);
float fTemp = -49 + (315 * temp / 65535.0);
float humidity = 100 * (data[3] * 256 + data[4]) / 65535.0;
// Output data to screen
printf("Relative Humidity : %.2f RH \n", humidity);
printf("Temperature in Celsius : %.2f C \n", cTemp);
printf("Temperature in Fahrenheit : %.2f F \n", fTemp);
}
sleep(1);
}
}
上述代码的逻辑过于简单,所以不做特别说明,也就是打开I2C控制器,设置要通信的从设备地址,然后写入命令,读取输出,再输出。
七、编译代码并执行:
参考 DongshanPI-D1s开发板使用基础文档【编译、烧录、adb、gpio-led、c】 ,在编译tina固件的环境中编译C代码,具体指令如下:
export PATH=/sdk/tina-D1-H//prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/:$PATH
riscv64-unknown-linux-gnu-gcc -o sht30_test3 sht30_test3.c
然后,在主机中,将 sht30_test3 使用adb 发布到开发板上:
adb push sht30_test3 /root/
最后,到开发板上执行:
/root/sht30_test3
实际执行效果如下:
读取显示数据的过程中,我对着传感器哈了气,所以温湿度都上升了。