日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

arduino蓝牙通讯代码_手机与Arduino蓝牙串口通讯实验及完整例程

發布時間:2023/12/16 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arduino蓝牙通讯代码_手机与Arduino蓝牙串口通讯实验及完整例程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

安卓手機與Arduino之間采用藍牙串口通訊,是很多智能裝置和互動裝置常用的控制方法,簡單而有效,無需網絡環境,很實用的技術。

實驗采用Arduino UNO板,加了一塊1602LCD屏做顯示(因為只有一個串口,用來做藍牙通訊,再用串口助手不方便,也不直觀)。藍牙模塊使用十幾元一個的HC-06。一個LED接在11腳作為演示。手機端做了一個簡單的界面,有按鍵和滑動條。用按鍵控制LED點亮和熄滅,演示開關量控制。滑動條控制LED的亮度,演示模擬量控制(0-100范圍)。LCD屏實時顯示傳送的數據。模塊接線按標準接法,大家都玩過的,請參考各種教程或書籍。硬件圖片如下。

關于藍牙串口通訊的幾個要點:

1. Arduino的串口,print()和println()函數都是用ASCII字符的方式傳送數據,無論是int、float還是string,都自動轉換成ASCII碼傳送。其中println()函數在傳送的數據后面加了回車和換行符("\r"和"\n")。換行符正好可以作為結束符來讓手機端識別。

2. 藍牙串口是異步傳輸方式,每次Serial.read()只讀一個字節,在一個loop()循環中可能收不全一條數據信息,必須要有一個全局變量來收集接收到的字符。如果要通訊可靠,使用結束符來確定收到了一條完整的信息,是非常必要的。手機端也是一樣。

3. 例程中用的Serial.parseInt()函數,作用是在收到的字符流中,找到數字字符,并累積在一起,直到收到一個非數字字符時,將前面收到的數字字符轉換成一個整數。如果要傳送多個數值,中間用逗號等分隔符隔開即可。比如三個數值,”12,325,993“,后面加一個自定義的結束符,作為字符串發給Arduino。(例程中用字符"X”作為結束符。)這樣接收數據完整而可靠。接收float可以用Serial.parseFloat()函數,用法一樣。

安卓手機端可以用藍牙串口助手APP。但是建議自己寫一個簡單的APP,才真正完整的知道怎么通訊。再說了,如果真的做一個產品或服務,總是要自己做手機端APP的,藍牙串口助理不能當產品用。

Arduino完整例程如下。IDE 1.6.3編譯通過,運行正常。歡迎大家修改使用,完全開源。例程內有詳細注釋。

/* 本例程演示從手機藍牙串口接收指令,點亮或熄滅11腳的LED,或者調整亮度。

* 接收指令格式:“101X”點亮,“102X"熄滅,”000X"調整亮度。(000為0-100的整數,表示亮度值,X是結束符。)

* 串口是異步接收的,用parseInt()查找第一個有效整數,檢測到結束符后開始處理。

* 接收數據顯示在1602LCD屏上。

* 點亮或熄滅LED后,將收到數據回傳給手機。用pringln()函數,數據后面加了"\r"和"\n"兩個字符,可以用作結束符。

* 串口傳送的是ASCII字符,數據格式可以自動轉換。

*/

#include? ?? ?? ?? ?? ?? ?// 包含LCD庫。

#include

LiquidCrystal_I2C lcd(0x27,16,2);??// 初始化LCD對象,地址為0x27,每行16個字符,共兩行。

int p;? ?? ?? ?? ?? ?? ?? ?? ?? ???// 定義整數型全局變量,保存接收的數據。

voidsetup(){

lcd.init();? ?? ?? ?? ?? ?? ?? ? // 初始化LCD。

lcd.backlight();? ?? ?? ?? ?? ???// 打開LCD背光。

Serial.begin(9600);? ?? ?? ?? ???// 打開串口(藍牙)

pinMode(11,OUTPUT);? ?? ?? ?? ???// 定義11腳為輸出。(數字或PWM)

}

voidloop(){

while (Serial.available() > 0) {? ?// 串口收到字符數大于零。

p = Serial.parseInt();? ?? ?? ???// 在串口數據流中查找一個有效整數。

if (Serial.read() == 'X') {? ?? ?// 收到結束符后開始處理數據。

lcd.clear();? ?? ?? ?? ?? ?? ? // LCD清屏。

lcd.print(p);? ?? ?? ?? ?? ?? ?// LCD顯示收到的數據(整數)。

switch (p) {? ?? ?? ?? ?? ?? ? // 判斷數據內容。

case 101:

digitalWrite(11,HIGH);? ?? ? // 點亮LED。

Serial.println(p);? ?? ?? ???// 回傳數據。

break;

case 102:

digitalWrite(11,LOW);? ?? ???// 熄滅LED。

Serial.println(p);? ?? ?? ???// 回傳數據。

break;

default:

p = map(p,0,100,0,255);? ?? ?// 轉換數據范圍到PWM輸出值。

analogWrite(11,p);? ?? ?? ???// 調整LED亮度。(PWM)

}

}

}

}

機端編程用的是E4A中文安卓編程軟件,簡單省力。基本功能都是齊全的。現在版本是4.7

/* 本例程通過藍牙串口發送指令給Arduino,點亮或熄滅LED,也可以通過滑塊調整LED亮度.

* 手機界面上的按鍵1發送"101X",點亮LED,按鍵2發送"102X",熄滅LED.

* 拖動界面上的滑塊后,發送0-100之間的整數,表示亮度值,后面加一個"X"為結束符..

* 接收Arduino傳回的數據,收到"101X",滑塊到最大位置.收到"102X",滑塊的最小位置.

* 藍牙串口接收是異步的,必須在收到數據事件中累積收到的ASCII字符,檢測到結束符后再處理.

* Arduino的println()函數發出的數據后面會加上回車和換行符,可以作為結束符使用.

* 處理數據時或轉換格式時,要去掉回車換行符.(字符長度要減2).

*/

變量 返回值 為 文本型? ???// 定義全局變量,保存接收數據.

事件 主窗口.創建完畢()

返回值 = ""

如果 藍牙1.是否已開啟() = 假 則? ???//開啟手機藍牙.

藍牙1.開啟藍牙()

結束 如果

結束 事件

事件 藍牙1.藍牙設置完畢(設置結果 為 整數型)

判斷 設置結果

分支 1? ?? ?? ???//藍牙已開啟.

彈出提示("藍牙已開啟")

藍牙1.置可被發現()? ?? ?? ???//置可被發現

分支 2? ?? ?? ?? ?? ?? ?? ?? ?'藍牙未開啟

信息框("信息","藍牙未被開啟,程序將退出!","確定")

結束程序()

分支 3? ?? ?? ?? ?? ?? ?? ???//已置可被發現

彈出提示("藍牙已設置為可被發現")

分支 4? ?? ?? ?? ?? ?? ?? ???//不可被發現

信息框("信息","藍牙未被設置為可被發現,程序將退出!","確定")

結束程序()

結束 判斷

藍牙1.置工作模式(1)? ?? ? //置工作模式為串口通訊.

結束 事件

事件 按鈕10.被單擊()

藍牙1.搜索設備()? ?? ?? ? //搜索設備

彈出提示("正在搜索")

結束 事件

事件 藍牙1.發現設備(設備名稱 為 文本型,設備地址 為 文本型,是否已配對 為 邏輯型)? ?//發現藍牙設備.

列表框1.可視 = 真? ?? ?? ?? ?//顯示列表框.

列表框1.添加項目(設備名稱 & "_" & 設備地址 & "_" & 是否已配對)? ?//列表框顯示搜索到的藍牙設備.

結束 事件

事件 列表框1.表項被單擊(項目索引 為 整數型)? ?? ?? ?? ?//單擊列表框選擇要通訊的設備.

變量 設備信息 為 文本型

變量 文本數組 為 文本型()

變量 設備地址 為 文本型

設備信息 = 列表框1.取項目內容(項目索引)

文本數組 = 分割文本(設備信息,"_")? ?? ?? ???//可以自定義分隔符,不要與設備名稱重復即可..

設備地址 = 文本數組(1)

彈出提示(設備地址)

藍牙1.連接設備(設備地址)? ?? ?? ???//連接設備

彈出提示("正在連接")

結束 事件

事件 藍牙1.連接完畢(連接結果 為 邏輯型,設備名稱 為 文本型,設備地址 為 文本型,連接模式 為 整數型)

如果 連接結果 = 真 則? ?? ???//已連接設備,關閉列表框顯示.

列表框1.可視 = 假

主窗口.標題 = "已連接:" & 設備名稱

彈出提示("連接成功")

否則

彈出提示("連接失敗")? ?? ?? ?//連接失敗,可以點擊列表框再次連接.

結束 如果

結束 事件

事件 藍牙1.收到數據(數據 為 字節型(),設備名稱 為 文本型,設備地址 為 文本型)? ? //收到串口數據

返回值 = 返回值 & 字節到文本(數據,"UTF8")? ?? ? //累積到文本變量中.

如果??取文本右邊(返回值,1) = "\n" 則? ?? ?? ?? ?? ? //發現結束符后開始處理數據.

判斷 取文本左邊(返回值,取文本長度(返回值)-2)? ???//去掉回車換行符,

分支 "101"? ?? ?? ?? ?? ???//滑塊到最大值.

水平滑塊條1.位置 = 100

分支 "102"? ?? ?? ?? ?? ???//滑塊到最小值.

水平滑塊條1.位置 = 0

結束 判斷

返回值 = ""? ?? ???//清空接收字符串,等待下一次接收.

結束 如果

結束 事件

事件 按鈕1.被單擊()

藍牙1.發送數據(文本到字節("101X","UTF8"))? ?? ?//按鍵1發送.

結束 事件

事件 按鈕11.被單擊()? ?? ?? ?? ?//結束按鈕點擊處理.

藍牙1.發送數據(文本到字節("102X","UTF8"))? ???//關掉LED.

藍牙1.斷開連接()? ?? ?? ?? ?//退出處理,釋放資源,結束內部處理線程

結束程序()

結束 事件

事件 按鈕2.被單擊()

藍牙1.發送數據(文本到字節("102X","UTF8"))? ?//按鍵2發送.

結束 事件

事件 水平滑塊條1.停止拖動()? ???//滑塊動作處理.

變量 數值 為 文本型

數值 = 整數到文本(水平滑塊條1.位置) & "X"? ? //添加結束符.

藍牙1.發送數據(文本到字節(數值,"UTF8"))? ?? ?//發送滑塊位置數據.

結束 事件

總結

以上是生活随笔為你收集整理的arduino蓝牙通讯代码_手机与Arduino蓝牙串口通讯实验及完整例程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。