这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【nFR54L15Zephyr】基于OLED的温湿计

共2条 1/1 1 跳转至

【nFR54L15Zephyr】基于OLED的温湿计

高工
2026-05-06 20:37:16     打赏

【前言】

本项目在Nordic nRF54L15-DK开发板上,通过I2C接口同时连接SHT30温湿度传感器和SSD1306 OLED显示屏,实时显示环境温度和湿度数据。

【开发环境】

SDK版本:nRF Connect SDK v3.2.4

Toolchains:ncs zephyr rtos 3.2.4

【硬件连接】

image.png

【工程创建】

的nrf connect中的create a new application中新建一个基于sht3x的示例工程

【项目结构】

image.png

【工程修改】

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

【实验效果】

1554b78bc2d146c80e0b9cd96f8e4b0c.jpg





关键词: nFR54L15Zephyr     sht30     OLED    

专家
2026-05-07 08:05:40     打赏
2楼

谢谢分享


共2条 1/1 1 跳转至

回复

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