三步学会使用【颜色识别】传感器,自制一款智能夜灯
前段时间王老师发布了一个智能夜灯的作品,主要功能是:根据我提供的积木块的颜色来改变夜灯的颜色。这个作品里面主要使用到了颜色识别的模块。
有网友看到王老师的视频后表示很感兴趣随后购买了一些器件但是在操作过程中遇到一些问题,今天王老师就把智能夜灯的实现过程分享给大家。
实现过程分为三步:
1、 准备材料;
2、 选择工作模式,连接电路;
3、 编写程序;
准备材料
需要准备的材料有:
Arduino UNO,1块;
IO扩展板,1块;
RGB灯带,1段;
GY-33颜色识别模块,1个;
如下图:
选择工作模式
首先简单的介绍一下GY-33颜色传感器模块,模块主要有两部分构成,一个是TCS34725颜色传感器另一个是负责传感器与外部通信的MCU。模块有三种工作模式:串口模式、IIC模式和TCS34725模式。模式的选择是通过跳线方式完成的,如下图:
我们这里使用的是串口工作方式,所以不用做任何跳线处理,保持模块的默认状态就好了(更多工作模式可以去查看产品使用手册)。接下来我们需要将模块与Arduino进行电路连接,看下我们需要使用到的引脚,如下图:
看下实物连接:
接下来将RGB灯带与Arduino进行连接。
按照图中文字将RGB灯带与Arduino连接好。
编写程序
我们通过程序为模块发送控制命令,同时通过程序读取模块返回的颜色数值。比如模块中LED的亮度设置以及白平衡校准都有对应的命令,了解全部命令我们需要查看产品使用手册。这里以白平衡命令为例为大家介绍,模块在使用前都要进行白平衡校准,目的是告诉传感器什么是“白色”。下面就来进行编写白平衡校准程序:
// 白平衡命令
byte WBalanceCMD[3] = {0xA5, 0xBB, 0x60};
void setup()
{
// 初始化Arduino串口
Serial.begin(9600);
// 发送白平衡命令
Serial.write(WBalanceCMD, 3);
}
void loop()
{
}
将上面的程序下载到Arduino中,注意在下载程序的时候需要临时将颜色传感器拔下,以免出现程序无法下载的问题(程序下载和颜色传感器都要使用串口)。程序下载成功后进行白平衡操作,首先我们断开Arduino电源,我们需要找一个白色物体贴近传感器,如下图:
然后接通电源,如下图:
电源接通后进行了一次白平衡操作,白平衡的结果将会自动保存在传感器模块中,如果我们修改模块中LED的亮度那么需要再次进行白平衡操作。接下来我们就看一下如何让RGB灯带发出的光与被识别的物体颜色一致,在默认情况下模块每次返回8个字节,前四个字节固定为0X5A、0X5A、0X45、0X03,第4-6字节为RGB分量,最后一个字节为校验和,我们看下程序是如何编写的(更多的命令请阅读产品手册)。
#define LED_R 5 // R分量控制引脚
#define LED_G 6 // G分量控制引脚
#define LED_B 3 // B分量控制引脚
// 接收命令
byte rBuf[8] = {};
// 存储颜色数值
byte R = 0;
byte G = 0;
byte B = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
static int i = 0;
while (Serial.available() > 0)
{
// 循环读取缓存中的数据
rBuf[i] = Serial.read();
i++;
// 默认情况下模块连续的返回8个字节,格式如下:
// byte0: 0X5A
// byte1: 0X5A
// byte2: 0X45
// byte3: 0X03
// byte4: R分量
// byte5: G分量
// byte6: B分量
// byte7: 校验和,我们忽略校验和
if (i >= 8)
{
i = 0;
// 分别从第4-6位数据中取出RGB分量
R = rBuf[4];
G = rBuf[5];
B = rBuf[6];
}
}
// 设置灯带颜色
analogWrite(LED_R, 255 - R);
analogWrite(LED_G, 255 - G);
analogWrite(LED_B, 255 - B);
}
最后,我们将上面程序下载到Arduino中(下载程序的时候临时拔掉颜色传感器),看一下程序运行的效果,如下图:
看到这里,相信大家对于智能夜灯的制作已经有了初步的了解,赶快去制作一个吧。
上一篇:自制一个温湿度传感器
下一篇:米家传感器连不上网关的解决办法