本系統主要由如下幾大模塊構成:MQ-2煙霧傳感器模塊、人體紅外傳感器模塊、溫度傳感器模塊、1602顯示模塊和GSM通訊模塊,系統的主控制器采用的是STM32F103芯片,功能強大,內部資源豐富。以上相關內容的資料都在附件中請自取,并且包含有本系統的程序框圖,硬件原理圖和系統總體程序。更多細節內容我就不做過多介紹,附件中的資料已經很豐富了,還請大家能夠秉持一種學習的態度,我們一起進步。
Altium Designer畫的原理圖和PCB圖如下:(附件中可下載工程文件)
程序 原理圖 PCB 材料清單.7z
(779.35 KB, 售價: 2 E幣)
2020-6-6 18:56 上傳
點擊文件名下載附件
售價: 2 E幣 [記錄]
[ 購買]
參考資料.7z
(10.85 MB, 售價: 1 E幣)
2020-6-6 18:56 上傳
點擊文件名下載附件
售價: 1 E幣 [記錄]
[ 購買]
4.png (4.22 KB)
下載附件
2020-6-6 18:55 上傳
5.png (16.15 KB)
下載附件
2020-6-6 18:55 上傳
6.png (20.86 KB)
下載附件
2020-6-6 18:55 上傳
1.png (31.84 KB)
下載附件
2020-6-6 18:55 上傳
2.png (55.23 KB)
下載附件
2020-6-6 18:55 上傳
3.png (46.23 KB)
下載附件
2020-6-6 18:55 上傳
(請一定讀懂程序!!!無論您出于什么目的,我都希望您能真正的弄懂這個程序,
比如板子如何與GSM模塊建立的通訊,I/O口怎么配的(結合原理圖看),ADC又如何調?為什么?等等問題)
文件MDK-ARM-->Project是家居系統的總程序(請提前下載好keil軟件)
部分源碼:
- ////頭文件
- #include "stm32f10x.h"
- #include "GPIOLIKE51.h"
- #include "display.h"
- #include "ds18b20.h"
- #include "key.h"
- #include "usart.h"
- #include "timer.h"
- #include "ADC.h"
- #include "iwdg.h"
- #include "I2C.h"
- #include "EXTI.h"
- uchar table1[]="NOW: % C "; //液晶屏顯示內容
- uchar table2[]="SET: % C "; //液晶屏顯示內容
- #define BEEP BIT_ADDR(GPIOA_ODR_Addr,11) //蜂鳴器接口
- #define STEAL GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) //防盜模塊接口
- char Alarm_flag; //溫度發送短信標志位,=1表示已經發送,=0表示沒有發送
- char Smoke_Alarm; //煙霧發送短信標志位,=1表示已經發送,=0表示沒有發送
- char Steal_Alarm; //防盜發送短信標志位,=1表示已經發送,=0表示沒有發送
- void GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //等同于int a;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE); //GPIOC APB2
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//選中管腳11
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //
- GPIO_Init(GPIOA, &GPIO_InitStructure);//以上設結構體置應用到GPIOA
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //選中管腳10
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //上拉輸入
- GPIO_Init(GPIOB, &GPIO_InitStructure); //以上設結構體置應用到GPIOB
- }
- /************************************檢測各部分是否異常***********************************************************/
- void Check(void)
- {
- if(temperature>Set_temp) //如果實際溫度值大于設置值
- {
- if((temperature>0)&(temperature<100)) //溫度在正常范圍內才報警
- {
- BEEP=1; //啟動蜂鳴器
- if(Alarm_flag==0) //警報標志位為1時發送溫度報警信息
- {
- Send_Message3(); //發送溫度過高報警短信
- }
- Alarm_flag=1; //標志位置一,表示短信已經發送,避免重復發送短信
- }
- }
- if(temperature<=Set_temp) //正常情況
- {
- Alarm_flag=0; //清除標志位,下次溫度超過繼續發送短信一次
- }
- if(Steal_flag==1)
- {
- if(STEAL==0) //檢測到人體
- {
- BEEP=1; //啟動蜂鳴器
- if(Steal_Alarm==0) //警報標志位為1時發送防盜報警信息
- {
- Send_Message2();
- }
- Steal_Alarm=1; //標志位置一,表示短信已經發送,避免重復發送短信
- }
- }
- if(STEAL==1) //正常情況
- {
- Steal_Alarm=0; //清除標志位,下次繼續發送短信一次
- }
- if(Smoke>Set_smoke) //檢測到濃度超標
- {
- BEEP=1; //啟動蜂鳴器
- if(Smoke_Alarm==0) //警報標志位為1時發送煙霧報警信息
- {
- Send_Message1();
- }
- Smoke_Alarm=1; //標志位置一,表示短信已經發送,避免重復發送短信
- }
- if(Smoke<=Set_smoke) //正常情況
- {
- Smoke_Alarm=0; //清除標志位,下次溫度超過繼續發送短信一次
- }
- if((Smoke<=Set_smoke)&&(temperature<=Set_temp)&&(STEAL==1))
- {
- BEEP=0; //關閉蜂鳴器
- }
- }
- //=============================================================================
- //文件名稱:Delay
- //功能概要:延時
- //參數說明:nCount:延時長短
- //函數返回:無
- //=============================================================================
- void Delay(uint z) //延時約3ms
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=5000;y>0;y--);
- }
- //=============================================================================
- //文件名稱:main
- //功能概要:主函數
- //參數說明:無
- //函數返回:int
- //=============================================================================
- int main(void)
- {
- GPIO_Configuration();
- GPIO_Configuration_LCD();
- GPIO_Configuration_USART();
- NVIC_Configuration();
- Set_ADC_Init();
- I2C_Init_Set();
- TIMER_Init();
- DS18B20_Init();
- temperature=DS18B20_Get_Temp(); //讀取實時溫度 第一次讀取跳過85度
- LCD_Initinal();
- GPIO_Configuration_KEY();
- Set_temp=I2C_EE_BufferRead(EEPROM_ADDRESS1); //讀取對應地址的值
- Set_smoke=I2C_EE_BufferRead(EEPROM_ADDRESS2); //讀取對應地址的值
-
- Delay(40000);Delay(40000);
- GSM_Init(); //GSM初始化
- LCD_Display_String(1,table1); //顯示內容
- LCD_Display_String(2,table2); //顯示內容
- IWDG_Configuration();
- while (1)
- {
- Read_Message();
- KEY();
- if(Adjust==0)
- {
- if(TIM_GetITStatus(TIM2, TIM_IT_Update)==SET) //每0.5s讀取一次溫度
- {
- temperature=DS18B20_Get_Temp(); //讀取實時溫度
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除定時器中斷
-
- ADC_RegularChannelConfig(ADC1,ADC_Channel_9,1,ADC_SampleTime_7Cycles5); //選取通道和采樣周期
- ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能指定的ADC的軟件轉換啟動功能
- Smoke=0.000806*ADC_GetConversionValue(ADC1)/(10/14.7)*20-10; //3.3V分4096份 ,每份約0.000806V, 硬件已被分壓,除以10k/(10+4.7k)得出真實電壓值(0-5V),
- //再根據y=20x(0代表0%,5V代表100%),10是校準值,是沒有檢測到煙霧時顯示的值,確保在潔凈空氣中濃度值盡可能低
- if(Smoke<0) //數值低于0做0處理
- Smoke=0;
- Write_Value(6,Smoke); //顯示濃度值
-
- if(Switch_flag==1) //防盜功能開啟狀態
- {
- Count++;
- if(Count>=20) //啟動定時器10s后開啟功能
- {
- Count=0;
- Steal_flag=1;
- }
- }
- }
- Write_Value(12,temperature); //顯示溫度到LCD1602
- Write_Value(0x40+12,Set_temp); //顯示設置溫度
-
- Write_Value(0x40+6,Set_smoke); //顯示設置溫度
- }
-
- Check();
- IWDG_Feed(); //10秒喂狗一次
- }
- }
復制代碼
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|