当前位置:   article > 正文

STM32单片机wifi云平台+温度+烟雾+火焰+短信+蜂鸣器 源程序原理图_火焰传感器与stm32单片机的连接

火焰传感器与stm32单片机的连接

目录

1.     整体设计

2.     液晶显示

3.     Ds18b20温度传感器

4.     Mq2烟雾传感器

5.     火焰传感器传感器

6.     蜂鸣器驱动控制

7.     按键

8.     Gsm短信模块

9.     Esp8266wifi模块

10、源代码

11、资料内容

资料下载地址:STM32单片机wifi云平台+温度+烟雾+火焰+短信+蜂鸣器 源程序原理图

1.     整体设计

设计由stm32f103c8t6单片机为控制核心

2.     液晶显示

单片机通过iic接口(pa6、pa7)与oled12864的液晶显示屏(scl、sda)连接,驱动液晶数据和阈值。

3.     Ds18b20温度传感器

Ds18b20温度传感器是单总线接口,把数据端接到单片机的pb9管脚,通过传感器协议读取温度值。


 

4.     Mq2烟雾传感器

Mq2传感器输出模电压会随着烟雾浓度的增大而增大。单片机通过模拟量采集管脚PA0采集mq2传感器输出的电压值,然后单片机通过计算把0-vcc电压转化成0-100%烟雾浓度。


 

5.     火焰传感器传感器

火焰传感器是数字量do输出,当检测到有明火时输出低电平0,无明火时输出高电平1。单片机通过io口pa6读取火焰传感器状态。

6.     蜂鸣器驱动控制

如果蜂鸣器接电源3.3v和地,蜂鸣器有电就会发声。1k电阻是限流电阻。单片机通过控制pa7管脚输出高低电平,从而达到控制风扇转动的效果。单片机输出高电平1时,三极管导通,蜂鸣器接地,蜂鸣器响。输出低电平0时,三极管截至不导通,蜂鸣器没有接地,蜂鸣器不响。


7.     按键

单片机io口接按键,按键按下的接地。Io口读取到低电平0,按键松开时,由于单片机有内置上拉电阻,Io口读取到高电平1。其他两个按键原理一样。

8.     Gsm短信模块

Sim900a gsm短信模块是通过串口通讯的,将单片机串口1发送端pa9接到gsm模块的接收端rxd,然后单片机通过at指令控制gsm模块发送短信。

9.     Esp8266wifi模块

8266是串口控制得模块,单片机通过串口1(pa9和pa10)与wifi模块通讯,从而控制wifi模块工作。首先wifi模块上电自动连接热点,然后连接onenet云平台得ip地址,通过mqtt协议登录云平台设备,订阅app(订阅了才能接收到app下发得信息)。单片机会定时上传数据(以mcu得身份发布数据)到onenet云平台,在app订阅了mcu设备得前提下,云平台接收到单片机上传得数据后会自动转发到app显示。反之app下发数据过程也一样。

