历史上的今天
返回首页

历史上的今天

今天是:2025年12月15日(星期一)

正在发生

2022年12月15日 | 基于STM32的BLE智能灯泡

2022-12-15 来源:zhihu

本文将教您如何使用 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?imageView2/2/w/550" 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?imageView2/2/w/550"导入lightOnImg ;
从"./light_off.png?imageView2/2/w/550"导入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 在浏览器上打开脚本。

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


推荐阅读

史海拾趣

南京绿芯(Grenergy)公司的发展小趣事

对于电子消毒柜电路,网友可能的问题涉及多个方面,包括故障排查、日常维护、使用注意事项等。以下是一些可能的问题及详细回答:

一、故障排查类问题

1. 消毒柜通电后跳闸怎么办?

回答
消毒柜通电后跳闸可能是由电路短路引起的。首先,检查电源插座的火线(L)、零线(N)、地线(E)是否接线正确。其次,按照消毒柜上的线路图检查柜内线路接线是否正确,以及线路绝缘层是否被破坏(如被螺丝钻破、被金属边角划破等)。如果以上检查均正常,可能是电源板或继电器等部件损坏,建议联系专业维修人员进行检查和更换。

2. 消毒柜插上电源后无法启动,指示灯不亮怎么办?

回答
消毒柜无法启动且指示灯不亮,可能是由以下原因造成:电源插座无电或接触不良、熔断器烧坏、电源线与机体接触不良或断路、变压器烧坏或断路、电路板烧坏、继电器失灵等。解决方法包括检查电源插座、更换熔断器、检查并修复线路、更换电路板或继电器等。如果问题依然存在,建议联系专业维修人员进行检查。

二、日常维护类问题

1. 消毒柜需要定期清洁哪些部位?

回答
消毒柜需要定期清洁的部位包括柜体内部、层架、门封条以及散热孔等。清洁时,应使用柔软的布或海绵,避免使用腐蚀性强的清洁剂。同时,要注意不要将水溅入电路板等电子元件区域,以免造成短路或损坏。

2. 消毒柜的电源线应该如何保养?

回答
消毒柜的电源线应定期检查是否老化或破损,如有发现应及时更换。在使用过程中,应避免电源线过度弯折或受到重物压迫,以免影响其使用寿命和安全性。此外,电源线应远离高温、潮湿和腐蚀性强的环境,以确保其绝缘性能不受影响。

三、使用注意事项类问题

1. 消毒柜在使用时需要注意哪些安全问题?

回答
消毒柜在使用时需要注意以下安全问题:

  • 确保电源插座接地良好,避免漏电危险。
  • 不要将易燃易爆物品放入消毒柜内,以免发生火灾或爆炸。
  • 在使用过程中,应避免频繁开关柜门,以免影响消毒效果和能耗。
  • 使用完毕后,应及时关闭电源并拔掉插头,以节约能源和延长设备使用寿命。

2. 消毒柜是否可以一直插电使用?

回答
消毒柜是否可以一直插电使用取决于用户的使用情况和需求。如果用户经常使用消毒柜且没有其他特殊需求,可以保持电源连接;如果用户不经常使用消毒柜或者有其他特殊需求(如节约能源、避免设备老化等),建议在使用前提前通电,并在非使用状态下拔掉电源。此外,为了确保安全,插座应具备防水、防漏电等功能。

综上所述,对于电子消毒柜电路的问题,网友可能关注故障排查、日常维护和使用注意事项等方面。通过了解这些问题的解决方法和注意事项,可以更好地使用和维护消毒柜,确保其正常运行和延长使用寿命。

Fastron公司的发展小趣事

Fastron公司一直将技术创新作为企业发展的核心动力。自创立以来,公司不断投入研发资源,致力于电感器技术的创新。Fastron生产的符合RoHS标准的高质量电感器和线圈,如AEC-Q200级产品,得到了市场的广泛认可。这些产品不仅具有高性能和长寿命,还能满足客户多样化的需求。

Avery Dennison公司的发展小趣事

1990年,Avery Adhesives与Dennison Manufacturing合并,成立了Avery Dennison公司。这一合并不仅增强了公司的实力,也为其全球扩张提供了有力支持。此后,Avery Dennison通过在欧洲建立工厂、收购其他公司等方式,不断拓展其业务版图。如今,公司的业务已经遍及50多个国家,成为全球领先的标签与包装材料解决方案提供商。

