学号:140201229 姓名何丹
组别:第4组 实验地点:D19
一、实验目的:
1.掌握通过GSM短信远程与嵌入式设备进行交互的方法。
二、实验内容:
1.编写程序把嵌入式开发板采集到的温度信息通过GSM短信传送给指定号码。(每10秒发送1次)
2.编写程序,使手机可以通过短信指令的方式控制嵌入式开发板的蜂鸣器和LED灯。(比如手机编辑“BEEP_ON”和“BEEP_OFF”控制嵌入式开发板的蜂鸣器)
三、实验过程描述及结果展示:
设备:移动SIM卡,充电器,SIM900A板子,连接线,耳机
(一)硬件处理过程
1、用串口连接STM32_MODE与SIM900A,并将SIM卡装进SIM900A卡套里。
2、连接电源。供电后长按开机按钮,使电话开机。
3、将USART1跳线棒和USART3跳线棒拔掉,用跳线将COM3TX(发送)与COM1RXD(接收),COM1RX(发送)与 COM3TXD(接收)相连接。
(二)测试处理过程:AT命令_拨打电话
1测试本机是否可用(AT+CPIN?)
2测试本机是否有信号(AT+CSQ)
主函数设计:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "touch.h"
#include "text.h"
#include "w25qxx.h"
#include "malloc.h"
#include "ff.h"
#include "exfuns.h"
#include <string.h>
#include "dht11.h"
#define BEEP PFout(8) // 蜂鸣器控制IO
const u16 POINT_COLOR_TBL[OTT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};
extern u16 USART3_RX_STA;
extern u8 USART3_RX_BUF[400];
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r);
void sendtext(char *p){
while(*p!='\0'){
USART_SendData(USART3,*p);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
p++;
}
USART_SendData(USART3,0x0D);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
USART_SendData(USART3,0x0A);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
}
int beepopen = 0;
int ledopen = 1;
int main(void)
{
u8 receive[5];
u8 command[100];
u32 t=0;
u8 temperature;
u8 humidity;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
uart3_init(115200);
LED_Init(); //初始化LED
KEY_Init();
LCD_Init(); //LCD初始化
BEEP_Init();
while(DHT11_Init());
tp_dev.init(); //触摸屏初始化
LCD_Clear(BLACK);
POINT_COLOR=YELLOW;//设置字体为黄色
BACK_COLOR = BLACK;
{
int i;
for(i=0;i<=10;i++)
sendtext("AT+CNMI=2,1");
}
while(1)
{
if(t%10==0)//每100ms读取一次
{
DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
printf("temperature:%d,humidity:%d\n",temperature,humidity);
if ((USART3_RX_STA&(1<<15))!=0){
if (strstr(USART3_RX_BUF,"+CMTI: \"SM\",")!=NULL){
strcpy(receive,strstr(USART3_RX_BUF,"+CMTI: \"SM\",")+12);
if (strstr(receive,"\r\n")!=NULL)
*strstr(receive,"\r\n")='\0';
printf("RECEIVE MESSAGE SM:%s\n",receive);
USART3_RX_STA=0;
command[0] = '\0';
strcat(command,"AT+CMGR=");
strcat(command,receive);
sendtext(command);
while((USART3_RX_STA&(1<<15))==0);
command[0] = '\0';
strcat(command,strstr(strstr(strstr(USART3_RX_BUF,"\r\n")+2,"\r\n")+2,"\r\n")+2);
printf("MESSAGE: %s\n",command);
if(strstr(command,"BEEP_ON")!=NULL){
beepopen = 1;
}
if(strstr(command,"BEEP_OFF")!=NULL){
beepopen = 0;
BEEP=0;
}
if(strstr(command,"LED_ON")!=NULL){
ledopen = 1;
}
if(strstr(command,"LED_OFF")!=NULL){
ledopen = 0;
LED0=1;
}
}
USART3_RX_STA=0;
}
}
delay_ms(10);
t++;
if(t%20==0)
{
if(ledopen)
LED0=!LED0;
if(beepopen)
BEEP=!BEEP;
}
if(t%1000==0)
{
printf("SEND SMS\n");
USART3_RX_STA=0;
sendtext("AT+CSCS=\"GSM\"");
delay_ms(100);
sendtext("AT+CMGF=1");
delay_ms(100);
command[0] = '\0';
strcat(command,"AT+CMGS=\"");
strcat(command,"13661361279");
strcat(command,"\"");
sendtext(command);
delay_ms(100);
command[0] = '\0';
sprintf(command,"temperature:%d,humidity:%d\n",temperature,humidity);
sendtext(command);
command[0]=0x1A;
command[1]='\0';
sendtext(command);
USART3_RX_STA=0;
}
}
}
四、总结及实验心得:
通过本次实验我学习通过GSM短信远程与嵌入式设备进行交互的方法,实现了通过编写程序把嵌入式开发板采集到的温度信息通过GSM短信传送给指定号码(每10秒发送1次)。以及编写程序,使手机可以通过短信指令的方式控制嵌入式开发板的蜂鸣器和LED灯。
这次实验总体来说比较难,开始的时候以为跟上节课的实验模式一样,想了好久弄了许多,结果整个思路都错了。后来向其他小组学习后才知道怎样完成。这节课是这门实验的最后一节课让我知道嵌入式实验是一个学习新知识、巩固加深所学课本理论知识的过程,它培养了我们综合运用知识的能力,独立思考和解决问题的能力。它不仅加深了我对嵌入式课程的理解,还让我感受到了嵌入式的乐趣。在这次设计中,我一点也不怕麻烦,反复编写、修改,就是希望能把这次课程设计做好。因此对我来说,这次课程设计是非常有意义的。同时也谢谢老师的帮助与教导!
实验课很快结束了,在实验中蔡老师非常细心为我们讲解。希望我们以后还能上蔡老师的课。感谢蔡老师!