基于STM32的BLE智能灯泡

发布者:sky0001最新更新时间:2022-12-15 来源: zhihu关键字:STM32  BLE  智能灯泡 手机看文章 扫描二维码
随时随地手机看文章

本文将教您如何使用 STM32 制作启用 BLE 的智能灯泡。
家庭自动化涉及自动化家庭环境设备。为此,我们开发了一种易于安装的智能灯泡,并且可以通过网络浏览器或智能手机应用程序控制连接的设备。该项目的目的是使用网络浏览器或智能手机控制不同的家用电器。


一、介绍

该项目展示了一种使用 BleuIO Dongle 打开和关闭通过 5V 继电器连接到 STM32 Nucleo-144 的灯泡的简单方法。

您将需要两个加密狗,一个连接到 Nucleo 板,一个连接到计算机,运行 Web 脚本。

当 BleuIO Dongle 连接到 Nucleo 板的 USB 端口时,STM32 会识别它并直接开始广告。这允许另一个加密狗连接到它。

它还将接受来自 UART 的 3 个不同输入:

输入结果

0 向 BlueIO Dongle 发送 ATI(请求设备信息)命令。

1 手动打开灯泡

2 手动关闭灯泡

我们使用了STM32 Nucleo-144开发板和STM32H743ZI MCU(STM32H743ZI micro mbed-Enabled Development Nucleo-144 series ARM? Cortex?-M7 MCU 32-Bit Embedded Evaluation Board)作为例子。

如果您想使用其他设置,您必须确保它支持 USB 主机,并注意 GPIO 设置可能不同,可能需要在 .ioc 文件中重新配置。

警告 – 该项目涉及可能导致严重伤害或死亡的高电压。在对电路进行操作之前,请采取所有必要的预防措施,并关闭电路的所有电源。


2. 连接继电器

谨防:

试验交流电时请务必小心,触电会导致严重伤害!风险通知;免责声明

引脚排列和连接到STM32 对于继电器电路的直流部分,将S(信号)连接到STM32 NUCLEO 板上的引脚PE4,同时将电源(+)和地(-)分别连接到+5V 和GND。

3. 关于守则

