2014-1-2 12:08:38 [显示全部楼层]
30082浏览
查看: 30082|回复: 7

自带保护色的变色龙灯

[复制链接]
变色龙LED灯的粗略效果预览↓↓↓

自带保护色的变色龙灯图2

【Intro】

    变色龙是一种善变的树栖爬行类动物,为了逃避天敌的侵犯和接近自己的猎物,它们常在不经意间改变身体颜色,从而让自己融入周围的环境之中。    由于受到这种拉风变色技能的刺激,自己也想做一个会变色的小东西,可以根据周围事物不同的颜色来改变自己的颜色。
自带保护色的变色龙灯图1

    当然,与变色龙的变色技能来自于皮肤三层色素细胞不同的是,这里想要实现变色功能就要用到一个颜色传感器和一个LED加上一个控制器和若干导线即可。
    接下来,还需要一个容器来装这些元件,有条件的话可以根据自己喜好制作一个容器。这里我选用了一个使用较透明的材料通过3D打印的小灯罩作为这个会变色LED灯的容器。

【硬件列表】
【步骤1】准备好需要的元器件
自带保护色的变色龙灯图4

因为容器的空间可能比较有限,如需要达到最佳的效果的话,尽量选用体积小一点的控制器。本人选用了Nano控制器,该控制器最大的特点就是体积小、功能强、低功耗可使用电池供电。

【步骤2】连接
自带保护色的变色龙灯图5

将颜色传感器与Nano控制器用导线连接起来,这里注意每个端口的连接要结合软件定义正确连接(传感器的LED端接Nano的3.3V端)由于Nano的端口有限,所以扩展几个需要的端口,如下图所示:
自带保护色的变色龙灯图7

自带保护色的变色龙灯图8

下图所示为一个使用DFRuino UNO 以及 IO传感器扩展板的版本:

自带保护色的变色龙灯图9

【步骤3】下载程序

所有元件连接好后将编写好的代码烧到Nano控制器中

代码中需要使用到Metro库,需要先安装。下载附件Metro.zip

自带保护色的变色龙灯图6

注意:将不同颜色纸片放到传感器下,盒子就会发出相应颜色的光。由于环境光可能会对传感器采集的数据有一定影响,所以在晚上测试效果应该会更好。

自带保护色的变色龙灯图10

【代码】

[size=16.363636016845703px]
  1. #include <Metro.h>  // 函数库
  2. #include <math.h>
  3. Metro ledlightup = Metro(60,true);
  4. Metro processdata = Metro(50,true);
  5. Metro TcsTrigger = Metro(10,true);
  6. int s0=8,s1=9,s2=10,s3=11; // 颜色传感器端口定义
  7. int out=2;
  8. int flag=0;  //变量初始化
  9. int counter=0;
  10. int countR=0,countG=0,countB=0;
  11. void setup()
  12. {
  13.   Serial.begin(115200);
  14.   pinMode(s0,OUTPUT);
  15.   pinMode(s1,OUTPUT);
  16.   pinMode(s2,OUTPUT);
  17.   pinMode(s3,OUTPUT);
  18.   analogWrite(3,0);
  19.   analogWrite(5,0);
  20.   analogWrite(6,0);
  21. }
  22. void TCS()
  23. {
  24.   digitalWrite(s0,HIGH);
  25.   digitalWrite(s1,HIGH);
  26.   attachInterrupt(0, ISR_INTO, CHANGE);
  27. }
  28. void ISR_INTO()
  29. {
  30.   counter++;
  31. }
  32. int Raverage = 0;
  33. int Baverage = 0;
  34. int Gaverage = 0;
  35. void loop()       //   函数调用
  36. {
  37.   TCS();
  38.   if(TcsTrigger.check()){
  39.     Tcstrigger();
  40.   }
  41.   if(processdata.check()){
  42.     procedata();
  43.   }   
  44.   if(ledlightup.check()){
  45.    ledup();
  46.   }
  47. }
  48. void Tcstrigger()  //   数据采集
  49. {
  50.       flag++;
  51.     if(flag==1){
  52.       digitalWrite(s2,LOW);
  53.       digitalWrite(s3,LOW);   
  54.       countR=counter;     
  55.       digitalWrite(s2,HIGH);
  56.       digitalWrite(s3,HIGH);
  57.     }     
  58.     else if(flag==2){
  59.       countG=counter;      
  60.       digitalWrite(s2,LOW);
  61.       digitalWrite(s3,HIGH);  
  62.     }
  63.     else if(flag==3){
  64.       countB=counter;   
  65.       digitalWrite(s2,LOW);
  66.       digitalWrite(s3,LOW);   
  67.       flag=0;
  68.     }
  69.     counter=0;
  70. }
  71. void  procedata()        // 数据处理
  72. {
  73.       static int Rinput[5] ={
  74.       0,0,0,0,0                }
  75.     ,Binput[5] ={
  76.       0,0,0,0,0                }
  77.     ,Ginput[5] ={
  78.       0,0,0,0,0                };
  79.     for(int i = 4;i > 0;i--){
  80.       Rinput[i] = Rinput[i-1];
  81.       Binput[i] = Binput[i-1];
  82.       Ginput[i] = Ginput[i-1];
  83.     }
  84.   
  85.     if(countR < 2500)
  86.       Rinput[0] = countR;
  87.     else
  88.       Rinput[0] = Rinput[1];
  89.     if(countB < 2500)
  90.       Binput[0] = countB;
  91.     else
  92.       Binput[0] = Binput[1];
  93.     if(countG < 2500)
  94.       Ginput[0] = countG;
  95.     else
  96.       Ginput[0] = Ginput[1];   
  97.     Raverage = 0;
  98.     Baverage = 0;
  99.     Gaverage = 0;
  100.     for(int i = 0;i <= 4;i++){
  101.       Raverage += Rinput[i];
  102.       Baverage += Binput[i];
  103.       Gaverage += Ginput[i];
  104.     }
  105.     Raverage /= 5;
  106.     Baverage /= 5;
  107.     Gaverage /= 5;
  108.       
  109. }
  110. void  ledup()     //数据输出
  111. {
  112.     int ledvalueR = Raverage;
  113.     int ledvalueG = Gaverage;
  114.     int ledvalueB = Baverage;
  115.     ledvalueR = constrain(ledvalueR,350,1700);
  116.     ledvalueB = constrain(ledvalueB,350,1500);
  117.     ledvalueG = constrain(ledvalueG,350,1650);
  118.      Serial.print("R:");
  119.     Serial.print(Raverage,DEC);
  120.     Serial.print(" ");
  121.     Serial.print(ledvalueR,DEC);
  122.     Serial.print("B:");
  123.     Serial.print(Baverage,DEC);
  124.     Serial.print(" ");
  125.     Serial.print(ledvalueB,DEC);
  126.     Serial.print("G:");
  127.     Serial.print(Gaverage,DEC);
  128.     Serial.print(" ");
  129.     Serial.println(ledvalueG,DEC);
  130.      
  131.    
  132.     ledvalueR = map(ledvalueR,350,1700,0,255);
  133.     ledvalueB = map(ledvalueB,350,1500,0,255);
  134.     ledvalueG = map(ledvalueG,350,1650,0,255);
  135.     analogWrite(3,ledvalueR);   
  136.     analogWrite(6,ledvalueB);
  137.     analogWrite(5,ledvalueG);
  138.   
  139. }
复制代码
tutorials

lengyuexinghun  学徒

发表于 2014-3-13 11:24:27

楼主,连接图怎么打不开啊
回复

使用道具 举报

Ash  管理员
 楼主|

发表于 2014-3-13 11:52:27

lengyuexinghun 发表于 2014-3-13 11:24
楼主,连接图怎么打不开啊

谢谢提醒,重新上传了,应该没问题了。
回复

使用道具 举报

lengyuexinghun  学徒

发表于 2014-3-14 16:13:18

谢谢啦,我对这个变色龙很感兴趣,正准备做一个试试。
回复

使用道具 举报

爱国者一号  初级技匠

发表于 2015-11-7 10:17:06

楼主你好,我是一个没有编程经验的人,按照我的思路,把程序直接烧进硬件就OK了,但前面你说代码需要Metro库,需下载,我不是很懂。楼主您能向我我讲解一下Metro库在烧录软件中的作用吗?有了您的讲解我将会进步。谢谢楼主
回复

使用道具 举报

再粗点再大点  学徒

发表于 2018-7-15 13:11:37

学习了
回复

使用道具 举报

lilei8488  中级技师

发表于 2019-5-22 10:14:34

好的创意
回复

使用道具 举报

海之鱼  学徒

发表于 2020-10-30 13:14:25

想法很新颖,如果有一个打印的变色龙外罩会更酷
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail