基于cubeMX的hal庫STM32實現MQ2煙霧濃度檢測

一、任務目標

? ? ? ? 使用STM32F103C8T6單片機,使用單片機AD模塊采集MQ2煙霧傳感器的數據,在OLED屏顯示檢測到的AD值、電壓值和濃度值(ppm單位)。

二、實現過程

1、MQ2煙霧傳感器的濃度轉化方法

(1)實驗所用的MQ2的鏈接

商品詳情

(2)MQ2的技術參數

1、具有信號輸出指示。

2、雙路信號輸出(模擬量輸出及TTL電平輸出)

3、TTL輸出有效信號為低電平。(當輸出低電平時信號燈亮,可直接接單片機) ????????????????

4、模擬量輸出0~5V電壓,濃度越高電壓越高。

5、對液化氣,天然氣,城市煤氣有較好的靈敏度。

6、具有長期的使用壽命和可靠的穩定性

7、快速的響應恢復特性

傳感器模塊的原理圖為:

由技術參數可知,MQ2模塊輸出0-5V的模擬量電壓,而STM32單片機的AD電壓采集范圍為0-3.3V,所以需要使用分壓電路將0-5V轉化為0-3.3V的范圍,以下為參考電路

其中,MQ2_AD連接到單片機AD采集引腳。

(3)濃度轉化推算

由傳感器的靈敏度曲線可知,不同濃度的ppm對應不同的RS/R0值,其中RS為元件在不同氣體不同濃度下傳感器的電阻值,R0為元件在潔凈空氣中電阻值。

又由電路可知,Vrl/Rl = (Vc - Vrl)/Rs;
Vrl:即AO口輸出電壓
Vc:回路電壓5V
Rl:Rl為可調電阻,這里電路里面Rl為第一張電路里面的R2為1K歐姆固定值。

從而,已知Vrl、Vc、Rl可以算出RS,已知RS和R0就可以得出不同濃度的ppm值。

根據靈敏度特性曲線,可進一步得出RS/R0與ppm的方程:

選擇丙烷(propane)使用matlab進行提取曲線,

ppm=[200 500 800 1000 1562 2000 3000 5000 10000];
Rs/R0=[1.74 1.22 0.90 0.80 0.63 0.60 0.50 0.38 0.27];

根據Rs/R0=a*(ppm)^b,得到

? ? ? ? ? ? ? ? ? Rs/R0=21.72×(ppm)^(-0.4739)

也即

? ? ? ? ? ? ? ? ppm=(21.72×R0/RS)^(2.1101)

最后,我們將單片機AD引腳采集到的在潔凈空氣中的電壓為0.78V,算出R0=(Vc-Vrl)*Rl/vrl=(5-0.78)*1/0.78=5.41(正常空氣情況下的Vrl值)。(由于R0和RS電阻值單位為千歐,這里都約掉千歐單位)

由RS=(Vc-Vrl)*Rl/vrl=(5-Vrl)*1/vrl,ppm=pow(21.72*R0/Rs,2.1101);即可得出濃度值。

2、STM32單片機的實現過程

(1)建立cubemx工程,并添加ADC設置和IIC驅動的OLED屏設置,即ADC檢測接PA1引腳,OLED的IIC接PB6---SCL,PB7---SDA。

(2)添加程序實現代碼

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_ADC1_Init();MX_I2C1_Init();/* USER CODE BEGIN 2 */OLED_Init();OLED_Clear();//	htim2.Instance->CNT=0;   /* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */Get_Smoke_ADC_Value();//獲取MQ2煙霧模塊的ADC值
//		key=KEY_Scan(0);  //獲取按鍵值OLED_ShowString(8, 1, "Smoke Detect", 12);//OLED屏第一行顯示煙霧檢測字符串OLED_ShowString(0, 3, "ADC_Value:", 12);//OLED屏第三行顯示MQ2的ADC_Value采樣值字符串OLED_ShowNum(80, 3, MQ2_ADC_Value, 4, 12); //OLED屏第三行顯示ADC采集值OLED_ShowString(0, 4, "ADC_Volt:", 12);//OLED屏第四行顯示MQ2的ADC_Volt采樣電壓字符串MQ2_ADC_Volt100=MQ2_ADC_Volt*100;//將采樣電壓擴大100倍		sprintf((char*)str_buff, "%d.%d%dV",  MQ2_ADC_Volt100/100, (MQ2_ADC_Volt100%100/10),  MQ2_ADC_Volt100%10);//格式化輸出擴大100倍的采樣電壓OLED_ShowString(72, 4,(uint8_t *)str_buff,12);//OLED屏第四行顯示采集的電壓值RS=(5-MQ2_ADC_Volt)*1/MQ2_ADC_Volt;  //濃度轉化算法R0=5.41;//R0為在潔凈空氣中的RS值Concent_Value=pow(21.72*R0/RS,2.1101);     //利用濃度擬合曲線公式和指數運算函數,計算出來ppm單位的煙霧含量值Concent_Value100=Concent_Value*100;  //將煙霧含量值擴大100倍		OLED_ShowString(0, 5, "smoke:", 12);//OLED屏第五行顯示煙霧字符串sprintf((char*)str_buff, "%d%d%d%d.%d%dppm",  (Concent_Value100/100000), (Concent_Value100%100000/10000),(Concent_Value100%10000/1000),(Concent_Value100%1000/100),(Concent_Value100%100/10),  (Concent_Value100%10));//格式化輸出擴大100倍的煙霧濃度OLED_ShowString(48, 5,(uint8_t *)str_buff,12);//OLED屏第五行顯示顯示煙霧ppm濃度值HAL_Delay(500);//每隔500ms刷新一次數據顯示}/* USER CODE END 3 */
}

