关于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