1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > java 报警系统_GitHub - Shadow-Java/alert-system: 嵌入式-图像检测自动报警系统

java 报警系统_GitHub - Shadow-Java/alert-system: 嵌入式-图像检测自动报警系统

时间:2020-01-28 00:18:50

相关推荐

java 报警系统_GitHub - Shadow-Java/alert-system: 嵌入式-图像检测自动报警系统

基于图像检测的自动报警系统

KeyWords:STM32、OV7725、嵌入式

Partner:王小石

📒目的与意义

为了更好的理解嵌入式系统的原理,提高小组成员之间分工与合作的能力以及应用设计的创新能力,我们选择了合作实现基于图像检测的自动报警系统这个课题。

通过本次课程设计,比较清晰地理解了关于摄像头模块、FLASH读写、图片显示、触摸屏模块、LCD模块、按键模块、触摸板模块、外部SRAM模块、光敏传感器、温度传感器、LED、蜂鸣器、外部SD卡读写的工作原理,学会了如何控制这些外设,如何去编程利用这些模块来实现自己想要的效果,在本次设计中,补全了在课程学习中没有注意到以及掌握较为薄弱的地方,并学习了图像检测与处理的基础知识.

📔课程设计思路及具体流程

设计思路

基于我们的选题——基于图像检测的自动报警系统,我们设计通过OV7725摄像头采集图像信息,对图像进行处理检测,一但检测到闯入者,则发出报警信息。

各模块划分

程序以LCD模块、按键模块、触屏模块、FLASH模块、外部SRAM模块、光敏模块、蜂鸣器等硬件为基础,以摄像头模块作为核心实现:

1.LCD模块在屏幕上输出信息

2.按键模块检测用户输入

3.外部SRAM模块存储动态图像数据

4.光敏模块检测环境光亮度并输出提示信息

5.摄像头模块采集图像信息

6.程序对图像进行处理与检测

7.蜂鸣器模块输出报警信息

再另外附加触屏模块实现密码登录和用户交互以及FLASH实现图像抓拍的存储功能,使可视化界面展示了被保护物品的所有时间维度的状态,一旦被盗或者发生移动之后,可以实现 FLASH图像抓拍,并且存储到主机里面。

📘关键操作函数的实现

开机界面的设计

(1)所用硬件

所用硬件资源如下:

1)串口

2)TFTLCD模块

3)SD卡

4)SPI FALSH

本次实验使用的是容量为8G的SD卡支持SPI/SDIO驱动,战舰STM32F103自带了标准的 SD卡接口,使用 STM32F1自带的SDIO接口驱动,4位模式,最高通信速度可达24Mhz,最高每秒可传输数据12M字节,所以够满足我们的实验要求。SD卡根目录下新建一个PICTURE文件夹用来存放JEPG、JPG、BMP或GIF图片。

开机的时候先初始化SD卡,初始化成功之后,注册两个工作区(一个给SD卡用,一个给SPI FLASH用),然后获取SD卡的容量和剩余空间,并显示在LCD模块上,最后等待USMART输入指令进行各项测试。

(2)设计思路

首先在alert_system项目中新建一个PICTURE文件夹,里面有bmp.c、bmp.h、tjpgd.c、tjpgd.h、integer.h、gif.c、gif.h、piclib.c和piclib.h

等 9 个文件,其中bmp.c 和 bmp.h用于实现对bmp文件的解码;tjpgd.c 和 tjpgd.h用于实现对 jpeg/jpg 文件的解码;gif.c和gif.h用于实现对gif文件的解码。从网上下载一幅图片拷贝于SD卡中,图片不易过大,因为对于战舰STM32闪存只有521KB,图片过大会导致界面加载过慢。本实验图片通过PS进行处理,添加自己的系统名和作者。

在alert_system项目中还添加了FATFS、MALLOC、TEXT文件,将每个分组的源文件根据路径进行添加,编译后再根据错误的执行进行添加。FATFS

是一个FAT文件系统模块,MALLOC里面包含计算机对内存资源的分配和使用的函数,可以更加高效和快速的分配内存资源。

通过f_opendir()打开图片文件夹,给图片的索引、文件名、长文件缓存分配内存,判断获取的数据是不是图片,如果是就ai_load_picfile()显示相应的图片。

(2)具体程序设计实现

①打开文件夹

while(f_opendir(&picdir,"0:/PICTURE"))//打开图片文件夹

{

Show_Str(30,170,240,16,"PICTURE IS WRONG!",16,0);

delay_ms(200);

LCD_Fill(30,170,240,186,WHITE);//清除显示

delay_ms(200);

}

②内存分配,出错则打不开文件

while(picfileinfo.lfname==NULL||pname==NULL)//内存分配出错

{

Show_Str(30,170,240,16,"memory share wrong!",16,0);//内存分配失败

delay_ms(200);

LCD_Fill(30,170,240,186,WHITE);//清除显示

delay_ms(200);

}

③图片显示

ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//显示图片

2.用户登陆界面

(1)所用硬件

1)指示灯LED1

2)串口

3)TFTLCD模块(含触摸屏)

4)SPI FLASH

指示灯LED1每30次循环闪烁一次,让输入的密码显示到屏幕上,同时输出到串口。TFTLCD模块用于实现ASCII字符和彩色的显示并在串口打印LCD控制器ID,同时在LCD上面显示,FLASH用于缓存数据。

(2)设计思路

