在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎樣通過藍牙將ArduinoUno連接到Android

454398 ? 來源:wv ? 2019-10-05 17:30 ? 次閱讀

第1步:電路

怎樣通過藍牙將ArduinoUno連接到Android

組件:

1 x Arduino Uno

3 x 220歐姆電阻器

1 x綠色LED

1 x黃色LED

1 x紅色LED

1 x TMP36溫度傳感器

1 x JY-MCU藍牙從模塊(請參閱介紹)

1 x面包板

電線

連接:

步驟1):將Arduino的地線和5V連接到面包板。

步驟2):將LED放在面包板上,并將其陰極接地。將它們的陽極分別通過220歐姆電阻連接到數字引腳:黃色到引腳3,綠色到引腳4,紅色到引腳5。

步驟3):將TMP36傳感器放在面包板上,將其引腳連接到5V,接地和A0 Arduino引腳。

步驟4):將提供的電纜的一側連接到JY-MCU藍牙模塊,另一側連接到面包板;連接如下:

VCC 《-》 5V

GND 《-》 GND TXD 《-》引腳0(Rx)

RXD 《-》引腳1(Tx)

該草圖還將使用數字引腳13上的Arduino內置LED。

由于TXD轉到Rx,而RXD轉到,藍牙模塊的連接可能會有些混亂。 Tx:這是一個解釋。發送和接收是針對每個設備的,因此,藍牙模塊的TXD引腳發出的傳輸必須由Arduino在Rx引腳0上接收;同樣,從Arduino Tx引腳1發出的傳輸也必須到達其RXD引腳上的JY-MCU藍牙模塊。

警告:藍牙模塊可能會干擾PC與Arduino的通信:對電路板進行編程時,請斷開VCC。 (在我的測試中,情況并非如此,但請確保它不會造成任何傷害)。

步驟2:Arduino代碼-簡介

Arduino監聽命令以點亮某些LED或顯示其狀態。另外,定時器中斷使它可以通過TMP36傳感器檢查溫度:如果溫度大于閾值,則LED點亮;否則,指示燈熄滅。每n秒(其中n是通過應用設置的參數)會向該應用發送狀態報告。簡單的命令結構使應用程序可以將參數和值發送到Arduino,反之亦然。

程序中定義的命令結構為:

CMD RED | GREEN | YELLOW =開|關

CMD TMAX | SECONDS =值

CMD SECONDS =值

CMD狀態

狀態消息結構為:

狀態紅色|綠色|黃色| TMAX | SECONDS | TEMP | THIGH = value

Arduino將以完整狀態回答STATUS命令,而在中斷時它將報告較短的版本。

示例:

CMD RED = ON將紅色LED點亮

CMD GREEN = OFF將綠色LED熄滅

您可以通過在Arduino IDE的串行監視器中發出命令并查看響應來測試草圖:確保在底部的下拉選項中選擇“回車”。

您可以從附件中下載草圖代碼。下一步將對此進行詳細說明。

步驟3:Arduino代碼-詳細信息

上一步中所述的命令和消息結構

//串行參數:COM11 9600 8 N 1

// r或 n結束命令行

//藍牙處于針腳0和1,速度為9600

//命令結構//CMD RED | GREEN | YELLOW = ON | OFF

//CMD TMAX | SECONDS = value

//CMD SECONDS = value

//CMD STATUS

//狀態消息結構

//STATUS RED | GREEN | YELLOW | TMIN | TMAX | SECONDS | TEMP | THIGH = value

溫度控制所需變量的初始化

float maxTemp = 30.0;//當溫度》 maxTemp

int maxTempSensor =(int)((maxTemp/100 + .5)* 204.8);

浮點溫度= 0.0;

以后可以更改maxTemp,但是程序需要使用默認值開始。 maxTempSensor是將maxTemp轉換為Arduino ADC轉換器提供的0-1023范圍;溫度比較將通過我們希望盡快執行的中斷例程執行:直接比較整數Pin輸出值而不是浮點溫度更為有效。我們仍然要報告溫度,程序會將其以相同的名稱存儲在變量中。

如果您不熟悉溫度轉換公式,可以在這里查看。

