備DIY全解析)
1. 項(xiàng)目概述當(dāng)微型單片機(jī)遇上可穿戴設(shè)備幾年前當(dāng)我第一次把一塊ATtiny85單片機(jī)焊接到一個比指甲蓋還小的電路板上時我就在想這玩意兒除了做個閃燈玩具還能干點(diǎn)啥“正經(jīng)事”直到有一次在健身房看到有人手腕上戴著各種復(fù)雜的智能手表監(jiān)測心率但動作不規(guī)范時卻沒有任何即時反饋一個想法冒了出來能不能做一個極致簡單、只專注于單一核心提醒功能的可穿戴設(shè)備比如一個只在你久坐時用振動提醒你活動或者在你進(jìn)行特定重復(fù)動作如健身組數(shù)時給予觸覺反饋的小裝置。這就是“ATtiny85可穿戴振動活動追蹤手表”項(xiàng)目的起點(diǎn)。這個項(xiàng)目的核心就是用一顆售價僅幾塊錢、只有8個引腳的微型單片機(jī)ATtiny85驅(qū)動一個微型振動電機(jī)再配合一個簡單的運(yùn)動傳感器打造一個超低成本、超低功耗、功能專注的可穿戴活動追蹤器。它不像商業(yè)智能手表那樣有屏幕、能聯(lián)網(wǎng)、功能繁雜它的使命非常單純感知特定的身體活動狀態(tài)并通過最直接的物理方式——振動來提醒你。這非常適合DIY愛好者、硬件創(chuàng)客或者那些希望為孩子或老人制作一個簡易健康提醒設(shè)備的人。你不需要是電子工程專家只要會基礎(chǔ)的焊接和Arduino編程就能親手實(shí)現(xiàn)它。接下來我將從設(shè)計(jì)思路、硬件選型、軟件實(shí)現(xiàn)到穿戴組裝完整拆解這個有趣的小項(xiàng)目。2. 核心設(shè)計(jì)思路與硬件選型解析2.1 為什么是ATtiny85選擇ATtiny85作為大腦是本項(xiàng)目所有設(shè)計(jì)決策的基石。這背后是一系列權(quán)衡極致的成本與體積控制ATtiny85的封裝如SOP-8非常小巧整個核心控制電路可以做到硬幣大小。對于可穿戴設(shè)備尤其是追求隱蔽性或舒適性的腕戴設(shè)備體積和重量是首要考慮因素。相比更常見的Arduino Nano或ESP8266ATtiny85在體積和功耗上具有壓倒性優(yōu)勢。恰到好處的資源它擁有8KB的Flash存儲程序、512B的SRAM運(yùn)行內(nèi)存和512B的EEPROM存儲數(shù)據(jù)。對于實(shí)現(xiàn)“讀取傳感器數(shù)據(jù) - 判斷邏輯 - 控制振動電機(jī)”這個核心任務(wù)這些資源綽綽有余。我們可以用EEPROM來存儲一些簡單的用戶設(shè)置比如久坐提醒的時間閾值。超低功耗的潛力ATtiny85支持多種休眠模式。在活動追蹤的典型場景中設(shè)備大部分時間處于待機(jī)監(jiān)聽狀態(tài)。通過編程讓其大部分時間處于深度休眠Sleep Mode僅定時喚醒比如每秒一次讀取一次傳感器數(shù)據(jù)平均工作電流可以輕松控制在1mA以下。配合一顆小容量的紐扣電池如CR2032續(xù)航可以達(dá)到數(shù)周甚至數(shù)月這是功能復(fù)雜的智能手表無法比擬的。足夠的外設(shè)接口雖然只有8個引腳但ATtiny85提供了足夠的數(shù)字I/O口和模擬輸入口ADC。我們需要連接一個振動電機(jī)1個數(shù)字I/O、一個運(yùn)動傳感器如1-2個數(shù)字I/O或模擬I/O、以及一個可能的編程/調(diào)試接口占用2個I/O。經(jīng)過精心規(guī)劃引腳資源剛好夠用。注意ATtiny85的工作電壓是1.8V - 5.5V這為我們提供了靈活的供電方案選擇既可以用3V的紐扣電池也可以用3.7V的鋰電池。2.2 傳感器選型如何“感知”活動活動追蹤的核心是傳感器。我們需要一個能夠檢測身體移動或姿態(tài)的器件。這里有幾個主流選擇三軸加速度計(jì)如ADXL345、MPU-6050這是最強(qiáng)大也最通用的選擇。它可以測量X、Y、Z三個方向的加速度從而計(jì)算出設(shè)備的姿態(tài)傾斜角度、運(yùn)動幅度和頻率。通過分析加速度數(shù)據(jù)我們可以識別出走路、跑步、坐下、站起等多種狀態(tài)。ADXL345通過I2C通信非常省電MPU-6050還集成了陀螺儀數(shù)據(jù)更豐富但功耗稍高。振動開關(guān)滾珠開關(guān)這是一種純機(jī)械開關(guān)內(nèi)部有一個滾珠當(dāng)設(shè)備傾斜或振動到一定角度時滾珠接通兩個觸點(diǎn)電路導(dǎo)通。它成本極低幾分錢一個但只能提供“有運(yùn)動”或“無運(yùn)動”這種非常二值化的信息無法區(qū)分運(yùn)動類型和強(qiáng)度。壓電振動傳感器這種傳感器可以檢測微小的振動但對身體大幅度的運(yùn)動反而不敏感更適合工業(yè)設(shè)備監(jiān)測。在本項(xiàng)目中我強(qiáng)烈推薦使用數(shù)字輸出的三軸加速度計(jì)例如ADXL345。理由如下信息豐富我們可以編程實(shí)現(xiàn)更智能的判斷。例如不是簡單地檢測“是否在動”而是計(jì)算一段時間內(nèi)加速度矢量和的變化量活動強(qiáng)度或者通過Z軸數(shù)據(jù)判斷手腕是平放可能坐著還是垂直可能站著??膳渲渺`敏度ADXL345的測量范圍和輸出數(shù)據(jù)速率都可以通過軟件配置允許我們針對“手腕活動”這一場景進(jìn)行優(yōu)化過濾掉無意義的細(xì)微抖動。低功耗它本身具有極低的待機(jī)電流配合單片機(jī)的休眠模式可以組成一個極省電的系統(tǒng)。2.3 執(zhí)行器與供電方案振動電機(jī)選擇常見的3V或5V微型扁平振動馬達(dá)Coin Vibration Motor。它的直徑通常在10mm左右厚度3-4mm非常適合嵌入表帶或小型外殼。驅(qū)動它需要一個簡單的晶體管如MOSFET 2N7000或三極管如S8050開關(guān)電路因?yàn)锳Ttiny85的I/O口無法直接提供足夠的電流通常需要20-100mA。供電方案方案A追求極致輕薄使用一顆CR2032紐扣電池3V約220mAh。通過一個低壓差穩(wěn)壓器LDO如HT7333將電壓穩(wěn)定在3.3V為整個系統(tǒng)供電。ATtiny85和ADXL345在3.3V下工作良好。此方案續(xù)航取決于休眠策略理想情況下可達(dá)1個月以上。方案B追求續(xù)航與充電便利使用一塊小型的3.7V鋰電池如301230 30mm x 12mm x 3mm搭配一個微型充電管理模塊如TP4056。這樣可以通過Micro USB接口充電更加方便。但需要額外的充電電路空間。硬件清單匯總ATtiny85單片機(jī)SOP-8封裝ADXL345三軸加速度計(jì)模塊或芯片微型振動電機(jī)3V/5VMOSFET2N7000或NPN三極管S8050及一個基極限流電阻1kΩ供電CR2032電池座 或 鋰電池TP4056充電模塊LDO穩(wěn)壓芯片如HT7333如果用鋰電池則可能需要10kΩ上拉電阻用于I2C總線0.1uF和10uF電容若干用于電源濾波輕觸開關(guān)用于電源開關(guān)或模式切換表帶、3D打印或手工制作的外殼3. 電路設(shè)計(jì)與PCB布局要點(diǎn)3.1 核心電路原理圖解析整個系統(tǒng)的電路并不復(fù)雜但有幾個關(guān)鍵點(diǎn)需要特別注意ATtiny85最小系統(tǒng)需要連接VCC和GND并在RESET引腳引腳1上拉一個10kΩ電阻到VCC防止誤復(fù)位。如果使用內(nèi)部時鐘則無需外接晶振。I2C連接ATtiny85的PB2引腳7和PB0引腳5可以配置為I2C的SCL和SDA線分別連接ADXL345的對應(yīng)引腳。必須在SDA和SCL線上各接一個4.7kΩ - 10kΩ的上拉電阻到VCC這是I2C總線正常工作的必要條件。振動電機(jī)驅(qū)動電路這是一個典型的低側(cè)開關(guān)電路。ATtiny85的一個I/O口如PB1引腳6通過一個1kΩ電阻連接到MOSFET2N7000的柵極G。MOSFET的源極S接GND漏極D接振動電機(jī)的負(fù)極。振動電機(jī)的正極直接接VCC。當(dāng)PB1輸出高電平時MOSFET導(dǎo)通電機(jī)兩端形成壓差開始振動。二極管如1N4148反向并聯(lián)在電機(jī)兩端用于吸收電機(jī)停止時產(chǎn)生的反向電動勢保護(hù)MOSFET。電源管理如果使用CR2032電池建議先經(jīng)過一個開關(guān)再接入LDOHT7333的輸入端LDO輸出穩(wěn)定的3.3V給MCU和傳感器。在LDO的輸入和輸出端靠近引腳處分別放置一個10uF儲能和一個0.1uF濾高頻噪聲的電容這是保證系統(tǒng)穩(wěn)定、防止意外復(fù)位的關(guān)鍵。3.2 PCB布局與可穿戴化設(shè)計(jì)心得對于可穿戴設(shè)備PCB布局比原理圖設(shè)計(jì)更需要花心思尺寸與形狀使用EDA工具如立創(chuàng)EDA、KiCad進(jìn)行設(shè)計(jì)時首先確定外殼的內(nèi)部空間。PCB形狀可以設(shè)計(jì)為圓角矩形甚至異形以最大化利用空間。將所有元件布置在PCB的同一面底層頂層盡量走線這樣便于焊接和后期維修。元件選型與擺放全部使用貼片元件0603或0805封裝的電阻電容SOT-23封裝的MOSFET和LDO。ATtiny85和ADXL345也選擇貼片封裝。電池連接器如果使用可充電鋰電池可以選擇PH2.0mm間距的臥式插座將電池貼在PCB背面。如果用CR2032則使用貼片電池座并確保其位于PCB邊緣方便更換。振動電機(jī)在PCB邊緣預(yù)留兩個大的焊盤或一個插座用于焊接電機(jī)的引線??紤]電機(jī)振動可能對焊點(diǎn)造成應(yīng)力可以用熱熔膠或硅膠進(jìn)行加固。傳感器朝向ADXL345的感應(yīng)軸方向是固定的。在布局時必須明確它在手腕上的最終朝向例如芯片表面平行于手腕皮膚且一個邊與手臂方向平行并在PCB上做出標(biāo)記如絲印“TOP - WRIST”這樣在編程時才能正確解讀數(shù)據(jù)。穿戴舒適性圓滑無棱角PCB的四個角一定要做圓角處理防止刮傷皮膚或衣物。厚度控制盡量選擇薄型元件。如果厚度仍然是個問題可以考慮將PCB做成兩片中間用排針連接平行放置以降低整體厚度。固定方式在PCB兩側(cè)或四角預(yù)留小孔用于縫合或粘貼到表帶上。實(shí)操心得第一次打樣PCB時我忽略了振動電機(jī)本身的厚度導(dǎo)致外殼合不上。后來我將電機(jī)的位置設(shè)計(jì)在PCB的一個“凹陷”區(qū)域讓電機(jī)部分嵌入PCB有效降低了整體厚度。另外為調(diào)試方便務(wù)必引出一個包含VCC、GND、SDA、SCL和RESET的編程接口例如用4-5個并排的焊盤這樣可以用夾子或飛線連接USBASP等編程器無需每次焊接。4. 固件開發(fā)算法與低功耗實(shí)現(xiàn)4.1 開發(fā)環(huán)境搭建與程序燒錄ATtiny85可以通過Arduino IDE進(jìn)行開發(fā)這大大降低了門檻。安裝ATtiny核心在Arduino IDE的“文件-首選項(xiàng)-附加開發(fā)板管理器網(wǎng)址”中添加網(wǎng)址https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json。然后在“工具-開發(fā)板-開發(fā)板管理器”中搜索“attiny”安裝“attiny by David A. Mellis”。配置開發(fā)板選擇“工具-開發(fā)板-ATtiny25/45/85”處理器選擇“ATtiny85”時鐘選擇“內(nèi)部8MHz”為了低功耗也可以選擇1MHz。編程器選擇“USBasp”或其他你使用的編程器如Arduino as ISP。連接與燒錄按照前面提到的編程接口將USBasp編程器的VCC、GND、MOSI、MISO、SCK、RESET分別連接到ATtiny85的對應(yīng)引腳。點(diǎn)擊“工具-燒錄引導(dǎo)程序”實(shí)際上就是設(shè)置熔絲位。之后就可以像普通Arduino一樣使用“上傳”按鈕來燒錄程序了。4.2 活動識別算法解析算法的目標(biāo)是從ADXL345的原始數(shù)據(jù)中判斷用戶當(dāng)前是“活躍”還是“靜止”并在靜止超時后觸發(fā)振動。這里提供一個簡單有效的方案數(shù)據(jù)讀取與濾波以每秒2-5次的速率數(shù)據(jù)速率設(shè)為100Hz但程序每秒只讀取幾次讀取ADXL345的X、Y、Z三軸數(shù)據(jù)12位精度-2g到2g范圍。為了消除噪聲可以對連續(xù)幾次的讀數(shù)進(jìn)行滑動平均濾波?;顒恿坑?jì)算計(jì)算本次讀數(shù)與上一次讀數(shù)之間三軸加速度變化量的絕對值之和。這被稱為“活動量增量”。activity_delta abs(ax - ax_prev) abs(ay - ay_prev) abs(az - az_prev);這個值越大說明動作越劇烈。閾值判斷設(shè)置一個經(jīng)驗(yàn)閾值例如100 mg。如果activity_delta超過閾值則認(rèn)為發(fā)生了一次“有效活動”并重置一個“靜止計(jì)時器”。如果activity_delta低于閾值則“靜止計(jì)時器”累加。觸發(fā)振動當(dāng)“靜止計(jì)時器”超過預(yù)設(shè)的久坐時間例如30分鐘 1800秒 * 2次/秒 3600個周期時控制振動電機(jī)工作2-3秒然后重置計(jì)時器并進(jìn)入一個短暫的“免打擾期”比如5分鐘防止連續(xù)提醒。// 代碼片段示例 (核心邏輯) #include Wire.h // 用于I2C通信 #include avr/sleep.h // 用于休眠 #define ACCEL_ADDR 0x53 // ADXL345的I2C地址 #define MOTOR_PIN 1 // PB1 #define THRESHOLD 100 // 活動量閾值 #define IDLE_TIME_THRESHOLD 3600 // 靜止周期閾值 (30分鐘*2次/秒) #define DND_PERIOD 600 // 免打擾期 (5分鐘*2次/秒) long lastActivityTime 0; long idleCounter 0; bool dndMode false; long dndCounter 0; void setup() { pinMode(MOTOR_PIN, OUTPUT); digitalWrite(MOTOR_PIN, LOW); Wire.begin(); setupADXL345(); // 初始化加速度計(jì)的函數(shù) lastActivityTime millis(); } void loop() { // 1. 讀取并計(jì)算活動量 int activity readActivityLevel(); // 2. 判斷與計(jì)時 if (activity THRESHOLD) { // 檢測到活動重置靜止計(jì)數(shù)器 idleCounter 0; dndMode false; // 有活動則退出免打擾 dndCounter 0; lastActivityTime millis(); } else { idleCounter; } // 3. 檢查是否觸發(fā)提醒 if (!dndMode idleCounter IDLE_TIME_THRESHOLD) { triggerVibration(); idleCounter 0; dndMode true; // 進(jìn)入免打擾期 } // 4. 處理免打擾期 if (dndMode) { dndCounter; if (dndCounter DND_PERIOD) { dndMode false; dndCounter 0; } } // 5. 進(jìn)入休眠 (約500ms) delay(500); }4.3 低功耗優(yōu)化實(shí)戰(zhàn)未經(jīng)優(yōu)化的系統(tǒng)電流可能達(dá)到5mA以上。我們的目標(biāo)是將平均電流降至50μA以下。關(guān)閉未用模塊在setup()中關(guān)閉ADCADCSRA 0;、看門狗等不需要的模塊。利用休眠模式使用avr/sleep.h庫。將主循環(huán)中的delay(500)替換為深度休眠。#include avr/sleep.h void sleep500ms() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); // 最省電的模式 sleep_enable(); // 配置一個定時器如看門狗定時器在500ms后喚醒 setup_watchdog(9); // WDT 512ms timeout (具體參數(shù)需查手冊) sleep_mode(); // 進(jìn)入休眠 sleep_disable(); // 被喚醒后繼續(xù)執(zhí)行 }這樣在每次循環(huán)的間隙MCU幾乎不耗電。外設(shè)電源管理振動電機(jī)不工作時完全斷電。對于ADXL345它本身有低功耗模式。在每次讀取數(shù)據(jù)后可以通過I2C命令將其設(shè)置為待機(jī)模式下次需要讀數(shù)前再喚醒。這能節(jié)省約100μA的電流。降低系統(tǒng)時鐘將ATtiny85的系統(tǒng)時鐘從8MHz降至1MHz可以顯著降低動態(tài)功耗。這需要在燒錄程序前在“工具-處理器”中選擇“ATtiny85 (Internal 1 MHz clock)”。經(jīng)過這些優(yōu)化系統(tǒng)的工作周期可能變?yōu)閱拘?ms 電流~3mA - 讀取傳感器并處理1ms - 休眠498ms 電流~5μA。平均電流 ≈ (3mA * 2ms 5μA * 498ms) / 500ms ≈ 17μA。一顆CR2032電池220mAh的理論續(xù)航將達(dá)到驚人的220mAh / 0.017mA ≈ 12941小時即超過500天當(dāng)然實(shí)際中由于自放電、振動電機(jī)耗電等因素續(xù)航會縮短但達(dá)到數(shù)月是完全可行的。5. 外殼制作與穿戴體驗(yàn)優(yōu)化5.1 從PCB到可佩戴設(shè)備電路板完成后需要一個舒適可靠的外殼來保護(hù)它并固定在手腕上。3D打印方案這是最靈活的方式。使用Fusion 360或SolidWorks等軟件建模。設(shè)計(jì)時需注意精確的配合公差PCB和電池槽的尺寸要比實(shí)物大0.2-0.3mm方便放入。按鈕開孔為電源開關(guān)或復(fù)位按鈕預(yù)留孔位。傳感器開窗在ADXL345芯片正上方外殼不能有遮擋但可以用一層很薄的塑料片保護(hù)。表帶連接結(jié)構(gòu)在殼體兩側(cè)設(shè)計(jì)“生耳桿”孔標(biāo)準(zhǔn)手表表帶接口或者直接設(shè)計(jì)成卡扣式用于連接尼龍魔術(shù)貼表帶后者更舒適且可調(diào)節(jié)范圍大。分層設(shè)計(jì)可以設(shè)計(jì)為上下蓋用少量螺絲或卡扣固定。上蓋可以設(shè)計(jì)一些透氣孔。手工制作方案如果沒有3D打印機(jī)可以使用“軟硅膠套”或“熱縮管”的方法。硅膠套測量好PCB尺寸在網(wǎng)上定制一個柔軟的硅膠保護(hù)套將PCB塞入硅膠套本身可以帶有環(huán)扣用于穿表帶。熱縮管將PCB和電池用絕緣膠帶包裹平整然后套入直徑合適的熱縮管用熱風(fēng)槍加熱收縮形成一個緊密的包裹層。兩端留出傳感器和開關(guān)位置。最后在兩側(cè)縫上或粘上表帶。5.2 穿戴舒適性與可靠性調(diào)校重心與平衡將電池最重的部分放置在靠近手腕內(nèi)側(cè)皮膚一側(cè)的位置這樣設(shè)備在手腕上更“貼服”不易晃動。振動電機(jī)也應(yīng)盡量靠近內(nèi)側(cè)讓振感更直接。表帶選擇推薦使用尼龍魔術(shù)貼表帶。它透氣、輕便、可無限調(diào)節(jié)非常適合這種輕量化設(shè)備。避免使用金屬表帶太重且可能影響傳感器讀數(shù)。防水防汗電子設(shè)備最怕汗液。可以在組裝完成的PCB上噴涂一層三防漆這是電子行業(yè)常用的防水防潮涂層。對于外殼接縫可以涂抹少量硅橡膠密封膠。注意留出充電口如果有和開關(guān)。振動反饋體驗(yàn)振動電機(jī)的位置和固定方式直接影響體驗(yàn)。電機(jī)不能懸空必須緊密貼合外殼內(nèi)壁最好用膠水固定這樣振動才能有效傳遞到外殼上??梢酝ㄟ^調(diào)整PWM信號的占空比來改變振動強(qiáng)度找到既明顯又不惱人的強(qiáng)度。6. 功能擴(kuò)展與調(diào)試排錯指南6.1 更多創(chuàng)意功能設(shè)想基礎(chǔ)久坐提醒實(shí)現(xiàn)后這個平臺還有很大的擴(kuò)展空間計(jì)步器功能通過更復(fù)雜的算法如峰值檢測分析加速度數(shù)據(jù)實(shí)現(xiàn)簡單的步數(shù)統(tǒng)計(jì)并將數(shù)據(jù)存儲在EEPROM中。健身動作計(jì)數(shù)器針對特定的健身動作如俯臥撐、深蹲通過識別特定的加速度模式來進(jìn)行計(jì)數(shù)并在完成一組后振動提示休息。姿態(tài)提醒長時間低頭看手機(jī)或電腦會導(dǎo)致頸椎前傾。通過分析ADXL345的Z軸數(shù)據(jù)當(dāng)設(shè)備戴在手腕上特定朝向時可以判斷手臂是否長期處于下垂前伸狀態(tài)并提醒用戶調(diào)整姿勢。簡易遙控器增加一個紅外發(fā)射管可以編程讓手表通過特定的手勢比如快速轉(zhuǎn)動手腕兩次來發(fā)射紅外信號控制電視、空調(diào)等家電。無線同步如果覺得ATtiny85資源有限可以升級到ATtiny84或更大的型號甚至使用帶藍(lán)牙低功耗BLE的芯片如nRF52832將活動數(shù)據(jù)同步到手機(jī)APP。但這會顯著增加復(fù)雜度和功耗。6.2 常見問題與排查實(shí)錄在制作過程中你幾乎一定會遇到以下問題這里是我的排查經(jīng)驗(yàn)問題現(xiàn)象可能原因排查步驟與解決方案系統(tǒng)完全不上電1. 電源開關(guān)未打開或損壞。2. 電池沒電或裝反。3. LDO穩(wěn)壓芯片損壞或焊接不良。4. PCB存在電源短路。1. 用萬用表蜂鳴檔檢查開關(guān)通斷。2. 測量電池電壓應(yīng)高于3V鋰電或2.8V紐扣電池。3. 測量LDO輸入輸出電壓。輸入應(yīng)有電池電壓輸出應(yīng)為穩(wěn)定的3.3V左右。4. 斷開所有負(fù)載測量VCC與GND之間的電阻阻值過小如幾歐姆說明有短路需檢查焊接。單片機(jī)無法燒錄程序1. 編程器連接錯誤或驅(qū)動問題。2. ATtiny85熔絲位配置錯誤如時鐘源選錯。3. RESET引腳未上拉或?qū)Φ囟搪贰?. 確認(rèn)USBasp驅(qū)動已安裝連線正確VCC, GND, MOSI, MISO, SCK, RESET。2. 嘗試使用“燒錄引導(dǎo)程序”重置熔絲位。3. 用萬用表測量RESET引腳電壓應(yīng)為VCC約3.3V。振動電機(jī)不工作1. 電機(jī)本身損壞。2. 驅(qū)動MOSFET電路故障。3. 程序未正確控制I/O口。1. 直接將電機(jī)兩端接3V電池看是否振動。2. 測量MOSFET柵極G電壓當(dāng)程序應(yīng)輸出高電平時此處應(yīng)有接近VCC的電壓。如果沒有檢查單片機(jī)I/O口及連接電阻。3. 檢查程序中對電機(jī)控制引腳的pinMode和digitalWrite語句。加速度計(jì)讀數(shù)全為0或不變1. I2C通信失敗。2. ADXL345未正確初始化。3. 電源不穩(wěn)定。1. 用I2C掃描程序檢查是否能找到設(shè)備地址0x53。2. 檢查初始化序列特別是“測量模式”的寄存器POWER_CTL是否已正確設(shè)置寫入0x08。3. 在ADXL345的VCC引腳處測量電壓并并聯(lián)一個0.1uF的貼片電容緊靠其引腳。功耗過高電池耗電快1. 未啟用休眠模式。2. 外設(shè)如加速度計(jì)未進(jìn)入低功耗模式。3. PCB存在漏電如焊錫渣短路。1. 用萬用表電流檔串聯(lián)在電池回路中分別測量MCU休眠時和工作時的電流。休眠電流應(yīng)10μA。2. 在程序里確認(rèn)已發(fā)送ADXL345的低功耗命令。3. 仔細(xì)檢查PCB尤其是芯片引腳間是否有細(xì)微的短路?;顒幼R別不準(zhǔn)確1. 加速度計(jì)安裝方向與程序假設(shè)不符。2. 活動量閾值THRESHOLD設(shè)置不合理。3. 數(shù)據(jù)噪聲大未濾波。1. 編寫一個測試程序連續(xù)輸出三軸原始值觀察設(shè)備在不同姿態(tài)下的數(shù)值變化據(jù)此調(diào)整程序中的坐標(biāo)軸映射。2. 將計(jì)算出的activity_delta值通過串口軟串口打印出來觀察日?;顒訒r的典型值據(jù)此調(diào)整閾值。3. 在程序中加入滑動平均濾波算法。這個項(xiàng)目最吸引人的地方在于用極簡的硬件創(chuàng)造了一個有實(shí)用價值的交互設(shè)備。它剝離了智能手表的浮華回歸到提醒功能的本質(zhì)。整個制作過程從畫原理圖、設(shè)計(jì)PCB、焊接貼片元件到編寫算法、優(yōu)化功耗、設(shè)計(jì)外殼是一次完整的微型電子產(chǎn)品開發(fā)實(shí)踐。當(dāng)你最終將它戴在手上感受到它因你久坐而發(fā)出的輕微震動時那種親手創(chuàng)造并解決實(shí)際問題的成就感是購買任何成品都無法替代的。如果你對其中某個細(xì)節(jié)有更多疑問或者有了新的改進(jìn)想法歡迎隨時交流。