关于STM32货车油箱防盗器程序及使用的介绍说明

关于STM32货车油箱防盗器程序及使用的介绍说明



前言

随着科技的发展,网上购物、直播带货等购物方式的出现,物流行业也随之崛起,随之加入的还有越来越多的货车司机。在农村,每隔几户几乎都会有一个货车司机从事物流行业,虽然带给了司机高利润,但是同时也伴随着被一些不法分子偷油的的风险。本设计主要为了解决以上问题,为货车司机在长时间驾驶货车后休息时提供一个安心睡觉的环境,而不用去警醒油耗子偷油,让司机安心睡觉。本设计采用STM32f407zgt6为主机主控芯片、STM32rct6为从机主控芯片+LoRa模块+WIFI模块+震动传感器+人体检测模块。本装置通过传感器采集油箱信息,无线传送给驾驶舱处主机,主机存储信息到sd卡+发送到原子云。在油箱被偷油时,从机处开启爆闪灯和蜂鸣器警示和驱赶偷油者,驾驶舱处主机通过语音输出提示司机。

只是作业,比较简陋。


1、系统简述

实物图片如下:
在这里插入图片描述
系统介绍:系统主要分为主机和从机。主机以STM32f407zgt6探索者开发板为主控+LoRa模块+ESP8266。从机以STM32f103rct6MINI开发板为主控+LoRa模块+震动传感器+人体检测模块。
这里主机的模拟安装环境是在驾驶室,从机的模拟安装环境是在货车的油箱处。主机主要负责接收信息,存储报警信息到sd卡,上传报警信息到原子云。
LoRa模块主要负责主机和从机之间的通信。WIFI模块主要把报警信息上传原子云。传感器负责采集信息,从机负责判断是否有人偷油(震动模块是否震动+人体检测模块是否检测到人)。

2、系统介绍

主机框图
在这里插入图片描述
从机框图
在这里插入图片描述
系统页面如下:

在这里插入图片描述
主机按键功能介绍:
// 设备上电默认关闭模式
// 设备开启:开启设防,设备正常预警
// 设备关闭:关闭设防,设备不预警
// 测试模式:主机每隔500ms向从机发送AAA一次

// key_up: 开启、关闭模式切换
// key0 :
// key1 : 复位(报警状态下有效)
// key2 : 打开或关闭测试模式

页面介绍:
页面红色线以上为显示的个人信息。
Command Receiver : 显示接收命令
Device State :设备的状态(开启(open)、关闭(close)、测试(test))
Alarm Signal:Normal :是否报警 (Warning(警报)、Normal(正常))
做下角的方框每接收一次数据会变一次颜色,receive+5。右下角每发送一次数据会变一次颜色,send+5。
LoRa间传递的命令信息:
aa[5]={‘A’,‘A’,‘A’,‘\r’,‘\n’};//测试
bb[5]={‘c’,‘A’,‘a’,‘\r’,‘\n’};//危险预警
cc[5]={‘c’,‘A’,‘b’,‘\r’,‘\n’};//设防开启
dd[5]={‘c’,‘A’,‘c’,‘\r’,‘\n’};//设防关闭
ee[5]={‘c’,‘A’,‘d’,‘\r’,‘\n’};//复位

在这里插入图片描述

报警状态
红绿闪烁+蜂鸣器 滴 滴 滴。
每报警一次主机会把报警信息的时间加日期写进sd卡的message.txt,同时上传原子云。如下图
在这里插入图片描述
报警信息上传原子云页面
原子云连接
通过串口配置ESP8266WIFI模块的步骤流程可以参考这个连接:http://t.csdn.cn/7D5sl
连接时usart1会依次打印出

AT is OK
STA is OK
RST is OK
WIFI connect
atomic_cloud connect

在这里插入图片描述

主从机的串口1都作为了监视串口 可以查看主机和从机的发送命令,如下图。主机串口2连接了wifi模块连接原子云,串口3连接了LoRa模块。从机串口2 连接了LoRa模块。
在这里插入图片描述

STM32 单片机配置ESP8266连接原子云初始化函数

