Ash 发表于 2014-1-2 12:08:38

自带保护色的变色龙灯

变色龙LED灯的粗略效果预览↓↓↓


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

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

【硬件列表】

[*]颜色传感器
[*]DFRduino Nano
[*]RGB 全彩LED灯盘


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

【步骤2】连接


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




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


【步骤3】下载程序
所有元件连接好后将编写好的代码烧到Nano控制器中代码中需要使用到Metro库,需要先安装。


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


【代码】
#include <Metro.h>// 函数库
#include <math.h>
Metro ledlightup = Metro(60,true);
Metro processdata = Metro(50,true);
Metro TcsTrigger = Metro(10,true);

int s0=8,s1=9,s2=10,s3=11; // 颜色传感器端口定义
int out=2;
int flag=0;//变量初始化
int counter=0;
int countR=0,countG=0,countB=0;
void setup()
{
Serial.begin(115200);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);

analogWrite(3,0);
analogWrite(5,0);
analogWrite(6,0);

}

void TCS()
{
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
attachInterrupt(0, ISR_INTO, CHANGE);

}

void ISR_INTO()
{
counter++;
}

int Raverage = 0;
int Baverage = 0;
int Gaverage = 0;

void loop()       //   函数调用
{
TCS();
if(TcsTrigger.check()){
    Tcstrigger();
}
if(processdata.check()){
    procedata();
}   
if(ledlightup.check()){
   ledup();
}

}
void Tcstrigger()//   数据采集
{
      flag++;
    if(flag==1){
      digitalWrite(s2,LOW);
      digitalWrite(s3,LOW);   
      countR=counter;   
      digitalWrite(s2,HIGH);
      digitalWrite(s3,HIGH);
    }   
    else if(flag==2){
      countG=counter;      
      digitalWrite(s2,LOW);
      digitalWrite(s3,HIGH);

    }
    else if(flag==3){
      countB=counter;   
      digitalWrite(s2,LOW);
      digitalWrite(s3,LOW);   
      flag=0;
    }
    counter=0;
}

voidprocedata()      // 数据处理
{
      static int Rinput ={
      0,0,0,0,0                }
    ,Binput ={
      0,0,0,0,0                }
    ,Ginput ={
      0,0,0,0,0                };

    for(int i = 4;i > 0;i--){
      Rinput = Rinput;
      Binput = Binput;
      Ginput = Ginput;
    }

    if(countR < 2500)
      Rinput = countR;
    else
      Rinput = Rinput;

    if(countB < 2500)
      Binput = countB;
    else
      Binput = Binput;

    if(countG < 2500)
      Ginput = countG;
    else
      Ginput = Ginput;   

    Raverage = 0;
    Baverage = 0;
    Gaverage = 0;

    for(int i = 0;i <= 4;i++){
      Raverage += Rinput;
      Baverage += Binput;
      Gaverage += Ginput;
    }
    Raverage /= 5;
    Baverage /= 5;
    Gaverage /= 5;
      
}

voidledup()   //数据输出
{
    int ledvalueR = Raverage;
    int ledvalueG = Gaverage;
    int ledvalueB = Baverage;

    ledvalueR = constrain(ledvalueR,350,1700);
    ledvalueB = constrain(ledvalueB,350,1500);
    ledvalueG = constrain(ledvalueG,350,1650);
   Serial.print("R:");
    Serial.print(Raverage,DEC);
    Serial.print(" ");
    Serial.print(ledvalueR,DEC);
    Serial.print("B:");
    Serial.print(Baverage,DEC);
    Serial.print(" ");
    Serial.print(ledvalueB,DEC);
    Serial.print("G:");
    Serial.print(Gaverage,DEC);
    Serial.print(" ");
    Serial.println(ledvalueG,DEC);
   
   
    ledvalueR = map(ledvalueR,350,1700,0,255);
    ledvalueB = map(ledvalueB,350,1500,0,255);
    ledvalueG = map(ledvalueG,350,1650,0,255);

    analogWrite(3,ledvalueR);   
    analogWrite(6,ledvalueB);
    analogWrite(5,ledvalueG);

}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

想法很新颖,如果有一个打印的变色龙外罩会更酷
页: [1]
查看完整版本: 自带保护色的变色龙灯