【前言】
在前面我驱动了OLED屏,帖子地址为:【nRF7002DK】硬件I2C驱动OLED屏-电子产品世界论坛
前面只用到了I2C的写,这次使用SHT30,需要用了I2C的读功能,本篇就分享如何驱动SHT0温湿度计,最后显示到OLED屏上,制作一个简易的温湿度计。
【实现步骤】
1、复制一个sht3x的工程到BSP文件夹下(源文件我会附上)。并把工程添加进CMakeLists.txt中。

CMakeLists.txt
add_library(BSP INTERFACE) target_include_directories(BSP INTERFACE ./ssd1306 ./sht3x ) target_sources(BSP INTERFACE ./ssd1306/oled.c ./ssd1306/gui.c ./sht3x/sht3x.c )
2、将以下配置选项添加到 prj.conf以启用对浮点格式说明符的支持,因此我们可以将温度读数打印为浮点数。默认情况下不启用此选项的原因是为了节省内存空间,因为启用此选项会使代码大小至少增加1Kbytes。
CONFIG_CBPRINTF_FP_SUPPORT=y
3、修改Devicetree,在i2c的dts下面添加sht3x的节点:

修改后的nrf7002dk_nrf5340_cpuapp_ns.overlay内容如下:
&i2c1 {
status = "okay";
pinctrl-0 = <&i2c1_default>;
pinctrl-1 = <&i2c1_sleep>;
pinctrl-names = "default", "sleep";
ssd1306: ssd1306@3c {
compatible = "i2c-device";
status = "okay";
reg = <0x3c>;
};
sht3x: sht3x@44 {
compatible = "i2c-device";
status = "okay";
reg = <0x44>;
};
clock-frequency = <I2C_BITRATE_FAST>;
};
&pinctrl {
/omit-if-no-ref/ i2c1_default: i2c1_default {
group1 {
psels = <NRF_PSEL(TWIM_SCL, 1, 14)>,
<NRF_PSEL(TWIM_SDA, 1, 15)>;
};
};
/omit-if-no-ref/ i2c1_sleep: i2c1_sleep {
group1 {
psels = <NRF_PSEL(TWIM_SCL, 1, 14)>,
<NRF_PSEL(TWIM_SDA, 1, 15)>;
low-power-enable;
};
};
};4、打开sht3x.c添加获取传感器的节点标识符
#define I2C1_NODE DT_NODELABEL(sht3x) static const struct i2c_dt_spec dev_sht3x = I2C_DT_SPEC_GET(I2C1_NODE);
5、修改写入以及读取功能函数

6、添加初始化sht30的函数:
int sht3x_dev_init(void)
{
if (!device_is_ready(dev_sht3x.bus))
{
printk("Device %s is not readyn", dev_sht3x.bus->name);
return -1;
}
return 0;
}
void sht3x_init(void)
{
sht3x_dev_init();
SHT30_SoftReset();
}7、在main.c中添加sht30的初始化以及读取显示代码:
OLED_Init();
OLED_Clear(0);
GUI_ShowString(0, 0, "hello world", 16, 1);
OLED_Display();
sht3x_init();
while (1)
{
ret = gpio_pin_toggle_dt(&led);
if (ret < 0) {
return 0;
}
led_state = !led_state;
OLED_Clear(0);
GUI_ShowString(0, 0, "NRF7002_SHT30", 16, 1);
get_temp(&temperature, &humidity);
printf("Temperature: %.2f C, Humidity: %.2f%%n", temperature, humidity);
sprintf(show_buffer, "%.2f C", temperature);
GUI_ShowString(0, 16, show_buffer, 16, 1);
sprintf(show_buffer, "%.2f %%", humidity);
GUI_ShowString(0, 32, show_buffer, 16, 1);
OLED_Display();
k_msleep(SLEEP_TIME_MS);
}【实验效果】
下载到开发板后,可以成功的读取了温湿度,并显示到OLED屏上。

【总结】
Zephry提供了非常优秀的功能,使得I2C的使用非常简单。
附源码:
我要赚赏金