void esp_8266_init(void)
{
	u8 *p;
	p=mymalloc(SRAMIN,32);
	
	while(atk_8266_send_cmd("AT","OK",20));  //检查WIFI模块是否在线
	printf("AT is OK\r\n");
	while(atk_8266_send_cmd("AT+CWMODE=1","OK",20));		//设置WIFI STA模式
	printf("STA is OK\r\n");
	while(atk_8266_send_cmd("AT+RST","OK",40));		//DHCP服务器关闭(仅AP模式有效)
	printf("RST is OK\r\n");
	delay_ms(1000);         //延时3S等待重启成功
	delay_ms(1000);
	delay_ms(1000);
	delay_ms(1000);	
	//设置连接到的WIFI网络名称/加密方式/密码,这几个参数需要根据您自己的路由器设置进行修改!! 
	sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"",wifista_ssid,wifista_password);//设置无线参数:ssid,密码
	while(atk_8266_send_cmd(p,"WIFI GOT IP",300));				//连接目标路由器,并且获得IP
	printf("WIFI connect\r\n");
	//atk_8266_send_cmd("AT+RESTORE","OK",20);
	//printf("ok\r\n");
	//连接原子云
	sprintf((char*)p,"AT+ATKCLDSTA=\"%s\",\"%s\"",atomic_cloud_id,atomic_cloud_password);//设置无线参数:ssid,密码
	while(atk_8266_send_cmd(p,"CLOUD CONNECTED",300));				//连接目标路由器,并且获得IP
	printf("atomic_cloud connect\r\n");
}

此初始化函数需在模块未连接原子云时使用,连接到原子云以后模块会把接收到的AT指令信息看作是发送给原子云的信息。(也就是说模块在供电时按rest复位按键执行此函数无效,因为此时模块在连接状态,会把AT指令信息直接发到原子云。)

初始化函数在common1.c中,移植需用到在这里插入图片描述两个文件,外加把串口配置成115200,加一个print的函数,如下

//串口2,printf 函数
//确保一次发送数据不超过USART3_MAX_SEND_LEN字节
void u2_printf(char* fmt,...)  
{  
	u16 i,j;
	va_list ap;
	va_start(ap,fmt);
	vsprintf((char*)USART2_TX_BUF,fmt,ap);
	va_end(ap);
	i=strlen((const char*)USART2_TX_BUF);//此次发送数据的长度
	for(j=0;j<i;j++)//循环发送数据
	{
	  while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);  //等待上次传输完成 
		USART_SendData(USART2,(uint8_t)USART2_TX_BUF[j]); 	 //发送数据到串口3 
	}
	
}

主机main程序

mian主要写了程序的逻辑

/*------------------------------------------------*/
// 设备上电默认关闭模式
// 设备开启:开启设防,设备正常预警
// 设备关闭:关闭设防,设备不预警
// 测试模式:主机每隔500ms向从机发送AAA一次

// key_up: 	开启、关闭模式切换
// key0 :		
// key1 :		复位
// key2 :   打开或关闭测试模式
// 
/*------------------------------------------------*/
#include "sdio_sdcard.h"    
#include "malloc.h" 
#include "w25qxx.h"    
#include "ff.h"  
#include "exfuns.h"   
#include "sram.h"   
#include "malloc.h" 

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "key.h"
#include "lcd.h"
#include "usmart.h"
#include "timer.h"
#include "rtc.h"
#include "beep.h" 
#include "common1.h"
u8 judge_password(u8 a[ ],u8 b[ ],u8 j)   //判断密码是否正确  正确返回1 不正确返回0
{
	u8 i=0;
	for(i=0;i<j;i++)
	{
		if(a[i]!=b[i])
	return 0;
	}
	return 1;
}
void huakuang(void)   
{
		LCD_ShowString(120,150,200,16,16,"Normal  ");
		LCD_Fill(6,221,233,313,WHITE); //填充区域
		POINT_COLOR = BLACK;
		LCD_DrawRectangle(5,220,115,314); 	//画一个矩形	
		LCD_DrawLine(5,240,115,240);		//画线
		POINT_COLOR = BLUE;
		LCD_ShowString(6,221,110,16,16,"Receive:");
		LCD_ShowxNum(69,221,receive_count,5,16,0x80);	//显示任务执行次数
		//框2
		POINT_COLOR = BLACK;
		LCD_DrawRectangle(125,220,234,314); //画一个矩形	
		LCD_DrawLine(125,240,234,240);		//画线
		POINT_COLOR = BLUE;
		LCD_ShowString(126,221,110,16,16,"Send:");
		LED0=1;LED1=1;
}
//LCD刷屏时使用的颜色
int lcd_discolor[14]={	WHITE, BLACK, BLUE,  BRED,      
						GRED,  GBLUE, RED,   MAGENTA,       	 
						GREEN, CYAN,  YELLOW,BROWN, 			
						BRRED, GRAY };
