久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5922|回復: 3
打印 上一主題 下一主題
收起左側

基于STM32F1的煙霧短信報警器程序+PCB+原理圖

[復制鏈接]
跳轉到指定樓層
#
主要功能:
檢測環境中是否有煙霧及可燃氣體,如果存在上述氣體,則發送報警短信到手機上
這個之前做的設計,只是實現了上述功能但是沒有做任何冗余處理,分享給大家僅供參考

硬件介紹:
主控單片機:STM32F103C8T6,8M主頻晶振,我用的是最小系統板
煙霧傳感器:MQ-2煙霧傳感器模塊,帶比較器,靈敏度可調,使用數字輸出接口連接單片機
GSM/GPRS模塊:果云GA6-B GSM/GPRS模塊,只支持移動、聯通的電話卡

附件是代碼和PCB工程,實物圖找到了再上傳,希望有所幫助,如有疑問可留言

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)

單片機源程序如下:
  1. /**********************************************************************************
  2.    STM32F103C8T6           
  3. * 硬件連接說明
  4.          使用單片串口2與GPRS模塊通信  注:使用串口2可以避免下載和通信不會沖突
  5.          STM32      GPRS模塊
  6.          打板子接線方法:               mini板子接線方法:
  7.     PA3 (RXD2)->U_RX               PA3 (RXD2)->U_TX
  8.          PA2 (TXD2)->U_TX               PA2 (TXD2)->U_RX
  9.          GND           ->GND                GND           ->GND
  10.          
  11.          PA9(TXD1)--->調試信息端口
  12.          PA10(RXD1)-->調試信息端口
  13. 設計:
  14. (1)LED0-7設置的引腳為:PB4-7 PB12-15
  15. (2)KEY0-3設置的引腳為:PA4-7

  16.   
  17. **********************************************************************************/
  18. #include "stm32f10x.h"
  19. #include "usart.h"
  20. #include "Led.h"
  21. #include "SysTick.h"
  22. #include "timer.h"
  23. #include "string.h"
  24. #include "key.h"
  25. #include "GA6_module_errors.h"
  26. #include <stdio.h>

  27. #define Buf2_Max           100 //串口2緩存長度
  28. #define STABLE_TIMES  20  //等待系統上電后的穩定

  29. /*************        本地常量聲明        **************/

  30. /*************  本地變量聲明        **************/
  31. char Uart2_Buf[Buf2_Max];//串口2接收緩存
  32. u8 First_Int = 0;
  33. char error_result[20];

  34. static char  *phone_num = "AT+CMGS=\"15678314556\""; //修改這里可以修改電話號碼


  35. /*************        本地函數聲明        **************/
  36. void CLR_Buf(void);     //清除串口2接收緩存
  37. u8 Wait_CREG(u8 query_times);    //等待模塊注冊成功
  38. u8 Find(char *a);

  39. /*************  外部函數和變量聲明*****************/

  40. int check_status(void)
  41. {
  42.         int ret;
  43.         
  44.         ret = UART2_Send_AT_Command("AT","OK",3,50);//測試通信是否成功
  45.         if(ret == 0)
  46.         {
  47.                 return COMMUNITE_ERROR;
  48.         }
  49.         
  50.         ret = UART2_Send_AT_Command("AT+CPIN?","READY",2,50);//查詢卡是否插上
  51.         if(ret == 0)
  52.         {
  53.                 return NO_SIM_CARD_ERROR;
  54.         }
  55.         
  56.         ret = Wait_CREG(3);//查詢卡是否注冊到網絡
  57.         if(ret == 0)
  58.         {
  59.                 return SIM_CARD_NO_REG_ERROR;
  60.         }
  61.         return 1;
  62. }

  63. /***************************************************************
  64. 注:當然你可以返回其他值,來確定到底是哪一步發送指令出現失敗了。
  65. ****************************************************************/
  66. int send_text_message(char *content)
  67. {
  68.         u8 ret;
  69.         char end_char[2];
  70.         
  71.         end_char[0] = 0x1A;//結束字符
  72.         end_char[1] = '\0';
  73.         
  74.         //設置存儲位置
  75.         ret = UART2_Send_AT_Command("AT+CPMS=\"SM\",\"ME\",\"SM\"","OK",3,100);
  76.         if(ret == 0)
  77.         {
  78.                 return AT_CPMS_ERROR;
  79.         }
  80.         
  81.         ret = UART2_Send_AT_Command("AT+CMGF=1","OK",3,50);//配置為TEXT模式
  82.         if(ret == 0)
  83.         {
  84.                 return AT_CMGF_ERROR;
  85.         }
  86.         
  87.         ret = UART2_Send_AT_Command("AT+CSCS=\"GSM\"","OK",3,50);//設置字符格式
  88.         if(ret == 0)
  89.         {
  90.                 return AT_CSCS_ERROR;
  91.         }
  92.         
  93.         ret = UART2_Send_AT_Command(phone_num,">",3,50);//輸入收信人的電話號碼
  94.         if(ret == 0)
  95.         {
  96.                 return AT_CMGS_ERROR;
  97.         }
  98.         
  99.         UART2_SendString(content);
  100.         ret = UART2_Send_AT_Command_End(end_char,"OK",1,250);//發送結束符,等待返回ok,等待5S發一次,因為短信成功發送的狀態時間比較長
  101.         if(ret == 0)
  102.         {
  103.                 return END_CHAR_ERROR;
  104.         }
  105.         
  106.         return 1;
  107. }

  108. /*******************************************************************************
  109. * 函數名 : main
  110. * 描述   : 主函數
  111. * 輸入   :
  112. * 輸出   :
  113. * 返回   :
  114. * 注意   : 串口2負責與GA6模塊通信,串口1用于串口調試,
  115. *******************************************************************************/
  116. int main(void)
  117. {
  118.         u16 key_value;
  119.         u8  i;
  120.         u8  run_led_flag = 0;
  121.         int  ret;
  122.         
  123.         SysTick_Init_Config();   //系統滴答時鐘初始化
  124.         GPIO_Config();           //GPIO初始化
  125.         Key_GPIO_Config();
  126.         USART2_Init_Config(115200);  //串口2初始化
  127.         Timer2_Init_Config();        //定時器2初始化
  128.         
  129.         USART1_Init_Config(115200);//UART1用作串口調試信息
  130.         
  131.         UART1_SendString("系統啟動.......................\r\n");
  132.         
  133.         // 等待系統上電穩定
  134.         for(i = 0;i < STABLE_TIMES;i++)
  135.         {
  136.                 delay_ms(50);
  137.         }
  138.         
  139.         memset(error_result,'\0',20);
  140.         
  141.                 if(run_led_flag == 0)
  142.                 {
  143.                         LED0_ON();
  144.                         UART1_SendString("LED0_ON\r\n");
  145.                         run_led_flag = 1;
  146.                 }
  147.                 else
  148.                 {
  149.                         LED0_OFF();
  150.                         UART1_SendString("LED0_OFF\r\n");
  151.                         run_led_flag = 0;
  152.                 }
  153.                
  154.                 ret = check_status();
  155.                 if(ret == 1)
  156.                 {
  157.                         ret = send_text_message("hello,Smoke Detector text test!");//發送TEXT短信
  158.                 }
  159.                 if(ret == 1)
  160.                 {
  161.                         sprintf(error_result,"成功發送TEXT短信\r\n");
  162.                         UART1_SendString(error_result);
  163.                         LED1_ON();
  164.                 }
  165.                 else
  166.                 {
  167.                         sprintf(error_result,"錯誤代碼 : %d\r\n",ret);
  168.                         UART1_SendString(error_result);
  169.                         LED1_OFF();
  170.                         
  171.                 }
  172.         
  173.         while(1)
  174.         {
  175.                 delay_ms(50);
  176.                
  177.                 /*if(run_led_flag == 0)
  178.                 {
  179.                         LED0_ON();
  180.                         UART1_SendString("LED0_ON\r\n");
  181.                         run_led_flag = 1;
  182.                 }
  183.                 else
  184.                 {
  185.                         LED0_OFF();
  186.                         UART1_SendString("LED0_OFF\r\n");
  187.                         run_led_flag = 0;
  188.                 }
  189.                
  190.                 ret = check_status();
  191.                 if(ret == 1)
  192.                 {
  193.                         ret = send_text_message("hello,Smoke Detector text test!");//發送TEXT短信
  194.                 }
  195.                 if(ret == 1)
  196.                 {
  197.                         sprintf(error_result,"成功發送TEXT短信\r\n");
  198.                         UART1_SendString(error_result);
  199.                         LED1_ON();
  200.                 }
  201.                 else
  202.                 {
  203.                         sprintf(error_result,"錯誤代碼 : %d\r\n",ret);
  204.                         UART1_SendString(error_result);
  205.                         LED1_OFF();
  206.                         
  207.                 }*/
  208.                
  209.                 if(run_led_flag == 0)
  210.                 {
  211.                         LED0_ON();
  212.                         UART1_SendString("LED0_ON\r\n");
  213.                         run_led_flag = 1;
  214.                 }
  215.                 else
  216.                 {
  217.                         LED0_OFF();
  218.                         UART1_SendString("LED0_OFF\r\n");
  219.                         run_led_flag = 0;
  220.                 }
  221.                
  222.                
  223.                 //key_value = Key_Down_Scan();
  224.                
  225.                 // 當有煙霧產生時
  226.                 if(Smoke_Detection() == 0)
  227.                 {
  228.                                 ret = check_status();
  229.                                 if(ret == 1)
  230.                                 {
  231.                                         ret = send_text_message("WARNING: Smoke Detected!");//發送TEXT短信
  232.                                 }
  233.                                 if(ret == 1)
  234.                                 {
  235.                                         sprintf(error_result,"成功發送TEXT短信\r\n");
  236.                                         UART1_SendString(error_result);
  237.                                         LED1_ON();
  238.                                 }
  239.                                 else
  240.                                 {
  241.                                         sprintf(error_result,"錯誤代碼 : %d\r\n",ret);
  242.                                         UART1_SendString(error_result);
  243.                                         LED1_OFF();
  244.                                        
  245.                                 }
  246.                 }
  247.                

  248.         }
  249. }

  250. /*******************************************************************************
  251. * 函數名  : USART2_IRQHandler
  252. * 描述    : 串口1中斷服務程序
  253. * 輸入    : 無
  254. * 返回    : 無
  255. * 說明    :
  256. *******************************************************************************/
  257. void USART2_IRQHandler(void)                        
  258. {
  259.         u8 Res=0;
  260.         Res = USART_ReceiveData(USART2);
  261.         Uart2_Buf[First_Int] = Res;            //將接收到的字符串存到緩存中
  262.         First_Int++;                          //緩存指針向后移動
  263.         if(First_Int >= Buf2_Max)                 //如果緩存滿,將緩存指針指向緩存的首地址
  264.         {
  265.                 First_Int = 0;
  266.         }
  267. }         

  268. /*******************************************************************************
  269. * 函數名  : TIM2_IRQHandler
  270. * 描述    : 定時器2中斷斷服務函數
  271. * 輸入    : 無
  272. * 輸出    : 無
  273. * 返回    : 無
  274. * 說明    : 無
  275. *******************************************************************************/
  276. void TIM2_IRQHandler(void)   //TIM2中斷
  277. {
  278.         static u8 flag =1;

  279.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //檢查TIM2更新中斷發生與否
  280.         {
  281.                
  282.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  //清除TIM2更新中斷標志
  283.         
  284.                 if(flag)
  285.                 {
  286.                         //LED4_ON();
  287.                         flag=0;
  288.                 }
  289.                 else
  290.                 {
  291.                         //LED4_OFF();
  292.                         flag=1;
  293.                 }
  294.         }        
  295. }

  296. /*******************************************************************************
  297. * 函數名 : CLR_Buf
  298. * 描述   : 清除串口2緩存數據
  299. * 輸入   :
  300. * 輸出   :
  301. * 返回   :
  302. * 注意   :
  303. *******************************************************************************/
  304. void CLR_Buf(void)
  305. {
  306.         u16 k;
  307.         for(k=0;k<Buf2_Max;k++)      //將緩存內容清零
  308.         {
  309.                 Uart2_Buf[k] = 0x00;
  310.         }
  311.     First_Int = 0;              //接收字符串的起始存儲位置
  312. }

  313. /*******************************************************************************
  314. * 函數名 : Wait_CREG
  315. * 描述   : 等待模塊注冊成功
  316. * 輸入   :
  317. * 輸出   :
  318. * 返回   :
  319. * 注意   :
  320. *******************************************************************************/
  321. u8 Wait_CREG(u8 query_times)
  322. {
  323.         u8 i;
  324.         u8 k;
  325.         u8 j;
  326.         i = 0;
  327.         CLR_Buf();
  328.         while(i == 0)                                
  329.         {

  330.                 UART2_Send_Command("AT+CREG?");
  331.                 delay_ms(100);
  332.                
  333.                 for(k=0;k<Buf2_Max;k++)                              
  334.                 {
  335. ……………………

  336. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:

Smoke_MessageAlarm(Code).7z

196.38 KB, 下載次數: 77, 下載積分: 黑幣 -5

代碼工程(使用Keil MDK-ARM打開)

SmokeDetectorMessage(PCB).zip

623.24 KB, 下載次數: 73, 下載積分: 黑幣 -5

PCB工程(使用Altium Designer打開)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂1 踩
回復

使用道具 舉報

板凳
ID:744226 發表于 2020-5-4 23:00 | 只看該作者
謝謝分享
回復

使用道具 舉報

沙發
ID:321974 發表于 2020-5-2 14:55 | 只看該作者
頂LZ好樣的
回復

使用道具 舉報

樓主
ID:119642 發表于 2020-4-29 11:24 | 只看該作者
漂亮啊。挺好的。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久99精品久久久久久国产越南 | 中文字幕精品一区二区三区精品 | 国产欧美精品一区二区三区 | 国产精品网页 | 五月婷婷中文 | 日韩在线一区二区三区 | 福利视频三区 | 国产午夜精品一区二区三区嫩草 | 欧美色图综合网 | 久久精品国产一区二区电影 | 国产精品一区二区av | 日韩成人av在线播放 | 一级欧美一级日韩片免费观看 | 欧美激情一区二区三区 | 97精品久久| 亚洲精品久久久一区二区三区 | 久久999| 国产精品福利一区二区三区 | 亚洲一区二区三区在线视频 | 综合婷婷 | 久草视频网站 | 欧美成人猛片aaaaaaa | 97超级碰碰 | 精品一区二区三区在线观看 | 国产专区在线 | 久久狠狠 | 亚洲成人免费视频 | 久久精品91久久久久久再现 | 日本不卡免费新一二三区 | 毛片免费视频 | www日本在线播放 | 亚洲欧洲一区 | 黄色成人免费在线观看 | 精品伊人 | 欧美精品第一页 | 日本精品在线播放 | 久久久久一区二区三区 | 欧美不卡视频一区发布 | 精品久久久久久亚洲精品 | 亚洲精品小视频在线观看 | 中文字幕在线精品 |