找回密码
 注册

QQ登录

只需一步,快速开始

搜索

有关STM32和GSM的家居系统设计程序+原理图+PCB资料分享

[复制链接]
路漫漫 发表于 2020-6-6 21:43:08 | 显示全部楼层 |阅读模式
本系统主要由如下几大模块构成:MQ-2烟雾传感器模块、人体红外传感器模块、温度传感器模块、1602显示模块和GSM通讯模块,系统的主控制器采用的是STM32F103芯片,功能强大,内部资源丰富。以上相关内容的资料都在附件中请自取,并且包含有本系统的程序框图,硬件原理图和系统总体程序。更多细节内容我就不做过多介绍,附件中的资料已经很丰富了,还请大家能够秉持一种学习的态度,我们一起进步。

Altium Designer画的原理图和PCB图如下:(附件中可下载工程文件)

程序 原理图 PCB 材料清单.7z (779.35 KB, 售价: 2 E币)
参考资料.7z (10.85 MB, 售价: 1 E币)

4.png 5.png 6.png 1.png 2.png 3.png

(请一定读懂程序!!!无论您出于什么目的,我都希望您能真正的弄懂这个程序,
比如板子如何与GSM模块建立的通讯,I/O口怎么配的(结合原理图看),ADC又如何调?为什么?等等问题)

文件MDK-ARM-->Project是家居系统的总程序(请提前下载好keil软件)

部分源码:
  1. ////头文件
  2. #include "stm32f10x.h"
  3. #include "GPIOLIKE51.h"
  4. #include "display.h"
  5. #include "ds18b20.h"
  6. #include "key.h"
  7. #include "usart.h"
  8. #include "timer.h"
  9. #include "ADC.h"
  10. #include "iwdg.h"
  11. #include "I2C.h"
  12. #include "EXTI.h"

  13. uchar table1[]="NOW:    %     C ";                                //液晶屏显示内容
  14. uchar table2[]="SET:    %     C ";                                //液晶屏显示内容

  15. #define BEEP BIT_ADDR(GPIOA_ODR_Addr,11)                    //蜂鸣器接口
  16. #define STEAL  GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10)    //防盗模块接口

  17. char Alarm_flag;                                                                                //温度发送短信标志位,=1表示已经发送,=0表示没有发送
  18. char Smoke_Alarm;                                                                                //烟雾发送短信标志位,=1表示已经发送,=0表示没有发送
  19. char Steal_Alarm;                                                                                //防盗发送短信标志位,=1表示已经发送,=0表示没有发送

  20. void GPIO_Configuration(void)
  21. {
  22.         GPIO_InitTypeDef GPIO_InitStructure;                                                                                                        //等同于int a;

  23.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE);                         //GPIOC APB2                        

  24.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//选中管脚11
  25.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
  26.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //
  27.         GPIO_Init(GPIOA, &GPIO_InitStructure);//以上设结构体置应用到GPIOA                                 

  28.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                //选中管脚10
  29.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;         //上拉输入
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);                        //以上设结构体置应用到GPIOB
  31. }
  32. /************************************检测各部分是否异常***********************************************************/

  33. void Check(void)
  34. {
  35.         if(temperature>Set_temp)                //如果实际温度值大于设置值
  36.         {
  37.                 if((temperature>0)&(temperature<100)) //温度在正常范围内才报警
  38.                 {
  39.                         BEEP=1;                                                //启动蜂鸣器
  40.                         if(Alarm_flag==0)                        //警报标志位为1时发送温度报警信息
  41.                         {
  42.                                 Send_Message3();                //发送温度过高报警短信
  43.                         }
  44.                         Alarm_flag=1;                                //标志位置一,表示短信已经发送,避免重复发送短信
  45.                 }
  46.         }
  47.         if(temperature<=Set_temp)                //正常情况
  48.         {
  49.                 Alarm_flag=0;                                //清除标志位,下次温度超过继续发送短信一次
  50.         }

  51.         if(Steal_flag==1)
  52.         {
  53.                 if(STEAL==0)                                    //检测到人体
  54.                 {
  55.                         BEEP=1;                                                //启动蜂鸣器
  56.                         if(Steal_Alarm==0)                        //警报标志位为1时发送防盗报警信息
  57.                         {
  58.                                 Send_Message2();
  59.                         }
  60.                         Steal_Alarm=1;                                //标志位置一,表示短信已经发送,避免重复发送短信
  61.                 }
  62.         }
  63.         if(STEAL==1)                                        //正常情况
  64.         {
  65.                 Steal_Alarm=0;                                 //清除标志位,下次继续发送短信一次
  66.         }

  67.         if(Smoke>Set_smoke)                                 //检测到浓度超标
  68.         {
  69.                 BEEP=1;                                                //启动蜂鸣器
  70.                 if(Smoke_Alarm==0)                        //警报标志位为1时发送烟雾报警信息
  71.                 {
  72.                         Send_Message1();
  73.                 }
  74.                 Smoke_Alarm=1;                                //标志位置一,表示短信已经发送,避免重复发送短信
  75.         }
  76.         if(Smoke<=Set_smoke)                                //正常情况
  77.         {
  78.                 Smoke_Alarm=0;                                 //清除标志位,下次温度超过继续发送短信一次
  79.         }

  80.         if((Smoke<=Set_smoke)&&(temperature<=Set_temp)&&(STEAL==1))
  81.         {
  82.                 BEEP=0;                                                 //关闭蜂鸣器
  83.         }
  84. }
  85. //=============================================================================
  86. //文件名称:Delay
  87. //功能概要:延时
  88. //参数说明:nCount:延时长短
  89. //函数返回:无
  90. //=============================================================================

  91. void Delay(uint z)                                         //延时约3ms
  92. {
  93.   uint x,y;
  94.         for(x=z;x>0;x--)
  95.                 for(y=5000;y>0;y--);
  96. }


  97. //=============================================================================
  98. //文件名称:main
  99. //功能概要:主函数
  100. //参数说明:无
  101. //函数返回:int
  102. //=============================================================================
  103. int main(void)
  104. {                  
  105.         GPIO_Configuration();
  106.         GPIO_Configuration_LCD();
  107.         GPIO_Configuration_USART();
  108.         NVIC_Configuration();
  109.         Set_ADC_Init();
  110.         I2C_Init_Set();        
  111.         TIMER_Init();        
  112.         DS18B20_Init();
  113.         temperature=DS18B20_Get_Temp();                                        //读取实时温度   第一次读取跳过85度
  114.         LCD_Initinal();
  115.         GPIO_Configuration_KEY();        
  116.         Set_temp=I2C_EE_BufferRead(EEPROM_ADDRESS1);        //读取对应地址的值
  117.         Set_smoke=I2C_EE_BufferRead(EEPROM_ADDRESS2);        //读取对应地址的值
  118.         
  119.         Delay(40000);Delay(40000);                    
  120.         GSM_Init();                                     //GSM初始化
  121.         LCD_Display_String(1,table1);                                        //显示内容
  122.         LCD_Display_String(2,table2);                                        //显示内容        
  123.         IWDG_Configuration();
  124.         while (1)
  125.         {   
  126.                 Read_Message();
  127.                 KEY();
  128.                 if(Adjust==0)
  129.                 {
  130.                         if(TIM_GetITStatus(TIM2, TIM_IT_Update)==SET)                  //每0.5s读取一次温度
  131.                         {                        
  132.                                 temperature=DS18B20_Get_Temp();                                        //读取实时温度
  133.                                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);                //清除定时器中断                                
  134.                                 
  135.                                 ADC_RegularChannelConfig(ADC1,ADC_Channel_9,1,ADC_SampleTime_7Cycles5); //选取通道和采样周期
  136.                                 ADC_SoftwareStartConvCmd(ADC1,ENABLE);                        //使能指定的ADC的软件转换启动功能
  137.                                 Smoke=0.000806*ADC_GetConversionValue(ADC1)/(10/14.7)*20-10;       //3.3V分4096份 ,每份约0.000806V, 硬件已被分压,除以10k/(10+4.7k)得出真实电压值(0-5V),
  138.                                                                                 //再根据y=20x(0代表0%,5V代表100%),10是校准值,是没有检测到烟雾时显示的值,确保在洁净空气中浓度值尽可能低
  139.                                 if(Smoke<0)                                     //数值低于0做0处理
  140.                                 Smoke=0;
  141.                                 Write_Value(6,Smoke);                                       //显示浓度值
  142.                
  143.                                 if(Switch_flag==1)                                                           //防盗功能开启状态
  144.                                 {
  145.                                         Count++;
  146.                                         if(Count>=20)                              //启动定时器10s后开启功能
  147.                                         {
  148.                                                 Count=0;
  149.                                                 Steal_flag=1;
  150.                                         }                                                                           
  151.                                 }
  152.                         }
  153.                         Write_Value(12,temperature);        //显示温度到LCD1602
  154.                         Write_Value(0x40+12,Set_temp);  //显示设置温度
  155.                         
  156.                         Write_Value(0x40+6,Set_smoke);  //显示设置温度
  157.                 }
  158.                                 
  159.         Check();
  160.                 IWDG_Feed();                        //10秒喂狗一次
  161.         }
  162. }
复制代码



您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-26 16:42

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表