这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【nFR54L15Zephyr】蓝牙实现LED控制

共3条 1/1 1 跳转至

【nFR54L15Zephyr】蓝牙实现LED控制

高工
2026-05-05 12:25:51     打赏

【前言】

在前面按键控制LED工程添加蓝牙控制逻辑

1、工程创建

在zephyr目录下面的app目录下面添加工程nrf54l15_led_button文件夹。

添加prj.conf、CMakeLists.txt以及src目录下面的main.c

2、文件内容:

prj.conf

CONFIG_GPIO=y

# Bluetooth BLE
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DIS=y
CONFIG_BT_DEVICE_NAME="NRF54L15_LED"
CONFIG_LOG=y
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048

在prj.conf中打开BLE配置,同时实现名称为NRF54L15_LED的设备。

CMakeLists.txt

cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(nrf54l15_led_button)

target_sources(app PRIVATE src/main.c)

main.c

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/sys/printk.h>

#define LED0_NODE DT_ALIAS(led0)
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET_OR(LED0_NODE, gpios, {0});

#define BUTTON0_NODE DT_ALIAS(sw0)
static const struct gpio_dt_spec button = GPIO_DT_SPEC_GET_OR(BUTTON0_NODE, gpios, {0});

static struct gpio_callback button_cb_data;
static bool led_state;

static void button_callback(const struct device *dev, struct gpio_callback *cb, uint32_t pins)
{
    if (pins & BIT(button.pin)) {
        /* Toggle LED state */
        led_state = !led_state;
        gpio_pin_set_dt(&led, led_state ? 0 : 1);

        if (led_state) {
            printk("[BTN] LED ONn");
        } else {
            printk("[BTN] LED OFFn");
        }
    }
}

int main(void)
{
    int ret;

    printk("=================================n");
    printk("nRF54L15-DK LED/Button Testn");
    printk("=================================n");

    if (!device_is_ready(led.port)) {
        printk("LED device not readyn");
        return -ENODEV;
    }
    led_state = false;
    ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_INACTIVE);
    if (ret != 0) {
        printk("LED config failed: %dn", ret);
        return ret;
    }

    if (!device_is_ready(button.port)) {
        printk("Button device not readyn");
        return -ENODEV;
    }
    ret = gpio_pin_configure_dt(&button, GPIO_INPUT | GPIO_PULL_UP);
    if (ret != 0) {
        printk("Button config failed: %dn", ret);
        return ret;
    }

    ret = gpio_pin_interrupt_configure_dt(&button, GPIO_INT_EDGE_FALLING);
    if (ret != 0) {
        printk("Interrupt config failed: %dn", ret);
        return ret;
    }

    gpio_init_callback(&button_cb_data, button_callback, BIT(button.pin));
    gpio_add_callback(button.port, &button_cb_data);

    printk("Ready! Press button SW1 on the board.n");

    while (1) {
        k_sleep(K_SECONDS(1));
    }

    return 0;
}

在prj.conf中开启shell、log实现日志打印,开启GPIO实现按键与LED灯

在main.c中注册按键的回调函数,同时添加led_state,实现LED灯翻转。

write_led这个是蓝牙接收回调函数,实现接收到数据后解析,如果是0x01就开启LED,如果接收0x00就关闭LED.

【编译与下载】

west build -b nrf54l15dk/nrf54l15/cpuapp
(.venv) PS D:zephyr_w71appnrf54l15_led_button> west flash -r jlink
-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner jlink
-- runners.jlink: reset after flashing requested
-- runners.jlink: JLink version: 9.24a
-- runners.jlink: Flashing file: D:zephyr_w71appnrf54l15_led_buttonbuildzephyrzephyr.hex

由于开发板上有jlink-ob因此指定下载工具为jlink。

【实验效果】

下载好开发板后, nRF Connect for Mobile 等 BLE 工具连接设备,写入 01 或 00 到 Characteristic 0x5678 来控制 LED。

image.png





关键词: nFR54L15Zephyr     蓝牙    

院士
2026-05-05 15:36:52     打赏
2楼

谢谢分享,学习了。


专家
2026-05-07 08:07:26     打赏
3楼

谢谢分享


共3条 1/1 1 跳转至

回复

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