3、成果展示

(1)潔凈空氣中的煙霧濃度值為513.79ppm

(2)點燃牙簽后MQ2探測到的煙霧濃度值,達到1401.13ppm

三、程序源碼下載鏈接

https://download.csdn.net/download/jacklood/90675879

四、參考文獻

1、MQ-2煙霧傳感器的電壓與濃度轉換_mq2煙霧濃度轉換公式-CSDN博客

2、關于MQ2煙霧模塊換算出的ppm太小的解決辦法_mq2煙霧濃度轉換公式-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80253.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android之AI自動化測試--Midscene

文章目錄 前言一、準備工作1.安裝2.準備 API Key3.安裝 adb4.連接設備 二、yaml格式自動化腳本1. 腳本案例2.執行結果 三、文件結構變化android 部分 前言 字節 Web Infra團隊官宣Midscene 從 v0.15 開始支持 Android 自動化測試,本篇文章介紹yaml方式的Android自動…

類的六個默認成員函數

如果一個類中什么成員都沒有,簡稱為空類。 空類中真的什么都沒有嗎?并不是,任何類在什么都不寫時,編譯器會自動生成以下6個默認成員函數。 默認成員函數:用戶沒有顯式實現,編譯器會生成的成員函數稱為默認…

HarmonyOS Grid 網格列表可長按 item 拖動移動位置