10、源代码

  1. #include "stm32f10x.h" //头文件
  2. #include "./usart/bsp_usart1.h"
  3. #include "./OLED_I2C/OLED_I2C.h"
  4. #include "./delay/delay.h"
  5. #include "adc.h"
  6. #include "string.h"
  7. #include "bsp_ds18b20.h"
  8. #include "./TIMER/timer.h"
  9. #define Speaker PAout(7)//pa7接蜂鸣器
  10. #define Key1 PBin(12)//按键
  11. #define Key2 PBin(13)//按键
  12. #define Key3 PBin(14)//按键
  13. #define HY PAin(6)//火焰传感器
  14. TIM_TimeBaseInitTypeDef TIM3_TimeBaseStructure;
  15. TIM_OCInitTypeDef TIM3_OCInitStructure;
  16. void DelayStm32(__IO u32 nCount)
  17. {
  18. for(; nCount != 0; nCount--);
  19. }
  20. u16 Time_1MS=0;
  21. u16 TX_10MS=0;
  22. u16 A0Value = 0; //烟雾值
  23. u16 Ds18b20Value; //温度
  24. u16 Cnt=0;
  25. u8 AlarmT=35; //温度阈值
  26. u8 AlarmM=60; //烟雾阈值
  27. char dispBuff[10];
  28. u8 FlagUpData = 0;
  29. u8 FlagFS = 0; //风扇手动标志位
  30. u8 FlagDelayA = 0; //继电器手动标志位
  31. u8 StateDelayA = 0; //继电器状态
  32. u8 StateFS = 0; //风扇状态
  33. u8 Stm32[17];
  34. u16 KeyCnt = 0;
  35. u8 FlagSet=0; //按键设置标志位
  36. u8 FlagAlarm=0; //告警标志位
  37. u8 RxBuf1[32];
  38. u8 RxBuf2[32];
  39. u8 RxBuf3[32]; //串口3数据缓存
  40. u8 pass[11];
  41. /**********************MQTTdata***********************/
  42. char MqttDataDL[37]=
  43. {
  44. 0x10, 0x23, 0x00, 0x04, 0x4D, 0x51, 0x54, 0x54, 0x04, 0xC0,
  45. 0x00, 0x78, 0x00, 0x0A, 0x31, 0x30, 0x36, 0x35, 0x36, 0x30,
  46. 0x31, 0x35, 0x35, 0x39, 0x00, 0x06, 0x35, 0x38, 0x39, 0x35,
  47. 0x35, 0x34, 0x00, 0x03, 0x6D, 0x63, 0x75
  48. };//mqtt登录数组
  49. char MqttDataDY[10]=
  50. {
  51. 0x82, 0x08, 0x00, 0x02, 0x00, 0x03, 'a', 'p', 'p', 0x00
  52. };//mqtt订阅数组
  53. char MqttDataFB[24]=
  54. {
  55. 0x30, 0x16, 0x00, 0x03, 0x6D, 0x63, 0x75, 0x06, 0x06, 0x06,
  56. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  57. 0x00, 0x00, 0x00, 0x00
  58. };//mqtt发布数组
  59. void SendASC1(u8 d) //串口1发送一个字节
  60. {
  61. USART_SendData(USART1, d);
  62. while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  63. }
  64. void SendASC2(u8 d) //串口2发送一个字节
  65. {
  66. USART_SendData(USART2, d);
  67. while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
  68. }
  69. void SendASC3(u8 d)
  70. {
  71. USART_SendData(USART3, d);
  72. while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
  73. }
  74. void DengLu(void) //mqtt登录函数
  75. {
  76. u8 k=0;
  77. printf("AT+CIPSEND=37\r\n");
  78. DelayS(1);
  79. for(k=0; k<37; k++)
  80. {
  81. SendASC1(MqttDataDL[k]);
  82. }
  83. }
  84. void DingYue(void) //mqtt订阅函数
  85. {
  86. u8 k=0;
  87. printf("AT+CIPSEND=10\r\n");
  88. DelayS(1);
  89. for(k=0; k<10; k++)
  90. {
  91. SendASC1(MqttDataDY[k]);
  92. }
  93. }
  94. void FaBu(void) //mqtt发布函数
  95. {
  96. u8 k=0;
  97. printf("AT+CIPSEND=24\r\n");
  98. DelayS(1);
  99. for(k=0; k<24; k++)
  100. {
  101. SendASC1(MqttDataFB[k]);
  102. }
  103. }
  104. /*************************************************/
  105. void GPIO_Config(void) //io口配置
  106. {
  107. GPIO_InitTypeDef GPIO_InitStructure;
  108. /* GPIOA and GPIOA clock enable */ //pb8、pb12、pb13、pb14设置为输入
  109. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  110. GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8 |GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
  111. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  112. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  113. GPIO_Init(GPIOB, &GPIO_InitStructure);
  114. /* GPIOA and GPIOA clock enable */ //pa6设置为输入
  115. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  116. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;
  117. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  118. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  119. GPIO_Init(GPIOA, &GPIO_InitStructure);
  120. /* GPIOA and GPIOA clock enable */ //pa7.pa4配置为推免输出
  121. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  122. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_7;
  123. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  124. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  125. GPIO_Init(GPIOA, &GPIO_InitStructure);
  126. /* GPIOA and GPIOA clock enable */ //pc13配置为推免输出
  127. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  128. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  129. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  130. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  131. GPIO_Init(GPIOC, &GPIO_InitStructure);
  132. }
  133. void DispOled(void)//液晶显示函数
  134. {
  135. //显示温度和阈值
  136. sprintf(dispBuff,"WenDu=%d%d.%dC %d%dC", Ds18b20Value %1000/100, Ds18b20Value%100/10, Ds18b20Value%10, AlarmT%100/10, AlarmT%10);
  137. OLED_ShowStr(0,0,dispBuff,2);
  138. //显示烟雾和阈值
  139. sprintf(dispBuff,"YanWu = %0.2d%% %0.2d%%",A0Value,AlarmM);
  140. OLED_ShowStr(0,2,dispBuff,2);
  141. //显示接收短信的号
  142. sprintf(dispBuff,"%d%d%d%d%d%d%d%d%d%d%d",pass[10],pass[9],pass[8],pass[7],pass[6],pass[5],pass[4],pass[3],pass[2],pass[1],pass[0]);
  143. OLED_ShowStr(0,6,dispBuff,2);
  144. }
  145. void SendDx(void) //发送短信函数
  146. {
  147. Uart3_printf("AT+CSCS=\"GSM\"\r\n");
  148. DelayS(1);
  149. Uart3_printf("AT+CMGF=1\r\n");
  150. DelayS(1);
  151. /*******************************************************/
  152. //printf("AT+CMGS=\"18xxxxxxxx\"\r\n");
  153. Uart3_printf("AT+CMGS=\""); //按设置的号码发送短信
  154. SendASC3(pass[10]+0x30);
  155. SendASC3(pass[9]+0x30);
  156. SendASC3(pass[8]+0x30);
  157. SendASC3(pass[7]+0x30);
  158. SendASC3(pass[6]+0x30);
  159. SendASC3(pass[5]+0x30);
  160. SendASC3(pass[4]+0x30);
  161. SendASC3(pass[3]+0x30);
  162. SendASC3(pass[2]+0x30);
  163. SendASC3(pass[1]+0x30);
  164. SendASC3(pass[0]+0x30);
  165. Uart3_printf("\"\r\n");
  166. /*******************************************************/
  167. DelayS(1);
  168. Uart3_printf("Have a Fire!!!"); //发送短信的内容
  169. DelayS(1);
  170. SendASC3(0x1A); //启动发送短信
  171. DelayS(1);
  172. }
  173. int main(void) //主函数
  174. {
  175. USART1_Config(); //串口初始化
  176. GPIO_Config();//io口初始化
  177. Adc_Init();//ad初始化
  178. DelayInit(); //定时函数初始化
  179. Speaker = 0;//关闭输出设备
  180. I2C_Configuration();//iic初始化
  181. OLED_Init();//液晶初始化
  182. OLED_Fill(0xFF);
  183. DelayS(1);
  184. DelayS(1);
  185. DelayS(1);
  186. DelayS(1);
  187. printf("AT\r\n");
  188. DelayS(1);
  189. printf("AT\r\n");
  190. DelayS(1);
  191. printf("AT\r\n");
  192. DelayS(1);
  193. printf("AT+CWMODE=3\r\n"); //8266设置为模式3
  194. DelayS(1);
  195. printf("AT+CWJAP=\"win\",\"123123123\"\r\n"); //连接热点
  196. DelayS(1);
  197. DelayS(1);
  198. DelayS(1);
  199. DelayS(1);
  200. DelayS(1);
  201. while(DS18B20_Init()); //温度初始化
  202. DelayS(1);
  203. Ds18b20Value = (u16)(DS18B20_GetTemp_SkipRom ( )*10); //上电连续读取几次温度值使其稳定
  204. DelayStm32(0xFFFFF);
  205. Ds18b20Value = (u16)(DS18B20_GetTemp_SkipRom ( )*10);
  206. DelayStm32(0xFFFFF);
  207. Ds18b20Value = (u16)(DS18B20_GetTemp_SkipRom ( )*10);
  208. DelayStm32(0xFFFFF);
  209. Ds18b20Value = (u16)(DS18B20_GetTemp_SkipRom ( )*10);
  210. DelayStm32(0xFFFFF);
  211. Ds18b20Value = (u16)(DS18B20_GetTemp_SkipRom ( )*10);
  212. DelayStm32(0xFFFFF);
  213. DelayS(1);
  214. DelayS(1);
  215. DelayS(1);
  216. DelayS(1);
  217. DelayS(1);
  218. DelayS(1);
  219. /*******************************************************/
  220. printf("AT+CIPSTART=\"TCP\",\"183.230.x.x\",6002\r\n"); //连接云平台ip和端口号
  221. /*******************************************************/
  222. DelayS(1);
  223. DelayS(1);
  224. DelayS(1);
  225. DelayS(1);
  226. DelayS(1);
  227. DelayS(1);
  228. DengLu(); //调用mqtt登录函数
  229. DelayS(1);
  230. DelayS(1);
  231. DelayS(1);
  232. DingYue(); //调用mqtt订阅函数
  233. DelayStm32(0xFFFFF);
  234. OLED_Fill(0x00);
  235. DelayStm32(0xFFFFF);
  236. TIM4_Int_Init(9,7199); //定时器初始化
  237. while(1)
  238. {
  239. Ds18b20Value = (u16)(DS18B20_GetTemp_SkipRom ( )*10);//读取稳定
  240. A0Value = (Get_Adc_Average(0,20)*100/4096);//读取烟雾
  241. DispOled(); //调用显示函数
  242. MqttDataFB[10] = Ds18b20Value/100; //把要上传得数据填进mqtt发布数据
  243. MqttDataFB[11] = Ds18b20Value%100/10;
  244. MqttDataFB[12] = Ds18b20Value%10;
  245. MqttDataFB[13] = A0Value;
  246. MqttDataFB[14] = 0;
  247. MqttDataFB[15] = 0;
  248. MqttDataFB[16] = FlagAlarm;
  249. if(FlagUpData==1) //上传数据时间到,上传数据
  250. {
  251. FlagUpData = 0;
  252. FaBu(); //发布数据
  253. }
  254. if( (Ds18b20Value>(AlarmT*10))||(A0Value>AlarmM)||(HY) ) //如果温度或者烟雾大于阈值或者有火焰
  255. {
  256. Speaker = 1; //蜂鸣器响
  257. if(FlagAlarm==0) //每个告警值发送一次短信
  258. {
  259. SendDx(); //调用发送短信函数
  260. }
  261. FlagAlarm = 1;
  262. }
  263. else
  264. {
  265. FlagAlarm = 0;
  266. Speaker = 0;
  267. }
  268. if(!Key1) //按键1
  269. {
  270. while(!Key1);
  271. pass[0]++;
  272. if(pass[0]>=10) pass[0]=0;
  273. }
  274. if(!Key2)//按键2
  275. {
  276. while(!Key2);
  277. pass[10] = pass[9];
  278. pass[9] = pass[8];
  279. pass[8] = pass[7];
  280. pass[7] = pass[6];
  281. pass[6] = pass[5];
  282. pass[5] = pass[4];
  283. pass[4] = pass[3];
  284. pass[3] = pass[2];
  285. pass[2] = pass[1];
  286. pass[1] = pass[0];
  287. pass[0] = 0;
  288. }
  289. /**************************************************************************************/
  290. /**************************************************************************************/
  291. }
  292. }
  293. void TIM4_IRQHandler(void) //定时中断每1ms中断一次
  294. {
  295. if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//?????
  296. {
  297. TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //??TIM4??????
  298. TX_10MS++;
  299. if(TX_10MS>=5000)
  300. {
  301. TX_10MS = 0;
  302. FlagUpData = 1;
  303. }
  304. }
  305. }
  306. void USART1_IRQHandler(void)
  307. {
  308. uint8_t ucTemp;
  309. if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
  310. {
  311. ucTemp = USART_ReceiveData(USART1);
  312. RxBuf1[0] = RxBuf1[1];
  313. RxBuf1[1] = RxBuf1[2];
  314. RxBuf1[2] = RxBuf1[3];
  315. RxBuf1[3] = ucTemp;
  316. if( (RxBuf1[0]=='F')&&(RxBuf1[1]=='t') ) //Ftxx 设置温度阈值
  317. {
  318. AlarmT = (RxBuf1[2]-0x30)*10 + (RxBuf1[3]-0x30);
  319. }
  320. else if( (RxBuf1[0]=='F')&&(RxBuf1[1]=='m') ) //Fmxx 设置烟雾阈值
  321. {
  322. AlarmM = (RxBuf1[2]-0x30)*10 + (RxBuf1[3]-0x30);
  323. }
  324. }
  325. }
  326. void USART2_IRQHandler(void)
  327. {
  328. uint8_t ucTemp2;
  329. if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
  330. {
  331. ucTemp2= USART_ReceiveData(USART2);
  332. RxBuf2[0] = RxBuf2[1];
  333. RxBuf2[1] = RxBuf2[2];
  334. RxBuf2[2] = RxBuf2[3];
  335. RxBuf2[3] = ucTemp2;
  336. if( (RxBuf2[0]=='F')&&(RxBuf2[1]=='T') )
  337. {
  338. }
  339. }
  340. }
  341. void USART3_IRQHandler(void)
  342. {
  343. uint8_t ucTemp3;
  344. if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
  345. {
  346. ucTemp3= USART_ReceiveData(USART3);
  347. RxBuf3[0] = RxBuf3[1];
  348. RxBuf3[1] = RxBuf3[2];
  349. RxBuf3[2] = RxBuf3[3];
  350. RxBuf3[3] = ucTemp3;
  351. }
  352. }

11、资料内容

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/802605
推荐阅读
相关标签
  

闽ICP备14008679号