基于STM32的火災報警設備(阿里云平臺)

目錄

前言:

一、項目介紹和演示視頻

二、硬件需求準備

三、硬件框圖

1. 原理圖

2. PCB

四、CubeMX配置

五、代碼框架


前言:

源代碼下載鏈接:

  • https://download.csdn.net/download/m0_74712453/90474701

需要實物的可以私信博主或者在文章最下方添加好友。

一、項目介紹和演示視頻

項目實物圖:

項目演示視頻:

基于STM32的火災報警系統(阿里云平臺)

二、硬件需求準備

  • STM32F103C8T6最小系統板
  • 0.96寸OLED屏幕
  • ESP88266-01s
  • DHT11溫濕度模塊
  • 火焰模塊
  • 蜂鳴器
  • MQ2煙霧傳感器
  • LED燈

三、硬件框圖

1. 原理圖

2. PCB

四、CubeMX配置

1、RCC配置外部高速晶振——HSE

?

2、SYS配置:Debug設置成Serial Wire

?

3、I2C配置:

?

4、串口配置:

?5、TIM配置(開啟中斷):

?6、ADC配置:

7、GPIO口配置(蜂鳴器、LED、火焰傳感器) :

?

8、時鐘樹配置:

最后我們生成工程即可。

五、代碼框架

主體代碼循環界面:

變量作用說明:看懂變量的作用是看懂代碼的第一步:(代碼中可能還有其他變量,那是后面便于增加項目功能的代碼,有了它們就可以更便捷添加)

uint8_t datas[5];//空氣溫濕度數據 數組23為溫度整數小數  數組01為濕度整數小數
extern unsigned int Beep_Slow;//蜂鳴器減速,定時器使用,得以控制蜂鳴器響的頻率
extern int Beep_flag;//蜂鳴器開關標志位——著火了1,沒著火0
extern unsigned char Beep_data;//蜂鳴器GPIO 1-開  0-關unsigned char Flame_flag = 0;//1-顯示字體   0-不顯示字體   實現字體閃爍現象
unsigned int Flame_Slow = 0;//定時器使用,字體閃爍頻率實現

初始先連接熱點,然后連接阿里云平臺:

u8g2_t u8g2;//定義一個U8g2結構類型變量u8g2Init(&u8g2);//初始化屏幕//清屏u8g2_ClearBuffer(&u8g2);u8g2_SendBuffer(&u8g2);HAL_TIM_Base_Start_IT(&htim3);//開啟定時器3中斷HAL_UART_Receive_IT(&huart1, &buf, 1);//開啟串口中斷HAL_UART_Transmit(&huart1, "Hello\r\n", strlen("Hello]\r\n"),0xffff);Home_Draw(&u8g2);//顯示開機頁面Wifi_Connect();//WIFI連接u8g2DrawTest(&u8g2);//開機動畫u8g2_ClearBuffer(&u8g2);u8g2_SendBuffer(&u8g2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */Home_Menu(u8g2);//循環界面(循環判斷,刷新頁面)}

全部初始化好外設后,封裝函數顯示到屏幕上

//主頁顯示界面
void Home_Menu(u8g2_t u8g2)
{uint32_t Air = 0;while(1)//當前為第0菜單{Air = MQ2_data(u8g2, 0,  32, u8g2_font_ncenB10_tr);//打印MQ2模塊的煙霧ADC轉換數據Printf_DHT11(u8g2, 0,  0, u8g2_font_ncenB10_tr);//打印DHT11模塊的溫濕度數據u8g2_SendBuffer(&u8g2);u8g2_ClearBuffer(&u8g2);//刷新屏幕//火災警報燈Beep();//處理蜂鳴器是否開關標志位if(Beep_flag == 1)//著火{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET);//開燈}else{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET);//關燈}//是否開啟蜂鳴器if(Beep_data == 1){if(Alarm_flag == 1)  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_RESET);}else if(Beep_data == 0){if(Alarm_flag == 1)  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_SET);}if(Data_Slow > 1500 && Data_Slow < 1800 && Beep_flag == 0)  //數據上傳減速后發送數據{aliyun_Data_flag = 1;//允許上傳數據aliyun_Data(datas[2], datas[0], Air);}else if(Data_Slow > 1500 && Data_Slow < 1800 && Beep_flag == 1 && aliyun_Data_flag == 1)//著火了發送99℃{aliyun_Data_Beeping(99,  0,  99);//允許發送數據,上傳99aliyun_Data_flag = 0;//發送一次后停止發送}}}

MQ2模塊封裝函數內部:?

int MQ2_data(u8g2_t u8g2,u8g2_uint_t x, u8g2_uint_t y, const uint8_t *font)
{int value;char var_buff[100];char var_buff1[100];HAL_ADC_Start(&hadc1); //啟動ADC單次轉換HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC轉換完成value = HAL_ADC_GetValue(&hadc1); //讀取ADC轉換數據u8g2_DrawXBMP(&u8g2, x, y, 16, 16, kong);//顯示字體u8g2_DrawXBMP(&u8g2, x+16, y, 16, 16, qi);u8g2_DrawXBMP(&u8g2, x+32, y, 16, 16, zhi);u8g2_DrawXBMP(&u8g2, x+48, y, 16, 16, liang);u8g2_DrawXBMP(&u8g2, x, y+16, 16, 16, huo);u8g2_DrawXBMP(&u8g2, x+16, y+16, 16, 16, yan);sprintf(var_buff, ": %dppm",value);  //顯示ADC轉換數據sprintf(var_buff1, ": ");u8g2_SetFont(&u8g2, font);u8g2_DrawStr(&u8g2, x+64, y+16, var_buff);u8g2_DrawStr(&u8g2, x+32, y+32, var_buff1);if(Beep_flag == 0)//顯示火焰正常{u8g2_DrawXBMP(&u8g2, x+40, y+16, 16, 16, zheng);u8g2_DrawXBMP(&u8g2, x+56, y+16, 16, 16, chang);}else if(Beep_flag == 1)//著火,閃爍火焰不正常{if(Flame_flag == 0)//閃爍字體{}else if(Flame_flag == 1){u8g2_DrawXBMP(&u8g2, x+40, y+16, 16, 16, bu);u8g2_DrawXBMP(&u8g2, x+56, y+16, 16, 16, zheng);u8g2_DrawXBMP(&u8g2, x+72, y+16, 16, 16, chang);}}return value;
}

DHT11封裝函數內部:

void Printf_DHT11(u8g2_t u8g2,u8g2_uint_t x, u8g2_uint_t y, const uint8_t *font)
{char var_buf[100];char var_buf1[100];Read_Data_From_DHT();//讀取溫濕度數據u8g2_DrawXBMP(&u8g2, x, y, 16, 16, kong);u8g2_DrawXBMP(&u8g2, x+16, y, 16, 16, qi);u8g2_DrawXBMP(&u8g2, x+32, y, 16, 16, wen);u8g2_DrawXBMP(&u8g2, x+48, y, 16, 16, du);u8g2_DrawXBMP(&u8g2, x, y+16, 16, 16, kong);u8g2_DrawXBMP(&u8g2, x+16, y+16, 16, 16, qi);u8g2_DrawXBMP(&u8g2, x+32, y+16, 16, 16, shi);u8g2_DrawXBMP(&u8g2, x+48, y+16, 16, 16, du);//	sprintf(var_buf , ": %d.%d C",datas[2],datas[3]);//顯示小數sprintf(var_buf , ": %d C",datas[2]);sprintf(var_buf1, ": %d.%d %%",datas[0],datas[1]);//不顯示小數u8g2_SetFont(&u8g2, font);//設置字體u8g2_DrawStr(&u8g2, x+64, y+16, var_buf);u8g2_DrawStr(&u8g2, x+64, y+32, var_buf1);
}

定時器減速,閃爍字體,滴答滴答蜂鳴器:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)   //中斷回調函數
{if(htim == (&htim3))//定時器3中斷{Data_Slow++;//阿里云數據上傳減速if(Data_Slow == 2000)  Data_Slow = 0;Working_Pro();}
}void Working_Pro()
{Key_Slow++;if(Key_Slow == 10)  Key_Slow = 0;//按鍵消抖if(Beep_flag == 1)//蜂鳴器開  著火了{Beep_Slow ++;Flame_Slow ++;if(Flame_Slow == 500)//火焰狀態顯示{Flame_Slow = 0;//復位Flame_flag ^= 1;//取反}if(Beep_Slow < 200 && Beep_data == 0){Beep_data = 1;//開}else if(Beep_Slow >= 200 && Beep_Slow < 400 && Beep_data == 1){Beep_data = 0;}else if(Beep_Slow >= 400 && Beep_Slow < 600 && Beep_data == 0){Beep_data = 1;}else if(Beep_Slow >= 600 && Beep_Slow < 1200 && Beep_data == 1){Beep_data = 0;}else if(Beep_Slow == 1200 && Beep_data == 0){Beep_Slow = 0;//復位}}else if(Beep_flag == 0)//蜂鳴器關{Beep_Slow = 0;Beep_data = 0;//關}
}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ????????????????👇🏻 需要實物 添加 博主👇🏻

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

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

