视力保护型智能节能台灯的设计与开发

目录

目录 2

1 引言 3

1.1 想法来源 3

1.2(1) 研究背景:青少年近视比例 3

1.2(2) 研究背景:青少年近视原因 3

1.4 项目目的 4

2 装置功能总介绍 4

2.1 坐姿检测及报警 4

2.2 亮度自适应 4

2.3 自动开关 4

3 装置结构介绍及说明 4

3.1 装置外部结构 5

3.2 各部件功能介绍 5

4 运行原理及其逻辑 6

4.1 运行原理 6

4.2 逻辑图 8

图1

图1

5 总结 8

5.1 装置总结分析 8

附录 9

1 引言

本节介绍此项目由来并简单介绍本项目。

1.1想法来源

如今,越来越多的青少年年纪小小便成了“小四眼”,这其中的原因与写字的姿势与用台灯的习惯密不可分。而无数次,作业进行到一半,老爸老妈总是会走进来唠叨几句自己的坐姿不行啦..眼离书本太近啦…这样对视力不好啦等等….心烦之余这也引发了我的思考,若是有一盏台灯能够全方位的保护我们的视力,自动检测我们的坐姿,并在坐姿不正时向我们发出警报,甚至是能自动调节光照的亮度及位置,无论我们处于哪种坐姿,或是趴着或是半趴,都能时刻照亮我们眼前的那一片区域。那岂不是就能大大减小日常生活中我们患上近视的几率,能有效减轻我们学生及工作党眼疲劳的症状?甚至可以再加上自动开灯与熄灯的功能,更能节省能耗做到最大程度的环保。

1.2 研究背景

本节将描述其研究背景,对青少年近视比例与原因进行介绍。主要将以应用各类文献的形式体现。

1.2(1) 青少年近视比例

近年来随着社会现代化进程的加快,近视眼的发病率不断增加,近视眼已经成为当今世界范围内发病率最高的眼病之一。据资料显示,我国约有盲人500多万,低视力者600多万,儿童斜弱视者1000万。而青少年近视率平均达40%,大学生近视率远远超过70%。

目前,全国戴眼镜的人数已超过3亿,中国的近视患者已占世界的33%,比世界平均水平高了10%。

1.2(2) 青少年近视的原因

针对当今中国青少年导致近视的原因,原北京防盲办主任、同仁医院医师、副研究员、中华医学会眼科学分会委员专家郑远远教授认为:遗传因素、营养体质因素和环境因素是造成青少年近视的三大诱因,而其中的环境因素是导致中国青少年近视发病率大幅增加的主要原因。

青少年处于生长发育旺盛时期,眼的生理功能和组织结构有与其他时期不同的特点,调节力强,球壁伸展性较大,易受环境不良影响而形成近视眼。长时间看电视、玩电脑游戏,不正确的看书、写作业姿势等,都是现阶段影易造成青少年近视的不良环境。

“中小学生近视绝大多数是因在晚上灯光下看书,致使眼睛长期处于疲劳状态造成的,而真正的遗传性近视只占全部近视的55%左右。”这是记者日前从中国少年儿童活动中心得到的研究结果。

由此可见,目前的青少年近视的主要原因是长期在灯光下写字及坐姿不正导致的视疲劳引起的。因此,为降低青少年近视几率,开发设计一盏能保护视力的台灯很有必要。

1.3 项目目的

通过制造一种可以做到亮度自适应,且在使用者坐姿不正时发出警报,并将光照位置移到使用者面前的智能LED台灯,保护青少年的视力,降低视疲劳的概率,从而起到护眼的作用。其次,通过对使用者是否坐在座位上的检测,还能做到自开自关,最大量地减少电能的损耗。

2 装置功能总介绍

2.1 坐姿检测及报警

使用者在位时,若正坐,则台灯照常照明;若身体向台灯方向倾斜,则警报响起,台灯自动调整光照位置,使光照中心处在使用者面前;若身体向台灯对面倾斜,警报响起,但光照位置不会发生改变。

2.2 亮度自适应

在台灯处于照明状态的情况下,台灯会根据使用者周围的环境光线来自行决定其自身的光照亮度。

2.3 自动开关

此功能建立在坐姿检测的基础上,若检测到座位上有人,只要在电源处于接通状态,台灯便会自动亮起。而反之,若使用者离席,台灯便会自动熄灭。

3 装置结构介绍及说明

