【前言】
本项目在Nordic nRF54L15-DK开发板上,通过I2C接口同时连接SHT30温湿度传感器和SSD1306 OLED显示屏,实时显示环境温度和湿度数据。【开发环境】
SDK版本:nRF Connect SDK v3.2.4
Toolchains:ncs zephyr rtos 3.2.4
【硬件连接】

【工程创建】
的nrf connect中的create a new application中新建一个基于sht3x的示例工程
【项目结构】

【工程修改】
1、prj.conf
CONFIG_STDOUT_CONSOLE=y CONFIG_I2C=y CONFIG_SENSOR=y CONFIG_CBPRINTF_FP_SUPPORT=y CONFIG_DISPLAY=y CONFIG_LOG=y CONFIG_CHARACTER_FRAMEBUFFER=y CONFIG_CHARACTER_FRAMEBUFFER_USE_DEFAULT_FONTS=y CONFIG_HEAP_MEM_POOL_SIZE=4096
配置说明:
CONFIG_DISPLAY - 启用显示子系统
CONFIG_CHARACTER_FRAMEBUFFER - 字符帧缓冲,支持文本显示
CONFIG_HEAP_MEM_POOL_SIZE - 堆内存大小,cfb需要此配置
【设备树overlay】
boards/nrf54l15dk_nrf54l15_cpuapp.overlay
/ {
aliases {
console = &uart20;
};
chosen {
zephyr,display = &ssd1306_oled;
};
};
&uart20 {
status = "okay";
};
&gpio1 {
status = "okay";
};
&gpio2 {
status = "okay";
};
&i2c21 {
status = "okay";
pinctrl-0 = <&i2c21_default>;
pinctrl-1 = <&i2c21_sleep>;
pinctrl-names = "default", "sleep";
zephyr,concat-buf-size = <2048>;
sht3xd@44 {
compatible = "sensirion,sht3xd";
reg = <0x44>;
status = "okay";
};
ssd1306_oled: ssd1306@3c {
compatible = "solomon,ssd1306fb";
reg = <0x3c>;
width = <128>;
height = <64>;
segment-offset = <0>;
page-offset = <0>;
display-offset = <0>;
multiplex-ratio = <63>;
segment-remap;
com-invdir;
prechargep = <0x22>;
status = "okay";
};
};
&pinctrl {
i2c21_default: i2c21_default {
group1 {
psels = <NRF_PSEL(TWIM_SDA, 1, 12)>,
<NRF_PSEL(TWIM_SCL, 1, 11)>;
bias-pull-up;
};
};
i2c21_sleep: i2c21_sleep {
group1 {
psels = <NRF_PSEL(TWIM_SDA, 1, 12)>,
<NRF_PSEL(TWIM_SCL, 1, 11)>;
low-power-enable;
bias-pull-up;
};
};
};关键配置说明:
zephyr,concat-buf-size = <2048> - 必须设置,否则SSD1306驱动会报I2C缓冲区不足错误
chosen { zephyr,display = &ssd1306_oled; } - 指定默认显示设备
-两个设备共用I2C21总线,并联连接
2、main.c
/*
* Copyright (c) 2018 Peter Bigot Consulting, LLC
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/display/cfb.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
const struct device *const sht3xd_dev = DEVICE_DT_GET_ONE(sensirion_sht3xd);
const struct device *display_dev;
int rc;
if (!device_is_ready(sht3xd_dev)) {
printf("Error: SHT3XD device not ready\n");
return 0;
}
printf("SHT3XD sensor initialized\n");
#ifdef CONFIG_SSD1306
display_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_display));
if (!device_is_ready(display_dev)) {
printf("Error: Display device not ready\n");
return 0;
}
display_set_pixel_format(display_dev, PIXEL_FORMAT_MONO10);
cfb_framebuffer_init(display_dev);
cfb_framebuffer_clear(display_dev, true);
display_blanking_off(display_dev);
display_set_contrast(display_dev, 200);
#endif
char temp_str[32];
char hum_str[32];
while (true) {
struct sensor_value temp, hum;
rc = sensor_sample_fetch(sht3xd_dev);
if (rc == 0) {
sensor_channel_get(sht3xd_dev, SENSOR_CHAN_AMBIENT_TEMP, &temp);
}
if (rc == 0) {
sensor_channel_get(sht3xd_dev, SENSOR_CHAN_HUMIDITY, &hum);
}
printf("SHT3XD: %.2f Cel ; %.2f %%RH\n",
sensor_value_to_double(&temp),
sensor_value_to_double(&hum));
#ifdef CONFIG_SSD1306
snprintf(temp_str, sizeof(temp_str), "T:%.1fC H:%.1f%%",
sensor_value_to_double(&temp),
sensor_value_to_double(&hum));
cfb_framebuffer_clear(display_dev, false);
cfb_framebuffer_set_font(display_dev, 0);
cfb_print(display_dev, "NRF54L15_SHT30", 0, 0);
cfb_framebuffer_set_font(display_dev, 1);
cfb_print(display_dev, temp_str, 0, 16);
cfb_framebuffer_finalize(display_dev);
#endif
k_sleep(K_MSEC(2000));
}
return 0;
}【构建与烧录】
# 构建 west build -b nrf54l15dk_nrf54l15_cpuapp . # 烧录 west flash
【实验效果】

我要赚赏金