相關文章

學習筆記之車票搜索為什么用Redis而不是ES?

在文章正式開始前&#xff0c;大家打開 12306.cn 搜索一趟列車&#xff0c;根據搜索條件判斷&#xff0c;數據搜索技術使用 ElasticSearch 或者其它搜索技術是否合適&#xff1f; 這里我先把答案說下&#xff0c;12306 車票搜索用的是 Redis &#xff0c;而不是大家常用的 Ela…

揭秘AI:機器學習與深度學習的奧秘

文章目錄 機器學習與深度學習1. 什么是人工智能&#xff1f;2. 機器學習、深度學習和人工智能又是什么關系&#xff1f;3. 人工智能解決了什么問題&#xff1f;為什么需要人工智能&#xff1f;4. 機器學習、深度學習常用術語1&#xff09;模型2&#xff09;數據集3&#xff09;…

【具體場景實踐】使用存儲過程查數據全流程+自動調度

文章目錄 場景設計場景描述:公司員工管理系統需求1. 創建數據庫和表2. 插入測試數據3. 復雜存儲過程4. 調用存儲過程5. 結果示例6. 細節優化存儲過程總結7. 自動定期執行存儲過程7.1 啟用 MySQL 事件調度器7.2 創建定時任務(每天凌晨 2 點自動執行)7.3 查看和管理事件1?? …

【ubuntu】——wsl中使用windows中的adb

一、引言 在 Windows Subsystem for Linux&#xff08;WSL&#xff09;環境下工作時&#xff0c;有時需要使用 Android Debug Bridge&#xff08;ADB&#xff09;工具與 Android 設備進行交互。通過特定設置&#xff0c;能夠在 WSL 中便捷地調用 Windows 系統中已安裝的 ADB&a…

Centos離線安裝gcc

文章目錄 Centos離線安裝gcc1. gcc是什么&#xff1f;2. gcc下載地址3. gcc的安裝4. 安裝結果驗證 Centos離線安裝gcc 1. gcc是什么&#xff1f; GCC&#xff08;GNU Compiler Collection&#xff09;是 GNU 項目下的開源編譯器套件&#xff0c;主要用于將 C、C 等編程語言的源…

JAVA中的多態性以及它在實際編程中的作用

JAVA中的多態性以及它在實際編程中的作用&#xff1f; 在Java中&#xff0c;多態性是指一個對象可以具有多種形態。它主要體現在兩個方面&#xff1a;編譯時多態和運行時多態。 1.編譯時多態 編譯時多態通過方法重載&#xff08;Overloading&#xff09;來實現。方法重載是指…

NetLink內核套接字案例分析

一、基礎知識 Netlink 是 Linux 系統中一種內核與用戶空間通信的高效機制&#xff0c;而 Netlink 消息是這種通信的核心載體。它允許用戶態程序&#xff08;如網絡配置工具、監控工具&#xff09;與內核子系統&#xff08;如網絡協議棧、設備驅動&#xff09;交換數據&#xff…

批量壓縮與優化 Excel 文檔,減少 Excel 文檔大小

當我們在 Excel 文檔中插入圖片資源的時候&#xff0c;如果我們插入的是原圖&#xff0c;可能會導致 Excel 變得非常的大。這非常不利于我們傳輸或者共享。那么當我們的 Excel 文件非常大的時候&#xff0c;我們就需要對文檔做一些壓縮或者優化的處理。那有沒有什么方法可以實現…

基于深度學習的多模態人臉情緒識別研究與實現(視頻+圖像+語音)

這是一個結合圖像和音頻的情緒識別系統&#xff0c;從架構、數據準備、模型實現、訓練等。包括數據收集、預處理、模型訓練、融合方法、部署優化等全流程。確定完整系統的組成部分&#xff1a;數據收集與處理、模型設計與訓練、多模態融合、系統集成、部署優化、用戶界面等。詳…