我们是用LCD_DrawLine()画图函数将键盘、提示框和输入框画出。当用户输入密码时,如果密码超过指定长度则会报“password is out-length!!”,可以通过CANCEL进行取消这次输入。当用户输入的密码和自己设置的密码一直则会进入开机界面。

(3)具体程序设计

①用户输入键盘画图函数

LCD_DrawLine(45,200,145,200);

LCD_DrawLine(145,200,145,250);

LCD_DrawLine(145,250,45,250);

LCD_DrawLine(45,250,45,200);

LCD_ShowString(95,220,100,20,16,"1");

依次算出12个按键的间隔和坐标输出上述函数,再构建一个输入框和提示框,键盘就完成了。

②获得键盘值函数

if(tp_dev.x[0]<=145&&tp_dev.x[0]>=45&&tp_dev.y[0]<=250&&tp_dev.y[0]>=200){//按下“1”

key=1;

delay_ms(20);

}

根据tp_dev.x[0]和tp_dev.y[0]限制键盘的坐标值,当用户点击这个区域,就让这个key获得这个值。

③防止用户连触点击而发生输入不对的情况函数

if(key){

if(key_x!=255){

if(key_x==key){

key=0;

}else{

key_x=key;

}

}else{

key_x=key;

}

}

key_x记录上一次用户点击的键值,key记录这次用户的键值,如果没有按键按下并且这次的按键和上次的按键相等(发生了连触),就将此次的键值变为零。如果没有按键按下,则让这次的按键等于上一次,这样就能保证点击一次屏幕只能发生一次点击。

④用户输入超过六位警告函数

POINT_COLOR=RED;

LCD_ShowString(140,165,250,20,16,"password is out-length!!");

POINT_COLOR=BROWN;

在指定的用户警告框中输入,给定一个地址、一个长度、高度、字号进行输出

⑤CANCEL键函数

if(key_index==12){//删除

password_length=0;

inputstr[0]='\0';

input_pwd=0;

LCD_Fill(192,118,288,148,WHITE);

LCD_Fill(137,163,387,180,WHITE);

}

当用户点击删除键时将inputstr数组全部清空,添加结束符并且将上次写入的输入框和警告框清除

✒️实践体会与总结

《嵌入式系统及应用》这门课程是学习计算机必备的常用知识,学期开始,我们开始学习《嵌入式系统及应用》,由于初次接触嵌入式系统,感觉蛮难的,所以收获不是很大,很多的概念都比较模糊,等到学期中期开始做嵌入式课程实验时,真是范然无从下手,自从拿到设计主题后,我就像热锅上的蚂蚁,一个字急。最后实在没有办法,我们逼着自己去学习,查资料,总算对嵌入式有了浅层理解。

在实验中,我们互相学习了对方的编程技巧,从不善于沟通,到能够以各种形式表达自己的观点,表现程序设计思路,获得了很大的收获.并合作编写了本次课设报告。在完成课设的过程中,不仅巩固了嵌入式系统的知识点,并且对c语言的特性也有了更深入的了解,很大程度上提升了编码能力。

每次对于未知的东西都很好奇,编程是一种奇妙而又有趣的事情。起初对于战舰STM32的开发既期待又觉得特别玄妙,硬件不是我特别喜欢的研究的东西,但恰好又有软件的结合。一开始对于Keil软件不能轻松驾驭,运行一个例程总会让我重新配置ST-link,在项目中添加文件也一样,要一直添加其中缺少的文件并且要配置源文件的路径才能不会报错。当这些都能够轻松驾驭的时候突然觉得自己已经进入门槛了,其次就是对于文件函数的调用,有些硬件在stm32f10x_conf.h是注释掉的,当添加一些硬件如malloc、falsh需要去掉注释。

①对于屏幕键盘可以利用LCD_DrawLine()进行画图,但这需要给与两个点的坐标才能化成一条横线。后面才知道可以利用LCD_DrawRectangle()给与两个点就可以画出一个矩形,这样大大节省了代码和减小了时间复杂度;

②键盘的设计非常简单,但主要的一个难点在于屏幕的连触问题。对于STM32开发板写入键盘点击时,会经常性的发生连触。在T9拼音实验中我发现同样的开发板导入这段程序竟然并不会发生连触问题,一直按在键盘上也算作一次点击。在u8 py_get_keynum()函数中利用key_x和key的值可以消除这种连触问题,key_x记录上次点击的键值,key记录这次的点击值,如果此时按下键值并且这次的等于上一次的,就让这一次为零。这样做就可以防止整个点击过程不会因为连续点击而不能输对密码,并且后面的每次点击都可以运用这样的算法实现。

③用户密码存储是无符号型整数,inputstr数组加入‘0’就可以转换成相应的字符。对于每一次的键值都分别进行讨论,但因为STM32提供的函数是区域性的,没有单独字体输入函数,每次写进输入框再覆盖掉,都会留下一大片空白。因为这个原因,在后来添加键盘的亮度问题也弄错了好一阵,说明了直接拷贝代码是行不通的,主要还是其中的含义和整个过程的把握。

④SD卡的读写遇到的麻烦就在于地址分配的重叠,因为SD卡是在后期加上的,分配地址的时候分配重叠了,而且STM32的内存又很小,存储过大的图片然后加载起码得5秒才加载完。所以我设计的时候就没有给索引值分配内存,主要存储文件名和缓存。

总的来说这次嵌入式让我收获很大,学习到了很多东西,编程是一件很美好的事,对于每一次实验都能了解到软件是怎么与代码相结合,计算机语言又是怎么被计算机识别并运用。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。