目錄
前言:
一、項目介紹和演示視頻
二、硬件需求準備
三、硬件框圖
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;//關}
}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ????????????????👇🏻 需要實物 添加 博主👇🏻