Arduino是一个很好的嵌入式开发平台,它有着很好的易用性。对于我们这种电子业余爱好者,有着很强的吸引力。这两天做了一个小Demo分享给大家。
通过控制R,G,B分量来设置RGB色灯的颜色,电位器为调整光的强度。
演示效果视频地址
上位机程序C# WinForm
RGB-Light
//输出颜色分量到LED
void setColor(int red, int green, int blue) {
analogWrite(redPin, 255 - red);
analogWrite(greenPin, 255 - green);
analogWrite(bluePin, 255 - blue);
analogWrite(beeOutPin, (red + green + blue) / 3); //蜂鸣器的发声由三个颜色分量的平均值决定
}
//随机显示颜色函数
void randColor(int num) {
while (num--) {
setColor(random(0, 255), random(0, 255), random(0, 255));
delay(500);
setColor(0, 0, 0);
delay(200);
}
}
void lightFlicker()
{
int r = 0, g = 0, b = 0;
while (1) {
for (; r <= 255; r++) {
setColor(r, g, b);
delay(4);
}
for (; g <= 255; g++) {
setColor(r, g, b);
delay(4);
}
for (; b <= 255; b++) {
setColor(r, g, b);
delay(4);
}
for (; r >= 0; r--) {
setColor(r, g, b);
delay(4);
}
for (; g >= 0; g--) {
setColor(r, g, b);
delay(4);
}
for (; b >= 0; b--) {
setColor(r, g, b);
delay(4);
}
delay(496);
setColor(0, 0, 0);
delay(300);
setColor(0xff, 0, 0);
delay(500);
setColor(0, 0, 0);
delay(300);
setColor(0, 0xff, 0);
delay(500);
setColor(0, 0, 0);
delay(300);
setColor(0, 0, 0xff);
delay(500);
setColor(0, 0, 0);
delay(300);
randColor(10);
}
}
Arduino程序
硬件图
// Arduino Nano V3.0 Board
int redPin = 3;//红色分量 PWM
int greenPin = 5; //绿色分量 PWM
int bluePin = 6; //蓝色分量 PWM
int readPin = A3; //读电位器
int putToRgbPin = 10; //输出到RGB色灯的亮度 PWM
int onOffPin = A1; //读压电陶瓷片
int beeOutPin = 11; //蜂鸣器输出 PWM
int value = 0; //亮度值
byte serialData[5]; //从串口读取的数据
void setup() {
// 此处定义一系列的引脚
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(readPin, INPUT);
pinMode(onOffPin, INPUT);
pinMode( beeOutPin , OUTPUT);
pinMode(putToRgbPin, OUTPUT);
//开始串口通信
Serial.begin(115200);
Serial.println("Baud Rate: 115200");
//初始RGB色灯不发光
setColor(0x00, 0x00, 0x00);
//定义了一个随机数种子
randomSeed(1397);
}
void loop() {
//读取电位器的模拟值并且转换成PWM输入值
value = map(analogRead(readPin), 0, 1023, 0, 255);
//输入到色灯中
analogWrite(putToRgbPin, value);
//读取压电陶瓷模拟值并且转换成蜂鸣器的输入值
analogWrite(beeOutPin, map(analogRead(onOffPin), 0, 1023, 0, 255) * 20);
//开始读取串口数据
if (Serial.available() > 0) {
//读取一个字节数组
Serial.readBytes(serialData, 5)
//判断首尾类型实现功能种类判断
if (serialData[0] == 0x01 && serialData[4] == 0x02)
{
setColor(serialData[1], serialData[2], serialData[3]); //上位机传入的颜色分量
}
if (serialData[0] == 0x01 && serialData[4] == 0x03)
{
lightFlicker(); //开始自定义闪烁
}
Serial.flush();
}
}
网友评论