如何使用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_host\usb_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, \r\n广告... ) != null )
        {
            isadvertising = true ;
        }
        if ( strstr (( char *)input, \r\n广告已停止。 ) != null )
        {
            isadvertising = false ;
        }
        if ( strstr (( char *)input, \r\nconnected ) != null )
        {
            isconnected =真;
            hal_gpio_writepin(gpioe, gpio_pin_1, gpio_pin_set);
        }
        if ( strstr (( char *)input, \r\ndisconnected ) != 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, \r\n灯泡是 %s\r\n , 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, \r\n灯泡是 %s\r\n , 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, \r\n(0 press )\r\n );
            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, \r\n(1 个按下的灯泡亮了!)\r\n );
            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, \r\n(2 按下灯泡关闭!)\r\n );
            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。
控制轻使用bleutooth低能
使用低功耗蓝牙控制灯光  
      连接  
      打开  
      turn off
创建一个名为 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 在浏览器上打开脚本。
您可以轻松连接到加密狗并从那里打开关闭灯。

全球最大FPGA的问世将给IC设计带来便利
慢雾科技发布了基于区块链技术的联盟链安全解决方案
JESD204B是FPGA中的新流行语吗
安捷伦收购Virtual Control人工智能技术_鼎阳科技获第六届中国IoT技术创新奖
采访赵海华:未来银行将是智慧化的数字银行
如何使用STM32制作启用BLE的智能灯泡
泰科电子举行在线研讨会应对散热及可靠性挑战
氮化镓行业产业链全景图分析
体感试衣镜将带我们重新享受智能线上的购物乐趣
高诱电系陶瓷电容器老化特性
浅谈安规Y电容在隔离电源的应用及接法
今日看点丨台积电首次提及 1.4nm 工艺技术,2nm 工艺按计划 2025 年量产;消息称字节跳动将取消下一代 VR 头显
百奥赛图科创板再募19亿 实控人债台高筑不得不借新还旧
射频同轴连接器的实用性能以及好坏效果影响
科创板虹软科技独立董事王慧介绍、履历信息
哪款轻薄电脑好?盘点2017年十款最佳轻薄超极本电脑
采用LabVIEW主控板自动测试系统设计
ModBus RTU 与 ModBus TCP
MP3听音乐注意方法
电池修复之水电瓶简单修复你也可以做到?