本设计由STC89C52单片机电路+烟雾传感器电路+温度传感器电路+加速度传感器+心率传感器电路+SIM800A_GSM模块电路+电源电路组成。
该系统实时监测老人是否跌倒,是否周围有火以及心率情况。
1、如果烟雾传感器检测到烟雾超标,则GSM向特定手机发送:Smoke!
2、如果ADXL345检测到老人跌倒了,则GSM向特定手机发送:Fall!同时蜂鸣器报警,如果老人没跌倒,则蜂鸣器不报警。如果老人没有跌倒,而是弯腰等等,这属于误报警,则老人可以自己用按键取消键取消警报。
3、如果心率传感器检测到老人心率高于120,则GSM向特定手机发送:High Heart!
4、如果温度超过38度,则GSM向特定手机发送:has a cold!
4、注意本设计一次上电上述情况每个只能触发一次上报短信,不会连续发送。
5、短信处理过程有GSM信号灯指示。
资料下载地址
https://pan.baidu.com/s/1QhR-6MoeNlXZsQ84CY4Bbg?pwd=8888
unsigned char sdLater = 0;
void Init_Timer0(void); //函数声明
void TIM2Inital(void);
void SendStr(unsigned char *s,unsigned char length);
void UART_Init(void);
void SendByte(unsigned char dat);
void main (void)
{
static unsigned char ErrorNum=0;
static unsigned char CheckNum=0;
LED = 0;
DelayMs(20); //延时有助于稳定
Init_ADXL345(); //清屏
for(i=0;i<50;i++)
DelayMs(100); //延时有助于稳定
SendStr("AT+CMGF=1\r\n",11); //设置字符
for(i=0;i<7;i++)
DelayMs(100); //延时有助于稳定
LED=1; //关闭led
while (1) //主循环
{
if(ReadAdxl345==1) //定时读取adxl345数据
{
ReadAdxl345=0;
ReadData_x(); //三轴检测函数
CheckNum++;
if((temp_X<550)||(abs(temp_Y)>750)) //方位值判断 查看正常次数
{
ErrorNum++;
}
if(CheckNum>=5) //进行5次处理
{
ErrorNum=0; //清空滤波计数
CheckNum=0;
}
}
if(ReadTempFlag==1) //读取温度标志
{
ReadTempFlag=0;
temp1=ReadTemperature(); //读取温度
temperature=(float)temp1*0.0625; //温度值转换
if(checkT<5)checkT++; //检测次数
if(checkT>=2)
{
if(temperature > 38)
{
if((reportFlag==0)&&(first4==0)) //当前没有任何触发
reportFlag=4;
}
}
}
if(displayOK==0)//如果显示关 检测心率是否真实
{
rate = 0;
}
if(ReportLater>=15) //15s
{
if(reportFlag!=0)
{
LED=0;
SendStr("AT+CMGF=1\r\n",11); //设置字符集
for(i=0;i<7;i++)
DelayMs(100); //延时有助于稳定
SendStr("AT+CSCS=\"GSM\"\r\n",15); //设置
for(i=0;i<7;i++)
DelayMs(100); //延时有助于稳定
// SendStr("AT+CMGS=\"+8618105140357\"\r\n",26); //可以修改电话号码
SendStr("AT+CMGS=\"+8618029401425\"\r\n",26); //可以修改电话号码
for(i=0;i<7;i++)
DelayMs(100); //延时有助于稳定
if(reportFlag==1)
{
SendStr("Smoke!",6); //可以修改短信内容,9代表短信内容长度,不可以发汉字,如果发汉字的话,需要转化为特定的码
first1=1;
}
else if(reportFlag==4)
{
SendStr("has a cold!",11); //可以修改短信内容,9代表短信内容长度,不可以发汉字,如果发汉字的话,需要转化为特定的码
first4=1;
}
DelayMs(100); //延时有助于稳定
SendStr( (uchar *)Crtl_Z, 1); //发送
for(i=0;i<20;i++)
DelayMs(100); //延时有助于稳定
LED=1;
ReportLater=0; //上报延时清零
reportFlag = 0;//上报标识清零
}
}
}
}