DongshanPI-D1s开发板使用教程之SHT30温湿度传感器(I2C)数据读取

通过查阅D1s相关的资料,以及Linux开发的资料,经过测试,完成了SHT30温湿度传感器(I2C)数据读取的实例,现分享给大家。

一、硬件材料:

  1. D1s开发板:DongshanPI-D1s开发板
  2. SHT30温湿度传感器:I2C接口
  3. 连接线:杜邦线若干,需要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连接,再进行下面的操作。

  1. 执行i2cdetect -l 查看当前的I2C控制器:

    可以看到,当前可用的i2c设备为i2c-2
  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

实际执行效果如下:

读取显示数据的过程中,我对着传感器哈了气,所以温湿度都上升了。

1 个赞