DDK公司的发展小趣事

DDK公司自创立之初,便以技术创新为核心竞争力。公司投入大量研发资源,不断探索新的电子技术和材料,力求在激烈的市场竞争中脱颖而出。在经历了数次技术突破后,DDK公司成功研发出了一款高性能、低能耗的芯片产品,这一产品迅速在市场上获得了广泛认可,为DDK公司赢得了良好的口碑和市场份额。

DIPTRONICS MANUFACTURING INC公司的发展小趣事

在稳定国内市场的基础上,圜达实业积极拓展海外市场。凭借优良的品质和快速的交期,公司的产品逐渐打入国际市场,并赢得了众多客户的信赖。如今,圜达实业的产品已营销至全球100余个国家,遍及五大洲。

Herrmann Kg公司的发展小趣事

Herrmann Kg凭借其卓越的产品质量和专业的服务,赢得了全球众多领先客户的信赖。例如,CUSTOMCELLS®作为一家全球领先的客户专用锂电池开发商,在生产过程中采用了Herrmann Kg的超声波焊接系统,有效降低了废品率,提高了生产效率。这种深度合作不仅展示了Herrmann Kg在电池制造领域的专业能力,也进一步巩固了其在全球市场中的地位。通过不断满足客户的特定需求,Herrmann Kg在电子及其他相关行业中树立了良好的口碑。

问答坊 | AI 解惑

μC/OS—II的嵌入式串口通信模块设计

在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。μC/OS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位不同框架的微处理器上。但μC/OS-II仅是一个 ...…

查看全部问答>

不知道大家的示波器程序进展如何?

不知道大家的程序进展如何?是否可以和大家分享一下呢? [ 本帖最后由 daicheng 于 2009-8-13 16:45 编辑 ]…

查看全部问答>

【藏书阁】射频电路设计理论与应用

目录: 第1章 引言 .. 1.1 射频设计的重要性 .. 1.2 量纲和单位 .. 1.3 频谱 .. 1.4 无源元件的射频特性 .. 〖DW〗1.4.1 高频电阻 .. 〖DW〗1.4.2 高频电容 .. 〖DW〗1.4.3 高频电感 .. 1.5 片状元件及对电路板的考虑 . 1.5.1 片状电阻 ...…

查看全部问答>

监控摄像头监控蔬菜了

上海正全力加强158个迎世博重点蔬菜基地的建设,强化生产基地的监管,建立健全农产品质量安全可追溯体系。闵行区农委世博蔬菜基地除在场区实行全天候巡逻外,还在农田蔬菜大棚和装运车间安装了监控摄像头,实现世博重点蔬菜基地生产和运输过程的有 ...…

查看全部问答>

关于采样保持电路的问题

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 哪位大虾可以指导一下关于采样保持电路的几个问题: 1、最常用的有哪些芯片 2、电路应该如何设计及各个部分的作用是什么 3、AD的是否影响采样保持电路芯片的选择,如果有还麻烦您讲解一下啊 再 ...…

查看全部问答>

基于MOSFET内部结构设计优化的驱动电路

功率MOSFET具有开关速度快,导通电阻小等优点,因此在开关电源,马达控制等电子系统中的应用越来越广。通常在实际的设计过程中,电子工程师对其的驱动电路以及驱动电路的参数调整并不是十分关注,尤其是从来没有基于MOSFET内部的微观结构去考虑驱动 ...…

查看全部问答>

RVDS或者ADS环境下开发C++工程

     我在RVDS环境下把以前能够通过的c源代码的工程改为c++的工程,但是发生连接错误找不到Main函数:      Undefined symbol Main (referred from 2440init.o)。请大虾指点…

查看全部问答>

T9输入法 购买

问下大家:我们想购买T9输入法,但是http://www.t9.com/该产品根本没有提供联系方式呀,只要我留言,但是我留了又发不出去,真急人。有了解的朋友帮帮我哦:)…

查看全部问答>

[提建议]建立一个语音教学及互动平台

[提建议]建立一个语音教学及互动平台 我相信在坛子里面的学生应该不少吧。想在EEWorld里学到一些实践的经验和如何做项目。 我们论坛中已经有了 但是,我觉得我们eeworld是还会有更多的想法和活动的. 如:     链接:https:/ ...…

查看全部问答>