第1步:電話部分
電話部分
貝爾模型202電話(或1930年至1970年的任何撥號(hào)電話)
仿古木制雪茄盒
DF Robot Bluno Nano
Deek-Robot Nano終端適配器
SPI Micro SD讀卡器
Micro SD卡
220歐姆電阻器(連接到耳機(jī)揚(yáng)聲器)
2x 10K歐姆電阻(連接到電話撥號(hào))
母電源插孔
5V(或高達(dá)12V)電源
第2步:名稱標(biāo)簽部件
這是要制作的項(xiàng)目列表一個(gè)名牌。我做了10個(gè)。
(注意:我將其中的一個(gè)短路,使其部分功能失調(diào)。提前計(jì)劃:可能會(huì)額外訂購(gòu)一兩個(gè)布魯諾斯或者提出一個(gè)計(jì)劃“B”以防萬(wàn)一!)
DF機(jī)器人Bluno甲殼蟲
4x 100歐姆電阻器
藍(lán)色可穿戴LED
紅色可穿戴設(shè)備LED
黃色可穿戴LED
綠色可穿戴LED
9V雙容量(1200mAh)鋰電池
9V電池連接器
微型開關(guān)
2cmx8cm原型板(切成兩半)
名稱帶剪輯的標(biāo)簽夾(亞馬遜)
Avery 5141“您好我的名字是”名稱標(biāo)簽(亞馬遜)
第3步:連接電話
手機(jī)內(nèi)的arduino需要執(zhí)行以下所有操作任務(wù)。本節(jié)介紹如何將所有內(nèi)容連接在一起。
當(dāng)有人拿起耳機(jī)時(shí)打開Arduino
撥打電話
抓住聲音SD卡
在耳機(jī)揚(yáng)聲器上播放聲音
原理圖
附圖是原始圖像和Fritzing格式。您可以在此處下載Fritzing應(yīng)用程序:fritzing.org
撥號(hào)和電源開關(guān)
手機(jī)內(nèi)部有三個(gè)需要連接的開關(guān)。
“掛機(jī)”開關(guān),為Bluno Nano上的Vin供電。
當(dāng)接收器掛在掛鉤上時(shí),此開關(guān)斷開。
“主動(dòng)撥號(hào)”開關(guān),表示車輪不在其家中位置。這是有線的,使D8在激活時(shí)為+ 5v,在激活時(shí)為0v。
當(dāng)手機(jī)處于靜止位置時(shí),我的手機(jī)上此開關(guān)正常連接 。一旦用戶開始移動(dòng)撥號(hào)盤,開關(guān)就會(huì)斷開連接。我把一端貼在Arduino上。我把另一端連接到arduino上的D8。 D8還連接到10K歐姆電阻到+5。這種配置產(chǎn)生一個(gè)“高”使能信號(hào),告訴Sketch程序是時(shí)候開始計(jì)數(shù)脈沖了。
(在其他一些手機(jī)上,當(dāng)撥號(hào)“休息”時(shí),此開關(guān)正常斷開。如果您有這種類型的手機(jī),則需要將其與我的電話對(duì)接:結(jié)束到+5,另一端接到D8和一個(gè)接地的10K電阻。)
“脈沖”開關(guān)每次撥號(hào)時(shí)產(chǎn)生一個(gè)脈沖在從釋放返回原位時(shí)傳遞一個(gè)數(shù)字。這用于在引腳D7上產(chǎn)生+ 5V脈沖。
在我的手機(jī)上,當(dāng)撥盤“休息”時(shí),此開關(guān)正常連接。用戶松開方向盤后,每次通過號(hào)碼時(shí),此開關(guān)斷開連接。我把一端貼在Arduino上。我將另一端連接到arduino上的D7。 D7還連接到一個(gè)10K歐姆電阻,該電阻導(dǎo)致+5導(dǎo)致引腳在斷開時(shí)被拉高。此配置為Sketch程序生成“高”脈沖以進(jìn)行計(jì)數(shù)。
(在其他一些手機(jī)上,當(dāng)撥號(hào)“休息”時(shí),此開關(guān)正常斷開。如果您有這種類型的手機(jī),則需要將其連接到我的對(duì)面:一端為+5,另一端為D7,另一端為10K接地電阻。)
我沒有添加任何特殊電路,如電容器進(jìn)行去抖動(dòng)。我用軟件處理了這個(gè)。每次開關(guān)打開或關(guān)閉時(shí),你都會(huì)得到一堆電力尖峰(++++ - + - + - + - + - + -------)直到它結(jié)束。在決定狀態(tài)實(shí)際發(fā)生變化之前,軟件只等待輸入引腳上的值穩(wěn)定到一個(gè)電壓或另一個(gè)電壓一段足夠長(zhǎng)的時(shí)間。
聽筒揚(yáng)聲器
用于產(chǎn)生聲音的輸出引腳需要是具有PWM功能的引腳。此外,根據(jù)您使用的Arduino,您可能需要注意運(yùn)行PWM所需的定時(shí)器并可能啟用它。 Arduino Nano上的針腳D9(在我的情況下是Bluno Nano)是一個(gè)很好的默認(rèn)選擇,因?yàn)槟J(rèn)配置正確。
耳機(jī)有三條線。簡(jiǎn)化,這些是:地面,耳機(jī)和吹嘴。由于耳機(jī)和吹嘴松散連接,因此并不那么簡(jiǎn)單。我將電壓表置于“接通”位置以測(cè)量電阻。在這種模式下,當(dāng)您探測(cè)正確的兩個(gè)端子時(shí),電壓表會(huì)產(chǎn)生少量的電,從而在聽筒中產(chǎn)生“靜態(tài)”的沙啞聲。
將一個(gè)端子連接到地。將另一個(gè)端子連接到一個(gè)220歐姆的電阻,該電阻通向D9 PWM引腳。這非常適合我在標(biāo)準(zhǔn)電話耳機(jī)揚(yáng)聲器中所需的聲級(jí)。
(如果你想創(chuàng)建一個(gè)“揚(yáng)聲器電話”,你需要添加一些額外的電路來(lái)將聲音放大到一個(gè)外部揚(yáng)聲器供所有人聽。我沒有在我的實(shí)現(xiàn)中這樣做但是本來(lái)不錯(cuò)增強(qiáng)。)
(如果要添加音量控制,可以將電位器連接到其中一個(gè)模擬輸入引腳,并根據(jù)輸入電壓讀數(shù)調(diào)整聲級(jí)。)
Micro SD卡SPI
SPI可以直接連接到Arduino Nano。 GND至GND,+ 5至+5,MISO至MISO,MOSI至MOSI,以及SCK至SCK。我使用引腳D4作為我的選擇引腳,所以:D4到CS。 (如果您使用的是5v Arduino,例如Nano,請(qǐng)確保使用5v SD卡控制器。)
電線
我剪了一段cat-5以太網(wǎng)電纜和從電話上的連接器通過一個(gè)鉆入基座的孔向下延伸到安裝在雪茄盒下面的Arduino。以太網(wǎng)電纜中的8根電線對(duì)我的連接來(lái)說(shuō)已經(jīng)足夠了,對(duì)于任何標(biāo)準(zhǔn)的撥號(hào)電話都應(yīng)該足夠了。因?yàn)槲覍⑺械孛孢B接在一起,只有一個(gè)地面連接到Arduino,因此8根電線對(duì)我來(lái)說(shuō)是過度殺死的。我不需要在手機(jī)上運(yùn)行+5線,但如果你使用不同類型的手機(jī),你可能會(huì)發(fā)現(xiàn)有必要這樣做。無(wú)論哪種方式,對(duì)于幾乎任何項(xiàng)目來(lái)說(shuō),8根電線應(yīng)該足夠了。
我還在雪茄盒后面鉆了一個(gè)小洞,讓我在切斷電源線后將電源線插入。端部在盒子內(nèi)拼接在一起,然后連接到電源。
我用電工膠帶完全包裹Nano,只留下USB連接器暴露并可以進(jìn)行編程。如果您決定將USB電纜留在盒子內(nèi),即使您沒有編程,也必須確保電纜末端與所有電氣部件隔離。靜電會(huì)弄亂電子設(shè)備,導(dǎo)致奇怪的事情發(fā)生如此意外的重置或更糟。
模擬引腳A0
注意:不連接任何東西針腳A0。該引腳用于為隨機(jī)數(shù)發(fā)生器播種,因此它需要浮動(dòng)未連接。
可選:兩個(gè)Arduinos卸載聲音
如果您需要卸載聲音我提供了原理圖到了第二個(gè)Arduino。如果RAM耗盡或需要更快啟動(dòng),請(qǐng)執(zhí)行此操作。標(biāo)準(zhǔn)的Arduino Nano處理聲音。 Bluno Beetle處理?yè)芴?hào)和藍(lán)牙連接。
將兩個(gè)Arduinos連接在一起:D2到D2,D3到D3。
步驟4:連接名稱標(biāo)簽
名稱標(biāo)簽內(nèi)電子設(shè)備的接線圖是公平的簡(jiǎn)單:只需幾個(gè)LED,一個(gè)開關(guān)和一個(gè)電池。 “可穿戴”LED有點(diǎn)難以使用。我的繞線工具在這里派上用場(chǎng)了。
開始之前
在布線Bluno Beetle名稱標(biāo)簽之前,我建議對(duì)每一個(gè)進(jìn)行預(yù)編程,這樣他們就可以了啟動(dòng)時(shí)依次閃爍所有數(shù)字引腳(D2,D3,D4,D5)。 (在提供的草圖中定義START_WITH_BLINK,或編寫您自己的簡(jiǎn)單草圖來(lái)執(zhí)行此操作。)這將允許您在組裝后立即測(cè)試不良焊接連接。
繞線和焊接LED
將所有四個(gè)電阻焊接到引腳D2,D3,D4和D5
從電路板背面夾住引線。
將電阻器導(dǎo)線留下約1英寸(2厘米)
將裸露的導(dǎo)線焊接到地面,留下1.5到2英寸(3-4厘米)。
使用繞線工具,將綠色LED的紅色線纏繞到D2電阻上并將其焊接到位。
將黑色引線繞線連接到接地引腳。
對(duì)藍(lán)色LED,黃色LED和紅色LED重復(fù)步驟5和6。
確認(rèn)沒有引腳意外觸及鄰居。
再次驗(yàn)證。
將USB電纜插入充電器電源插座,確認(rèn)所有四個(gè)LED在啟動(dòng)時(shí)按正確順序閃爍。
如果一切似乎都連接正確,請(qǐng)將一根熱縮管滑過每個(gè)暴露的針腳(包括接地針)并將其縮小,使其貼合。我用烙鐵來(lái)完成這個(gè)任務(wù)。如果你有一個(gè)熱縮槍(又名熱“吹風(fēng)機(jī)”),那將是更好的選擇。
焊接開關(guān)和電池
將面包板切成大約3“x .5”(5cm x 1cm)(大約是Bluno Beetle抵達(dá)盒子高度的一半。
將面包板頂部三個(gè)孔中的開關(guān)焊接。
焊接一端針。
確保開關(guān)的兩端都貼著面包板,如果需要,可能會(huì)重新焊接第一根針。
焊接另一端兩個(gè)開關(guān)銷到面包板。
在電路板背面:焊接正極端(紅線)電池連接器連接到開關(guān)的頂部引腳。(焊接到面包板,使其連接到頂部引腳。)
將電池的負(fù)極(黑線)焊接到電池的接地孔上。 Bluno。
將紅線切割,剝離并焊接到開關(guān)的中間引腳上(焊接到面包板的背面)與開關(guān)的電氣連接。)
將電線穿過幾個(gè)孔以消除應(yīng)力。
將紅線的另一端焊接到Bluno上的VIN孔,這樣當(dāng)開關(guān)打開時(shí),9伏將施加到VIN。
確認(rèn)沒有交叉線。
連接電池并進(jìn)行測(cè)試,確保Bluno開啟并在開關(guān)打開時(shí)閃爍。
纏繞電工膠帶以覆蓋整個(gè)面包板。
用電工膠帶包裹Bluno,直到您對(duì)電線應(yīng)變消除和隔離連接感到滿意為止。
留出一個(gè)用于連接USB電纜的開口,以便將來(lái)進(jìn)行編程。
將其打開并再次測(cè)試。
步驟5:打包名稱標(biāo)簽
這些是步驟將可穿戴名稱標(biāo)簽包裝在Bluno Beetle進(jìn)來(lái)的盒子里面。
用鋒利的手術(shù)刀切開開關(guān)的矩形孔Exacto刀
將開關(guān)和電路板放入盒子中并將其按壓在側(cè)面以找到合適的步伐來(lái)切割孔。/li》
使用泡沫和電池將卡紙切換到位。
將電池放在電路板旁邊的盒子里
Bluno來(lái)了用一塊泡沫。將其卷起并粘貼,然后將其塞入盒子中,使開關(guān)牢固地固定到位。
為前面的LED線切一個(gè)洞因此它在關(guān)閉時(shí)不會(huì)干擾翻蓋,距離頂部大約0.75英寸(1.5厘米)。尺寸無(wú)關(guān)緊要。稍后會(huì)隱藏。我的洞大約1.5英寸x .25英寸(1厘米x) .5厘米。
通過孔進(jìn)給LED
使用透明膠帶將LED指示燈朝外。透明膠帶確保LED安全并面向全世界以獲得全亮度。
將Bluno推入U(xiǎn)SB接口的盒子中,可以進(jìn)行編程。
將Avery 5141名稱標(biāo)簽剝離并粘貼在白紙上,然后將其剪成形狀。最好不要將名稱標(biāo)簽直接粘貼到盒子上,因?yàn)閷?lái)某個(gè)時(shí)候您需要將其刪除。
覆蓋LED并將“Hello my name is”名稱標(biāo)記為帶。
切割塑料名牌固定器,使其牢固地固定在盒子背面。
附上剪輯。
第6步:Arduino草圖
我已經(jīng)提供了在這個(gè)項(xiàng)目中配置和運(yùn)行Bluno Arduinos所需的全部四個(gè)草圖。
如果您還沒有下載Arduino IDE。這里:arduino.cc
解壓縮包含草圖的zip文件,并從Arduino IDE中打開它們。這些是草圖:
blunoBasic:用于初始化所有Blunos
blunoPhone:在手機(jī)上的Bluno Nano上運(yùn)行
blunoPhoneSounds(可選) :播放手機(jī)上的聲音
blunoNameTag:在“可穿戴”名稱標(biāo)簽上運(yùn)行
步驟7:在中央電話上準(zhǔn)備BLE
將草圖 BlunoBasic 加載到手機(jī)內(nèi)的Arduino Bluno Nano中并執(zhí)行以下操作:
打開串口監(jiān)視器
設(shè)置“無(wú)行結(jié)束”類型“+++”并發(fā)送
應(yīng)說(shuō)“進(jìn)入AT模式”
現(xiàn)在我們處于“AT”模式,用于在電路板上配置BLE藍(lán)牙。
設(shè)置“兩個(gè)NL& CR”
AT + MAC =?
復(fù)制MAC地址
打開 blunoNameTag 草圖。
找到正確的“centralMAC”
粘貼MAC以指定正確連接。
全部輸入要完成配置,請(qǐng)執(zhí)行以下命令:
AT + ROLE = ROLE_CENTRAL
AT + CMODE = UNIQUE
AT + IBEACONS = OFF
AT + BLUNODEBUG = OFF
AT + USBDEBUG = OFF
AT + EXIT
現(xiàn)在用草圖重新編程bluno blunoPhone 用于正常操作。
步驟8:在名稱標(biāo)簽上準(zhǔn)備BLE
加載草圖 BlunoBasic 將放置在名稱標(biāo)簽內(nèi)的每個(gè)Bluno Beetle上并執(zhí)行以下操作:
打開串行監(jiān)視器
設(shè)置“無(wú)行結(jié)束”
輸入“+++”并發(fā)送
應(yīng)該說(shuō)“進(jìn)入AT模式”
現(xiàn)在我們處于“AT”模式,用于配置主板上的BLE藍(lán)牙。
設(shè)置“兩個(gè)NL& CR”
AT + MAC =?
復(fù)制MAC地址
打開 blunoPhone 草圖。
查找“phoneLookup_t phoneBook [] = {”
將MAC粘貼到陣列中的適當(dāng)位置,可能會(huì)創(chuàng)建一個(gè)新條目。
刪除最重要的4位數(shù)字,從而創(chuàng)建一個(gè)32位十六進(jìn)制數(shù)字。
確保MAC_PREFIX與上一步中刪除的最重要的4位數(shù)匹配。
(步驟5和6實(shí)現(xiàn)優(yōu)化以在手機(jī)Sketch上保存珍貴的RAM。)
綁定到bluno手機(jī)的MAC。例如,如果Bluno中央MAC是0xB4994C50236A,那么您可以在外設(shè)名稱標(biāo)簽上執(zhí)行此操作:
AT + BIND = 0xB4994C50236A
確定一個(gè)數(shù)字作為名稱的ID標(biāo)簽。例如“8”。將該數(shù)字插入上面討論的phoneBook []數(shù)組條目,并在外圍名稱標(biāo)簽bluno上執(zhí)行此操作:
AT + NAME = 8
輸入以下所有命令以完成配置:
AT + ROLE = ROLE_PERIPHERAL
AT + CMODE = UNIQUE
AT + IBEACONS = OFF
AT + BLUNODEBUG = OFF
AT + USBDEBUG = OFF
AT + EXIT
現(xiàn)在使用Sketch blunoNameTag 重新編程bluno以進(jìn)行正常操作。
步驟9:創(chuàng)建聲音
《我附上了一個(gè)包含我在SDCard上安裝的所有聲音的zip文件。聲音來(lái)自各種網(wǎng)站:
來(lái)自freesound.org的有趣聲音
電話錄音來(lái)自:http://stuff.gigo.com/phone/
如果您想要一組不同的聲音,可以生成一些或從各種網(wǎng)站下載。但它們需要轉(zhuǎn)換為簡(jiǎn)單的單聲道8位16KHz WAV格式。我是這樣做的:
轉(zhuǎn)到:https://audio.online-convert.com/convert-to-wav
更改位分辨率:8位
更改采樣率:16000 Hz
更改音頻通道:?jiǎn)温暤?/p>
高級(jí):
PCM格式:PCM無(wú)符號(hào)8位
開始轉(zhuǎn)換
下載
如果需要,請(qǐng)重命名文件,文件名中有8個(gè)或更少的字符,擴(kuò)展名為“.wav”(又名8.3格式)。
將SD卡插入計(jì)算機(jī)
將所有文件復(fù)制到micro SD卡上最頂層的目錄中
彈出
插入通過SPI接口將micro SD卡連接到Arduino控制器中。
blunoPhone Sketch負(fù)責(zé)安裝SD卡并使用庫(kù)播放聲音文件:SD.h,SPI.h和TMRpcm .H
步驟10:Arduino手機(jī)草圖軟件
在手機(jī)內(nèi)部的Bluno Nano上運(yùn)行的Sketch blunoPhone 旨在使用BLE進(jìn)行通信藍(lán)牙與另一個(gè)草圖 blunoNameTag 在電池供電的“可穿戴式”Bluno Beetles上執(zhí)行,其中包含分散在房間內(nèi)的人們的“名牌”。
可選擇手機(jī)聲音可以播放一個(gè)單獨(dú)的Arduino,也將被安置在手機(jī)內(nèi)。這樣做的原因有很多,稍后將在評(píng)論中進(jìn)行描述。如果您希望其他Arduino使用Sketch nanoPhoneSounds 播放聲音,請(qǐng)定義OFFLOAD_SOUND。我用一個(gè)內(nèi)置的Bluno Nano制作了一部手機(jī)。我制造了第二部手機(jī),其中包含用于通信的Bluno Beetle,以及用于播放聲音的標(biāo)準(zhǔn)Arduino Nano。在大多數(shù)情況下,我用單個(gè)Bluno Nano記錄手機(jī),但知道還有其他選擇。
這個(gè)程序適用于Arduino。 RAM最大化因此,如果添加更多功能或增加變量數(shù)量,您可能會(huì)遇到一些奇怪的行為,例如程序重置和意外重啟。該程序使用一些先進(jìn)的技術(shù)來(lái)節(jié)省RAM(以及一些黑客來(lái)節(jié)省RAM)。 (如果你有RAM問題,你應(yīng)該認(rèn)真考慮將聲音功能卸載到另一個(gè)Arduino。)
Bluno BLE似乎只用于兩個(gè)藍(lán)牙永不改變端點(diǎn)之間的通信:一個(gè)中心端口和一個(gè)外圍設(shè)備。似乎我正在使用它的目的不是專門設(shè)計(jì)的。通過一些努力,我得到了它的工作 - 主要是。有時(shí)需要多次嘗試才能建立連接。
該程序的設(shè)計(jì)有一個(gè)中央Bluno和許多外圍設(shè)備。在任何給定時(shí)間只連接一個(gè)外圍設(shè)備,但中央Bluno從已知外圍設(shè)備列表中動(dòng)態(tài)選擇。通常連接速度相當(dāng)快(在15秒內(nèi)),但有時(shí)需要更長(zhǎng)時(shí)間(幾分鐘)。外圍設(shè)備(名稱標(biāo)簽)在代碼中內(nèi)置了一個(gè)看門狗,以便偶爾強(qiáng)制重啟。這種“黑客”似乎有所幫助,但并不完美。手動(dòng)關(guān)閉/打開所有外圍設(shè)備以及中央電話似乎有時(shí)可以幫助建立穩(wěn)固的連接。
此草圖動(dòng)態(tài)運(yùn)行“AT + BIND”命令,然后“AT + RESTART”連接期望的外圍設(shè)備。那個(gè)序列并不總是有效。如果在一個(gè)循環(huán)中調(diào)用兩次而不是一次,它似乎更穩(wěn)定。不幸的是,每次通過循環(huán)都會(huì)增加額外的延遲時(shí)間。如果您不擔(dān)心額外的延遲,請(qǐng)考慮調(diào)整程序調(diào)用AT + BIND三次以獲得更好的穩(wěn)定性。
當(dāng)通過USB電纜將Sketch編程到Bluno中心或任何外圍設(shè)備時(shí),我發(fā)現(xiàn)它如果我關(guān)掉房間里所有其他的Blunos,那么最穩(wěn)定。由于通過藍(lán)牙從一個(gè)Bluno到另一個(gè)Bluno的串行連接,程序員似乎對(duì)Bluno的目標(biāo)編程感到困惑。
這使用PlainProtocol庫(kù)來(lái)格式化通過藍(lán)牙發(fā)送的命令。這可以在GitHub上找到:
git clone https://github.com/DFRobot/BlunoAccessoryShieldDe.。.
當(dāng)在串行監(jiān)視器上手動(dòng)弄亂AT命令時(shí),我發(fā)現(xiàn)最好運(yùn)行Sketch blunoBasic 。
正常程序流程
軟件具有各種不同功能的狀態(tài)。正常的軟件路徑如下所示:
當(dāng)手機(jī)放在開關(guān)掛鉤上時(shí),電流不會(huì)流動(dòng)并且Bluno電源關(guān)閉。
當(dāng)有人拿起聽筒時(shí),接通電源并且Bluno開始啟動(dòng),調(diào)用功能設(shè)置()。
在初始化期間安裝SD卡,初始化藍(lán)牙BLE,并初始化相關(guān)的數(shù)字引腳。這需要幾秒鐘。
一旦所有內(nèi)容都初始化,就會(huì)播放撥號(hào)音。與所有聲音一樣,此聲音來(lái)自SD卡上的文件。撥號(hào)音實(shí)際上是一個(gè)相對(duì)較短的聲音文件,一旦完成就會(huì)重復(fù)。
一旦手機(jī)上的滾輪開始移動(dòng),軟件就會(huì)檢測(cè)到引腳D8上的更改并停止撥號(hào)音。
電話號(hào)碼中的每個(gè)數(shù)字都是根據(jù)D7針腳上檢測(cè)到的脈沖數(shù)計(jì)算出來(lái)的。
撥打全部6位數(shù)后,程序?qū)?dòng)鈴聲,在phoneBook []數(shù)組中找到該號(hào)碼,并綁定到列出的名稱標(biāo)簽的MAC地址。
只要完成簡(jiǎn)單的握手以驗(yàn)證MAC地址是否與預(yù)期的名稱標(biāo)簽ID匹配,就會(huì)在耳機(jī)揚(yáng)聲器上播放一長(zhǎng)串(有些愚蠢)的“你好”聲音(當(dāng)時(shí)草圖上的名稱標(biāo)簽開始快速閃爍顏色瘋狂)。
通常此人會(huì)自動(dòng)掛斷電話并觀看有人打開禮物。電源關(guān)閉,因此Bluno什么都不做。
特殊情況導(dǎo)致特殊情況
如果有人撥打手機(jī)上寫的號(hào)碼(869-869)或“TMW-TMW”)然后播放隨機(jī)應(yīng)答消息。另外,The Mad Wrapper在圣誕樹深處隱藏了一個(gè)額外的Bluno Beetle“名牌”。布魯諾開始快速地眨眼。在樹上有一個(gè)特別的禮物供所有人享用!
各種標(biāo)準(zhǔn)的AT& T錯(cuò)誤信息都是針對(duì)諸如未知號(hào)碼之類的內(nèi)容而播放的,并且在沒有答案的情況下響鈴太長(zhǎng)。
如果手機(jī)處于摘機(jī)狀態(tài)4分鐘,則摘機(jī)AT& T“blat-blat-blat 。..”聲音表示掛斷電話。
很多計(jì)時(shí)器
每次循環(huán)時(shí),程序都會(huì)檢查時(shí)間并查看是否有任何“計(jì)時(shí)器”已過期。定時(shí)器用于一系列事情,包括正常操作和錯(cuò)誤測(cè)試:
有一個(gè)看門狗定時(shí)器,用于重置和重新綁定到所需的名稱標(biāo)簽。
有一個(gè)定時(shí)器用于去除“撥號(hào)移動(dòng)”引腳D8。在宣布狀態(tài)發(fā)生變化之前,我們等待嘈雜的信號(hào)穩(wěn)定下來(lái)。
有一個(gè)定時(shí)器用于消除引腳D7上的脈沖。
在開始同步時(shí),有一個(gè)定時(shí)器用于限制與名稱標(biāo)記的握手通信。
沒有足夠的RAM用于變量和數(shù)組
程序完全超出RAM使用量,導(dǎo)致以下警告
可用內(nèi)存不足,可能會(huì)出現(xiàn)穩(wěn)定性問題。
如果添加任何新內(nèi)容,則可能出現(xiàn)錯(cuò)誤功能,程序?qū)㈤_始表現(xiàn)得非常奇怪,包括重啟。我實(shí)現(xiàn)了一些技巧來(lái)最小化RAM使用:
諸如聲音文件名之類的字符串作為常量存儲(chǔ)在ROM中。函數(shù)pgm_read_word()用于檢索ROM的常量。
MAC地址是48位十六進(jìn)制數(shù)。我的原始實(shí)現(xiàn)將MAC地址存儲(chǔ)為52個(gè)字符的字符串。當(dāng)我只有三個(gè)名稱標(biāo)簽與之通信時(shí),這很好。一旦我啟用了10個(gè)遠(yuǎn)程Blunos,我就用光了。我能夠通過存儲(chǔ)10個(gè)32位長(zhǎng)整數(shù)來(lái)恢復(fù)程序。所有Bluno Beetle MAC地址中最重要的16位對(duì)于我所擁有的設(shè)備始終是相同的,因此我只是將16位添加到唯一的32位數(shù)字進(jìn)行綁定。
另一種節(jié)省RAM的方法(可能是最好的方法)是在兩個(gè)Arduinos之間拆分任務(wù)。如果定義了OFFLOAD_SOUND,則刪除聲音產(chǎn)生功能。這被替換為使用SoftwareSerial庫(kù)與另一個(gè)連接到D3和D4的Arduino進(jìn)行通信的功能。這樣做可以在RAM中留出足夠的空間來(lái)支持許多新功能或更多名稱標(biāo)簽。
步驟11:消除嘈雜的電話交換機(jī)
當(dāng)手機(jī)內(nèi)的開關(guān)打開或關(guān)閉時(shí),它不會(huì)干凈利落。電壓將反彈+ 5,0,+ 5,0,+ 5,0 。..。..一段時(shí)間,直到它穩(wěn)定在一個(gè)或另一個(gè)上。這可以用一些電子設(shè)備來(lái)處理,例如電容器。我用軟件處理它。 blunoPhone 草圖會(huì)檢查該值是否發(fā)生變化,然后等待一段時(shí)間來(lái)驗(yàn)證該值是否再次發(fā)生變化。
延遲10毫秒效果很好!
#define DEBOUNCE_DELAY 10 // wait 10ms for the circuit to settle during puls transition
用于跟蹤時(shí)間的變量:
long timeOfPulsePinStateChange = 0; // save the time for debouncing
去抖動(dòng)的一些代碼:
if (pulseInputLastState != pulseInputPinState) {
timeOfPulsePinStateChange = millis();
}
if ((millis() - timeOfPulsePinStateChange) 》 DEBOUNCE_DELAY) {
// debounce - this happens once it‘s stabilized
if (pulseInputTrueState != pulseInputPinState) {
// this means that the switch has either just gone from closed-》open or vice versa.
pulseInputTrueState = pulseInputPinState;
}
步驟12 :Arduino名稱標(biāo)記草圖軟件
草圖 blunoNameTag 實(shí)現(xiàn)在DFRobot上運(yùn)行的可穿戴“名稱標(biāo)記” Bluno Beetle。
它使用BLE藍(lán)牙連接與隱藏在古董電話中的中央Bluno進(jìn)行通信。
在空閑狀態(tài) - 當(dāng)沒有連接到手機(jī)時(shí) - - 藍(lán)色LED輕輕地發(fā)出更亮的光,然后變暗。
隨著通信握手開始,一些不同顏色的LED亮起,藍(lán)色LED發(fā)出全亮度不再發(fā)出脈沖。
握手需要使用名稱標(biāo)簽的ID進(jìn)行回復(fù)。這是從AT + NAME =?返回的結(jié)果。有關(guān)使用適當(dāng)編號(hào)配置AT + NAME的重要說(shuō)明,請(qǐng)參閱本Instructable的另一部分。
一旦通信完全建立,所有顏色的LED都開始瘋狂地閃爍。
很多計(jì)時(shí)器
每次循環(huán)時(shí),程序都會(huì)檢查時(shí)間并查看是否有任何“定時(shí)器”已過期。
有一個(gè)計(jì)時(shí)器可以更新藍(lán)色LED的亮度。 (我真的很喜歡這個(gè)簡(jiǎn)單的細(xì)微特征。在空閑狀態(tài)下輕柔的平靜脈沖為項(xiàng)目增添了一點(diǎn)“自然”的人性。)
每個(gè)彩色LED都有一個(gè)定時(shí)器告訴它閃爍一定時(shí)間。每個(gè)LED的閃爍速率不同,導(dǎo)致輕微隨機(jī)的光圖案。
有一個(gè)計(jì)時(shí)器可以檢查來(lái)自手機(jī)的消息。
有一個(gè)看門狗定時(shí)器可以重置整個(gè)Bluno Beetle。有時(shí),完全開始是與嘗試接觸的中央Bluno同步的唯一方法。
步驟13:輕輕地點(diǎn)亮LED以獲得良好的平靜效果
我盡可能嘗試為我的應(yīng)用添加一些微妙的“自然”效果。如果做得好,這將增加一定程度的舒適度并獲得用戶的一點(diǎn)信任。它讓人感覺很好。這是一個(gè)很好的設(shè)計(jì)。
如果您只是需要向用戶顯示您的小工具已啟動(dòng),那么簡(jiǎn)單的事情就是在啟動(dòng)過程中點(diǎn)亮LED并忘記它。
咩。
使用Arduino PWM功能并做一些有趣的事情。做吧!這并不難(特別是因?yàn)槲乙呀?jīng)提供了一些代碼供您復(fù)制/粘貼到您的應(yīng)用程序中)。
我喜歡以下代碼的效果,它實(shí)現(xiàn)了藍(lán)色LED輕輕發(fā)光以平靜的“呼吸”速度變得更加明亮和暗淡。感覺很棒!
我將藍(lán)色LED連接到一個(gè)支持PWM的引腳(Bluno Beetle上的引腳D3)。
#define BLUE_LED 3 // blue LED
我設(shè)置了一些參數(shù)LED發(fā)光的速度和亮度有多快
#define GLOW_MIN 15 //15 // min brightness of glow
#define GLOW_MAX 100 //120 // max brightness of glow
#define GLOW_UPDATE_DELAY 40 // when to increment
#define GLOW_STEP_SIZE 2
及相關(guān)變量
long timeOfLastPulseUpdate = 0;
int glowValue = 0; // led brightness 0-255
int glowIncrement = GLOW_STEP_SIZE; // Either + or - depending on up/down glow
我創(chuàng)建了一個(gè)實(shí)用程序函數(shù)來(lái)幫助確定是否需要調(diào)整LED的亮度:
// gently glow bright/dim when not connected
bool timeToUpdateGlow () {
long now = millis();
if ((now - timeOfLastPulseUpdate) 》 GLOW_UPDATE_DELAY) {
timeOfLastPulseUpdate = now;
return true;
} else {
return false;
}
}
然后,每次通過循環(huán),如果是時(shí)候改變亮度,改變它。如果 glowIncrement 為正數(shù),則LED會(huì)略微變亮。如果 glowIncrement 是負(fù)數(shù),則藍(lán)色LED稍微變暗。
void loop() {
。..
if (timeToUpdateGlow()) {
glowValue += glowIncrement;
if (glowValue 《= GLOW_MIN) {
glowValue = GLOW_MIN;
glowIncrement = GLOW_STEP_SIZE; // +1 so start glowing brighter
} else if (glowValue 》= GLOW_MAX) {
glowValue = GLOW_MAX;
glowIncrement = -GLOW_STEP_SIZE; // start dimming now
}
analogWrite(BLUE_LED, glowValue);
}
。..
}
步驟14:瘋狂的浮華色彩吸引注意力
引起人們對(duì)小工具的關(guān)注的一個(gè)好方法是使用幾個(gè)LED“隨機(jī)”潑灑閃亮的顏色。我對(duì)我使用的效果感到滿意。每個(gè)LED以不同的快速閃爍,以創(chuàng)建一個(gè)有趣的色彩管弦樂隊(duì)。
定義閃爍率和變量:
// blink rates when connected spaced to look like random orchestrated splatter
#define BLUE_BLINK_DELAY 300 // blink rate 0.3 seconds
#define YELLOW_BLINK_DELAY 500 // blink rate 0.5 seconds
#define RED_BLINK_DELAY 800 // blink rate 0.8 seconds
#define GREEN_BLINK_DELAY 1300 // blink rate 1.3 seconds
long timeOfLastBlueBlink = 0;
long timeOfLastGreenBlink = 0;
long timeOfLastYellowBlink = 0;
long timeOfLastRedBlink = 0;
確定何時(shí)閃爍LED的一些實(shí)用程序功能
// after connected we wildly blink the blue LED
bool timeForBlueBlink () {
long now = millis();
if ((now - timeOfLastBlueBlink) 》 BLUE_BLINK_DELAY) {
timeOfLastBlueBlink = now;
return true;
} else {
return false;
}
}
// after connected we wildly blink the green LED
bool timeForGreenBlink () {
long now = millis();
if ((now - timeOfLastGreenBlink) 》 GREEN_BLINK_DELAY) {
timeOfLastGreenBlink = now;
return true;
} else {
return false;
}
}
// after connected we wildly blink the yellow LED
bool timeForYellowBlink () {
long now = millis();
if ((now - timeOfLastYellowBlink) 》 YELLOW_BLINK_DELAY) {
timeOfLastYellowBlink = now;
return true;
} else {
return false;
}
}
// after connected we wildly blink the red LED
bool timeForRedBlink () {
long now = millis();
if ((now - timeOfLastRedBlink) 》 RED_BLINK_DELAY) {
timeOfLastRedBlink = now;
return true;
} else {
return false;
}
}
以及閃爍的功能。
void blink (int pin) {
digitalWrite(pin, HIGH);
delay(100);
digitalWrite(pin, LOW);
}
并且,如果處于正確的狀態(tài),每個(gè)循環(huán)一次,檢查時(shí)間并使LED閃爍
void loop() {
。..
if (timeForBlueBlink()) {
blink (BLUE_LED);
}
if (timeForGreenBlink()) {
blink (GREEN_LED);
}
if (timeForYellowBlink()) {
blink (YELLOW_LED);
}
if (timeForRedBlink()) {
blink (RED_LED);
}
。..
}
-
藍(lán)牙
+關(guān)注
關(guān)注
114文章
5811瀏覽量
170194 -
電話
+關(guān)注
關(guān)注
0文章
135瀏覽量
25798
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論