|
主要功能:
檢測環境中是否有煙霧及可燃氣體,如果存在上述氣體,則發送報警短信到手機上
這個之前做的設計,只是實現了上述功能但是沒有做任何冗余處理,分享給大家僅供參考
硬件介紹:
主控單片機:STM32F103C8T6,8M主頻晶振,我用的是最小系統板
煙霧傳感器:MQ-2煙霧傳感器模塊,帶比較器,靈敏度可調,使用數字輸出接口連接單片機
GSM/GPRS模塊:果云GA6-B GSM/GPRS模塊,只支持移動、聯通的電話卡
附件是代碼和PCB工程,實物圖找到了再上傳,希望有所幫助,如有疑問可留言
51hei.png (12.38 KB, 下載次數: 59)
下載附件
2020-4-16 15:04 上傳
51hei.png (29.27 KB, 下載次數: 62)
下載附件
2020-4-16 15:04 上傳
51hei.png (5.7 KB, 下載次數: 57)
下載附件
2020-4-16 15:04 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
單片機源程序如下:
- /**********************************************************************************
- STM32F103C8T6
- * 硬件連接說明
- 使用單片串口2與GPRS模塊通信 注:使用串口2可以避免下載和通信不會沖突
- STM32 GPRS模塊
- 打板子接線方法: mini板子接線方法:
- PA3 (RXD2)->U_RX PA3 (RXD2)->U_TX
- PA2 (TXD2)->U_TX PA2 (TXD2)->U_RX
- GND ->GND GND ->GND
-
- PA9(TXD1)--->調試信息端口
- PA10(RXD1)-->調試信息端口
- 設計:
- (1)LED0-7設置的引腳為:PB4-7 PB12-15
- (2)KEY0-3設置的引腳為:PA4-7
-
- **********************************************************************************/
- #include "stm32f10x.h"
- #include "usart.h"
- #include "Led.h"
- #include "SysTick.h"
- #include "timer.h"
- #include "string.h"
- #include "key.h"
- #include "GA6_module_errors.h"
- #include <stdio.h>
- #define Buf2_Max 100 //串口2緩存長度
- #define STABLE_TIMES 20 //等待系統上電后的穩定
- /************* 本地常量聲明 **************/
- /************* 本地變量聲明 **************/
- char Uart2_Buf[Buf2_Max];//串口2接收緩存
- u8 First_Int = 0;
- char error_result[20];
- static char *phone_num = "AT+CMGS=\"15678314556\""; //修改這里可以修改電話號碼
- /************* 本地函數聲明 **************/
- void CLR_Buf(void); //清除串口2接收緩存
- u8 Wait_CREG(u8 query_times); //等待模塊注冊成功
- u8 Find(char *a);
- /************* 外部函數和變量聲明*****************/
- int check_status(void)
- {
- int ret;
-
- ret = UART2_Send_AT_Command("AT","OK",3,50);//測試通信是否成功
- if(ret == 0)
- {
- return COMMUNITE_ERROR;
- }
-
- ret = UART2_Send_AT_Command("AT+CPIN?","READY",2,50);//查詢卡是否插上
- if(ret == 0)
- {
- return NO_SIM_CARD_ERROR;
- }
-
- ret = Wait_CREG(3);//查詢卡是否注冊到網絡
- if(ret == 0)
- {
- return SIM_CARD_NO_REG_ERROR;
- }
- return 1;
- }
- /***************************************************************
- 注:當然你可以返回其他值,來確定到底是哪一步發送指令出現失敗了。
- ****************************************************************/
- int send_text_message(char *content)
- {
- u8 ret;
- char end_char[2];
-
- end_char[0] = 0x1A;//結束字符
- end_char[1] = '\0';
-
- //設置存儲位置
- ret = UART2_Send_AT_Command("AT+CPMS=\"SM\",\"ME\",\"SM\"","OK",3,100);
- if(ret == 0)
- {
- return AT_CPMS_ERROR;
- }
-
- ret = UART2_Send_AT_Command("AT+CMGF=1","OK",3,50);//配置為TEXT模式
- if(ret == 0)
- {
- return AT_CMGF_ERROR;
- }
-
- ret = UART2_Send_AT_Command("AT+CSCS=\"GSM\"","OK",3,50);//設置字符格式
- if(ret == 0)
- {
- return AT_CSCS_ERROR;
- }
-
- ret = UART2_Send_AT_Command(phone_num,">",3,50);//輸入收信人的電話號碼
- if(ret == 0)
- {
- return AT_CMGS_ERROR;
- }
-
- UART2_SendString(content);
- ret = UART2_Send_AT_Command_End(end_char,"OK",1,250);//發送結束符,等待返回ok,等待5S發一次,因為短信成功發送的狀態時間比較長
- if(ret == 0)
- {
- return END_CHAR_ERROR;
- }
-
- return 1;
- }
- /*******************************************************************************
- * 函數名 : main
- * 描述 : 主函數
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 : 串口2負責與GA6模塊通信,串口1用于串口調試,
- *******************************************************************************/
- int main(void)
- {
- u16 key_value;
- u8 i;
- u8 run_led_flag = 0;
- int ret;
-
- SysTick_Init_Config(); //系統滴答時鐘初始化
- GPIO_Config(); //GPIO初始化
- Key_GPIO_Config();
- USART2_Init_Config(115200); //串口2初始化
- Timer2_Init_Config(); //定時器2初始化
-
- USART1_Init_Config(115200);//UART1用作串口調試信息
-
- UART1_SendString("系統啟動.......................\r\n");
-
- // 等待系統上電穩定
- for(i = 0;i < STABLE_TIMES;i++)
- {
- delay_ms(50);
- }
-
- memset(error_result,'\0',20);
-
- if(run_led_flag == 0)
- {
- LED0_ON();
- UART1_SendString("LED0_ON\r\n");
- run_led_flag = 1;
- }
- else
- {
- LED0_OFF();
- UART1_SendString("LED0_OFF\r\n");
- run_led_flag = 0;
- }
-
- ret = check_status();
- if(ret == 1)
- {
- ret = send_text_message("hello,Smoke Detector text test!");//發送TEXT短信
- }
- if(ret == 1)
- {
- sprintf(error_result,"成功發送TEXT短信\r\n");
- UART1_SendString(error_result);
- LED1_ON();
- }
- else
- {
- sprintf(error_result,"錯誤代碼 : %d\r\n",ret);
- UART1_SendString(error_result);
- LED1_OFF();
-
- }
-
- while(1)
- {
- delay_ms(50);
-
- /*if(run_led_flag == 0)
- {
- LED0_ON();
- UART1_SendString("LED0_ON\r\n");
- run_led_flag = 1;
- }
- else
- {
- LED0_OFF();
- UART1_SendString("LED0_OFF\r\n");
- run_led_flag = 0;
- }
-
- ret = check_status();
- if(ret == 1)
- {
- ret = send_text_message("hello,Smoke Detector text test!");//發送TEXT短信
- }
- if(ret == 1)
- {
- sprintf(error_result,"成功發送TEXT短信\r\n");
- UART1_SendString(error_result);
- LED1_ON();
- }
- else
- {
- sprintf(error_result,"錯誤代碼 : %d\r\n",ret);
- UART1_SendString(error_result);
- LED1_OFF();
-
- }*/
-
- if(run_led_flag == 0)
- {
- LED0_ON();
- UART1_SendString("LED0_ON\r\n");
- run_led_flag = 1;
- }
- else
- {
- LED0_OFF();
- UART1_SendString("LED0_OFF\r\n");
- run_led_flag = 0;
- }
-
-
- //key_value = Key_Down_Scan();
-
- // 當有煙霧產生時
- if(Smoke_Detection() == 0)
- {
- ret = check_status();
- if(ret == 1)
- {
- ret = send_text_message("WARNING: Smoke Detected!");//發送TEXT短信
- }
- if(ret == 1)
- {
- sprintf(error_result,"成功發送TEXT短信\r\n");
- UART1_SendString(error_result);
- LED1_ON();
- }
- else
- {
- sprintf(error_result,"錯誤代碼 : %d\r\n",ret);
- UART1_SendString(error_result);
- LED1_OFF();
-
- }
- }
-
- }
- }
- /*******************************************************************************
- * 函數名 : USART2_IRQHandler
- * 描述 : 串口1中斷服務程序
- * 輸入 : 無
- * 返回 : 無
- * 說明 :
- *******************************************************************************/
- void USART2_IRQHandler(void)
- {
- u8 Res=0;
- Res = USART_ReceiveData(USART2);
- Uart2_Buf[First_Int] = Res; //將接收到的字符串存到緩存中
- First_Int++; //緩存指針向后移動
- if(First_Int >= Buf2_Max) //如果緩存滿,將緩存指針指向緩存的首地址
- {
- First_Int = 0;
- }
- }
- /*******************************************************************************
- * 函數名 : TIM2_IRQHandler
- * 描述 : 定時器2中斷斷服務函數
- * 輸入 : 無
- * 輸出 : 無
- * 返回 : 無
- * 說明 : 無
- *******************************************************************************/
- void TIM2_IRQHandler(void) //TIM2中斷
- {
- static u8 flag =1;
- if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //檢查TIM2更新中斷發生與否
- {
-
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除TIM2更新中斷標志
-
- if(flag)
- {
- //LED4_ON();
- flag=0;
- }
- else
- {
- //LED4_OFF();
- flag=1;
- }
- }
- }
- /*******************************************************************************
- * 函數名 : CLR_Buf
- * 描述 : 清除串口2緩存數據
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void CLR_Buf(void)
- {
- u16 k;
- for(k=0;k<Buf2_Max;k++) //將緩存內容清零
- {
- Uart2_Buf[k] = 0x00;
- }
- First_Int = 0; //接收字符串的起始存儲位置
- }
- /*******************************************************************************
- * 函數名 : Wait_CREG
- * 描述 : 等待模塊注冊成功
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- u8 Wait_CREG(u8 query_times)
- {
- u8 i;
- u8 k;
- u8 j;
- i = 0;
- CLR_Buf();
- while(i == 0)
- {
- UART2_Send_Command("AT+CREG?");
- delay_ms(100);
-
- for(k=0;k<Buf2_Max;k++)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
|
評分
-
查看全部評分
|