这个项目基于我们之前的 STM32 项目 (https://github.com/smart-sensor-devices-ab/stm32_bleuio_example),在 .ioc 文件中有这些变化:

在引脚视图中,我们将 GPIO PE4 设置为 OUTPUT 并将其标记为“灯泡”。

在 USB_HOSTusb_host.c 中的 USBH_

CDC_ReceiveCallback 函数中,我们将 CDC_RX_Buffer 复制到一个名为 dongle_response 的外部变量中,该变量可从 main.c 文件访问。

在 main.c 中,我们创建了一个简单的解释器,以便我们可以对从加密狗接收到的数据做出反应。

void dongle_interpreter ( uint8_t * input)
{

if ( strlen (( char *)input) != 0 )
{
if ( strstr (( char *)input, "rn广告..." ) != NULL )
{
isAdvertising = true ;
}
if ( strstr (( char *)input, "rn广告已停止。" ) != NULL )
{
isAdvertising = false ;
}
if ( strstr (( char *)input, "rnCONNECTED" ) != NULL )
{
isConnected =真;
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_SET);
}
if ( strstr (( char *)input, "rnDISCONNECTED" ) != NULL )
{
isConnected = false ;
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_RESET);
}
if ( strstr (( char *)input, "L=0" ) != NULL )
{
isLightBulbOn = false ;
HAL_GPIO_WritePin(Lightbulb_GPIO_Port, Lightbulb_Pin, GPIO_PIN_RESET);

writeToDongle(( uint8_t *)DONGLE_SEND_LIGHT_OFF);

uart_buf_len = sprintf (uart_tx_buf, "rn灯泡是 %srn" , isLightBulbOn ? "on" : "off" );
HAL_UART_Transmit(&huart3, ( uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
}
if ( strstr (( char *)input, "L=1" ) != NULL )
{
isLightBulbOn = true ;
HAL_GPIO_WritePin(Lightbulb_GPIO_Port, Lightbulb_Pin, GPIO_PIN_SET);

writeToDongle(( uint8_t *)DONGLE_SEND_LIGHT_ON);

uart_buf_len = sprintf (uart_tx_buf, "rn灯泡是 %srn" , isLightBulbOn ? "on" : "off" );
HAL_UART_Transmit(&huart3, ( uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
}
}
memset (&dongle_response, 0 , RSP_SIZE);
}

我们还更新了 handleUartInput 函数,以便我们可以通过 UART 手动控制灯泡。

void handleUartInput (UARTCommandTypeDef cmd)
{
switch (cmd)
{
情况UART_RX_0:
{
// 0
uart_buf_len = sprintf (uart_tx_buf, "rn(0 press )rn" );
HAL_UART_Transmit(&huart3, ( uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
如果(isBleuIOReady)
{
writeToDongle(( uint8_t *)DONGLE_CMD_ATI);
}其他
{
uart_buf_len = sprintf (uart_tx_buf, BLEUIO_NOT_READY_MSG);
HAL_UART_Transmit(&huart3, ( uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
}
uartStatus = UART_RX_NONE;
打破;
}
情况UART_RX_1:
{
// 1
uart_buf_len = sprintf (uart_tx_buf, "rn(1 个按下的灯泡亮了!)rn" );
HAL_UART_Transmit(&huart3, ( uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
HAL_GPIO_WritePin(Lightbulb_GPIO_Port, Lightbulb_Pin, GPIO_PIN_SET);
uartStatus = UART_RX_NONE;
打破;
}
情况UART_RX_2:
{
// 2
uart_buf_len = sprintf (uart_tx_buf, "rn(2 按下灯泡关闭!)rn" );
HAL_UART_Transmit(&huart3, ( uint8_t *)uart_tx_buf, uart_buf_len, HAL_MAX_DELAY);
HAL_GPIO_WritePin(Lightbulb_GPIO_Port, Lightbulb_Pin, GPIO_PIN_RESET);

uartStatus = UART_RX_NONE;
打破;
}
情况UART_RX_NONE:
{
打破;
}
默认:
{
uartStatus = UART_RX_NONE;
打破;
}
}
}

我们将解释器函数放在主循环中。

4. 使用示例项目

4.1 你需要什么

  • 两个 BleuIO 加密狗

  • 加密狗的脚本(可在 web 脚本文件夹中的源代码中找到)

  • 带有带 USB 端口的 STM32 微控制器的板。(Nucleo-144 开发板:NUCLEO-H743ZI2,用于开发此示例。

  • 要将加密狗连接到 Nucleo 板,可以使用带有 USB A 母对母适配器的“USB A 到 Micro USB B”电缆。)

  • STM32CubeIDE

  • 一个 5V 继电器

  • 一个灯泡

5. 如何设置项目

5.1 从下方下载项目

克隆项目,或将其下载为 zip 文件并将其解压缩到您的 STM32CubeIDE 工作区中。

5.2 作为现有项目导入

从 STM32CubeIDE 中选择 File>Import...

然后选择 General>Existing Projects into Workspace 然后点击“Next>”

确保您在“选择根目录:”中选择了您的工作区

您应该会看到项目“stm32_bleuio_example”,检查它并单击“完成”。

6. 运行示例

在 STMCubeIDE 中,单击锤子图标以构建项目。

使用 TeraTerm、Putty 或 CoolTerm 等串行终端仿真程序打开“STMicroelectronics STLink 虚拟 COM 端口”。串行端口设置:

波特率:115200

数据位:8

奇偶校验:无

停止位:1

流量控制:无

在运行示例之前连接 BleuIO Dongle。

在 STMCubeIDE 中,单击绿色播放按钮闪烁并在您的板上运行它。第一次单击它时,将出现“运行配置”窗口。您可以保持原样,然后单击运行。

您应该会收到以下欢迎信息:

等到显示消息:“[BleuIO Dongle Ready]”。

您现在可以使用脚本连接另一个加密狗。

您还可以使用 uart 命令(0、1 或 2):

按 0 获取设备信息。

1 打开灯泡。

2 关闭灯泡。

加密狗响应将打印到 UART。

7. 从网络浏览器控制灯光

我们编写了一个简单的脚本,该脚本连接到加密狗并发送信号以从 Web 浏览器切换灯光。

为了让这个脚本工作,我们需要

  • 连接到计算机的 BleuIO USB 加密狗。

  • BleuIO javascript 库

  • Chrome 78 或更高版本,并且您需要在 chrome://flags 中启用 #enable-experimental-web-platform-features 标志

  • 一个网络打包器——(parcel js)

创建一个名为 index.html 的简单 Html 文件,它将用作脚本的前端。此 Html 文件包含一些按钮,可帮助连接到远程加密狗并向其发送信号,该加密狗已连接到 stm32。

< html lang = "en" >
< head >
< meta charset = "UTF-8" />
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" />
<元 名称= "viewport" content = "width=device-width, initial-scale=1.0" />
< link
href = "https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/ bootstrap.min.css”
rel = "样式表"
完整性= “sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3”
crossorigin = “匿名”
/>
<标题>控制轻使用Bleutooth低能

<体 类= “MT-5” >
< DIV 类= “容器MT-5” >
< h1 class = "mb-5" >使用低功耗蓝牙控制灯光
<按钮 类="btn btn-success" id = "connect" >连接
< button class = "btn btn-warning" id = "lightOn" disabled >打开
< button class = "btn btn-danger" id = "lightOf" disabled > Turn Off

< div class = "container mt-5">
<图片 ID= "light" src = "light_off.png" alt = "" />

< script src = "script.js" >

创建一个名为 script.js 的 js 文件并将其包含在 Html 文件的底部。该js文件使用BleuIO js库来编写AT命令并与其他加密狗通信。

import * as my_dongle from "bleuio" ;
const dongleToConnect = "[0]40:48:FD:E5:35:A5" ;
从"./light_on.png"导入lightOnImg ;
从"./light_off.png"导入lightOfImg ;
文档.getElementById( "connect" ).addEventListener( "click" , function () {
my_dongle.at_connect();
文档.getElementById( "lightOn" ).disabled = false ;
文档.getElementById( "lightOf" ).disabled = false ;
文档.getElementById( "connect" ).disabled = true ;
});

文档.getElementById( "lightOn" ) .addEventListener ( "click" , function () {
my_dongle
.ati ()
. 然后((数据) => {
//米AKE中央如果 不
如果(JSON.stringify(数据).includes( “外设”)){
控制台的.log( “周边”);
my_dongle.at_central()。then ( (x) => {
console .log( "central now" );
});
}
})
. then ( () => {
//连接到加密狗
my_dongle
.at_getconn()
. then ( (y) => {
if (JSON.stringify(y).includes(dongleToConnect)) {
console .log( "already connected" );
}其他{
my_dongle.at_gapconnect(dongleToConnect)。then ( () => {
console .log( "连接成功" );
});
}
})
. then ( () => {
//发送命令控制灯光
my_dongle.at_spssend( "L=1" )。then ( () => {
console .log( "Turned on" );
document .getElementById( "light" ).src = lightOnImg;
});
});
});
});

文档.getElementById( "lightOf" ) .addEventListener ( "click" , function () {
my_dongle
.ati ()
. 然后((数据) => {
//米AKE中央如果 不
如果(JSON.stringify(数据).includes( “外设”)){
控制台的.log( “周边”);
my_dongle.at_central()。then ( (x) => {
console .log( "central now" );
});
}
})
. then ( () => {
//连接到加密狗
my_dongle
.at_getconn()
. then ( (y) => {
if (JSON.stringify(y).includes(dongleToConnect)) {
console .log( "already connected" );
}其他{
my_dongle.at_gapconnect(dongleToConnect)。then ( () => {
console .log( "连接成功" );
});
}
})
. then ( () => {
//发送命令控制灯光
my_dongle.at_spssend( "L=0" )。then ( () => {
console .log( "Turned off" );
document .getElementById( "light" ).src = lightOfImg;
});
});
});
});

脚本js文件有三个按钮动作;连接和控制灯。

现在我们需要知道另一个连接到STM32的加密狗的ID,以便我们可以连接到它。您可以使用此 Web 终端获取加密狗 ID。

- 打开此站点 https://bleuio.com/web_terminal.html 并单击连接到加密狗。

- 选择合适的端口进行连接。

- 一旦它说已连接,输入**“ATI”**。这将显示加密狗信息和当前状态。

- 如果加密狗处于外围角色,请通过键入 **"AT+CENTRAL"** 将其设置为中央

- 现在通过键入 **"AT+GAPSCAN"** 进行间隙扫描

- 在列表中看到您的加密狗后,按 control+c 停止扫描

- 复制 ID 并将其粘贴到脚本 (script.js) 第 2 行中

您将需要一个网络捆绑器。你可以使用parcel.js

安装parcel js后,转到根目录并输入“parcel index.html”。这将启动您的开发环境。

使用parcel js 在浏览器上打开脚本。

您可以轻松连接到加密狗并从那里打开关闭灯。


关键字:STM32  BLE  智能灯泡 引用地址:基于STM32的BLE智能灯泡

上一篇:STM32的SPI外设片选只有一个,怎么破?
下一篇:STM32常用的开发工具有哪些

推荐阅读最新更新时间:2024-11-13 05:22

关于PWM模式
首先,本人虽然初学STM32但极力反对一种误人子弟的观点:“对于STM32这样级别的MCU,有库函数就不用去看寄存器怎么操作的了!” 好了,言归正传,最近总看到很多朋友对于PWM这个实验有很多的疑惑,看到原子也在极力的回复也挺累的(体谅一下幸苦的原子大神,(*^__^*) ),所以我打算写这么一篇文字来阐述一下我个人对STM32的PWM的理解。 首先来说,你要使用PWM模式你得先选择用那个定时器来输出PWM吧!除了TIM6、TIM7这两个普通的定时器无法输出PWM外,其余的定时器都可以输出PWM,每个通用定时器可以输出4路PWM,高级定时器TIM1、TIM8每个可输出7路PWM,这里为了方便起见,我们选择与实验相同的TIM3的
[单片机]
STM32 Boot模式设置方法
1、模式设置 Boot模式设实际指的就是选择启动的起始地址区域,在STM32F20x和STM32F21x中存在以下三种模式可供选择,分别为片内Flash、系统内存、片内SRAM: 2、BOOT Pin值确认 BOOT引脚值在系统复位的4个系统时钟周期后被锁存,同时BOOT1引脚实际与GPIO引脚共享一外部接口,在4个系统时钟周期后则会被释放可作为GPIO使用。 BOOT引脚值会在待机模式后被重新检测,在待机模式中BOOT引脚状态要保持正确 3、ST Embedded Bootloader 在System Memory中预置了bootloader用于对片内Flash进行IAP, 其使用如下接口: -USART1 -US
[单片机]
STM32下载不成功问题汇总
在某宝上买了五个最小系统核心板是STM32F103C8T6的芯片,刚拿到手准备下载程序调试,上电后板子自带LED闪烁,这是商家自己下载的示例程序,说明芯片工作着,用KEIL4进行下载自己程序,把自己编译好的程序下载。用的JLINK的四线下载调试下载口,SW的调试接口,点击下载后发现擦除成功,下载失败,提示: Load ..\Output\STM32-DEMO.axf Set JLink Project File to F:文件RFID程序电机USERJLinkSettings.ini * JLink Info: Device STM32F103T8 selected (64 KB flash, 20 KB RAM).
[单片机]
<font color='red'>STM32</font>下载不成功问题汇总
STM32学习笔记(6) 串口通信数据包解析
串口的数据解析代码 /** * 函数名:UART1_Handler() * 功能: 串口1的中断服务函数 * 入口参数:无 * 引脚: 无 * USART1_RX_STA:串口一的接收状态标志位 * USART1_BUFF :缓冲区(存储数据),串口长度 */ u16 USART1_RX_STA; u16 USART1_BUFF ; void USART1_IRQHandler() { u8 Res; if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) { Res=USART_ReceiveData(USART1);
[单片机]
<font color='red'>STM32</font>学习笔记(6) 串口通信数据包解析
STM32基于库函数工程模板
#下载stm32官方(标准库/HAL库)下载链接 http://www.openedv.com/thread-295843-1-1.html ##文件夹介绍: Libraries文件夹下面有CMSIS和STM32F4XX_StdPeriph_Driver两个目录,这两个目录包含固件库核心的所有子文件夹和文件。 1.CMSIS文件夹存放的是符合CMSIS规范的一些文件。包括STM32F4核内外设访问层代码。DSP库,RTOS API,以及STM32F4片上外设访问层代码等。 2.STM32F4XX_StdPeriph_Driver放的是标准外设库源码文件和对应的头文件。inc目录存放的是stm32f4xx_ppp.h头文件,无
[单片机]
<font color='red'>STM32</font>基于库函数工程模板
ARM开发(10)基于STM32的通用定时器中断控制蜂鸣器响
一 通用定时器原理: 1.1 本实验实现通用定时器中断控制蜂鸣器1s鸣叫一次。 1.2 实验思路:理解中断控制寄存器,DMA/中断使能寄存器,预分频寄存器,初始化定时器参数,中断优先级设置,编写中断服务函数,中断服务函数里面我们实现蜂鸣器1s鸣叫一次 1.3 开发环境 : MDK5 库函数版本开发 JLINK仿真 二 实验步骤: 2.1 timer.h代码: #ifndef __TIMER_H #define __TIMER_H #include sys.h void TIM3_Int_Init(u16 arr,u16 psc); #endif 1 2 3 4 5 2.2 timer.c代码(通用定时器参
[单片机]
基于STM32点亮LED灯
我们在控制模块中所使用的处理器是Cortex-M4系列中的STM32F407VE,这个处理器芯片有100个引脚,其中包含一些电源供电引脚、外部晶振引脚、SWD程序烧录引脚和我们最常用的GPIO功能引脚: 实际上,我们使用的GPIO并不多,我们只使用了3路AD采集、Uart1和Uart2、I2C1、Tim3和Tim4的PWM输出引脚以及几个普通GPIO脚(具体使用情况请参照《控制模块》)。STM32有丰富的硬件资源供我们使用,例如:AD采集、串口、I2C、SPI、SDIO、CAN、USB_OTG_FS、USB_OTG_HS、I2S、PWM输出、PWM采集、GPIO输入输出等。在这一节里我们将完成STM32的第一个小程序:点亮LE
[单片机]
基于<font color='red'>STM32</font>点亮LED灯
STM32串口操作相关事项
放了一段时间,对stm32似乎有点陌生,总结一下! (基于3.0固件库,芯片stm32f103rbt6) 1、配置串口的管脚和时钟 由于串口1、2是在GPIOA上: 所以要是能串口GPIOA、AFIO和1或者2的串口时钟,代码如下: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE); 2、对串口的具体物理管脚进行相应的配置: /* A9 USART1_Tx */ GPIO_InitStructure.GPIO_Pin = GPIO_Pi
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
    做任何事情之前,一定要想好目标。没有目标的事情是做不好的,也做不成。我的目标就是学习ARM开发,当然是深入的学习。目标如下 :1、学习A ...
  • 学习ARM开发(2)
    天是星期天,刚好在家里休息。又是学习ARM的大好时机了。早上起得很早,因为都想着怎么样搞好这个ARM开发环境,总是心急的。搞得睡觉,也睡 ...
  • 学习ARM开发(4)
  • 学习ARM开发(6)
  • 学习ARM开发(7)
  • 学习ARM开发(8)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved