请选择 进入手机版 | 继续访问电脑版
搜索
热搜: ROHM 模拟 车载
查看: 3812|回复: 2

[分享] (DIY)制作组合多个传感器的照明器件

  [复制链接]

该用户从未签到

3

主题

28

帖子

0

精华

初级会员

最后登录
2020-6-22
发表于 2018-7-23 14:45:44 | 显示全部楼层 |阅读模式
8.jpg
此次,我们将进一步运用该程序,将评估套件附带的气压传感器、温度传感器组合在一起,制作出颜色、光照方式可根据多个传感器感知的环境信息发生变化的智能照明元器件!

目录
  • 思考照明元器件的规格
  • 气压传感器、温度传感器的使用方法
  • 搭载多个传感器时的数据的获取方法
  • 照明元器件程序的制作
  • 照明元器件外罩的制作
  • 总结
1.思考照明元器件的规格首先,我们应考虑要制作的照明元器件的规格。此次,我们将使用颜色传感器、温度传感器、气压传感器3种传感器来挑战元器件的制作,因此首先应确定这3种传感器的值达到多少时,光照方式会发生变化。此次,我们将以传感器值为基础,通过"亮度"、"光的摇曳"、"颜色"3种方式来表现LED。
  • 光的摇曳 = 颜色传感器
  • 光的颜色 = 气压传感器
  • 光的亮度 = 温度传感器
9.png
图1 照明元器件的规格

虽说不制作出实物很难明白会产生什么样的照明效果,但我们可以先按以上规格进行制作,如果发现不实用可以进一步修改。

2.气压传感器、温度传感器的使用方法颜色传感器的使用方法我们在上次已经学习过了,此次我们将学习气压传感器、温度传感器的使用方法。由于使用了地磁传感器及颜色传感器,因此上述两种传感器也同样很容易操作。确认温度传感器、气压传感器可以安装在扩展板的哪个部位。

10.png
图2传感器扩展板的连接方法说明


和以往一样,将传感器零件安装在评估套件的扩展板上。此次,I2C I/F区需要气压传感器和颜色传感器2个传感器,应如照片1所示进行排列安装。

11.jpg
照片1 温度传感器、气压传感器、颜色传感器


12.jpg
照片2 温度传感器BD1020HFV


13.jpg
照片3 气压传感器BM1383GLV


安装完成后,为了通过Arduino从多个传感器获取数据,应进行程序设定。

3.搭载多个传感器时的数据的获取方法温度传感器和气压传感器的库请从下述官方网站下载。从下载到安装的流程已在第3回、第2回、第1回报道中详细介绍,初次使用传感器套件的用户请参阅上述内容。
  • 气压传感器模块 – BM1383GLV
  • 温度传感器模块 – BD1020HFV
从上述网站的页面下方下载传感器用软件后,打开Arduino IDE,通过添加库分别选择下载的文件,完成库的安装。
14.png
图3 添加库


库安装完成后,请从sketch示例中打开气压传感器及温度传感器的样本,写入Arduino,检查能否正常运行。
  • 气压传感器的样本:"文件"-"sketch示例"-"BM1383GLV"-"example"-"BM1383"
  • 温度传感器的样本:"文件"-"sketch示例"-"BD1020HFV"-"example"-"BD1020"

15.png
图4 气压传感器样本运行示例


16.png
图5 温度传感器样本运行示例


气压传感器和温度传感器单独运行状态已确认。
那么,多个传感器时,该如何获取数据呢?

"多个传感器时,突然就无法运行了"
"必须操心电压及电流不足等问题"
"由于各个传感器的输入输出不同,所以必须进行复杂的调整,很麻烦"

刚开始从事电子工程的作业时,随着零件的增多,工作难度会一下子加大,作业人员会遇到上述种种困难。本产品可充分发挥"套件"的优势,即使使用多个传感器,也只需进行基本的程序组合,即可简单操作多个传感器。
以下示例是现在我们尝试的气压传感器和温度传感器的程序组合。
  1. #include <BD1020.h> //温度传感器用

  2. #include <Wire.h> //气压传感器用

  3. #include <BM1383GLV.h>  //气压传感器用



  4. BM1383GLV bm1383;//温度传感器用

  5. int tempout_pin = A2; //温度传感器用

  6. BD1020 bd1020;  //气压传感器用




  7. void setup() {



  8. Serial.begin(9600);

  9. while (!Serial);



  10. //温度传感器用
  11. bd1020.init(tempout_pin);

  12. Serial.println("BD1020HFV Sample");



  13. //气压传感器用

  14. byte rc;

  15. Wire.begin();

  16. rc = bm1383.init();




  17. }



  18. void loop() {



  19. //************************************

  20. //温度传感器用

  21. //************************************

  22. float temp;

  23. bd1020.get_val(&temp);

  24. Serial.print("BD1020HFV Temp=");

  25. Serial.print(temp);

  26. Serial.print("  [degrees Celsius], ADC=");

  27. Serial.println(bd1020.temp_adc);



  28. delay(500);



  29. //************************************

  30. //气压传感器用

  31. //************************************

  32. byte rc;

  33. float press;



  34. rc = bm1383.get_val(&press);

  35. if (rc == 0) {

  36. Serial.write("BM1383GLV (PRESS) = ");

  37. Serial.print(press);

  38. Serial.println(" [hPa]");

  39. Serial.println();

  40. }

  41. delay(500);

  42. }

复制代码




17.png
图6 温度传感器、气压传感器的组合程序


我们很简单地就同时获取了气压传感器和温度传感器的值。下面,我们再将上次讲过的颜色传感器的程序也组合进来。这样,只需1个Arduino,就能获取照明元器件使用的所有传感器的数据。


3个传感器的采集样本程序(sketch)
  1. #include <Wire.h> //气压传感器・颜色传感器

  2. #include <BM1383GLV.h>  //气压传感器用

  3. #include <BD1020.h> //温度传感器用

  4. #include <BH1745NUC.h>



  5. //颜色传感器用

  6. BH1745NUC bh1745nuc(BH1745NUC_DEVICE_ADDRESS_39);



  7. //气压传感器用

  8. BM1383GLV bm1383;



  9. //温度传感器

  10. int tempout_pin = A2;

  11. BD1020 bd1020;



  12. void setup() {

  13. //温度传感器用

  14. Serial.begin(9600);

  15. while (!Serial);

  16. bd1020.init(tempout_pin);
  17. Serial.println("BD1020HFV Sample");



  18. //气压传感器・颜色传感器

  19. Wire.begin();





  20. //气压传感器

  21. byte rc;

  22. rc = bm1383.init();



  23. //颜色传感器

  24. byte rc2;

  25. rc2 = bh1745nuc.init();



  26. pinMode(9,OUTPUT);

  27. pinMode(10,OUTPUT);

  28. pinMode(11,OUTPUT);

  29. }



  30. void loop() {

  31. //***************************************************

  32. //获取温度传感器的值

  33. //***************************************************

  34. float temp;



  35. bd1020.get_val(&temp);

  36. Serial.print("BD1020HFV Temp=");

  37. Serial.print(temp);

  38. Serial.print("  [degrees Celsius], ADC=");

  39. Serial.println(bd1020.temp_adc);

  40. delay(20);



  41. //***************************************************

  42. //获取气压传感器的值

  43. //***************************************************

  44. byte rc;

  45. float press;

  46. rc = bm1383.get_val(&press);

  47. if (rc == 0) {

  48. Serial.write("BM1383GLV (PRESS) = ");

  49. Serial.print(press);

  50. Serial.println(" [hPa]");

  51. }

  52. delay(20);



  53. //***************************************************

  54. //获取颜色传感器的值

  55. //***************************************************

  56. byte rc2;

  57. unsigned short rgbc[4];

  58. rc2 = bh1745nuc.get_val(rgbc);

  59. int rVal  = 0;

  60. int gVal  = 0;

  61. int bVal  = 0;



  62. int maxVal  = 0;

  63. if (rc2 == 0) {



  64. for(int i=0;i < 3;i++){

  65. if(maxVal < rgbc[i]){

  66. maxVal  = rgbc[i];

  67. }

  68. }



  69. rVal  =  (float(rgbc[0])/maxVal)*255;

  70. gVal  =  (float(rgbc[1])/maxVal)*255;

  71. bVal  =  (float(rgbc[2])/maxVal)*255;



  72. //设定各颜色的阈值

  73. Serial.print("BH1745NUC R=");

  74. Serial.print(rVal);

  75. Serial.print(",G=");

  76. Serial.print(gVal);

  77. Serial.print(",B=");

  78. Serial.print(bVal);

  79. Serial.print(",C=");

  80. Serial.println(rgbc[3]);

  81. Serial.println();

  82. }

  83. analogWrite(9,rVal);

  84. analogWrite(10,gVal);

  85. analogWrite(11,bVal);



  86. delay(1000);



  87. }
复制代码




18.png
图7 批量获取气压传感器、温度传感器、颜色传感器的数据


到这里,多个传感器的数据获取已经解决。

4.照明元器件程序的制作下面终于可以进入正题,安装照明程序。根据1.中确定的规格,将传感器数据值应用于全彩色LED的控制。为了便于说明,这里我们将气压低于1013的设为蓝色、高于1013的设为红色,将气温在0~35度的范围内按比例设置亮度,颜色越接近红色,光的晃动越大。

照明元器件程序
  1. #include <Wire.h> //气压传感器・颜色传感器

  2. #include <BM1383GLV.h>  //气压传感器用

  3. #include <BD1020.h> //温度传感器用

  4. #include <BH1745NUC.h>



  5. //颜色传感器用

  6. BH1745NUC bh1745nuc(BH1745NUC_DEVICE_ADDRESS_39);



  7. //气压传感器用

  8. BM1383GLV bm1383;



  9. //温度传感器

  10. int tempout_pin = A2;

  11. BD1020 bd1020;



  12. void setup() {

  13. //温度传感器

  14. Serial.begin(9600);

  15. while (!Serial);

  16. bd1020.init(tempout_pin);

  17. Serial.println("BD1020HFV Sample");



  18. //气压传感器・颜色传感器

  19. Wire.begin();




  20. //气压传感器

  21. byte rc;

  22. rc = bm1383.init();



  23. //颜色传感器

  24. byte rc2;

  25. rc2 = bh1745nuc.init();



  26. pinMode(9,OUTPUT);

  27. pinMode(10,OUTPUT);

  28. pinMode(11,OUTPUT);

  29. }



  30. void loop() {

  31. //***************************************************

  32. //获取温度传感器的值

  33. //***************************************************

  34. float temp;



  35. float power = 0;



  36. bd1020.get_val(&temp);

  37. Serial.print("BD1020HFV Temp=");

  38. Serial.print(temp);

  39. Serial.print("  [degrees Celsius], ADC=");

  40. Serial.println(bd1020.temp_adc);

  41. delay(20);



  42. //假定为0~35度

  43. power = 1 - (temp / 35);



  44. //***************************************************

  45. //获取气压传感器的值

  46. //***************************************************

  47. byte rc;

  48. float press;

  49. int colR  = 0;

  50. int colG  = 0;

  51. int colB  = 0;

  52. rc = bm1383.get_val(&press);

  53. if (rc == 0) {

  54. Serial.write("BM1383GLV (PRESS) = ");

  55. Serial.print(press);

  56. Serial.println(" [hPa]")
  57. ;
  58. }

  59. delay(20);



  60. //决定颜色

  61. if(press < 1013){

  62. colR  = 255;

  63. }

  64. else{

  65. colB  = 255;

  66. }



  67. //***************************************************

  68. //获取颜色传感器的值

  69. //***************************************************

  70. byte rc2;

  71. unsigned short rgbc[4];

  72. rc2 = bh1745nuc.get_val(rgbc);

  73. int rVal  = 0;

  74. int gVal  = 0;

  75. int bVal  = 0;

  76. int yuragiVal = 0;



  77. int maxVal  = 0;

  78. if (rc2 == 0) {



  79. for(int i=0;i<3;i++){

  80. if(maxVal < rgbc[i]){ maxVal = rgbc[i]; } } rVal =

  81. (float(rgbc[0])/maxVal)*255; gVal = (float(rgbc[1])/maxVal)*255; bVal =

  82. (float(rgbc[2])/maxVal)*255; //设定各颜色的阈值 Serial.print("BH1745NUC R=");

  83. Serial.print(rVal); Serial.print(",G=");

  84. Serial.print(gVal); Serial.print(",B="); Serial.print(bVal);

  85. Serial.print(",C="); Serial.println(rgbc[3]); Serial.println(); //

  86. 偏红色的话会剧烈摇动,偏蓝色的话会平稳

  87. if(rVal > bVal){

  88. yuragiVal = 100;

  89. }

  90. else{

  91. yuragiVal = 0;

  92. }

  93. }



  94. light(colR,colG,colB,yuragiVal,power);

  95. /*  analogWrite(9,rVal);

  96. analogWrite(10,gVal);

  97. analogWrite(11,bVal);*/




  98. delay(20);

  99. }



  100. /*******************************

  101. * LED的输出函数

  102. /*******************************/

  103. void light(int rVal,int gVal, int bVal,int yuragiVal,float power){



  104. int value = 100;



  105. if(yuragiVal){

  106. value = chaos();

  107. }



  108. analogWrite(9,rVal*value/100*power);

  109. analogWrite(10,gVal*value/100*power);

  110. analogWrite(11,bVal*value/100*power);

  111. }



  112. /*******************************

  113. * LED的摇曳 0~100

  114. /*******************************/

  115. float x = 0.1;

  116. float x1 = 0.1;

  117. int chaos(){

  118. // 1/f yuragi

  119. x = x1;

  120. if(x < 0.5){

  121. x = x + 2 * x * x;

  122. }

  123. else {

  124. x = x - 2 * (1.0 - x) * (1.0 - x);

  125. }



  126. if(x < 0.08){ x = (float)(random(20,80))/1023; } if(x > 0.995){

  127. x = (float)(random(128,253))/1023;

  128. }



  129. x1 = x;

  130. x = x * 100;



  131. return (unsigned int)x;

  132. }
复制代码



19.jpg
照片4 全彩色LED的控制

写入程序开始运行,可以看出光照方式根据传感器的值而变化。由于实验时为雨天,因此颜色为蓝色,颜色传感器感知到LED的蓝色,因此光没有晃动,这也可以在安装外罩时想办法消除。
虽然还可以将程序条件设定的更复杂些,使照明元器件的效果更丰富些,但这里暂且就用此程序来讲解吧。

5.照明元器件外罩的制作元器件的电路部分完成后,下一步进行外罩的制作。我们已经有了尺寸正合适的灯罩,接下来就利用3D打印机打印出与之匹配的Arduino外罩,并将必要零件收纳到该外罩中。

21.png
照片5 用3D打印机制作作为照明元器件基础的外罩


22.jpg
照片6 灯罩和照明电路板


24.jpg
照片7 将灯罩罩上使之发亮・・・

完成了!本日为阴天、接近低气压,因此发出蓝色的淡光。过几天后再看,发觉变成红色的、摇曳着的光,随着时间的推移光照会发生变化,这十分令人欣喜。

6.总结即使是多个传感器,只要使用传感器评估套件,就可以轻松应用,不必作复杂的考虑!这次我们使用的照明元器件可以进行无数种变化,比如通过程序改变光照条件,也可以改变使用的传感器等等。还可以设法通过组合以太网扩展板和无线LAN扩展板,利用智能手机远程控制照明元器件等。
请大家务必来尝试制作自己独创的照明元器件。

本文摘自罗姆官网:http://www.rohm.com.cn/sensor-shield-support/device-plus/entry4


回复

使用道具 举报

该用户从未签到

2248

主题

1万

帖子

1

精华

论坛元老

最后登录
2024-3-28
发表于 2018-7-23 16:18:44 | 显示全部楼层
自己动手做点小玩意挺不错的
回复 支持 反对

使用道具 举报

该用户从未签到

1153

主题

5959

帖子

0

精华

论坛元老

最后登录
2021-2-19
发表于 2018-7-23 21:55:23 | 显示全部楼层
详细制作流程呢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

Archiver|手机版|小黑屋|罗姆半导体技术社区

GMT+8, 2024-3-28 20:29 , Processed in 0.121486 second(s), 17 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表