【前言】
在前面我驱动了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的使用非常简单。
附源码: