庫(kù)監(jiān)測(cè)系統(tǒng)設(shè)計(jì):傳感器、PCB與MQTT實(shí)戰(zhàn))
簡(jiǎn)介本資源是一套面向本科畢業(yè)設(shè)計(jì)的完整嵌入式安防系統(tǒng)實(shí)戰(zhàn)方案適用于STM32初學(xué)者及電子類(lèi)專(zhuān)業(yè)畢設(shè)學(xué)生解決智能倉(cāng)庫(kù)環(huán)境監(jiān)測(cè)、多源入侵報(bào)警與遠(yuǎn)程協(xié)同管控等典型工程問(wèn)題。壓縮包共524個(gè)文件涵蓋86個(gè).h頭文件與74個(gè).c源碼含STM32F103底層驅(qū)動(dòng)與應(yīng)用邏輯、44份PDF文檔含完整論文參考、原理圖說(shuō)明、元件清單、2個(gè)PCB工程文件、2個(gè)原理圖文件、1個(gè)可直接安裝的Android APK應(yīng)用及配套MP4演示視頻整體達(dá)684.32MB結(jié)構(gòu)清晰、模塊解耦明確便于分階段學(xué)習(xí)與調(diào)試。已有835人下載學(xué)習(xí)資源提供從硬件設(shè)計(jì)含可編輯PCB、固件開(kāi)發(fā)、APP通信到論文撰寫(xiě)的全鏈路支撐特別包含GSM短信報(bào)警觸發(fā)邏輯、WIFI透?jìng)鲄f(xié)議適配代碼、多傳感器數(shù)據(jù)融合顯示等關(guān)鍵實(shí)現(xiàn)細(xì)節(jié)是少有的兼具工程規(guī)范性與教學(xué)完整性的畢設(shè)級(jí)項(xiàng)目范例。1. 先把“智能倉(cāng)庫(kù)”拆成你能交付的東西做畢設(shè)第一個(gè)坑就是一上來(lái)就想“我要做一個(gè)智能倉(cāng)庫(kù)”然后打開(kāi)STM32CubeMX發(fā)呆。倉(cāng)庫(kù)監(jiān)測(cè)和安防拆開(kāi)來(lái)看其實(shí)是三塊互相獨(dú)立、又能拼在一起的功能環(huán)境感知溫濕度、煙霧/可燃?xì)怏w這些數(shù)據(jù)要實(shí)時(shí)采集還要能看歷史趨勢(shì)否則“遠(yuǎn)程監(jiān)測(cè)”沒(méi)有落地。安防報(bào)警人體紅外、門(mén)窗磁、火焰檢測(cè)觸發(fā)之后要聲光報(bào)警同時(shí)把告警事件推到遠(yuǎn)程端。遠(yuǎn)程通道倉(cāng)庫(kù)里沒(méi)有人在但數(shù)據(jù)要能傳到手機(jī)或電腦網(wǎng)頁(yè)上這套系統(tǒng)才叫“遠(yuǎn)程”。把這三個(gè)功能列出來(lái)選題的框架就清楚了傳感器采集端用STM32F103C8T6做主控外掛DHT22溫濕度、MQ-2或MQ-135煙霧/可燃?xì)怏w、HC-SR501人體紅外、火焰?zhèn)鞲衅髂K加上OLED顯示屏做本地看板遠(yuǎn)程通信用ESP8266走M(jìn)QTT協(xié)議上云或者走局域網(wǎng)TCP也行報(bào)警執(zhí)行端用有源蜂鳴器和繼電器模塊。整套系統(tǒng)供電用12V適配器板載AMS1117-3.3轉(zhuǎn)換成3.3V給MCU和傳感器用。選擇STM32F103C8T6而不是F407或者GD32原因很實(shí)在例程多、資料全、CubeMX一鍵生成工程芯片價(jià)格也穩(wěn)定。本科畢設(shè)最怕的不是技術(shù)難是卡在一個(gè)問(wèn)題上三天沒(méi)人問(wèn)而F103系列的踩坑記錄幾乎全網(wǎng)都是這對(duì)畢設(shè)進(jìn)度的保障比性能參數(shù)重要得多。這塊板子本身資源也夠用64KB Flash跑得下全部固件20KB RAM足夠緩沖多路ADC采集數(shù)據(jù)和MQTT報(bào)文USART、I2C、SPI、ADC外設(shè)應(yīng)有盡有控制這類(lèi)傳感器綽綽有余。PCB部分這一篇我會(huì)詳細(xì)講。因?yàn)楹芏嗳艘詾楫?huà)完原理圖拉完線投板就結(jié)束了實(shí)際上布局、布線規(guī)則、電源完整性、絲印處理這些才是真正拉開(kāi)差距的地方。2. 環(huán)境感知模塊選型別只看“能用”要看“好調(diào)”倉(cāng)庫(kù)環(huán)境監(jiān)測(cè)最常見(jiàn)的參數(shù)就是溫濕度和空氣質(zhì)量。二者選型的邏輯完全不一樣分開(kāi)說(shuō)。2.1 溫濕度傳感器DHT22AM2302的性?xún)r(jià)比與坑DHT22單總線協(xié)議一根數(shù)據(jù)線搞定通信便宜、資料多非常適合本科畢設(shè)。我也見(jiàn)過(guò)有人用SHT30或者AHT20I2C接口精度更高、穩(wěn)定性更好但DHT22足夠應(yīng)付倉(cāng)庫(kù)環(huán)境且例程遍地都是不需要自己摳時(shí)序。但DHT22有它的毛病采樣周期必須大于2秒。很多人一上來(lái)就死循環(huán)里讀結(jié)果讀出來(lái)的數(shù)據(jù)全是0或者跳變。這是因?yàn)镈HT22內(nèi)部上電后需要時(shí)間完成轉(zhuǎn)換你讀得太快傳感器根本來(lái)不及響應(yīng)。正確做法是在主循環(huán)里搞一個(gè)狀態(tài)機(jī)或者簡(jiǎn)單的定時(shí)器標(biāo)志2秒讀一次就夠了。倉(cāng)庫(kù)環(huán)境本來(lái)就是個(gè)慢變量2秒刷新綽綽有余。另外一個(gè)坑是上拉電阻。DHT22的數(shù)據(jù)線需要接一個(gè)4.7kΩ到10kΩ的上拉電阻到VCC如果模塊自帶電平轉(zhuǎn)換電路就無(wú)所謂但你裸片焊在PCB上的時(shí)候忘了加上拉數(shù)據(jù)線在空閑狀態(tài)是高阻態(tài)通信必然失敗。我在PCB設(shè)計(jì)那一節(jié)會(huì)專(zhuān)門(mén)畫(huà)出來(lái)。2.2 氣體傳感器MQ-2還是MQ-135MQ-2可檢測(cè)丙烷、丁烷、液化氣、煙霧MQ-135對(duì)氨氣、硫化物、苯系蒸汽更敏感同時(shí)也對(duì)煙霧有響應(yīng)。對(duì)于倉(cāng)庫(kù)場(chǎng)景我推薦MQ-135原因不是靈敏度而是它的交叉響應(yīng)更適合做“空氣質(zhì)量綜合指標(biāo)”——你要的不是精確到“某種氣體濃度是多少ppm”而是“倉(cāng)庫(kù)空氣是不是變質(zhì)了”MQ-135輸出一個(gè)隨空氣污染程度變化的模擬電壓閾值可調(diào)邏輯簡(jiǎn)單。而MQ系列傳感器有個(gè)所有新手都會(huì)忽視的問(wèn)題它內(nèi)部有加熱電阻上電后需要預(yù)熱。冷啟動(dòng)的幾分鐘內(nèi)輸出是不穩(wěn)定的可能亂跳也可能一直高電平。所以程序里不要在初始化后立刻讀ADC要延時(shí)個(gè)3到5分鐘再開(kāi)始判斷否則誤報(bào)率極高。另外這類(lèi)傳感器工作電流不小加熱絲大概150mA左右不能用單片機(jī)3.3V引腳直接供最好單獨(dú)用5V供電PCB上留一顆100uF電解電容給它儲(chǔ)能緩沖。MQ-135輸出的是模擬電壓連接到STM32的ADC引腳。信號(hào)量與濃度是非線性的但畢設(shè)階段不需要擬合精確曲線直接在程序里設(shè)閾值判斷“正常/警告/危險(xiǎn)”三檔就好。真要顯示濃度值可以把ADC值直接映射成“空氣質(zhì)量指數(shù)0-100”百分比顯示人看得懂就行。2.3 ADC多通道采集的關(guān)鍵配置不是每個(gè)引腳都能隨便接STM32F103C8T6的ADC是12位逐次逼近型最多支持16個(gè)外部通道。但要注意ADC引腳分布在PA0到PA7、PB0、PB1等特定引腳上不是任意GPIO都能當(dāng)模擬輸入。網(wǎng)上最常見(jiàn)的翻車(chē)就是把傳感器輸出接到了PA8或者PB3上軟件里怎么配置都讀不到有效值最后只能用萬(wàn)用表量電壓發(fā)現(xiàn)引腳根本不通。我自己做這版系統(tǒng)用了ADC的掃描模式連續(xù)轉(zhuǎn)換DMA搬運(yùn)。MQ-135接PA0火焰?zhèn)鞲衅鹘覲A1兩個(gè)通道一起采樣DMA自動(dòng)把結(jié)果搬到內(nèi)存數(shù)組里CPU完全不用參與等標(biāo)志位即可。這個(gè)寫(xiě)法和輪詢(xún)讀ADC的代碼量其實(shí)差不多但架構(gòu)上舒服得多以后加傳感器通道只需要改CubeMX配置。ADC初始化里有個(gè)關(guān)鍵參數(shù)是采樣時(shí)間。STM32的ADC采樣時(shí)間可以設(shè)1.5到239.5個(gè)周期如果引腳源阻抗高采樣時(shí)間太短會(huì)導(dǎo)致采集電壓偏低。MQ-135模塊輸出經(jīng)過(guò)一個(gè)電壓比較器或者直接分壓輸出源阻抗不算太低我建議把采樣時(shí)間設(shè)為55.5周期以上穩(wěn)定不漂。3. 安防子系統(tǒng)無(wú)源蜂鳴器與有源蜂鳴器千萬(wàn)別選錯(cuò)安防報(bào)警執(zhí)行端很多人第一反應(yīng)是“蜂鳴器唄”。但蜂鳴器分為無(wú)源和有源兩種無(wú)源蜂鳴器需要外部提供一定頻率的方波才能響有源蜂鳴器內(nèi)部自帶振蕩源給個(gè)高電平就響。畢設(shè)系統(tǒng)里強(qiáng)烈建議用有源蜂鳴器否則你得用定時(shí)器輸出PWM驅(qū)動(dòng)麻煩且有源蜂鳴器的響度通常更大倉(cāng)庫(kù)環(huán)境需要響度。驅(qū)動(dòng)方式上也不要直接用GPIO高電平觸發(fā)就完事。有源蜂鳴器工作電流大概30mAGPIO引腳直接驅(qū)動(dòng)會(huì)拉低電壓也可能燒引腳。正確方案是加一顆S8050三極管做開(kāi)關(guān)蜂鳴器接在5V和三極管集電極之間GPIO接基極串1kΩ限流電阻。PCB設(shè)計(jì)時(shí)這顆三極管的位置盡量靠近蜂鳴器走線短可以減少壓降和干擾。人體紅外模塊HC-SR501輸出的是數(shù)字信號(hào)觸發(fā)時(shí)輸出高電平。這個(gè)模塊最容易被忽略的是它有兩個(gè)可調(diào)電位器靈敏度調(diào)節(jié)和延時(shí)時(shí)間調(diào)節(jié)。延時(shí)時(shí)間調(diào)太長(zhǎng)你測(cè)試的時(shí)候按一次觸發(fā)它可能持續(xù)輸出半分鐘高電平邏輯上看起來(lái)就像“卡死了”。推薦把延時(shí)調(diào)到最小逆時(shí)針旋到底讓它輸出一個(gè)短暫脈沖便于程序判斷邊沿?;鹧?zhèn)鞲衅饕彩悄M輸出但它的光譜響應(yīng)決定了它只能在一定距離內(nèi)有效。距離幾十厘米能測(cè)到打火機(jī)火焰再遠(yuǎn)就瞎了。所以整機(jī)聯(lián)調(diào)的時(shí)候千萬(wàn)別把它放在倉(cāng)庫(kù)門(mén)口說(shuō)“我看不到火焰”——物理特性擺在那里選型和安裝位置本來(lái)就是系統(tǒng)方案的一部分。安防聯(lián)動(dòng)邏輯不能太復(fù)雜。我的策略是人體紅外觸發(fā)且持續(xù)10秒以上判定為非法闖入蜂鳴器響火焰?zhèn)鞲衅鬏敵龀撝盗⒓错慚Q-135濃度超過(guò)警告閾值響一下提示而不是持續(xù)報(bào)警超過(guò)危險(xiǎn)閾值持續(xù)報(bào)警。報(bào)警事件同時(shí)通過(guò)ESP8266推送到MQTT服務(wù)器手機(jī)上收到消息。有一個(gè)問(wèn)題必須提前想好遠(yuǎn)程端網(wǎng)絡(luò)斷開(kāi)了報(bào)警還靈不靈正確答案是本地報(bào)警必須任何時(shí)候都生效遠(yuǎn)程推送只是錦上添花。所以邏輯寫(xiě)成“檢測(cè)到事件-本地聲光報(bào)警-嘗試網(wǎng)絡(luò)推送”順序不能反。倉(cāng)庫(kù)安防的本體是現(xiàn)場(chǎng)的響應(yīng)能力不是手機(jī)上那條通知。4. 遠(yuǎn)程通道選型與數(shù)據(jù)協(xié)議設(shè)計(jì)ESP8266 MQTT 怎么搭才穩(wěn)遠(yuǎn)程監(jiān)測(cè)是本系統(tǒng)的靈魂這部分的方案選型一度讓我糾結(jié)了很久最后定了ESP8266MQTT。先說(shuō)為什么不用藍(lán)牙BLE通信距離在倉(cāng)庫(kù)場(chǎng)景下太短穿墻之后基本廢了。為什么不用GSM模塊比如SIM800C資費(fèi)問(wèn)題、信號(hào)問(wèn)題、還要備用卡畢設(shè)階段沒(méi)必要引入這種可變因素。ESP8266模塊十幾塊錢(qián)WiFi覆蓋率在校園里幾乎百分百做局域網(wǎng)遠(yuǎn)程夠了加一個(gè)云平臺(tái)比如巴法云、OneNET就能實(shí)現(xiàn)互聯(lián)網(wǎng)遠(yuǎn)程。4.1 ESP8266與STM32的通信協(xié)議STM32和ESP8266之間走串口AT指令通信波特率115200ESP8266默認(rèn)是115200有些模塊出廠是9600先確認(rèn)。ESP8266要配成透?jìng)髂J竭€是非透?jìng)髂J轿彝扑]使用非透?jìng)髯远x幀協(xié)議而不是開(kāi)透?jìng)?。透?jìng)髂J娇粗奖愕珨?shù)據(jù)沒(méi)有任何幀頭幀尾和校驗(yàn)一旦WiFi丟包或者串口誤碼上位機(jī)拿到一坨亂數(shù)據(jù)根本沒(méi)轍。我設(shè)計(jì)的幀格式很簡(jiǎn)單幀頭(0xAA) 長(zhǎng)度(1字節(jié)) 數(shù)據(jù)負(fù)載 校驗(yàn)和 幀尾(0x55)負(fù)載里放傳感器數(shù)據(jù)字符串例如TEMP:25.3,HUMI:60,SMOKE:12,FLAME:0,PIR:1STM32發(fā)完一幀后等ESP8266返回“OK”收到才發(fā)下一幀。這樣鏈路上有基本的狀態(tài)同步。4.2 MQTT消息設(shè)計(jì)主題分層是關(guān)鍵MQTT的Topic設(shè)計(jì)直接決定你擴(kuò)展性。不要用一個(gè)大主題“data”把所有東西都塞進(jìn)去按設(shè)備類(lèi)型和設(shè)備ID分層wh/device01/env -- 環(huán)境數(shù)據(jù) wh/device01/alarm -- 報(bào)警事件 wh/device01/status -- 在線狀態(tài)遺囑消息這樣手機(jī)端APP只需要訂閱wh/device01/#就能收到該設(shè)備所有消息。報(bào)警消息是遺囑也好、主動(dòng)推送也好都能區(qū)分。云平臺(tái)你可以用巴法云免費(fèi)、接入簡(jiǎn)單或者自己搭一個(gè)EMQX服務(wù)器。自己搭EMQX要多一臺(tái)服務(wù)器作為畢設(shè)演示不劃算。巴法云提供一個(gè)MQTT Broker地址和主題ESP8266直接連接就行微信小程序端用WebSocket接口同樣連到巴法云就能刷出數(shù)據(jù)。不過(guò)這里要提醒一點(diǎn)巴法云是公眾MQTT服務(wù)沒(méi)有加密認(rèn)證Topic名字不要用容易被猜的加個(gè)隨機(jī)串后綴。同時(shí)也別指望它做數(shù)據(jù)持久化歷史曲線展示建議自己在本地寫(xiě)個(gè)Python腳本訂閱消息并存儲(chǔ)這也能在答辯的時(shí)候展示你的“數(shù)據(jù)鏈路”理解。4.3 ESP8266本身是一個(gè)“小坑王”給ESP8266供電是個(gè)隱蔽的坑。它的峰值電流在發(fā)送WiFi數(shù)據(jù)時(shí)能到300mA甚至更高如果直接從STM32的3.3V穩(wěn)壓輸出取電一發(fā)送數(shù)據(jù)電壓就下墜串口通信立刻亂碼。這也就是為什么很多人調(diào)試時(shí)發(fā)現(xiàn)ESP8266單獨(dú)測(cè)試一切正常一接上STM32就瘋狂輸出垃圾字符。解決方法是ESP8266獨(dú)立供電。在PCB上把3.3V走線分成兩路一路給MCU和傳感器一路單獨(dú)給ESP8266模塊兩路在AMS1117輸出端匯合但經(jīng)過(guò)磁珠或0Ω電阻隔離。同時(shí)ESP8266模塊旁邊加一個(gè)470uF的電解電容和0.1uF的陶瓷電容給它“兜底”。串口連接上STM32的TX接ESP8266的RXSTM32的RX接ESP8266的TX如果模塊是3.3V電平就直連F103的IO也是3.3V可以直連。別接反了接反的后果是上位機(jī)收到全0xFF。5. PCB設(shè)計(jì)實(shí)戰(zhàn)從原理圖到投板前我踩完的坑都在這這一節(jié)是本題的重頭戲。智能倉(cāng)庫(kù)監(jiān)測(cè)系統(tǒng)包含數(shù)字電路、模擬電路、電源和無(wú)線模塊正好是練習(xí)PCB設(shè)計(jì)的絕佳載體。我用的是嘉立創(chuàng)EDA專(zhuān)業(yè)版免費(fèi)、有海量元器件庫(kù)、能直接生成Gerber下單對(duì)畢設(shè)來(lái)說(shuō)完全夠用。5.1 原理圖設(shè)計(jì)模塊化不要一坨連到底原理圖不是連線工具是設(shè)計(jì)記錄。我是按電源模塊、主控最小系統(tǒng)、傳感器接口、執(zhí)行器接口、無(wú)線通信模塊五個(gè)模塊畫(huà)的模塊之間用網(wǎng)絡(luò)標(biāo)簽Net Label連接不要用線跨過(guò)圖紙拉成一團(tuán)。這樣不僅自己看得清評(píng)審老師掃一眼就知道你系統(tǒng)設(shè)計(jì)有條理。電源模塊是原理圖里最容易被忽略但又是最重要的部分。我用的拓?fù)涫?2V DC適配器輸入 - 通過(guò)接線端子接入 - 一路直通繼電器繼電器線圈需要12V驅(qū)動(dòng)另一路經(jīng)MP1584降壓模塊轉(zhuǎn)5V - AMS1117轉(zhuǎn)3.3V。AMS1117輸入輸出各接一顆10uF鉭電容和0.1uF陶瓷電容這是基本功但很多人漏。主控最小系統(tǒng)除了STM32F103C8T6本身之外最關(guān)鍵的是三顆電容和一顆10kΩ上拉電阻VDD引腳每顆就近放0.1uF去耦電容BOOT0引腳經(jīng)10kΩ下拉到GND否則可能進(jìn)不了Flash啟動(dòng)模式芯片跑不起來(lái)NRST復(fù)位引腳接10kΩ上拉到3.3V并聯(lián)0.1uF電容到地。這些件每一顆都有存在的理由少了、位置放錯(cuò)了系統(tǒng)就可能概率性死機(jī)。STM32F103C8T6是LQFP48封裝引腳間距0.5mm新手焊接容易連錫。如果你的焊接經(jīng)驗(yàn)不足建議用QFN封裝的替代型號(hào)不過(guò)一般不建議換或者直接買(mǎi)一塊最小系統(tǒng)板插在PCB上留出排針接口。我個(gè)人建議還是直接焊畢竟畢設(shè)含PCB指的就是你親手做板焊接一次LQFP48對(duì)你的動(dòng)手能力提升非常明顯不試一次太可惜了。5.2 PCB布局順序比走線更決定成敗拿到板框先別急著布線布局決定了你這個(gè)板子好不好走、性能穩(wěn)不穩(wěn)。我的布局順序六步走固定接口件電源端子、傳感器排針、ESP8266模塊座、OLED排針?lè)旁诎暹叿较虺夥奖悴寰€和操作。固定電源模塊DC-DC和LDO靠近電源輸入端子這樣電源路徑最短壓降和紋波最小避免電源走線繞過(guò)大半個(gè)板子再回來(lái)給MCU供電那種走法板子電磁兼容一定不理想。放置主控STM32放在板子中心偏一側(cè)所有IO外設(shè)朝向?qū)?yīng)的接口方向避免交叉走線。VCAP引腳105對(duì)應(yīng)的1uF電容放在引腳邊上這個(gè)電容不能省。放置傳感器接口MQ-135的引腳是從底部伸出來(lái)的注意封裝方向要留出足夠的空間給傳感器本體。MQ-135本體會(huì)發(fā)熱別跟溫濕度傳感器貼在一起否則DHT22測(cè)到的是MQ-135旁邊的熱空氣數(shù)據(jù)必然偏高。這個(gè)坑我實(shí)測(cè)過(guò)溫差能到4到5攝氏度。放置執(zhí)行器件蜂鳴器和繼電器放在遠(yuǎn)離模擬信號(hào)傳感器的一側(cè)防止電磁干擾影響ADC采樣。繼電器線圈斷電瞬間會(huì)產(chǎn)生反向電動(dòng)勢(shì)PCB上要給繼電器線圈并聯(lián)一顆1N4007續(xù)流二極管注意方向否則可能把MCU旁邊電路打掛。ESP8266布置到板邊天線區(qū)正下方整層掏空不要走任何銅皮和走線否則WiFi信號(hào)被PCB銅皮擋住信號(hào)強(qiáng)度驟降遠(yuǎn)程通信會(huì)時(shí)不時(shí)斷連排查起來(lái)非常頭疼。5.3 布線規(guī)則電源、地、信號(hào)線的優(yōu)先級(jí)布線之前先在規(guī)則管理器里把線寬設(shè)好信號(hào)類(lèi)型建議線寬說(shuō)明電源主干線12V、5V40mil以上走電流線寬不夠壓降大GND鋪銅/走線20mil以上回流路徑阻抗要低3.3V電源線15~20mil給MCU和傳感器供電普通信號(hào)線10milIO、UART、I2C差分/高頻信號(hào)無(wú)本系統(tǒng)無(wú)高頻要求ESP8266走線盡量短布線這個(gè)環(huán)節(jié)我想強(qiáng)調(diào)三點(diǎn)第一布線順序應(yīng)該是先電源后信號(hào)。先把電源和地走完再走信號(hào)線最后統(tǒng)一鋪地銅。很多人反過(guò)來(lái)信號(hào)線走得七扭八歪之后電源線沒(méi)地方走了只能繞大圈結(jié)果就是電源回路長(zhǎng)、壓降大、紋波高。第二信號(hào)線不要走直角和銳角。直角走線在轉(zhuǎn)角處會(huì)形成阻抗突變高速信號(hào)下有反射風(fēng)險(xiǎn)生產(chǎn)時(shí)酸液也可能在直角根部殘留導(dǎo)致細(xì)線被蝕刻斷。所有轉(zhuǎn)角用45度斜角或者圓弧過(guò)渡EDA軟件里都有這個(gè)設(shè)置。第三晶振要放在主控芯片附近晶振下面和周?chē)灰咂渌盘?hào)線。8MHz晶振給MCU提供時(shí)鐘時(shí)鐘線上的噪聲會(huì)直接耦合進(jìn)系統(tǒng)導(dǎo)致UART通信偶發(fā)亂碼。晶振周?chē)帕藘蓚€(gè)負(fù)載電容典型值20pF它們要靠近晶振引腳而不是靠近MCU引腳這是很多參考設(shè)計(jì)都沒(méi)畫(huà)對(duì)的地方。5.4 Gerber輸出與投板檢查投板之前做這幾件事能省回來(lái)一版DRC檢查必須清零。開(kāi)短路、線距不足、鉆孔距離近這些是硬性錯(cuò)誤任何一個(gè)在生產(chǎn)環(huán)節(jié)都可能直接報(bào)廢整板。嘉立創(chuàng)EDA的檢查包含孔到線、線到線、孔到板邊等規(guī)則跑完有紅叉就得回去改。檢查絲印位號(hào)大小。位號(hào)文字太小的話打印出來(lái)根本看不清。嘉立創(chuàng)EDA里面選中全部位號(hào)統(tǒng)一把字高改成60mil大概1.5mm左右就清晰了。這個(gè)細(xì)節(jié)在熱搜詞里有人專(zhuān)門(mén)問(wèn)“如何批量修改位號(hào)尺寸”說(shuō)明很多人前期被小字折磨過(guò)。生成Gerber文件之后用在線查看器預(yù)覽一遍。只看PCB編輯器里的樣子是不算數(shù)的因?yàn)镋DA軟件里隱藏了層到Gerber里看到的才是生產(chǎn)實(shí)際用的東西。預(yù)覽時(shí)重點(diǎn)看所有層是否對(duì)齊、絲印有沒(méi)有蓋在焊盤(pán)上絲印壓焊盤(pán)會(huì)導(dǎo)致焊接不良、鉆孔文件是否包含所有孔位。確認(rèn)PCB板厚和銅厚。常規(guī)1.6mm板厚、1oz銅厚對(duì)這塊板是夠用的。如果你把電源走線設(shè)計(jì)得特別細(xì)生產(chǎn)的時(shí)候就該發(fā)現(xiàn)并改粗了不要投板后才發(fā)現(xiàn)。5.5 PCB打樣回來(lái)后的驗(yàn)證清單板子到手第一件事不是插電是先用萬(wàn)用表量一遍電源對(duì)地阻抗。3.3V和GND之間正常應(yīng)該有幾百歐姆以上如果用的是成品模塊量出來(lái)短路的話先檢查AMS1117有沒(méi)有焊反。AMS1117封裝是SOT-223引腳順序是GND腳比輸入輸出長(zhǎng)一截裝反的概率極高。接著上電之后用手摸芯片溫度。如果發(fā)熱異常趕緊斷電查反向連接。再然后才是燒錄程序。調(diào)試順序建議是先點(diǎn)亮電源指示燈 - 初始化OLED顯示 - 讀DHT22 - 讀ADC - 測(cè)試UART與ESP8266 - 本地報(bào)警輸出 - 遠(yuǎn)程平臺(tái)聯(lián)調(diào)。一步一步來(lái)每一步都有明確驗(yàn)證點(diǎn)出了問(wèn)題能立刻鎖定范圍不會(huì)出現(xiàn)“整個(gè)系統(tǒng)沒(méi)反應(yīng)但不知道是哪的問(wèn)題”。6. 系統(tǒng)聯(lián)調(diào)順序與常見(jiàn)問(wèn)題排查表整個(gè)系統(tǒng)聯(lián)調(diào)我踩的坑不少把最典型的列出來(lái)你可以按表自查?,F(xiàn)象一OLED白屏或花屏。九成是I2C地址不對(duì)。OLED的I2C地址通常是0x3C但有些模塊是0x3D在代碼里先掃描一遍地址別硬編碼。還有個(gè)原因是SCL和SDA接反了這種低級(jí)錯(cuò)誤我犯過(guò)一次補(bǔ)了幾秒才反應(yīng)過(guò)來(lái)。現(xiàn)象二DHT22讀出來(lái)永遠(yuǎn)是0。檢查單總線引腳有沒(méi)有接上拉檢查引腳有沒(méi)有在CubeMX里配成開(kāi)漏輸出模式。開(kāi)漏輸出配合上拉電阻才能實(shí)現(xiàn)真正的雙向總線協(xié)議推挽模式下信號(hào)會(huì)被拉死。現(xiàn)象三ADC值滿(mǎn)量程或者一直跳。MQ-135模塊上通常有個(gè)電位器調(diào)節(jié)比較電壓如果模塊設(shè)計(jì)成“模擬輸出數(shù)字輸出”兩路別接錯(cuò)引腳。模擬輸出的電壓范圍是0到VCC如果讀到409512位滿(mǎn)量程多半是引腳懸空或者接錯(cuò)線了。另外前一版PCB如果ADC走線挨著繼電器線采樣值會(huì)在繼電器動(dòng)作瞬間跳變這是電磁耦合解決方法是加大走線間距或者加一個(gè)RC低通濾波10kΩ加0.1uF截止頻率大概160Hz夠用?,F(xiàn)象四ESP8266發(fā)送AT沒(méi)反應(yīng)。這個(gè)問(wèn)題先分兩部分排查一是串口波特率是不是對(duì)的二是模塊供電夠不夠。手頭有USB轉(zhuǎn)TTL的話把ESP8266單獨(dú)接電腦上測(cè)試如果單獨(dú)測(cè)試正常但接STM32不正常就是串口電平或者電源問(wèn)題重點(diǎn)查T(mén)X/RX有沒(méi)有接反、ESP8266電源是不是獨(dú)立供的?,F(xiàn)象五本地報(bào)警正常但遠(yuǎn)程收不到消息。先在PC上用MQTT客戶(hù)端軟件訂閱對(duì)應(yīng)主題看有沒(méi)有消息進(jìn)來(lái)。能收到的話問(wèn)題在手機(jī)端APP收不到的話分段排查ESP8266有沒(méi)有成功連接路由器連接上巴法云沒(méi)有巴法云上創(chuàng)建的主題和代碼里寫(xiě)的是不是完全一致MQTT是明文傳輸主題名打個(gè)大小寫(xiě)就能把你坑半小時(shí)。上面這些問(wèn)題的共性都是先看硬件再看軟件先查物理層再查協(xié)議層。很多人一上來(lái)就刷固件換代碼結(jié)果換了半小時(shí)發(fā)現(xiàn)是杜邦線接觸不良或者引腳定義搞錯(cuò)了很浪費(fèi)時(shí)間的。7. 一個(gè)能提升答辯含金量的思路本地?cái)?shù)據(jù)記錄遠(yuǎn)程平臺(tái)確實(shí)能看實(shí)時(shí)數(shù)據(jù)和報(bào)警但偶爾網(wǎng)絡(luò)斷開(kāi)那幾分鐘的數(shù)據(jù)就丟了。所以我建議在STM32端加一個(gè)Flash存儲(chǔ)模塊或者簡(jiǎn)單的SD卡記錄。STM32F103C8T6內(nèi)部Flash只有64KB扣掉程序空間剩下的空間雖然不大但用協(xié)議組織好的話存幾天的關(guān)鍵數(shù)據(jù)每分鐘采樣一次溫濕度和氣體濃度是夠的。思路是把數(shù)據(jù)以固定長(zhǎng)度結(jié)構(gòu)體存儲(chǔ)包含時(shí)間戳、溫度、濕度、氣體濃度、報(bào)警標(biāo)志。存滿(mǎn)一塊區(qū)域就循環(huán)覆蓋最舊的一條。如果板子上掛了ESP8266遠(yuǎn)程端斷線重連后把離線期間的數(shù)據(jù)補(bǔ)傳上去。這個(gè)設(shè)計(jì)成本極低但答辯的時(shí)候很能體現(xiàn)你的系統(tǒng)設(shè)計(jì)思維不是“實(shí)現(xiàn)了基本功能”而是你考慮到了真實(shí)環(huán)境中網(wǎng)絡(luò)不可靠的問(wèn)題并提出了降級(jí)方案。這在本科畢設(shè)里算是一個(gè)相當(dāng)不錯(cuò)的加分項(xiàng)。實(shí)現(xiàn)方式上用片內(nèi)Flash模擬EEPROM初始化時(shí)預(yù)留最后一頁(yè)1KB做數(shù)據(jù)區(qū)擦除后按地址偏移寫(xiě)入。注意寫(xiě)Flash之前必須整頁(yè)擦除這是STM32的物理特性只能按“頁(yè)”操作。8. 走完一版之后我對(duì)這個(gè)系統(tǒng)的幾個(gè)復(fù)盤(pán)點(diǎn)如果再來(lái)一遍有些地方我會(huì)調(diào)整這里寫(xiě)出來(lái)給你做個(gè)參考。第一MQ-135這個(gè)傳感器在倉(cāng)庫(kù)場(chǎng)景其實(shí)不是最優(yōu)解它更偏“空氣質(zhì)量綜合指標(biāo)”而不是“火災(zāi)煙霧檢測(cè)”。如果你想更貼近“倉(cāng)庫(kù)安防”這個(gè)主題可以換成真正的光電式煙霧傳感器比如MQ-2或者更專(zhuān)業(yè)的離子式煙霧報(bào)警器模塊響應(yīng)速度和靈敏度完全不在一個(gè)級(jí)別。但代價(jià)是貴一些、代碼也要重新調(diào)。畢設(shè)選題是“安防系統(tǒng)”的話煙霧這塊值得投入。第二ESP8266到云平臺(tái)的接入雖然簡(jiǎn)單但答辯容易被追問(wèn)數(shù)據(jù)安全。哪怕只是演示級(jí)系統(tǒng)也建議把Topic命名得看不出業(yè)務(wù)邏輯同時(shí)寫(xiě)一句“實(shí)際落地應(yīng)使用TLS加密和設(shè)備認(rèn)證”在論文的不足與展望部分。這句不是套話是真的會(huì)被問(wèn)到。第三PCB版圖上OLED的接口方向與外殼沖突是我在這版最后悔的地方。當(dāng)時(shí)只想著放板邊方便插線但沒(méi)考慮整個(gè)裝置如果放進(jìn)有機(jī)玻璃外殼里排針朝上的話OLED就沒(méi)法固定在外殼上。如果你的畢設(shè)有外殼設(shè)計(jì)PCB布局階段就必須把外殼的結(jié)構(gòu)尺寸拿過(guò)來(lái)對(duì)齊不然后期全是手工改造和熱熔膠找補(bǔ)。第四在功耗上也有優(yōu)化空間。倉(cāng)庫(kù)場(chǎng)景如果要對(duì)UPS供電或者感應(yīng)取電整個(gè)系統(tǒng)的靜態(tài)電流可以壓到很低把OLED做成10秒刷一次、關(guān)掉ESP8266的空閑連接、用STM32的待機(jī)模式配合RTC定時(shí)喚醒。當(dāng)時(shí)趕進(jìn)度沒(méi)做但這是“智能”兩個(gè)字很值得展開(kāi)的落點(diǎn)。最后再說(shuō)一個(gè)做整機(jī)小技巧把上位機(jī)或者微信小程序端的界面截圖、調(diào)測(cè)過(guò)程錄屏、實(shí)物樣機(jī)照片這三樣提前整理到一個(gè)文件夾里寫(xiě)論文、答辯PPT和項(xiàng)目展示會(huì)用到不要到最后答辯前才到處翻。系統(tǒng)的功能演示流暢度比代碼寫(xiě)得漂亮更直觀。這套系統(tǒng)做下來(lái)嵌入式開(kāi)發(fā)、傳感器應(yīng)用、無(wú)線通信、PCB設(shè)計(jì)這些本科能力點(diǎn)基本上都覆蓋了。祝你的板子一版點(diǎn)亮跑完整個(gè)調(diào)測(cè)流程順利過(guò)答辯。如果投板或調(diào)測(cè)過(guò)程中卡住了帶著你的具體現(xiàn)象去對(duì)應(yīng)板塊找答案通常都能解決別蹲在那硬想。本文還有配套的精品資源點(diǎn)擊獲取