这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【nRF7002DK】基于sht30的温湿度计

共1条 1/1 1 跳转至

【nRF7002DK】基于sht30的温湿度计

工程师
2025-03-23 09:12:23   被打赏 20 分(兑奖)     打赏

【前言】

在前面我驱动了OLED屏,帖子地址为:【nRF7002DK】硬件I2C驱动OLED屏-电子产品世界论坛

前面只用到了I2C的写,这次使用SHT30,需要用了I2C的读功能,本篇就分享如何驱动SHT0温湿度计,最后显示到OLED屏上,制作一个简易的温湿度计。

【实现步骤】

1、复制一个sht3x的工程到BSP文件夹下(源文件我会附上)。并把工程添加进CMakeLists.txt中。

image.png

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的节点:

image.png

修改后的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、修改写入以及读取功能函数

image.png

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屏上。

image.png

【总结】

Zephry提供了非常优秀的功能,使得I2C的使用非常简单。

附源码:

ssd1306_sht30.zip





关键词: nRF7002DK     OLED     Zephry     IIC    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]