保姆級離線TiDB V8+解釋

以前學習的時候還是3版本&#xff0c;如今已經是8版本了 https://cn.pingcap.com/product-community/?_gl1ujh2l9_gcl_auMTI3MTI3NTM3NC4xNzM5MjU3ODE2_gaMTYwNzE2NTI4OC4xNzMzOTA1MjUz_ga_3JVXJ41175MTc0MTk1NTc1OC4xMS4xLjE3NDE5NTU3NjIuNTYuMC41NDk4MTMxNTM._ga_CPG2VW1Y4…

spark實驗2

一.實驗題目 實驗所需要求&#xff1a; centos7虛擬機 pyspark spark python3 hadoop分布式 統計歷屆春晚的節目數目 統計各個類型節目的數量&#xff0c;顯示前10名 統計相聲類節目歷年的數目。 查詢每個演員在春晚上表演節目的數量。 統計每年各類節目的數量&#xff0…

學習文章:Spring Boot 中如何使用 `@Async` 實現異步處理

文章目錄 學習文章&#xff1a;Spring Boot 中如何使用 Async 實現異步處理 一、什么是 Async&#xff1f;優點&#xff1a; 二、Spring Boot 中啟用 Async1. 啟用異步支持2. 配置線程池&#xff08;可選&#xff09;3. 使用 Async 注解4. 調用異步方法 三、Async 的進階用法1.…

Manus:成為AI Agent領域的標桿

一、引言 官網&#xff1a;Manus 隨著人工智能技術的飛速發展&#xff0c;AI Agent&#xff08;智能體&#xff09;作為人工智能領域的重要分支&#xff0c;正逐漸從概念走向現實&#xff0c;并在各行各業展現出巨大的應用潛力。在眾多AI Agent產品中&#xff0c;Manus以其獨…

Git Fast-forward 合并詳解:原理、場景與最佳實踐

在使用 Git 進行團隊協作時&#xff0c;我們經常需要合并分支。合并方式有很多種&#xff0c;其中 Fast-forward&#xff08;快速合并&#xff09; 是一種最簡單且無沖突的合并方式。本文將詳細介紹 Fast-forward 的原理、適用場景、常見問題及最佳實踐。 一、Fast-forward 合并…

命令行重啟Ubuntu軟件

我是用Todesk遠程桌面&#xff0c;如果卡死的時候&#xff0c;只能通過ssh連接命令行。于是&#xff0c;就有了如標題所示的需求。 首先&#xff0c;我們看一下todesk在系統里叫什么名字&#xff1a; systemctl list-unit-files | grep -i todesk看到發現是"todeskd.serv…

算法每日一練 (11)

&#x1f4a2;歡迎來到張胤塵的技術站 &#x1f4a5;技術如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 算法每日一練 (11)全排列題目描述解題思路解題代碼c/c…

《Spring日志整合與注入技術:從入門到精通》

1.Spring與日志框架的整合 1.Spring與日志框架進行整合&#xff0c;日志框架就可以在控制臺中&#xff0c;輸出Spring框架運行過程中的一些重要的信息。 好處&#xff1a;方便了解Spring框架的運行過程&#xff0c;利于程序的調試。 Spring如何整合日志框架 Spring5.x整合log4j…

《SQL性能優化指南:新手如何寫出高效的數據庫查詢

新手程序員如何用三個月成為SQL高手&#xff1f;萬字自學指南帶你彎道超車 在數據為王的時代&#xff0c;掌握SQL已成為職場新人的必修課。你可能不知道&#xff0c;僅用三個月系統學習&#xff0c;一個零基礎的小白就能完成從數據庫萌新到SQL達人的蛻變。去年剛畢業的小王就是…

【Unity】在項目中使用VisualScripting

1. 在packagemanager添加插件 2. 在設置中進行初始化。 Edit > Project Settings > Visual Scripting Initialize Visual Scripting You must select Initialize Visual Scripting the first time you use Visual Scripting in a project. Initialize Visual Scripting …

JConsole 在 Linux 上的使用

JConsole 在 Linux 上的使用指南 1. 啟動 JConsole 遠程監控 Linux 服務器上的 JVM 進程 1.1 修改 JMX 配置&#xff0c;允許遠程訪問 在 Linux 服務器 啟動 Java 應用時&#xff0c;需要加上 -Djava.rmi.server.hostname<服務器IP>&#xff0c;完整的啟動參數如下&am…