maxSeconds也可以使用命令進行更改,但再次需要默認值

int maxSeconds = 10;//每maxSeconds

Pin常量聲明發送狀態消息

const int ledPin = 13;//溫度指示燈

const int tempPin = A0;//T36溫度傳感器模擬輸入引腳

const int led1Pin = 3;//黃色

const int led2Pin = 4;//Green

const int led3Pin = 5;//紅色

中斷例程中使用并從其外部訪問的變量

volatile int tempVal;

volatile int seconds = 0;

volatile boolean tempHigh = false;

volatile boolean statusReport = false;

Volatile是一個特殊的關鍵字,可防止編譯器執行某些優化:在中斷內修改的所有變量例程,并且必須在例程之外進行訪問,必須將其聲明為volatile,以表明其值可以隨時更改,并確保在需要時從內存中讀取最新的正確值。

命令字符串變量(稍后將對此進行說明)

字符串inputString =“”;

String command =“”;

字符串值=“”;

布爾stringComplete = false;

setup()函數

void setup(){

//開始串行連接

Serial.begin(9600);

Serial.print(“ Max T:”);

Serial.print(maxTemp);

Serial.print(“ Sensor:”);

Serial.println(maxTempSensor);

inputString.reserve(50);

command.reserve(50) ;

value.reserve(50);

pinMode(ledPin,OUTPUT);

digitalWrite(ledPin,LOW);

pinMode(led1Pin,OUTPUT);

pinMode(led2Pin,OUTPUT) ;

pinMode(led3Pin,OUTPUT);

digitalWrite(led1Pin,LOW);

digitalWrite(led2Pin,LOW);

digitalWrite(led3Pin,LOW);

字符串的reserve方法分配作為參數提供的字節數。

需要以下代碼來初始化計時器中斷并將其設置為每秒觸發一次,這是Arduino可以完成的最慢的時間。有關詳細信息,請參見此處。

cli();//禁用全局中斷

//初始化Timer1以中斷@ 1000毫秒

TCCR1A = 0;//將整個TCCR1A寄存器設置為0

TCCR1B = 0;//與TCCR1B

相同//將比較匹配寄存器設置為所需的計時器計數:

OCR1A = 15624;//打開CTC模式:

TCCR1B | =(1 《//為1024個預分頻器設置CS10和CS12位:

TCCR1B | =(1 《 TCCR1B | =(1 《//啟用計時器比較中斷:

TIMSK1 | =(1 《 sei();//啟用全局中斷

}

定時器中斷例程:我們無法更改其名稱,但內容是完全可定制的。/p》

ISR(TIMER1_COMPA_vect)

{

tempVal = AnalogRead(tempPin);

if(tempVal》 maxTempSensor){

digitalWrite(ledPin,HIGH);

tempHigh = true;

}

else {

digitalWrite(ledPin,LOW);

tempHigh = false;

}

溫度值-或如上文所述,從傳感器讀取其0-1023整數表示形式,并將其與閾值進行比較:當上面的內置LED點亮并且tempHigh設置為true時,否則關閉LED并 tempHigh設置為false。

如果(秒++》 = maxSeconds){

statusReport = true;

秒= 0;

}

}

請記住,每秒觸發一次中斷,但是我們希望報告系統狀態的頻率降低:秒變量在每次迭代時遞增,直到達到s報告到期時的值;稍后將在主循環中通過檢查statusReport標志來完成此操作。通常,永遠不要執行太慢的操作,例如從中斷例程中將數據寫入串行。

loop()函數在接收到指令后便會解釋并執行命令,然后如果計時器發出標志,則會報告狀態打斷。為了從串行緩沖區讀取字符串,loop()依賴于將在最后定義的serialEvent()函數:該例程在每次loop()運行之間運行。它沒有得到廣泛的記錄,并且可能不適用于所有的Arduino模型。無論如何,將其內容嵌套在主循環中并不難(請參見本步驟的結尾)。

void loop(){

int intValue = 0;

if(stringComplete){ boolean stringOK = false;

if(inputString.startsWith(“ CMD”)){

inputString = inputString.substring(4);

首先,我們檢查接收到的字符串是否以“ CMD”開頭:如果是這樣,我們可以丟棄前四個字符,否則稍后會出現錯誤。

int pos = inputString.indexOf(‘=’);

if(pos》 -1){

command = inputString.substring(0,pos);

value = inputString。 substring(pos + 1,inputString.length()-1);//提取最多 n個被排除的命令

有兩種類型的命令:設置值的命令,在其中找到分隔空格的“ =”值對,以及該命令是單個指令(STATUS)。如果pos處出現“ =”,則字符串將分為命令(左部分)和值(右部分),并將“ =”插入中間,并在行尾添加末尾字符。

如果(command.equals(“ RED”)){//RED = ON | OFF

value.equals(“ ON”)? digitalWrite(led3Pin,HIGH):digitalWrite(led3Pin,LOW);

stringOK = true;

}

否則if(command.equals(“ GREEN”)){//GREEN = ON | OFF

value.equals(“ ON”)嗎? digitalWrite(led2Pin,HIGH):digitalWrite(led2Pin,LOW);

stringOK = true;

}

否則if(command.equals(“ YELLOW”)){//YELLOW = ON | OFF

value.equals(“ ON”)嗎? digitalWrite(led1Pin,HIGH):digitalWrite(led1Pin,LOW);

stringOK = true;

}

我們檢查并執行LED命令;請注意,代碼僅檢查值ON:如果您寫入GREEN = ASD,它將被解釋為GREEN = OFF。它不是完美的,但是它使事情變得簡單得多。每次識別并執行命令時都會設置stringOK = true,以便以后標記錯誤的命令。

否則,如果(command.equals(“ TMAX”)){//TMAX =值

intValue = value.toInt();

如果(intValue》 0){

maxTemp = (float)intValue;

maxTempSensor =(int)((maxTemp/100 + .5)* 204.8);

stringOK = true;

}

}

否則,如果(command.equals(“ SECONDS”)){//SECONDS = value

intValue = value.toInt();

如果(intValue》 0){

maxSeconds = intValue;

stringOK = true;

}

}

當值應為數字時,我們需要將其轉換并測試它確實是一個數字。對于MaxTemp,我們還按照變量定義部分中的說明計算傳感器值

}//pos》 -1

else if(inputString.startsWith(“ STATUS”)){

Serial.print(“ STATUS RED =”);

Serial.println(digitalRead(led3Pin ));

Serial.print(“ STATUS GREEN =”);

Serial.println(digitalRead(led2Pin));

Serial.print(“ STATUS YELLOW =”);

Serial.println(digitalRead(led1Pin));

Serial.print(“ STATUS TMAX =“);

Serial.println(maxTemp);

Serial.print(” STATUS SECONDS =“);

Serial.println(maxSeconds);

Serial.print(“ STATUS TEMP =”);

Serial.println(temperature);

Serial.print(“ STATUS THIGH =”);

Serial.println(tempHigh);

stringOK = true ;

}//inputString.starts With(“ STATUS”)

如果命令是STATUS,則程序僅將所有信息輸出到串行。

}//inputString.startsWith (“ CMD”)

stringOK嗎? Serial.println(“ Command Executed”):Serial.println(“ Invalid Command”);

指示是否已收到有效或無效命令。

//清除字符串以進行下一次迭代

inputString =“”;

stringComplete = false;

}//stringComplete

下一次命令迭代的變量內務處理。

if(statusReport){

temperature =(tempVal * 0.0048828125-.5)* 100;

Serial.print(“ STATUS TEMP =”);

Serial.println(temperature);

Serial.print(“ STATUS THIGH =”);

Serial.println(tempHigh);

statusReport = false;

}

}

如果中斷例程已引發statusReport標志,則將打印一些信息請注意,此時要計算當前溫度值:因此,如果在statusReport時間間隔之間發出STATUS命令,則會得到舊的溫度值。

如前所述,只要新數據進入硬件串行RX,就會發生serialEvent()。該例程在每次loop()運行之間運行,因此在循環內部使用delay可以延遲響應。可能有多個字節的數據。

無效的serialEvent(){

而(Serial.available()){

//獲得新的字節:

char inChar =(char)Serial.read();

//將其添加到inputString:

inputString + = inChar;

//如果傳入字符是換行符或回車符,則設置標志

//,因此主循環可以對此做一些事情:

if(inChar ==‘ n’|| inChar ==‘ r’){

stringComplete = true;

}

}

}

從串行讀取每個字節并將其添加到輸入字符串,直到遇到“ n”或“ r”表示字符串結尾:在這種情況下,設置由loop()檢查的stringComplete標志。同時使用回車符 r和換行符 n確保代碼能夠從各種輸入(包括Arduino IDE串行監視器以外的其他串行終端)檢測字符串結尾。

關于藍牙和串行的注意事項

在許多示例中,包括JY-MCU賣方的示例,您可以找到連接在不同Arduino數字引腳(例如10和11)上的藍牙模塊,以及通過SoftwareSerial庫訪問。根據我的測試結果,當該模塊僅用于發送信息時,SoftwareSerial可以完美運行,但是在接收命令時Arduino Uno不夠快。我沒有嘗試降低SoftwareSerial連接的速度(在示例中通常設置為2400bps),因為MIT AppInventor應用似乎不支持藍牙連接速度設置。

使用SoftwareSerial,serialEvent()不會工作:需要重命名它(例如mySerialEvent())并在loop()的開頭顯式調用它。

步驟4:App Inventor代碼-簡介

在使用Android應用之前,您需要將Bluetooth模塊與智能手機配對。

給Arduino開發板通電,打開在Android手機上的藍牙上并搜索附近的藍牙設備:JY-MCU模塊將顯示為HC-06,配對密碼為1234。

藍牙Arduino連接的關鍵組件應用程序是藍牙客戶端,而Arduino板將充當服務器:這意味著應用程序將始終啟動連接。給Arduino開發板供電時,藍牙模塊紅色LED開始閃爍;按下應用程序的“連接到設備”按鈕,然后從列表中選擇模塊:紅色LED指示燈將變為穩定,連接狀態將變為“已連接”。

同樣,這與藍牙無關Master/Slave,但仍可能令人困惑:您的Bluetooth模塊需要為Slave,但它(或Arduino草圖)在客戶端中將充當Server-與Android應用程序進行服務器通信。

您可以直接從Android Play商店安裝Bluetooth Arduino Connection App,或者您可以通過下載附件將完整的應用程序代碼導入到MIT App Inventor項目中。

藍牙Arduino連接應用程序是使用MIT App Inventor 2開發的;以下步驟將提供詳細說明。

步驟5:App Inventor代碼-詳細信息

Arduino藍牙連接應用程序的關鍵組件是:

用于藍牙配對設備的ListPicker(ListPicker1)

3個按鈕,每個按鈕控制相應的配色板LED(RedLedBtn,GreenLedBtn,YellowLedBtn)

發送狀態命令(GetStatusBtn)的按鈕

帶有關聯按鈕的按鈕文本框以設置狀態報告間隔(SecondsBtn和SecondsTxBx)

巨大的多行狀態標簽,顯示從Arduino板(狀態)接收的信息

上一步(BluetoothClient1)

一個時鐘組件,該時鐘組件在客戶端連接時每秒觸發一次中斷(Clock1)

以下是基于以下內容的應用代碼說明:上面的圖片。

圖1

Variabl當打開應用程序屏幕時,將設置并初始化LED的狀態和間隔。

圖2

連接ListPicker對象ListPicker1使用兩種方法:

已準備好可用(配對)的藍牙設備的列表,并顯示給用戶

當用戶選擇設備時,將調用Bluetooth Client對象的Connect方法為了開始連接:如果成功,它將顯示在適當的標簽中,并激活Clock中斷,以便可以接收來自設備的消息。

圖3

在這里,我們演示如何向Arduino板發送命令。

按下GetStatusBtn時,將調用Bluetooth Client對象的SendText方法并執行文本命令發出:注意,在“ CMD STATUS”字符串的末尾添加了“ n”,以便Arduino草圖中的serialEvent()函數能夠知道消息何時結束。

代碼打開或關閉LED稍微復雜一點:

我們使用相應的變量來跟蹤其當前狀態:如果打開,我們想將其關閉,反之亦然;因此,首先,我們將變量更改為布爾值

,然后使用新狀態更新按鈕標簽

最后,調用BluetoothClient1.SendText來傳輸命令。

其他命令的代碼非常相似,因此未顯示。

圖4

每次Clock1計時器觸發,該例程被執行:它等效于Arduino的serialEvent();。如果BluetoothClient1接收到字節,則將它們復制到狀態標簽中。請注意,Bluetooth客戶端對象具有一種返回所接收消息長度的方法。

步驟6:結論

在此指導中,我演示了一個通過藍牙連接Arduino開發板和Android智能手機的有用方法。通信是雙向的,因此開發板不僅向應用程序報告其狀態,而且還從應用程序接收命令。

此外,一個簡單的擴展程序允許將Arduino的命令發送給應用程序。電話:例如:按下板上的按鈕即可拍照或發送短信。

Arduino草圖可以作為遠程命令處理的基礎,它使用中斷來執行一些操作-檢查溫度并打開LED警報-并發送狀態心跳信號:該技術不僅可以通過藍牙通信應用,還可以通過以太網等其他方式應用。

MIT App Inventor應用程序使用中斷同樣:它等效于Arduino的loop()+ serialEvent()函數的重復,并且類似地用于接收消息。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3966

    瀏覽量

    129640
  • 藍牙
    +關注

    關注

    116

    文章

    6042

    瀏覽量

    173286
  • Arduino
    +關注

    關注

    189

    文章

    6493

    瀏覽量

    190203
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    藍牙適配器連接技巧

    常重要的。市面上主要有以下幾種類型的藍牙適配器: USB藍牙適配器 :這是最常見的類型,通過USB接口連接到電腦或其他設備。 內置藍牙適配器
    的頭像 發表于 02-06 17:05 ?994次閱讀

    使用插件Excel連接到MySQL/MariaDB

    使用插件 Excel 連接到 MySQL/MariaDB 適用于 MySQL 的 Devart Excel 插件允許您將 Microsoft Excel 連接到 MySQL 或 MariaDB
    的頭像 發表于 01-20 12:38 ?539次閱讀
    使用插件<b class='flag-5'>將</b>Excel<b class='flag-5'>連接到</b>MySQL/MariaDB

    EE-219:字符LCD面板連接到ADSP-21262 SHARC DSP

    電子發燒友網站提供《EE-219:字符LCD面板連接到ADSP-21262 SHARC DSP.pdf》資料免費下載
    發表于 01-05 10:10 ?0次下載
    EE-219:<b class='flag-5'>將</b>字符LCD面板<b class='flag-5'>連接到</b>ADSP-21262 SHARC DSP

    在實際的電氣連接中,是直接Exposed Thermal Pad連接到AGND嗎?

    在閱讀ADS8568數據手冊時,在第6頁至第9頁無Exposed Thermal Pad介紹,通過查找的方式發現也無Exposed Thermal Pad相關介紹。請問在實際的電氣連接中,直接
    發表于 12-24 06:04

    ADS8402/ADS8412連接到TMS320C6713 DSP

    電子發燒友網站提供《ADS8402/ADS8412連接到TMS320C6713 DSP.pdf》資料免費下載
    發表于 10-23 10:18 ?0次下載
    <b class='flag-5'>將</b>ADS8402/ADS8412<b class='flag-5'>連接到</b>TMS320C6713 DSP

    ADS8320/ADS8325連接到TMS320C6711 DSP

    電子發燒友網站提供《ADS8320/ADS8325連接到TMS320C6711 DSP.pdf》資料免費下載
    發表于 10-23 10:09 ?0次下載
    <b class='flag-5'>將</b>ADS8320/ADS8325<b class='flag-5'>連接到</b>TMS320C6711 DSP

    ADS8401/ADS8411連接到TMS320C6713 DSP

    電子發燒友網站提供《ADS8401/ADS8411連接到TMS320C6713 DSP.pdf》資料免費下載
    發表于 10-23 10:09 ?0次下載
    <b class='flag-5'>將</b>ADS8401/ADS8411<b class='flag-5'>連接到</b>TMS320C6713 DSP

    ADS8383連接到TMS320C6711 DSP

    電子發燒友網站提供《ADS8383連接到TMS320C6711 DSP.pdf》資料免費下載
    發表于 10-23 09:36 ?0次下載
    <b class='flag-5'>將</b>ADS8383<b class='flag-5'>連接到</b>TMS320C6711 DSP

    LCD控制器連接到DM642視頻端口

    電子發燒友網站提供《LCD控制器連接到DM642視頻端口.pdf》資料免費下載
    發表于 10-17 10:42 ?0次下載
    <b class='flag-5'>將</b>LCD控制器<b class='flag-5'>連接到</b>DM642視頻端口

    使用SPIMSPM0–ADC連接到AM62x上

    電子發燒友網站提供《使用SPIMSPM0–ADC連接到AM62x上.pdf》資料免費下載
    發表于 08-30 10:27 ?0次下載
    使用SPI<b class='flag-5'>將</b>MSPM0–ADC<b class='flag-5'>連接到</b>AM62x上

    使用ESP8266arduino連接到thinkspeak云,無法將其連接到任何網頁,為什么?

    我正在嘗試使用 ESP8266 arduino 連接到 thinkspeak 云。所以我能夠 esp 模塊連接到我的家庭 wifi,但我無法將其
    發表于 07-16 07:43

    通過APPesp8266設備連接到AP遇到的疑問求解

    我正在嘗試通過樂鑫 APP(適用于 Android)將我的 esp8266 設備連接到我的 AP。但是,只有當AP有互聯網連接時,APP才能正常工作。有人能告訴我為什么嗎?互聯網
    發表于 07-15 07:48

    如何ESP-8266連接到Android

    我正在嘗試通過 android 連接到 esp8266。我在 android 上嘗試了以下代碼,但無法連接到 8266。 如果我缺少一些與
    發表于 07-15 06:27

    是否可以通過WPS連接到ESP8266 AP?

    是否可以通過 WPS 連接到ESP8266 AP(而不是通過 ESP8266 連接到具有 WPS 的路由器)? 我只找到了一種解決方案,可以
    發表于 07-10 06:09

    Android設備SDK更新到1.4.0后無法連接到ESP SoftAP怎么解決?

    SDK 從 1.2.0 更新到 1.4.0 后,一切看起來都很好,但是從某些設備(例如 Android 5.0、Android 4.4)我無法連接到 AP。例如,從iPhone或筆
    發表于 07-08 07:41
    主站蜘蛛池模板: 中文字幕在线观看一区 | 天天翘夜夜洗澡天天做 | 香蕉久久影院 | 好色999| 四虎黄色网 | 日本高清www | 午夜视频在线 | 中国一级特黄真人毛片免费看 | 国产日本久久久久久久久婷婷 | 深爱五月激情网 | 永久免费的啪啪免费的网址 | 久久精品国产精品亚洲人人 | 日本黄色大片在线观看 | 欧美123区 | 精品亚洲综合在线第一区 | 午夜免费福利在线观看 | 狠狠躁夜夜躁人人爽天天3 狠狠躁夜夜躁人人爽天天段 | 久久综合九色综合网站 | 久久免费精品国产72精品剧情 | 美女毛片免费 | 欧美性猛交xxx嘿人猛交 | 黄色小视频日本 | 天天澡天天摸天天添视频 | 色批| 奇米影视7777久久精品 | 亚洲一区二区在线免费观看 | 欧美大狠狠大臿蕉香蕉大视频 | 伊人久久大香线蕉综合爱婷婷 | 欧美卡一卡二卡新区网站 | 成人亚洲视频 | 日本68xxxxxxxxx59 日本68xxxxxxxxx老师 | 男女性高爱潮免费的国产 | 国产无遮挡床戏视频免费 | 天堂在线www在线资源 | 99精品在免费线视频 | 永久看免费bbbbb视频 | 国产综合精品久久久久成人影 | 日本天堂网在线观看 | 午夜激情小视频 | 成人精品亚洲 | 免费观看交性大片 |