FIL fil;
FRESULT res;
UINT bww;
char buf[100];
						
 int main(void)
 {
	 
	u8 *buf1;
	u32 sd_size;	
 	u32 total,free;
	u8 res=0;	
	
	RTC_TimeTypeDef RTC_TimeStruct;
	RTC_DateTypeDef RTC_DateStruct;
	u8 t=0,ttc=' ';
	u8 iii=0; 
	u8 tbuf[20];
	u8 dbuf[40];
	u8 minutes_z=0;
	 
	u8 state_flag=0;  //设防开关 默认关闭
	u8 warning_state = 0;  //报警状态
	u8 aa[5]={'A','A','A','\r','\n'};//测试
	u8 bb[5]={'c','A','a','\r','\n'};//危险预警
	u8 cc[5]={'c','A','b','\r','\n'};//设防开启
	u8 dd[5]={'c','A','c','\r','\n'};//设防关闭
	u8 ee[5]={'c','A','d','\r','\n'};//复位
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);      //初始化延时函数	    	 //延时函数初始化	
	TIM3_Int_Init(10-1,8400-1);	//定时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计数10次为1ms   
	uart_init(115200);	 
	uart2_init(115200);
	uart3_init(9600);
	usmart_dev.init(84); 	//初始化USMART	
	LED_Init();
	KEY_Init();
	LCD_Init();           //初始化LCD
	My_RTC_Init();		 		//初始化RTC
	BEEP_Init(); 
	RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);		//配置WAKE UP中断,1秒钟中断一次
	
	W25QXX_Init();				//初始化W25Q128
	my_mem_init(SRAMIN);		//初始化内部内存池 
	my_mem_init(SRAMCCM);		//初始化CCM内存池
	
	POINT_COLOR=RED;
	LCD_ShowString(15,10,200,16,16,"Electronic System Experiment");	
	LCD_ShowString(15,30,200,16,16,"Name:Chaoy6565 ^_^ ");	
	LCD_ShowString(15,50,200,16,16,"Device:Host LoRa test");
	LCD_ShowString(15,70,200,16,16,"Time:");	  	

	POINT_COLOR = RED;
	LCD_DrawLine(5,108,313,108);		//画线
	huakuang();
	
	
	POINT_COLOR = BLUE;
	LCD_ShowString(15,110,200,16,16,"Command Receiver:");
	LCD_ShowString(15,130,200,16,16,"Device State:");	
	LCD_ShowString(15,150,200,16,16,"Alarm Signal:Normal");	
	
	while(SD_Init())//检测不到SD卡
	{
		LCD_ShowString(30,150,200,16,16,"SD Card Error!");
		delay_ms(500);					
		LCD_ShowString(30,150,200,16,16,"Please Check! ");
		delay_ms(500);
	}
 	exfuns_init();							//为fatfs相关变量申请内存				 
  	f_mount(fs[0],"0:",1); 					//挂载SD卡 
 	res=f_mount(fs[1],"1:",1); 				//挂载FLASH.	
	if(res==0X0D)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
	{
		LCD_ShowString(30,170,200,16,16,"Flash Disk Formatting...");	//格式化FLASH
		res=f_mkfs("1:",1,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
		if(res==0)
		{
			f_setlabel((const TCHAR *)"1:ALIENTEK");	//设置Flash磁盘的名字为:ALIENTEK
			LCD_ShowString(30,170,200,16,16,"Flash Disk Format Finish");	//格式化完成
		}else LCD_ShowString(30,170,200,16,16,"Flash Disk Format Error ");	//格式化失败
		delay_ms(1000);
	}													    
	LCD_Fill(30,170,240,150+16,WHITE);		//清除显示			  
	while(exf_getfree("0",&total,&free))	//得到SD卡的总容量和剩余容量
	{
		LCD_ShowString(30,170,200,16,16,"SD Card Fatfs Error!");
		delay_ms(200);
		LCD_Fill(30,170,240,150+16,WHITE);	//清除显示			  
		delay_ms(200);
	}	
	esp_8266_init();	  //原子云初始化
	
	while(1)
	{
		if(time_100ms_flag)
		{
				time_100ms_flag=0;
				
				RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
				sprintf((char*)tbuf,"Time:%02d:%02d:%02d",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds); 
				POINT_COLOR = RED;
				LCD_ShowString(17,90,210,16,16,tbuf);	
				
				RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
				sprintf((char*)tbuf,"Date:20%02d-%02d-%02d",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date); 
				POINT_COLOR = RED;
				LCD_ShowString(15,70,200,16,16,tbuf);	
			
			if(minutes_z!=RTC_TimeStruct.RTC_Seconds)
			{
					sprintf((char*)dbuf,"20%02d-%02d-%02d-%02d:%02d:%02d--Warning\r\n",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date,RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds); 
					minutes_z=RTC_TimeStruct.RTC_Seconds;
					//uart1_send_buff(dbuf,40);
					
	//				res=f_open (&fil,"0:/message.txt",FA_WRITE);	//FA_CREATE_ALWAYS|
	//				f_lseek(&fil, f_size(&fil));
	//				f_write (&fil, dbuf, 22, &bww); //"alien121tek test"
	//				f_close(&fil);
	//				res=f_open (&fil,"0:/message.txt", FA_READ);
	//				f_lseek(&fil, f_size(&fil)-22);
	//				f_read (&fil, buf,22,&bww);	
	//				f_close(&fil);
	//				LCD_ShowString(10,190,230,24,24,(u8 *)buf);	
			}
			
		}
		if(warning_flag)   									//警报
		{
				//if(time_300ms_flag) BEEP=!BEEP;
				if(time_500ms_flag)
				{
						iii++;
						if(iii%2==1) LCD_Fill(6,221,233,313,RED); //填充区域
						else  LCD_Fill(6,221,233,313,GREEN); //填充区域
						time_500ms_flag=0;
						LED0=!LED0;	
						LED1=!LED1;		
				}		
				if(warning_state==0)
				{
						warning_state=1;
						uart1_send_buff(dbuf,40); //串口1 监控
						u2_printf(dbuf);		//信息发送原子云
						res=f_open (&fil,"0:/message.txt",FA_WRITE);	//信息写sd卡	
						f_lseek(&fil, f_size(&fil));
						f_write (&fil, dbuf, 22, &bww); //"alien121tek test"
						f_close(&fil);
				}
		}
		else               									//正常
		{
				BEEP=0;
				//发送指令显示
				LCD_ShowxNum(166,221,send_count,5,16,0x80);  //显示任务执行次数
				LCD_Fill(126,241,233,313,lcd_discolor[send_count/3%14]); //填充区域
				
				//接收指令颜色显示
					LCD_ShowxNum(69,221,receive_count,5,16,0x80);	//显示任务执行次数
					LCD_Fill(6,241,114,313,lcd_discolor[receive_count/3%14]); //填充区域
					//接收指令显示
					POINT_COLOR = BLUE;
					LCD_ShowString(15,110,200,16,16,"Command Receiver:");	
		}
		
		if(state_flag==0)      							//关闭状态
		{
			POINT_COLOR = BLUE;
			LCD_ShowString(125,130,200,16,16,"Close");	
		}
		if(state_flag==1)      							//开启状态
		{
			POINT_COLOR = BLUE;
			LCD_ShowString(125,130,200,16,16,"Open");
		}
		if(state_flag==2&&time_500ms_flag)  //测试状态
		{
				send_count+=5;
				uart3_send_buff(aa,5); //usart3 Lora 500ms发送一次
				time_500ms_flag=0;
		}
		
		if(receive_flag)  									//接收到信息
		{
				receive_flag=0;
				if(judge_password(USART_RX_BUF_3,ee,3))   //复位  从机usart3  cAd
				{	
							warning_flag=0;
							huakuang();
				}
				if(judge_password(USART_RX_BUF_3,bb,3))   //危险预警播报  从机发送 cAa
				{
						 warning_flag=1;
							LCD_ShowString(120,150,200,16,16,"Warning");
							LCD_DrawRectangle(5,220,234,314);//画一个矩形
							LCD_Fill(6,221,233,313,RED); //填充区域
				}
				if(judge_password(USART_RX_BUF_1,cc,3))   //设防开启  电脑usart1  cAb
				{
						state_flag=1;uart3_send_buff(cc,5);send_count+=5;  //开启
				}
				if(judge_password(USART_RX_BUF_1,dd,3))   //设防关闭  电脑usart1  cAc
				{
						state_flag=0;uart3_send_buff(dd,5);send_count+=5;	 //关闭
				}
				if(judge_password(USART_RX_BUF_1,aa,3))   //测试用  电脑usart1  AAA
				{
						switch(state_flag)
							{
								case 0: state_flag=2;POINT_COLOR = BLUE;LCD_ShowString(125,130,200,16,16,"Test ");	break;
								case 1: state_flag=2;break;
								case 2: state_flag=0;break;
							}
							LED0=!LED0;	
							LED1=!LED1;				
				}
				LCD_ShowString(151,110,200,16,16,USART_RX_BUF_3);	
				USART_RX_BUF_3[2]=USART_RX_BUF_3[1]=USART_RX_BUF_3[0]=' ';
		}
		
		t=KEY_Scan(0);		//得到键值
		switch(t)
		{				 
			case KEY0_PRES:
								res=f_open (&fil,"0:/message.txt", FA_READ);
								//f_lseek(&fil, f_size(&fil)-22);
								f_read (&fil, buf,22,&bww);	
								f_close(&fil);
								for(sd_size=0;sd_size<f_size(&fil);sd_size++)printf("%x ",buf[sd_size]);//打印0扇区数据    	   
								printf("\r\nDATA ENDED\r\n");
//							buf1=mymalloc(0,512);		//申请内存
//							if(SD_ReadDisk(buf1,0,1)==0)	//读取0扇区的内容
//							{	
//								LCD_ShowString(30,190,200,16,16,"USART1 Sending Data...");
//								printf("SECTOR 0 DATA:\r\n");
//								for(sd_size=0;sd_size<512;sd_size++)printf("%x ",buf1[sd_size]);//打印0扇区数据    	   
//								printf("\r\nDATA ENDED\r\n");
//								LCD_ShowString(30,190,200,16,16,"USART1 Send Data Over!");
//							}
//							myfree(0,buf1);//释放内存	  
				break;
			case KEY1_PRES: //复位
								warning_flag=0;
								warning_state=0;
								huakuang();
								uart3_send_buff(ee,5);send_count+=5;
						
				break;
			case KEY2_PRES:   //开启或关闭测模式 LoRa模块 AAA
							switch(state_flag)
							{
								case 0: state_flag=2;POINT_COLOR = BLUE;LCD_ShowString(125,130,200,16,16,"Test ");	break;
								case 1: state_flag=2;POINT_COLOR = BLUE;LCD_ShowString(125,130,200,16,16,"Test ");break;
								case 2: state_flag=0;uart3_send_buff(dd,5);send_count+=5;break;
							}
							
				break;
			case WKUP_PRES:	  // 开启或关闭模式
							switch(state_flag)
							{
								case 0: state_flag=1;uart3_send_buff(cc,5);send_count+=5;break;  //开启
								case 1: state_flag=0;uart3_send_buff(dd,5);send_count+=5;break;	 //关闭
							}
				
				break;
			default:
				delay_ms(10);	
		} 
	}	 
}

