智能台灯盒子设计方案
五(2)班 郑元昊 六(3)班 张天翼
壹:开发初衷
随着时代发展,同学们学习的知识、看书时间也渐渐变多,“眼镜族”也占领了班里的“半壁江山”。导致大家去医院看眼睛、配眼镜,天天上课要戴。不仅耗费时间,也消耗同学们的精力与金钱。
所以我们决定开发一款防止大家近视的辅助设备。
我们之所以不开发台灯,只设计辅助设备,是因为如果设计台灯,就会让大家换一个台灯,而开发出来的台灯使用可能不顺手、并且成本过于大,而其效果却没有其他台灯好。于是,这款智能台灯盒子横空出世。既价格低廉,并只需将其装在自家的台灯上就行了。
贰:硬件结构
开发板:单片机中Arduino的开发过程简洁且功能强大,所以我们选择它。
OUTPUT:
第一部分:灯(红、黄、绿)
红灯:距离过低;
黄灯:人不在;
绿灯:人在;
第二部分:显示屏(共显示一个图片(logo)、六种文字(标题、作者、有人时间、无人时间、距离、提示))
logo、标题:在开始的时候显示,表示开机及其用处;
作者:在刚开始时显示,表示谁开发这款台灯盒子;
有、无人时间:有人时显示有人时间,无人时则显示无人时间;
距离:显示人头的距离;
提示:当有人时间大于等于可容许的最高时间,就显示,提示用户该休息了;
第三部分:音响(播放音乐、警报)
音乐:当有人时间大于等于可容许的最高时间,就播放音乐,提示用户该休息了;
警报:当人的头过低时,就发出”滴滴滴”的警报声;
第四部分:WIFI(发送数据)
向服务器发送请求,让其受到相关数据。
INPUT:
第一部分:人体感应器(告诉主机用户是否在旁边)
如果有,向主机输入1,否则0;(1:HIGH,0:LOW);
第二部分:超声波传感器(告诉主机用户的头是否过低)
如果距离小于某个值,返回1(头过低),否则0(头不低);
WEB:
提供一个H5界面,让家长可以掌握孩子的用眼情况。
叁:软件结构
IDE、开发语言选择:
因选择的是ArduinoUNO,我们决定使用Arduino自身配备的开发环境进行开发。而操控单片机最方便、且我有基础的语言是C语言,我们选择它。
使用的库文件:
#include<SPI.h>
#include<Wire.h>
#include<Adafruit_GFX.h>
#include<Adafruit_SSD1306.h>
#include<SoftwareSerial.h>
使用这些对显示屏、WIFI模块的指令简介化。
显示屏打印字符方式:
打印字符函数:
display.print(text);
display.println(text);
display.drawBitmap(x,y,textArray,width,height,display);
第一个与第二个函数可以打印数字及英文字母,但不能打印中文、图片,一个打印好后可以换行,一个不行。
第三个什么都可以显示在屏幕上,但是打印的内容必须放在一个数组中,数组存储字符的属性、样子。
判断用户是否在学习:
我们使用“人体热释电红外传感器”其可以每隔一段时间就告诉主机是否侦测到人。
侦测函数:
digitalRead(pin);
这个函数可以获得指定针脚上返回的值(HIGH或LOW)。HIGH代表侦测到,LOW代表没有。使用if…else…语句就可以在有人时做出特定举动,没人时做出另一个举动。
播放音乐:
我们使用mp3模块来播放声音。
先定义一组D4-D6的音符常量。
再把谱子以上面那些常量的形式编到一个数组中,并将节奏编入另一个数组中(如八分音符就是8)。
再编写一个playMusic()的函数,里面写一个for循环,遍历谱子的数组与节奏的数组,并使用Arduino系统自带的函数tone()让mp3模块播放声音,并等待(1/ arr[i]) * 1000 /* arr代表节奏数组 */ 毫秒。
播放警报:
同样使用mp3模块,让其发声。
在用户头过低的时候,使用analogWrite(pin,value);这个函数来实现播放警报声。
如:analogWrite(alertPin,200);
检测头是否过低:
使用超声波模块,计算距离。
首先定义一个变量val,存储计算出的距离。
再写代码让超声波模块发送出长0.00001秒的声波,并接收。根据发送至接收的时间来计算出距离。具体就是将变量val设定为 时间 / 58。
如果如果头过于低就会被超声波模块侦测到,并警报。
在开发侦测头过低的模块中,我们发现如果手离超声波模块足够近,其数值就会特别大,于是加了一个判断 if (val >= 4000){val = 0;} 。
发送数据:
我们使用WIFI模块进行发送。
首先再使用硬窗口的函数Serial.print(text);与WIFI模块进行通信,向其发送AT命令,让WIFI连接上。然后再发送服务器请求,以连接上控制的后台,并发送数据(看书数据、休息时间、是否在学习)。
在开发其的时候,我们发现,单片机的内存太小,写太多,占用太多内存,Arduino会傻掉,卡死在那。然后经过仔细研究,发现我们写的时候,都是占用其软盘的存储空间,还有差不多硬盘256K没有使用,并且使用f()这个函数,使用C语言中“宏”这个概念,可以让字符串所占的内存降低近10%。在定义其时,加上一个关键字PROGMEM,就可以存储至硬盘,减小软盘与CPU的压力。
提供家长检查界面:
我们使用前端wed语言(html5、css3及JavaScript)开发一个界面,接收WIFI模块发来的数据,使家长可以看到孩子放学回家是否在认真写作业、用眼卫生如何。
肆:网页开发流程
将html5的页面结构进行搭建,写好基本结构。
使用css3对网页进行渲染。
使用JavaScript写好前端的改变,与get()后端发送的数据。
用js的衍生产物——node.js,进行后端的接收与发送。
伍:3D建模流程
使用solidworks对零部件进行3D建模。并从百度上下载一些复杂零部件的solidworks文件。
对各个零部件进行拼接、组装成整个智能台灯盒子。
再使用solidworks生成爆炸图,以方便搭建整个实体,并熟悉结构。
陆:附件
参考资料:《Arduino程序设计基础》、《C Primer Plus》、《WIFI模块使用方法》(http://zhongbest.com/2016/09/07/esp8266-01/)、《显示屏用法》(http://zhongbest.com/2016/10/24/oled12864%E6%98%BE%E7%A4%BA%E5%B1%8F/)、
《进击node.js》(https://www.imooc.com/learn/348)
开发辅助程序:webwtorm、Arduino IDE、solidworks、中贝斯特”字符取模软件、“中贝斯特”图片取模软件
程序逻辑流程图
初赛感想
小队名称:π小队
队员:郑元昊(五2)
张天翼(六3)
简介
智能台灯盒子是台灯的外挂设备,能适配各种台灯。采用的Arduino UNO板,结合超声波、人体红外等传感器,硬件设计采用了3D建模,根据设备采购设备,面板生成CAD图纸去工厂激光切割亚克力板。
只需安装至合适的高度即可实现:
检测坐姿,当头部过低时,发出声音警报提示。
具有3色LED警示灯,其中绿色:正常、黄色:提醒、红色:过近。
检测书桌前是否有人坐着,有人即启动计时,当看书时间过长,也会有相应的提醒。
OLED显示标题、作者、学习时间、距离、提示等信息。
WIFI模块,能把当前看书情况上传至云端,并提供一个H5的状态查看页,方便在外的父母查看孩子的看书情况。
比赛感想
时间一分一秒地过去,我的额头上布满了细小的汗珠,WIFI模块仍毫无反应,路由器虽然可以连,但WIFI就是连不上去。我们这个小队不比赛还好,一开始,什么东西都万无一失,能联网,能显示,可是比赛当天WIFI、路由器双双倒下、台灯线拿了,灯忘拿了。给评委展示时,迫不得已使用模拟数据,让电脑自动向服务器发消息。
经过这一天的跌宕起伏,我得到以下几点启示:
一、注重团队合作
分工明确,事先与全体队友开会,商讨每个人的负责内容,以充分发挥各自的长项。比赛前三天应与队友排练、演示好,将介绍的流程烂熟于心。多与队友讨论项目流程,将程序优化至最佳状态。比赛时与队友互相鼓励,多多放松,不因紧张失分。不自己一个人独干,不与队友沟通。否则会让队友搞不清状况,反而影响效率。对于成员提出的任何问题都需认真、耐心解答,细心听取他人意见。
二、走正规使用方法
元器件坚决按照使用流程走,不随便为其通电、充电前检查清楚其输出的电压是否符合。
三、细心
出发前一定要检查好万无一失,没有任何东西落下再上车。
友情链接