arduino中斷和一些問題

2021-07-09 05:01:20 字數 1121 閱讀 5196

上次做的arduino小專案在測試過程中發現了一些小問題,至此又引出了一系列問題。大概是這樣的,之前檢測煙霧感測器使用電位器分壓替代的,今天找到了打火機和小木棍就點火實測了一把(好久沒玩火了)。測試過程中發現這個mq135感測器並不是很靈敏,把火苗放在下面感測器測試值公升高的很有限(50公升到100的樣子),而且火滅掉後或者有風吹過測量值很快就下來了,我估計這是和這個感測器所主要測量的氣體相關,這個感測器主要是測氨氣,一些有機氣體和煙霧,可能小木棍燃燒過程中這類氣體相對較少。

因此就出現了乙個問題,我之前的程式裡面採用的並非實時監測,而是在每一秒求100次採集平均值(而且是寫死的),這樣做主要為了減少虛警,但是如果要提高監測靈敏度的話還是需要增加乙個虛警時間閾值的引數,將求平均的時間縮短,實際實現還是增加乙個佇列儲存一段時間的取樣資料(虛警時間閾值視窗),然後每次取樣的時候求一次平均值。這樣的話相當於實時在對煙霧進行檢測並且實時檢測是否超過閾值需要報警,而且可以通過調整虛警時間閾值這個引數來改變報警的靈敏度。為了實現這個功能就需要用到arduino的中斷。幸好arduino是有內部中斷的,即便是uno這個最低的型號,它裡面有3個定時器,每乙個都可以作為中斷,也就是說最多可以同時又三個定時中斷,我找到了一篇文章詳細的介紹了中斷的設定方式,具體就不詳細說明了,看**即可。具體就不詳細說明了,看**即可。

int i = 0;

void setup()

isr(timer1_compa_vect)

void loop()

在這個100hz中斷中進行mq135採集,10ms取樣間隔,然後在中斷中進行平均值計算,並給出報警標誌。在使用中斷過程中又發現了乙個問題,就是蜂鳴器報警失效了,這個我之前單獨給蜂鳴器寫了乙個庫,最終發現問題應該是arduino函式堆疊問題,這裡主函式loop裡面呼叫蜂鳴器庫函式,蜂鳴器庫函式裡面又有delay函式,估計是在這個delay裡面再進中斷的時候掛掉的,解決的方法也很簡單,把這個蜂鳴器庫函式去掉封裝,直接放到loop函式裡面即可。這也進一步說明問題應該是由於arduino函式堆疊大小不夠導致的函式入棧或者出棧時出了問題。

這進一步又讓我懷疑arduino的中斷系統,它是如何處理多個中斷的,是否支援中斷巢狀,是否有中斷佇列等等,這個如果寫實時性高複雜的**就需要注意這些問題,後面有時間對現在一些有名的處理器的中斷機制做乙個總結。

String 一些問題

前言 等號 對於基本型別,比較的是值,對於引用型別,比較的是記憶體位址。1.在物件池中建立,如果常量池中已經存在則返回常量池中已經有的。private static void test1 結果 true 2.乙個在string pool中,乙個在堆中。private static void test...

C 一些問題

1 if else語句和switch case語句的效率分析對比 switch效率高。switch的效率與分支數無關,當只有分支比較少的時候,if效率比switch高,因為switch有跳轉表。分支比較多,那當然是switch 根據大量的實際程式測試 不考慮不同的編譯器優化程度差異,假設都是最好的優...

mysql 一些問題

1 中文亂碼 問題 推薦用 uft 8 編碼 適配一切介面,mysql中 發生中文亂碼時 開啟mysql 安裝路徑 更改後 重啟mysql 服務即可,有時也需要 重新匯入資料庫 可能是與 source 檔案時 編碼沒有設定好 client password your password port 33...