方案一 @Component struct WorkCircleCreatePage {// 存儲車控列表的數組@State VehicleDoorArr: IVehicleDoor[] = []// 當前移動的Item索引@State CurrentIndex: number = -1// 拖動時顯示的數據@State MoveItem: IVehicleDoor = { title: , icon: }// 拖動時放大倍數@State…

海量數據筆試題--Top K 高頻詞匯統計

問題描述: 假設你有一個非常大的文本文件(例如,100GB),文件內容是按行存儲的單詞(或其他字符串,如 URL、搜索查詢詞等),單詞之間可能由空格或換行符分隔。由于文件巨大&…

【數據結構】Map與Set結構詳解

數據結構系列五:Map與Set(一) 一、接口的實現 1.方法上 2.成員上 二、Map的內外雙接口結構 1.實現 1.1外部Map接口的實現 1.1.1臨摹整體 1.1.2外部類實現整體 1.2內部Entry接口的實現 1.2.1臨摹內部 1.2.2內部類實現內部 2.關系 3.意義 3.1邏輯內聚 …

Electron使用WebAssembly實現CRC-32 原理校驗

Electron使用WebAssembly實現CRC-32 原理校驗 將C/C語言代碼,經由WebAssembly編譯為庫函數,可以在JS語言環境進行調用。這里介紹在Electron工具環境使用WebAssembly調用CRC-32 原理格式校驗的方式。 CRC-32 原理校驗函數WebAssembly源文件 C語言實現C…

【晶振】晶振的工作原理及其與單片機關系

晶振(晶體振蕩器)是電子設備中常見的元件,其核心功能是提供穩定的時鐘信號,而單片機(MCU)依賴這一信號來同步內部操作。以下是晶振的工作原理及其與單片機關系的詳細說明: 一、晶振的工作原理 壓電效應與諧振 晶振的核心是石英晶體,利用其壓電效應: 當在晶體兩端施加電…

【Oracle專欄】函數中SQL拼接參數 報錯處理

Oracle相關文檔,希望互相學習,共同進步 風123456789~-CSDN博客 1.背景 最近同事反饋了一個很奇怪的問題,即有一個函數,入參是當前年月,主要作用是通過SQL語句將不合規的數據插入到指定表中,插入數據時帶上入參的年月參數。當前問題:單獨測試SQL沒有問題可以執行成功,…

nodejs之Express-介紹、路由

五、Express 1、express 介紹 express 是一個基于 Node.js 平臺的極簡、靈活的 WEB 應用開發框架,官方網址: https://www.expressjs.com.cn/ 簡單來說,express 是一個封裝好的工具包,封裝了很多功能,便于我們開發 WEB 應用(HTTP 服務) (1)基本使用 第一步:初始化項目并…

Unicode和 ASCII碼以及UTF-8編碼的區別和聯系

Unicode、ASCII 和 UTF-8 是計算機編碼領域的關鍵概念,它們既有聯系又有區別。以下是它們的對比分析: 1. ASCII(美國信息交換標準碼) 誕生時間:1967 年(7 位編碼,共 128 字符)。特點…

STM32F103_HAL庫+寄存器學習筆記20 - CAN發送中斷+ringbuffer + CAN空閑接收中斷+接收所有CAN報文+ringbuffer

導言 如上所示,在[[STM32F103_HAL庫寄存器學習筆記19 - CAN發送中斷CAN接收中斷接收所有CAN報文ringbuffer數據結構]]的基礎上,為CAN發送端也引入了ringbuffer(環形緩沖區)機制。CAN發送有三個發送郵箱,為什么還另外需…

Windows 環境下安裝 MariaDB 及 HeidiSQL 使用教程

引言 本報告旨在提供一份詳盡的操作指南。內容將覆蓋在 Windows 操作系統上安裝 MariaDB Community Server 的全過程。我們還將探討如何利用 HeidiSQL 這款圖形用戶界面(GUI)工具,直觀地預覽和管理我們新安裝的數據庫。除了安裝與配置的步驟…

美團2024年春招第一場筆試 C++

目錄 1&#xff0c;小美的平衡矩陣 2&#xff0c;小美的數組詢問 3&#xff0c;小美的MT 4&#xff0c;小美的朋友關系 1&#xff0c;小美的平衡矩陣 【題目描述】 給定一個n*n的矩陣&#xff0c;該矩陣只包含數字0和1。對于 每個i(1<i<n)&#xff0c;求在該矩陣中&am…

09-DevOps-Jenkins實現CI持續集成

前面已經把harbor搭建好了&#xff0c;也可以向harbor中推送自定義鏡像。 原計劃是在Jenkins這臺服務器上&#xff0c;完成鏡像構建&#xff0c;然后把鏡像推送的harbor倉庫中。現在改變計劃了&#xff0c;Jenkins所在的服務器&#xff08;192.168.1.10&#xff09;不負責鏡像…

Postman設置了Cookies但是請求不攜帶Cookie

1 問題說明 使用Postman工具往往要向本地服務器發送請求攜帶Cookie便于測試接口&#xff0c;但是在Send下面的Cookies選項中設置域名127.0.0.1&#xff0c;并添加Cookie&#xff0c;發現發送的請求怎么都不會攜帶Cookie&#xff1a; 通過Fiddler抓包發現并沒有Cookie&#xff1…

【unity】Vulkan模式下部分Android機型使用VideoPlayer組件播放視頻異常問題

一、問題背景 考慮到Vulkan高性能的優勢&#xff0c;項目組決定打包設置為vulkan優先&#xff0c;opengl es次之的方案&#xff1b;但由于部分低端設備或者部分模擬器對Vulkan的兼容性良莠不齊&#xff0c;導致諸如使用VideoPlayer組件無法正常播放視頻等問題頻發&#xff0c;而…

0802api設計和實戰-網絡ajax請求1-react-仿低代碼平臺項目

文章目錄 1 API設計1.1 用戶功能1.1.1 獲取用戶信息1.1.2 注冊1.1.3 登錄 1.2 問卷功能1.2.1 獲取單個問卷1.2.2 獲取問卷列表1.2.3 創建問卷1.2.4 更新問卷1.2.5 批量徹底刪除問卷1.2.6 復制問卷 1.3 小結 2 實戰2.1配置axios2.2 封裝API和測試2.3 新建問卷2.4 自定義hooks封裝…

Android Kotlin AIDL 完整實現與優化指南

本文將詳細介紹如何在Android中使用Kotlin實現AIDL&#xff08;Android Interface Definition Language&#xff09;&#xff0c;并提供多種優化方案。 一、基礎實現 1. 創建AIDL文件 在src/main/aidl/com/example/myapplication/目錄下創建&#xff1a; IMyAidlInterface.…

【數據結構】_棧和隊列相關面試題

&#x1f525; 數據結構修煉場 &#x1f525; &#x1f4a5; 棧與隊列 終極試煉 &#x1f4a5; &#x1f680; 理論已加載完畢&#xff0c;代碼之魂覺醒時刻&#xff01; ?? 是時候用實戰點燃你的算法之力了—— 「題目風暴&#xff0c;來襲&#xff01;」 &#xff08;握…

精益數據分析(8/126):從Airbnb案例看精益創業與數據驅動增長

精益數據分析&#xff08;8/126&#xff09;&#xff1a;從Airbnb案例看精益創業與數據驅動增長 大家好&#xff01;一直以來&#xff0c;我都堅信在創業和技術的領域里&#xff0c;持續學習與分享是不斷進步的關鍵。今天&#xff0c;咱們繼續深入學習《精益數據分析》&#x…