本文將教您如何使用 STM32 制作啟用 BLE 的智能燈泡。
家庭自動(dòng)化涉及自動(dòng)化家庭環(huán)境設(shè)備。為此,我們開發(fā)了一種易于安裝的智能燈泡,并且可以通過網(wǎng)絡(luò)瀏覽器或智能手機(jī)應(yīng)用程序控制連接的設(shè)備。該項(xiàng)目的目的是使用網(wǎng)絡(luò)瀏覽器或智能手機(jī)控制不同的家用電器。
一、介紹
該項(xiàng)目展示了一種使用 BleuIO Dongle 打開和關(guān)閉通過 5V 繼電器連接到 STM32 Nucleo-144 的燈泡的簡(jiǎn)單方法。
您將需要兩個(gè)加密狗,一個(gè)連接到 Nucleo 板,一個(gè)連接到計(jì)算機(jī),運(yùn)行 Web 腳本。
當(dāng) BleuIO Dongle 連接到 Nucleo 板的 USB 端口時(shí),STM32 會(huì)識(shí)別它并直接開始廣告。這允許另一個(gè)加密狗連接到它。
它還將接受來自 UART 的 3 個(gè)不同輸入:
輸入結(jié)果
0 向 BlueIO Dongle 發(fā)送 ATI(請(qǐng)求設(shè)備信息)命令。
1 手動(dòng)打開燈泡
2 手動(dòng)關(guān)閉燈泡
我們使用了STM32 Nucleo-144開發(fā)板和STM32H743ZI MCU(STM32H743ZI micro mbed-Enabled Development Nucleo-144 series ARM? Cortex?-M7 MCU 32-Bit Embedded Evaluation Board)作為例子。
如果您想使用其他設(shè)置,您必須確保它支持 USB 主機(jī),并注意 GPIO 設(shè)置可能不同,可能需要在 .ioc 文件中重新配置。
警告 – 該項(xiàng)目涉及可能導(dǎo)致嚴(yán)重傷害或死亡的高電壓。在對(duì)電路進(jìn)行操作之前,請(qǐng)采取所有必要的預(yù)防措施,并關(guān)閉電路的所有電源。
2. 連接繼電器
謹(jǐn)防:
試驗(yàn)交流電時(shí)請(qǐng)務(wù)必小心,觸電會(huì)導(dǎo)致嚴(yán)重傷害!風(fēng)險(xiǎn)通知;免責(zé)聲明
引腳排列和連接到STM32 對(duì)于繼電器電路的直流部分,將S(信號(hào))連接到STM32 NUCLEO 板上的引腳PE4,同時(shí)將電源(+)和地(-)分別連接到+5V 和GND。
3. 關(guān)于守則
這個(gè)項(xiàng)目基于我們之前的 STM32 項(xiàng)目 (https://github.com/smart-sensor-devices-ab/stm32_bleuio_example),在 .ioc 文件中有這些變化:
在引腳視圖中,我們將 GPIO PE4 設(shè)置為 OUTPUT 并將其標(biāo)記為“燈泡”。
在 USB_HOST\usb_host.c 中的 USBH_CDC_ReceiveCallback 函數(shù)中,我們將 CDC_RX_Buffer 復(fù)制到一個(gè)名為 dongle_response 的外部變量中,該變量可從 main.c 文件訪問。
在 main.c 中,我們創(chuàng)建了一個(gè)簡(jiǎn)單的解釋器,以便我們可以對(duì)從加密狗接收到的數(shù)據(jù)做出反應(yīng)。
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 函數(shù),以便我們可以通過 UART 手動(dòng)控制燈泡。
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 個(gè)按下的燈泡亮了!)\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 按下燈泡關(guān)閉!)\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:
{
打破;
}
默認(rèn):
{
uartStatus = UART_RX_NONE;
打破;
}
}
}
我們將解釋器函數(shù)放在主循環(huán)中。
4. 使用示例項(xiàng)目
4.1 你需要什么
兩個(gè) BleuIO 加密狗
加密狗的腳本(可在 web 腳本文件夾中的源代碼中找到)
帶有帶 USB 端口的 STM32 微控制器的板。(Nucleo-144 開發(fā)板:NUCLEO-H743ZI2,用于開發(fā)此示例。
要將加密狗連接到 Nucleo 板,可以使用帶有 USB A 母對(duì)母適配器的“USB A 到 Micro USB B”電纜。)
STM32CubeIDE
一個(gè) 5V 繼電器
一個(gè)燈泡
5. 如何設(shè)置項(xiàng)目
5.1 從下方下載項(xiàng)目
克隆項(xiàng)目,或?qū)⑵湎螺d為 zip 文件并將其解壓縮到您的 STM32CubeIDE 工作區(qū)中。
5.2 作為現(xiàn)有項(xiàng)目導(dǎo)入
從 STM32CubeIDE 中選擇 File》Import.。。
然后選擇 General》Existing Projects into Workspace 然后點(diǎn)擊“Next》”
確保您在“選擇根目錄:”中選擇了您的工作區(qū)
您應(yīng)該會(huì)看到項(xiàng)目“stm32_bleuio_example”,檢查它并單擊“完成”。
6. 運(yùn)行示例
在 STMCubeIDE 中,單擊錘子圖標(biāo)以構(gòu)建項(xiàng)目。
使用 TeraTerm、Putty 或 CoolTerm 等串行終端仿真程序打開“STMicroelectronics STLink 虛擬 COM 端口”。串行端口設(shè)置:
波特率:115200
數(shù)據(jù)位:8
奇偶校驗(yàn):無
停止位:1
流量控制:無
在運(yùn)行示例之前連接 BleuIO Dongle。
在 STMCubeIDE 中,單擊綠色播放按鈕閃爍并在您的板上運(yùn)行它。第一次單擊它時(shí),將出現(xiàn)“運(yùn)行配置”窗口。您可以保持原樣,然后單擊運(yùn)行。
您應(yīng)該會(huì)收到以下歡迎信息:
等到顯示消息:“[BleuIO Dongle Ready]”。
您現(xiàn)在可以使用腳本連接另一個(gè)加密狗。
您還可以使用 uart 命令(0、1 或 2):
按 0 獲取設(shè)備信息。
1 打開燈泡。
2 關(guān)閉燈泡。
加密狗響應(yīng)將打印到 UART。
7. 從網(wǎng)絡(luò)瀏覽器控制燈光
我們編寫了一個(gè)簡(jiǎn)單的腳本,該腳本連接到加密狗并發(fā)送信號(hào)以從 Web 瀏覽器切換燈光。
為了讓這個(gè)腳本工作,我們需要
連接到計(jì)算機(jī)的 BleuIO USB 加密狗。
BleuIO javascript 庫(kù)
Chrome 78 或更高版本,并且您需要在 chrome://flags 中啟用 #enable-experimental-web-platform-features 標(biāo)志
一個(gè)網(wǎng)絡(luò)打包器——(parcel js)
創(chuàng)建一個(gè)名為 index.html 的簡(jiǎn)單 Html 文件,它將用作腳本的前端。此 Html 文件包含一些按鈕,可幫助連接到遠(yuǎn)程加密狗并向其發(fā)送信號(hào),該加密狗已連接到 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/[email protected]/dist/css/ bootstrap.min.css”
rel = "樣式表"
完整性= “sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3”
crossorigin = “匿名”
/>
<標(biāo)題>控制輕使用Bleutooth低能
<體 類= “MT-5” >
< DIV 類= “容器MT-5” >
< h1 ?class = "mb-5" >使用低功耗藍(lán)牙控制燈光
<按鈕 類="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" >
創(chuàng)建一個(gè)名為 script.js 的 js 文件并將其包含在 Html 文件的底部。該js文件使用BleuIO js庫(kù)來編寫AT命令并與其他加密狗通信。
import * as my_dongle from "bleuio" ;
const dongleToConnect = "[0]40:48:FD:E5:35:A5" ;
從"./light_on.png"導(dǎo)入lightOnImg ;
從"./light_off.png"導(dǎo)入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 ()
. 然后((數(shù)據(jù)) => {
//米AKE中央如果 不
如果(JSON.stringify(數(shù)據(jù)).includes( “外設(shè)”)){
控制臺(tái)的.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 ( () => {
//發(fā)送命令控制燈光
my_dongle.at_spssend( "L=1" )。then ( () => {
console .log( "Turned on" );
document .getElementById( "light" ).src = lightOnImg;
});
});
});
});
文檔.getElementById( "lightOf" ) .addEventListener ( "click" , function () {
my_dongle
.ati ()
. 然后((數(shù)據(jù)) => {
//米AKE中央如果 不
如果(JSON.stringify(數(shù)據(jù)).includes( “外設(shè)”)){
控制臺(tái)的.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 ( () => {
//發(fā)送命令控制燈光
my_dongle.at_spssend( "L=0" )。then ( () => {
console .log( "Turned off" );
document .getElementById( "light" ).src = lightOfImg;
});
});
});
});
腳本js文件有三個(gè)按鈕動(dòng)作;連接和控制燈。
現(xiàn)在我們需要知道另一個(gè)連接到STM32的加密狗的ID,以便我們可以連接到它。您可以使用此 Web 終端獲取加密狗 ID。
- 打開此站點(diǎn) https://bleuio.com/web_terminal.html 并單擊連接到加密狗。
- 選擇合適的端口進(jìn)行連接。
- 一旦它說已連接,輸入**“ATI”**。這將顯示加密狗信息和當(dāng)前狀態(tài)。
- 如果加密狗處于外圍角色,請(qǐng)通過鍵入 **”AT+CENTRAL“** 將其設(shè)置為中央
- 現(xiàn)在通過鍵入 **”AT+GAPSCAN“** 進(jìn)行間隙掃描
- 在列表中看到您的加密狗后,按 control+c 停止掃描
- 復(fù)制 ID 并將其粘貼到腳本 (script.js) 第 2 行中
您將需要一個(gè)網(wǎng)絡(luò)捆綁器。你可以使用parcel.js
安裝parcel js后,轉(zhuǎn)到根目錄并輸入“parcel index.html”。這將啟動(dòng)您的開發(fā)環(huán)境。
使用parcel js 在瀏覽器上打開腳本。
您可以輕松連接到加密狗并從那里打開關(guān)閉燈。
-
STM32
+關(guān)注
關(guān)注
2272文章
10925瀏覽量
357707 -
BLE
+關(guān)注
關(guān)注
12文章
670瀏覽量
59606 -
智能燈泡
+關(guān)注
關(guān)注
5文章
76瀏覽量
35662
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
智能燈泡拆解圖
STM32CubeIDE為啟用了BLE的STM32WB生成的任何程序都會(huì)掛起怎么解決?
STM32WB BLE無法啟用調(diào)試UART是何原因呢
如何使用STMCubeIDE在STM32WB5MMG中啟用BLE和USB(DFU 模式)?
燈泡沒有WiFi也智能 智能燈泡顯個(gè)性
LED智能燈泡有什么用?體驗(yàn)智能家居從智能燈泡開始?
stm32wb55 基于rtt的ble sample制作過程
![<b class='flag-5'>stm32</b>wb55 基于rtt的<b class='flag-5'>ble</b> sample<b class='flag-5'>制作</b>過程](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
如何利用ESP32和Arduino制作BLE檢測(cè)器
![如何利用ESP32和Arduino<b class='flag-5'>制作</b><b class='flag-5'>BLE</b>檢測(cè)器](https://file.elecfans.com/web2/M00/5D/95/pYYBAGLyJLuAARXlAAF58oVg1ME310.png)
制作一個(gè)適合當(dāng)前吸頂燈的智能燈泡
![<b class='flag-5'>制作</b>一個(gè)適合當(dāng)前吸頂燈的<b class='flag-5'>智能</b><b class='flag-5'>燈泡</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32WB BLE應(yīng)用低功耗設(shè)計(jì)
![<b class='flag-5'>STM32</b>WB <b class='flag-5'>BLE</b>應(yīng)用低功耗設(shè)計(jì)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32WB55RG開發(fā)(3)----生成 BLE 程序連接手機(jī)APP
![<b class='flag-5'>STM32</b>WB55RG開發(fā)(3)----生成 <b class='flag-5'>BLE</b> 程序連接手機(jī)APP](https://file1.elecfans.com/web3/M00/02/75/wKgZPGdf2H-AEoxXAAYYCxH3dnU800.png)
評(píng)論