北京儿童插座价格联盟

智能台灯盒子

只看楼主 收藏 回复
  • - -
楼主



智能台灯盒子设计方案

五(2)班 郑元昊 六(3)班 张天翼


壹:开发初衷

  随着时代发展,同学们学习的知识、看书时间也渐渐变多,“眼镜族”也占领了班里的“半壁江山”。导致大家去医院看眼睛、配眼镜,天天上课要戴。不仅耗费时间,也消耗同学们的精力与金钱。

  所以我们决定开发一款防止大家近视的辅助设备。

  我们之所以不开发台灯,只设计辅助设备,是因为如果设计台灯,就会让大家换一个台灯,而开发出来的台灯使用可能不顺手、并且成本过于大,而其效果却没有其他台灯好。于是,这款智能台灯盒子横空出世。既价格低廉,并只需将其装在自家的台灯上就行了。


贰:硬件结构

开发板:单片机中Arduino的开发过程简洁且功能强大,所以我们选择它。

OUTPUT:

第一部分:灯(红、黄、绿)

  • 红灯:距过低;

  • 黄灯:人不;

  • 绿灯:人;


第二部分:显示(共显示一图片(logo)、六文字(标题、作者、人时间、无人时间、距、提示))

  1. logo、标题:在开始的时候显示,表示开其用处;

  2. 作者:刚开始时显示,表示谁开发这款台灯盒子;

  3. 有、无人时间:有人时显示有人时间,无人时则显示无人时间;

  4. 离:显示人头的距;

  5. 提示:当有人时间大于等于可容许的最高时间,就显示,提示用户该休息了;


第三部分:音响(播放音乐、警报)

  • 音乐:当有人时间大于等于可容许的最高时间,就播放音乐,提示用户该休息了;

  • 警报:当人的头过低时,就发出”滴滴滴”的警报声;


第四部分: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模块发来的数据,使家长可以看到孩子放学回家是否在认真写作业、用眼卫生如何。


肆:网页开发流程

  1. html5的页面结构进行搭建,写好基本结构。

  2. 使用css3对网页进行渲染。

  3. 使用JavaScript写好前端的改变,与get()后端发送的数据。

  4. 用js的衍生产物——node.js,进行后端的接收与发送。

 

伍:3D建模流程

  1. 使用solidworks对零部件进行3D建模。并从百度上下载一些复杂零部件的solidworks文件。

  2. 对各个零部件进行拼接、组装成整个智能台灯盒子。

  3. 再使用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图纸去工厂激光切割亚克力板。

只需安装至合适的高度即可实现:

  1. 检测坐姿,当头部过低时,发出声音警报提示。

  2. 具有3色LED警示灯,其中绿色:正常、黄色:提醒、红色:过近。

  3. 检测书桌前是否有人坐着,有人即启动计时,当看书时间过长,也会有相应的提醒。

  4. OLED显示标题、作者、学习时间、距离、提示等信息。

  5. WIFI模块,能把当前看书情况上传至云端,并提供一个H5的状态查看页,方便在外的父母查看孩子的看书情况。



比赛感想

  时间一分一秒地过去,我的额头上布满了细小的汗珠,WIFI模块仍毫无反应,路由器虽然可以连,但WIFI就是连不上去。我们这个小队不比赛还好,一开始,什么东西都万无一失,能联网,能显示,可是比赛当天WIFI、路由器双双倒下、台灯线拿了,灯忘拿了。给评委展示时,迫不得已使用模拟数据,让电脑自动向服务器发消息。

  经过这一天的跌宕起伏,我得到以下几点启示:

一、注重团队合作

  分工明确,事先与全体队友开会,商讨每个人的负责内容,以充分发挥各自的长项。比赛前三天应与队友排练、演示好,将介绍的流程烂熟于心。多与队友讨论项目流程,将程序优化至最佳状态。比赛时与队友互相鼓励,多多放松,不因紧张失分。不自己一个人独干,不与队友沟通。否则会让队友搞不清状况,反而影响效率。对于成员提出的任何问题都需认真、耐心解答,细心听取他人意见。

二、走正规使用方法

  元器件坚决按照使用流程走,不随便为其通电、充电前检查清楚其输出的电压是否符合。

三、细心

  出发前一定要检查好万无一失,没有任何东西落下再上车。


举报 | 1楼 回复

友情链接