上一回,我们制作了利用rohm传感器评估套件的颜色传感器×arduino获得的颜色在全彩色led上显示的程序。此次,我们将进一步运用该程序,将评估套件附带的气压传感器、温度传感器组合在一起,制作出颜色、光照方式可根据多个传感器感知的环境信息发生变化的智能照明元器件!
此次的电子工程配方
完成为止的大致时间标准:60分钟
必要零件
- arduino主体(arduino uno r3 或者 arduino uno smd rev3)
- 罗姆传感器评估套件
http://www.rohm.com.cn/sensor-shield-support - 带散热基板的1w大功率全彩的rgb led
※罗姆传感器评估套件可通过以下网站购买!
目录
- 思考照明元器件的规格
- 气压传感器、温度传感器的使用方法
- 搭载多个传感器时的数据的获取方法
- 照明元器件程序的制作
- 照明元器件外罩的制作
- 总结
1.思考照明元器件的规格
首先,我们应考虑要制作的照明元器件的规格。此次,我们将使用颜色传感器、温度传感器、气压传感器3种传感器来挑战元器件的制作,因此首先应确定这3种传感器的值达到多少时,光照方式会发生变化。此次,我们将以传感器值为基础,通过"亮度"、"光的摇曳"、"颜色"3种方式来表现led。
- 光的摇曳 = 颜色传感器
- 光的颜色 = 气压传感器
- 光的亮度 = 温度传感器
图1 照明元器件的规格
虽说不制作出实物很难明白会产生什么样的照明效果,但我们可以先按以上规格进行制作,如果发现不实用可以进一步修改。
2.气压传感器、温度传感器的使用方法
颜色传感器的使用方法我们在上次已经学习过了,此次我们将学习气压传感器、温度传感器的使用方法。由于使用了地磁传感器及颜色传感器,因此上述两种传感器也同样很容易操作。确认温度传感器、气压传感器可以安装在扩展板的哪个部位。
图2传感器扩展板的连接方法说明
和以往一样,将传感器零件安装在评估套件的扩展板上。此次,i2c i/f区需要气压传感器和颜色传感器2个传感器,应如照片1所示进行排列安装。
照片1 温度传感器、气压传感器、颜色传感器
照片2 温度传感器bd1020hfv
照片3 气压传感器bm1383glv
安装完成后,为了通过arduino从多个传感器获取数据,应进行程序设定。
3.搭载多个传感器时的数据的获取方法
温度传感器和气压传感器的库请从下述官方网站下载。从下载到安装的流程已在第3回、第2回、第1回报道中详细介绍,初次使用传感器套件的用户请参阅上述内容。
从上述网站的页面下方下载传感器用软件后,打开arduino ide,通过添加库分别选择下载的文件,完成库的安装。
图3 添加库
库安装完成后,请从sketch示例中打开气压传感器及温度传感器的样本,写入arduino,检查能否正常运行。
- 气压传感器的样本:"文件"-"sketch示例"-"bm1383glv"-"example"-"bm1383"
- 温度传感器的样本:"文件"-"sketch示例"-"bd1020hfv"-"example"-"bd1020"
图4 气压传感器样本运行示例
图5 温度传感器样本运行示例
气压传感器和温度传感器单独运行状态已确认。
那么,多个传感器时,该如何获取数据呢?
"多个传感器时,突然就无法运行了"
"必须操心电压及电流不足等问题"
"由于各个传感器的输入输出不同,所以必须进行复杂的调整,很麻烦"
刚开始从事电子工程的作业时,随着零件的增多,工作难度会一下子加大,作业人员会遇到上述种种困难。本产品可充分发挥"套件"的优势,即使使用多个传感器,也只需进行基本的程序组合,即可简单操作多个传感器。
以下示例是现在我们尝试的气压传感器和温度传感器的程序组合。
#include//温度传感器用 #include //气压传感器用 #include //气压传感器用 bm1383glv bm1383;//温度传感器用 int tempout_pin = a2; //温度传感器用 bd1020 bd1020; //气压传感器用 void setup() { serial.begin(9600); while (!serial); //温度传感器用 bd1020.init(tempout_pin); serial.println("bd1020hfv sample"); //气压传感器用 byte rc; wire.begin(); rc = bm1383.init(); } void loop() { //************************************ //温度传感器用 //************************************ float temp; bd1020.get_val(&temp); serial.print("bd1020hfv temp="); serial.print(temp); serial.print(" [degrees celsius], adc="); serial.println(bd1020.temp_adc); delay(500); //************************************ //气压传感器用 //************************************ byte rc; float press; rc = bm1383.get_val(&press); if (rc == 0) { serial.write("bm1383glv (press) = "); serial.print(press); serial.println(" [hpa]"); serial.println(); } delay(500); }
图6 温度传感器、气压传感器的组合程序
我们很简单地就同时获取了气压传感器和温度传感器的值。下面,我们再将上次讲过的颜色传感器的程序也组合进来。这样,只需1个arduino,就能获取照明元器件使用的所有传感器的数据。
3个传感器的采集样本程序(sketch)
#include//气压传感器・颜色传感器 #include //气压传感器用 #include //温度传感器用 #include //颜色传感器用 bh1745nuc bh1745nuc(bh1745nuc_device_address_39); //气压传感器用 bm1383glv bm1383; //温度传感器 int tempout_pin = a2; bd1020 bd1020; void setup() { //温度传感器用 serial.begin(9600); while (!serial); bd1020.init(tempout_pin); serial.println("bd1020hfv sample"); //气压传感器・颜色传感器 wire.begin(); //气压传感器 byte rc; rc = bm1383.init(); //颜色传感器 byte rc2; rc2 = bh1745nuc.init(); pinmode(9,output); pinmode(10,output); pinmode(11,output); } void loop() { //*************************************************** //获取温度传感器的值 //*************************************************** float temp; bd1020.get_val(&temp); serial.print("bd1020hfv temp="); serial.print(temp); serial.print(" [degrees celsius], adc="); serial.println(bd1020.temp_adc); delay(20); //*************************************************** //获取气压传感器的值 //*************************************************** byte rc; float press; rc = bm1383.get_val(&press); if (rc == 0) { serial.write("bm1383glv (press) = "); serial.print(press); serial.println(" [hpa]"); } delay(20); //*************************************************** //获取颜色传感器的值 //*************************************************** byte rc2; unsigned short rgbc[4]; rc2 = bh1745nuc.get_val(rgbc); int rval = 0; int gval = 0; int bval = 0; int maxval = 0; if (rc2 == 0) { for(int i=0;i < 3;i ){ if(maxval < rgbc[i]){ maxval = rgbc[i]; } } rval = (float(rgbc[0])/maxval)*255; gval = (float(rgbc[1])/maxval)*255; bval = (float(rgbc[2])/maxval)*255; //设定各颜色的阈值 serial.print("bh1745nuc r="); serial.print(rval); serial.print(",g="); serial.print(gval); serial.print(",b="); serial.print(bval); serial.print(",c="); serial.println(rgbc[3]); serial.println(); } analogwrite(9,rval); analogwrite(10,gval); analogwrite(11,bval); delay(1000); }
图7 批量获取气压传感器、温度传感器、颜色传感器的数据
到这里,多个传感器的数据获取已经解决。
4.照明元器件程序的制作
下面终于可以进入正题,安装照明程序。根据1.中确定的规格,将传感器数据值应用于全彩色led的控制。为了便于说明,这里我们将气压低于1013的设为蓝色、高于1013的设为红色,将气温在0~35度的范围内按比例设置亮度,颜色越接近红色,光的晃动越大。
照明元器件程序
#include//气压传感器・颜色传感器 #include //气压传感器用 #include //温度传感器用 #include //颜色传感器用 bh1745nuc bh1745nuc(bh1745nuc_device_address_39); //气压传感器用 bm1383glv bm1383; //温度传感器 int tempout_pin = a2; bd1020 bd1020; void setup() { //温度传感器 serial.begin(9600); while (!serial); bd1020.init(tempout_pin); serial.println("bd1020hfv sample"); //气压传感器・颜色传感器 wire.begin(); //气压传感器 byte rc; rc = bm1383.init(); //颜色传感器 byte rc2; rc2 = bh1745nuc.init(); pinmode(9,output); pinmode(10,output); pinmode(11,output); } void loop() { //*************************************************** //获取温度传感器的值 //*************************************************** float temp; float power = 0; bd1020.get_val(&temp); serial.print("bd1020hfv temp="); serial.print(temp); serial.print(" [degrees celsius], adc="); serial.println(bd1020.temp_adc); delay(20); //假定为0~35度 power = 1 - (temp / 35); //*************************************************** //获取气压传感器的值 //*************************************************** byte rc; float press; int colr = 0; int colg = 0; int colb = 0; rc = bm1383.get_val(&press); if (rc == 0) { serial.write("bm1383glv (press) = "); serial.print(press); serial.println(" [hpa]") ; } delay(20); //决定颜色 if(press < 1013){ colr = 255; } else{ colb = 255; } //*************************************************** //获取颜色传感器的值 //*************************************************** byte rc2; unsigned short rgbc[4]; rc2 = bh1745nuc.get_val(rgbc); int rval = 0; int gval = 0; int bval = 0; int yuragival = 0; int maxval = 0; if (rc2 == 0) { for(int i=0;i<3;i ){ if(maxval < rgbc[i]){ maxval = rgbc[i]; } } rval = (float(rgbc[0])/maxval)*255; gval = (float(rgbc[1])/maxval)*255; bval = (float(rgbc[2])/maxval)*255; //设定各颜色的阈值 serial.print("bh1745nuc r="); serial.print(rval); serial.print(",g="); serial.print(gval); serial.print(",b="); serial.print(bval); serial.print(",c="); serial.println(rgbc[3]); serial.println(); // 偏红色的话会剧烈摇动,偏蓝色的话会平稳 if(rval > bval){ yuragival = 100; } else{ yuragival = 0; } } light(colr,colg,colb,yuragival,power); /* analogwrite(9,rval); analogwrite(10,gval); analogwrite(11,bval);*/ delay(20); } /******************************* * led的输出函数 /*******************************/ void light(int rval,int gval, int bval,int yuragival,float power){ int value = 100; if(yuragival){ value = chaos(); } analogwrite(9,rval*value/100*power); analogwrite(10,gval*value/100*power); analogwrite(11,bval*value/100*power); } /******************************* * led的摇曳 0~100 /*******************************/ float x = 0.1; float x1 = 0.1; int chaos(){ // 1/f yuragi x = x1; if(x < 0.5){ x = x 2 * x * x; } else { x = x - 2 * (1.0 - x) * (1.0 - x); } if(x < 0.08){ x = (float)(random(20,80))/1023; } if(x > 0.995){ x = (float)(random(128,253))/1023; } x1 = x; x = x * 100; return (unsigned int)x; }
照片4 全彩色led的控制
写入程序开始运行,可以看出光照方式根据传感器的值而变化。由于实验时为雨天,因此颜色为蓝色,颜色传感器感知到led的蓝色,因此光没有晃动,这也可以在安装外罩时想办法消除。
虽然还可以将程序条件设定的更复杂些,使照明元器件的效果更丰富些,但这里暂且就用此程序来讲解吧。
5.照明元器件外罩的制作
元器件的电路部分完成后,下一步进行外罩的制作。我们已经有了尺寸正合适的灯罩,接下来就利用3d打印机打印出与之匹配的arduino外罩,并将必要零件收纳到该外罩中。
照片5 用3d打印机制作作为照明元器件基础的外罩
照片6 灯罩和照明电路板
照片7 将灯罩罩上使之发亮・・・
完成了!本日为阴天、接近低气压,因此发出蓝色的淡光。过几天后再看,发觉变成红色的、摇曳着的光,随着时间的推移光照会发生变化,这十分令人欣喜。
6.总结
即使是多个传感器,只要使用传感器评估套件,就可以轻松应用,不必作复杂的考虑!这次我们使用的照明元器件可以进行无数种变化,比如通过程序改变光照条件,也可以改变使用的传感器等等。还可以设法通过组合以太网扩展板和无线lan扩展板,利用智能手机远程控制照明元器件等。
请大家务必来尝试制作自己独创的照明元器件。