主要对本项目设计的装置进行简要的描述以及各组件的功能介绍。

3.1 装置外部结构

整个装置大体上的结构与普通的LED台灯无异,都由一个底座,灯的躯干,和位于最上的LED灯管组成。不同的是用了一个由单片机控制的迷你机械臂取代原本的躯干(见图1)。整个机械臂由特制塑料制成,并由三个由舵机控制的关节和无数其他可动关节组成,使得整个机械臂可以轻松地前后上下移动,以带动整个灯管的前后高低变化。而在灯管旁有着一个环境光传感器,时刻捕捉使用者所在地周围的环境亮度。

图2

图2

这座台灯另一个与众不同的部分是其底座。除了摆有arduino开发板及盾板、蜂鸣器外,其底座上还有着三个红外测距传感器,分别指向不同方位(见图3)。三个传感器会有一个预置值(即没人在位上时其所测到的数据),当使用者挡到了传感器的红外路径,其测得的数值也会发生变化,而单片机也可以此来判定使用者此时坐姿。(具体工作方法将由后文运行原理部分具体说明)。

图3

图3

底座尾部与其余LED台灯一样,有着一个驱动电源提供整个装置所需的电能。但是整个台灯没有开关!是的,这个台灯上你找不到任何传统的开关。因为在设计之初我的设想便是让其通过红外测距传感器辨别使用者是否在位以自动控制台灯的点亮和熄灭。(具体工作原理也将在后文详细说明)

最后介绍整个装置的整体比例。采用的灯管大约30cm长,为确保照明范围,与之连接的躯干部分总高度约为35cm上下。其底座因为需载有几块开发板,而导致其底座面积偏大,约为20cm*15cm。

3.2 各部件功能介绍

arduino单片机:主要用于发出指令,控制各部件进行操作。

使用arduino单片机因此单片机有这一特点。是一款便捷灵活、方便上手的开源电子原型平台, Arduino,是一个基于开放原始码的软硬件平台,构建于开放原始码simple I/O介面版,并且具有使用类似Java,C语言的Processing/Wiring开发环境。能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。对Arduino的编程是利用 Arduino编程语言 (基于 Wiring)和Arduino开发环境(based on Processing)来实现的, 基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,他们之间进行通信 (比如 Flash, Processing, MaxMSP)来实现。

红外测距传感器:红外测距传感器具有一对红外信号发射与接收二极管,利用的红外测距传感器LDM301发射出一束红外光,在照射到物体后形成一个反射的过程,反射到传感器后接收信号,然后利用CCD图像处理接收发射与接收的时间差的数据。经信号处理器处理后计算出物体的距离。这不仅可以使用于自然表面,也可用于加反射板。测量距离远,很高的频率响应,适合于恶劣的工业环境中。

环境光传感器:环境光传感器主要由光敏元件组成,可以感知周围光线情况,并告知单片机自动调节灯管亮度。(采用PWM调光技术,PWM:是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。)

LED灯管:提供光源,经过改造后已可以与环境光传感器联动并进行PWM调光。(见图2)

图4

图4

舵机+机械臂:进行转动操作,有扭力大,速度快的特点。

蜂鸣器:用以在检测到使用者坐姿不正时发出警报。

(图1:台灯的躯干:迷你机械臂)

(图3:各个测距传感器位置示意图)

4 运行原理及其逻辑

说明其运行原理,并说明其设计逻辑。单片机编写所需逻辑顺序。

4.1 运行原理

首先,在通电情况下,整个装置运作的只有单片机以及三个红外测距传感器,因测得数据都为预置值,灯此时处于熄灭状态。

情况一、使用者在座位上坐下,挡住了第一个测距传感器的红外路径,使其所测值发生改变,台灯亮起。但此时因为使用者正坐,另外两个测距器的数据都未改变,因此台灯除亮起外并无其他行动。

情况二、使用者坐下后,若往台灯方向趴着,此时,第一个测距传感器所测值又变回预置值。但会同时挡住了第二第三个传感器的红外路径,也就是使第二第三个传感器的数值发生变化,此时判定使用者坐姿不正且遮住了台灯的部分光,则蜂鸣器响起,且机械臂会带着灯管抬高并向前,作为“导航开关”的第三个传感器(也就是其红外路径与光照方向相同)会与灯管一道移动,只有当其所测值再次变大时,说明光照位置已经在使用者的面前,机械臂会停止运动。而当第一个传感器所测数值再次变化,也就是说明使用者再次正坐时,蜂鸣器会停止鸣响,机械臂也会回到起始位置。

情况三、使用者坐下后,若往另一方向趴着,此时只有第二个传感器所测数值发生改变,则判定使用者未正坐但没有挡到光源。则机械臂不会运动,但是蜂鸣器依旧会发出警报提醒使用者。直到第一个传感器所测得的数值又变回预置值,警报结束。

情况四,坐在座位前的使用者离开座位,则三个传感器所测值都为预置值,判定使用者离开,则灯光熄灭。这样一来,能有效的节省能耗。

另外一个十分重要的功能是亮度自适应,在灯亮的情况下,环境光传感器会按一定频率捕捉周遭环境的亮度,并跟据所在环境的亮度通过PWM调光技术改变灯光亮度,若环境较暗,则灯光相对较暗,若环境较亮,则灯光也相对较亮,防止使用者受到眼疲劳的侵扰。

而为了减缓LED台灯普遍拥有的蓝光问题,我也将电脑显示屏的滤蓝光膜裁剪后贴在了灯管上,以减缓蓝光问题。

4.2 逻辑图

5 总结

对成果的总结,分析

5.1 装置总结分析

其优点:整个装置功能全,运行准确性高,集保护视力与节能(自开自关)与一身,能自动调整光线亮度的同时还能在使用者坐姿不正时发出提醒,并调整光照位置至其面前。有效降低青少年患上近视与视疲劳的几率。

其缺点:整个装置的部件较多,特别是用到几块开发板,使其占用空间增大不少,相比普通的台灯,其体积较大。且台灯的摆放位置有所讲究,用户在初次使用时,都需调整对台灯的摆放位置进行调整。

附录

/*

Code for the self-adaptive lamp

Connection between modules:

------------------------------------------------------

BH1750 Light sensor Arduino UNO

VCC 5V

GND GND

SCL SCL

SDA SDA

ADD NC

-----------------------------------------------------

Light Lamp Arduino UNO

Yellow Line GND

Blue Line D9(PWM)

-----------------------------------------------------

*/

#include //BH1750 IIC Mode

#include

/*

setting I2C address

If ADDR = LOW , The address will be 0x23

If ADDR = HIGH, The address will be 0x5C

*/

int BH1750address = 0x23;

byte buff[2];

int preValue=300;

int Value=0;

int led_pwm = 9; //D9 can output the PWM signal

int led_on = 8; //D8 is in charge of the on-off controll of the lamp

int preBright = 0;

int brightness = 0; // brightness of led

int count = 0;

/*----------------initialize the system----------------------------*/

void setup()

{

pinMode(led_pwm, OUTPUT);

pinMode(led_on, OUTPUT);

Wire.begin();

Serial.begin(9600);//init Serail band rate

BH1750_Init(BH1750address);

}

/*----------------the main loop function----------------------------*/

void loop()

{

if(2==BH1750_Read(BH1750address))

{

Value=(int)(((buff[0]<<8)|buff[1])/1.2);

//for 0.5lx resolution: val=((buff[0]<<8)|buff[1])/2.4;

SelfAdaptiveBrightness(Value);

Serial.print(Value);

Serial.println("[lx]");

}

delay(150);

analogWrite(led_pwm, brightness);

}

/*--------------initialize the BH1750 light sensor----------------------*/

void BH1750_Init(int address)

{

Wire.beginTransmission(address);

//Wire.send(0x10);//1lx reolution 120ms

Wire.write(0x10);//0x11 for 0.5lx

Wire.endTransmission();

}

/*-----------read the brightness of the BH1750 light sensor------------*/

int BH1750_Read(int address) //

{

int i=0;

Wire.beginTransmission(address);

Wire.requestFrom(address, 2);

while(Wire.available()) //

{

//buff[i] = Wire.receive(); // receive one byte

buff[i] = Wire.read();

i++;

}

Wire.endTransmission();

return i;

}

/*-----------self adaptation of brightness of the lamp------------*/

void SelfAdaptiveBrightness(int value)

{

int different = value-preValue;

different = abs(different);

if(value<20 && different>20) {

if(preBright<30) brightness=250;

}

else if(value<100 && different>20) brightness=10;

else if(value<300 && different>20) brightness=10;

else{

if(preBright>300) brightness=250;

//else brightness=0;

}

preValue=value;

preBright=brightness;

}