从机main程序

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "timer.h"
#include "jiance.h"
#include "usmart.h"
#include "rtc.h"

u8 aa[5]={'A','A','A','\r','\n'};//测试
u8 bb[5]={'c','A','a','\r','\n'};//危险预警
u8 cc[5]={'c','A','b','\r','\n'};//设防开启
u8 dd[5]={'c','A','c','\r','\n'};//设防关闭
u8 ee[5]={'c','A','d','\r','\n'};//复位
//LCD刷屏时使用的颜色
int lcd_discolor[14]={	WHITE, BLACK, BLUE,  BRED,      
						GRED,  GBLUE, RED,   MAGENTA,       	 
						GREEN, CYAN,  YELLOW,BROWN, 			
						BRRED, GRAY };
u8 judge_password(u8 a[ ],u8 b[ ],u8 j)   //判断密码是否正确  正确返回1 不正确返回0
{
	u8 i=0;
	for(i=0;i<j;i++)
	{
		if(a[i]!=b[i])
	return 0;
	}
	return 1;
}

 int main(void)
 { 
		u8 t=0;
		u8 iii=0; 
		u8 warning_flag=0,warning_state=0;
		u8 state_flag=0;  //设防开关 默认关闭
		delay_init();	    	 //延时函数初始化
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
		TIM3_Int_Init(9,7199);//10Khz的计数频率,计数到5000为500ms  	 
		uart_init(115200);	 	//串口初始化为9600
		uart2_init(9600);
		LED_Init();		  		//初始化与LED连接的硬件接口
		LCD_Init();
		KEY_Init();
		usmart_dev.init(72);	//初始化USMART			

		POINT_COLOR=RED;
		LCD_ShowString(15,10,200,16,16,"Electronic System Experiment");	
		LCD_ShowString(15,30,200,16,16,"Name:Chaoy6565 ^_^ ");	
		LCD_ShowString(15,50,200,16,16,"Device:Slave LoRa test");
		LCD_ShowString(15,70,200,16,16,"Data:     -  -    ");	
		LCD_ShowString(15,90,200,16,16,"Time:   -  -    ");	
//		LCD_ShowString(15,70,200,16,16,"Time:2023/3/28");	  
	  //框1
		POINT_COLOR = BLACK;
		LCD_DrawRectangle(5,220,115,314); 	//画一个矩形	
		LCD_DrawLine(5,240,115,240);		//画线
		POINT_COLOR = BLUE;
		LCD_ShowString(6,221,110,16,16,"Receive:000");
		//框2
		POINT_COLOR = BLACK;
		LCD_DrawRectangle(125,220,234,314); //画一个矩形	
		LCD_DrawLine(125,240,234,240);		//画线
		POINT_COLOR = BLUE;
		LCD_ShowString(126,221,110,16,16,"Send:000");
		
		POINT_COLOR = RED;
		LCD_DrawLine(5,108,313,108);		//画线
		
		POINT_COLOR = BLUE;
		LCD_ShowString(15,110,200,16,16,"Command Receiver:");
		LCD_ShowString(15,130,200,16,16,"Device State:");	
		LCD_ShowString(15,150,200,16,16,"Alarm Signal:Normal");
		
		
		while(RTC_Init())		//RTC初始化	,一定要初始化成功
		{ 
			LCD_ShowString(60,130,200,16,16,"RTC ERROR!   ");	
			delay_ms(800);
			LCD_ShowString(60,130,200,16,16,"RTC Trying...");	
		}		    						
  while(1) 
	{
			if(ZDD==0&&RTT==1&&state_flag==1)   //传感器相关
			{
					
					if(warning_state==0) 
					{
						warning_flag=1;
						warning_state=1;
						uart2_send_buff(bb,5); 				 	//向主机发送
						uart1_send_buff(bb,5);
						send_count+=5;
					}
			}
			if(t!=calendar.sec)   							//时钟相关
			{
					t=calendar.sec;
					POINT_COLOR = RED;   
					LCD_ShowNum(60,70,calendar.w_year,4,16);									  
					LCD_ShowNum(100,70,calendar.w_month,2,16);									  
					LCD_ShowNum(124,70,calendar.w_date,2,16);	
					
					LCD_ShowNum(60,90,calendar.hour,2,16);									  
					LCD_ShowNum(84,90,calendar.min,2,16);									  
					LCD_ShowNum(108,90,calendar.sec,2,16);
			}
			if(warning_flag)  //报警状态
			{
					if(time_500ms_flag)
					{
							iii++;
							if(iii%2==1) LCD_Fill(6,221,233,313,RED); //填充区域
							else  LCD_Fill(6,221,233,313,GREEN); //填充区域
							POINT_COLOR = BLACK;
							LCD_DrawRectangle(5,220,234,314);//画一个矩形
							POINT_COLOR = BLUE;
							LCD_ShowString(120,150,200,16,16,"Warning");
							time_500ms_flag=0;
							LED0=!LED0;	
							LED1=!LED1;		
					}	
			}    						//正常状态
			else
			{
					//发送指令显示
					POINT_COLOR = BLUE;
					LCD_ShowxNum(166,221,send_count,5,16,0x80);  //显示任务执行次数
					LCD_Fill(126,241,233,313,lcd_discolor[send_count/3%14]); //填充区域
					
					//接收指令颜色显示
					LCD_ShowxNum(69,221,receive_count,5,16,0x80);	//显示任务执行次数
					LCD_Fill(6,241,114,313,lcd_discolor[receive_count/3%14]); //填充区域
					//接收指令显示
					POINT_COLOR = BLUE;
					LCD_ShowString(120,150,200,16,16,"Normal  ");		
					POINT_COLOR = BLACK;
					LCD_DrawRectangle(5,220,115,314); 	//画一个矩形	
					LCD_DrawLine(5,240,115,240);		//画线
					LCD_DrawRectangle(125,220,234,314); //画一个矩形	
					LCD_DrawLine(125,240,234,240);		//画线
					POINT_COLOR = BLUE;
					LCD_ShowString(6,221,110,16,16,"Receive:");
					LCD_ShowString(126,221,110,16,16,"Send:");
					LED0=1;LED1=1;	
			}
			if(state_flag==0)    //关闭模式
			{
					POINT_COLOR = BLUE;
					LCD_ShowString(125,130,200,16,16,"Close");	
			}
			if(state_flag==1)		//开启模式
			{
					POINT_COLOR = BLUE;
					LCD_ShowString(125,130,200,16,16,"Open");
			}
			if(state_flag==2)   //测试模式
			{
					POINT_COLOR = BLUE;
					LCD_ShowString(125,130,200,16,16,"Test ");
			}
			
			if(receive_flag)		//串口接收到信息
			{
					receive_flag=0;
					if(judge_password(USART_RX_BUF,aa,3))   //测试用 主机 AAA
					{
							state_flag=2;
					}
					if(judge_password(USART_RX_BUF,cc,3))   //设防开启 cAb
					{
							state_flag=1;
					}
					if(judge_password(USART_RX_BUF,dd,3))   //设防关闭 cAc
					{
							state_flag=0;
					}
					if(judge_password(USART_RX_BUF,ee,3))   //复位 
					{
						LCD_Fill(6,221,233,313,WHITE); //填充区域
						warning_flag=0;
						warning_state=0;
					}
					POINT_COLOR = BLUE;
					LCD_ShowString(153,110,200,16,16,USART_RX_BUF);	
					USART_RX_BUF[2]=USART_RX_BUF[1]=USART_RX_BUF[0]=' ';
			}
			
			t=KEY_Scan(0);		//得到键值
			switch(t)
			{	
					case KEY0_PRES:	  //警报测试
							warning_flag=1;
							if(warning_flag==0) LCD_Fill(6,221,233,313,WHITE); //填充区域
							LED1=1;LED0=1;
							uart2_send_buff(bb,5);		 // 向主机发送
							uart1_send_buff(bb,5);
							send_count+=5;
							break;
					case KEY1_PRES:		//复位
//							LCD_Fill(6,221,233,313,WHITE); //填充区域	
//							if(warning_flag==1){uart2_send_buff(ee,5);uart1_send_buff(ee,5);}  //向主机发送
//							warning_flag=0;
//							warning_state=0;
//							
//							send_count+=5;
								
							break;
					case WKUP_PRES:		
						
							
							break;
					default:
							delay_ms(10);	
			} 
		} 
}

程序编写和调试中的bug记录
关于WIFI连接原子云:http://t.csdn.cn/7D5sl
关于keil5的:http://t.csdn.cn/WFWCm

程序代码

https://m.tb.cn/h.6rQT6PJ?tk=mUi6Vi6dRwb CZ005
点击链接直接打开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chaoy6565

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值