手機與Arduino藍牙串口通訊實驗及完整例程


http://www.arduino.cn/thread-16311-1-1.html 轉載來源,原作者謝謝你!

能夠干自己喜歡的工作,學習自己喜歡的知識,讀自己喜歡讀的書,這就是目前我能夠追求的幸福!

 

安卓手機與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 <Wire.h>                  // 包含LCD庫。
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // 初始化LCD對象,地址為0x27,每行16個字符,共兩行。
int p;                             // 定義整數型全局變量,保存接收的數據。
 
void setup() {
  lcd.init();                      // 初始化LCD。
  lcd.backlight();                 // 打開LCD背光。
  Serial.begin(9600);              // 打開串口(藍牙)
  pinMode(11,OUTPUT);              // 定義11腳為輸出。(數字或PWM)
}
 
void loop() {
  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)
      }
    }
  }
}

 ========================================================================

https://jingyan.baidu.com/article/d45ad148b252a969552b80db.html  這個看着比較靠譜

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM