如何写全彩的呼吸灯效果?-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3282|回复: 8

[未解决] 如何写全彩的呼吸灯效果?

[复制链接]
发表于 2021-5-24 10:58 | 显示全部楼层 |阅读模式
本帖最后由 tigerzq 于 2021-5-24 13:54 编辑

百度到的呼吸灯效果都是单色或者是固定颜色的,我想如何写一个能覆盖全部颜色的呼吸灯效果,就想到以下代码:使用的是共阴极rgb灯珠。
#define led_red 9     //Pin 9 连接上 led的红色引脚
#define led_green 10
#define led_blue 11


void setup() {
  Serial.begin(9600);
  pinMode(led_red, OUTPUT);
  pinMode(led_green, OUTPUT);
  pinMode(led_blue, OUTPUT);

  analogWrite(led_red, 0);
  analogWrite(led_green, 0);
  analogWrite(led_blue, 0);
}

void loop() {
  int Rr = random(200);//随机产生红色
  int Bb = random(200);//随机产生绿色
  Serial.println(Rr);
  Serial.println(Bb);

  for (int i = 0; i < Rr; i++)
  {
    analogWrite(led_red, i);
    for (int j = 0; j < Bb; i++){
      analogWrite(led_green, j);
    analogWrite(led_blue, 0);
   // delay(10);
  }
}



for (int i = 200; i > 0; i--)
{
  analogWrite(led_red, i);   
  analogWrite(led_green, i);

  delay(10);
}
}

但是执行后,串口只打印2个数后,程序不执行了?各位高手给看看,问题出在哪里呀?

发表于 2021-5-24 11:16 | 显示全部楼层
for (int j = 0; j < Bb; i++){
      analogWrite(led_green, j);
    analogWrite(led_blue, 0);
   // delay(10);
  }
}

你的这个for是i++,j没有自加,所以一直卡在这个for循环
 楼主| 发表于 2021-5-24 13:42 | 显示全部楼层
本帖最后由 tigerzq 于 2021-5-24 13:58 编辑
int_i 发表于 2021-5-24 11:16
for (int j = 0; j < Bb; i++){
      analogWrite(led_green, j);
    analogWrite(led_blue, 0);

谢谢,是这个问题!但是又有问题了,把代码写完整:#define led_red 9     //Pin 9 连接上 led的红色引脚
#define led_green 10
#define led_blue 11


void setup() {
  Serial.begin(9600);
  pinMode(led_red, OUTPUT);
  pinMode(led_green, OUTPUT);
  pinMode(led_blue, OUTPUT);

  analogWrite(led_red, 0);
  analogWrite(led_green, 0);
  analogWrite(led_blue, 0);
}

void loop() {
  int Rr = random(200);//随机产生红色
  int Gg = random(200);//随机产生绿色
  int Bb = random(200);
  //分割线
  Serial.println("****");
  Serial.println(Rr);
  Serial.println(Bb);
  Serial.println(Gg);
//随机产生红绿蓝,逐步变亮
  for (int i = 0; i < Rr; i++)
  {
    analogWrite(led_red, i);
    for (int j = 0; j < Gg; j++) {
      analogWrite(led_green, j);
      for (int k = 0; k < Bb; k++) {
        analogWrite(led_blue, k);
        delay(10);
      }
    }
  }

//逐步熄灭

  for (int i = Rr; i > 0; i--)
  {
    analogWrite(led_red, i);
    for (int j = Gg; j > 0; j--) {
      analogWrite(led_green, j);
      for (int k = Bb; k > 0; k--) {
        analogWrite(led_blue, k);
        delay(10);
      }
    }
  }
}

结果是这样的:

发表于 2021-5-26 12:08 | 显示全部楼层
图片一直在加载中,我看不到你的结果,但是根据代码你的效果是不是这样子的?
1,红绿灯不亮,然后蓝灯的亮度达到最大
2、红灯不亮,绿灯亮度微亮(很弱几乎看不到),然后蓝灯又从黑到最亮
3、重复第二步,直到绿灯达到最亮,然后红灯亮度加1.
4、然后绿灯又黑掉,蓝灯从黑到最亮,直到红灯亮度点满,才开始运行后半部分的i--程序?
发表于 2021-5-26 17:48 | 显示全部楼层
如果你是想实现三种随机产生的颜色灯,同步呼吸的效果。我之前做过一次不使用for做的呼吸灯,我没编译也没有上传,不知道里面有没有语法问题。
int Rr = random(200);//随机产生红色
int Gg = random(200);//随机产生绿色
int Bb = random(200);//随机产生蓝色
float a=Rr/50;
float b=Gg/50;
float c=Bb/50;
//随机产生颜色,因为值不固定且不确定,所以将值分成50份,来保证每个颜色的灯加到最亮是相同的次数
float d;
float e;
float f;
//变量d,e,f储存灯的亮度
d=d+a;
f=f+b;
e=e+c;
if(d==Rr || d==0)//如果有一个灯颜色的灯加到最亮或者亮度达到最低,将自加值进行正负切换
{
a=-a;
b=-b;
c=-c;
}
analogWrite(3,a);
analogWrite(6,b);
analogWrite(9,c);
delay(10);
 楼主| 发表于 2021-5-26 20:15 | 显示全部楼层
int_i 发表于 2021-5-26 17:48
如果你是想实现三种随机产生的颜色灯,同步呼吸的效果。我之前做过一次不使用for做的呼吸灯,我没编译也没 ...

学习了。高手,语句写的比较简练。Arduino如何调试呢?比如我想看看变量在程序运行中的变化,怎么弄呀?除串口打印之外。
 楼主| 发表于 2021-5-26 20:19 | 显示全部楼层
int_i 发表于 2021-5-26 12:08
图片一直在加载中,我看不到你的结果,但是根据代码你的效果是不是这样子的?
1,红绿灯不亮,然后蓝灯的亮 ...

思路或者想实现的效果是这样的:
首先,随机产生红绿蓝的电压比例,使用for语句实现从灭到亮慢慢的变化。到最亮时,再反转,逐步变化到熄灭,周而复始,实现全彩呼吸灯效果。
发表于 2021-5-27 09:49 | 显示全部楼层
我刚刚做了完整的代码,上传主板串口监测了一下数据,变量数据都正常。我没有搭建电路,你可以试试把程序上传到主板看看效果咋样
********************************************************************************************

#define led_red 9     //Pin 9 连接上 led的红色引脚
#define led_green 10
#define led_blue 11
int d=0;
int e=0;
int f=0;
int a;
int b;
int c;
int Rr;
int Gg;
int Bb;
//变量d,e,f储存灯的亮度
void setup() {
  Serial.begin(9600);
  pinMode(led_red, OUTPUT);
  pinMode(led_green, OUTPUT);
  pinMode(led_blue, OUTPUT);

  analogWrite(led_red, 0);
  analogWrite(led_green, 0);
  analogWrite(led_blue, 0);
}

void loop() {
  if(d==0)
  {
  Rr = random(200);//随机产生红色
  Gg = random(200);//随机产生绿色
  Bb = random(200);//随机产生蓝色
  constrain(Rr, 20, 255);
  constrain(Gg, 20, 255);
  constrain(Bb, 20, 255);
  a=Rr/20;
  b=Gg/20;
  c=Bb/20;
  //约束随机产生不小于20,避免商小于1
  Serial.print("Rr==");
  Serial.print(Rr);
  Serial.print("\n");
  Serial.print("Gg==");
  Serial.print(Gg);
  Serial.print("\n");
  Serial.print("Bb==");
  Serial.print(Bb);
  Serial.print("\n");
  Serial.print("a==");
  Serial.print(a);
  Serial.print("\n");
  Serial.print("b==");
  Serial.print(b);
  Serial.print("\n");
  Serial.print("c==");
  Serial.print(c);
  Serial.print("\n");  
  Serial.print("************************");
  Serial.print("\n");
  }
  
  d=d+a;
  f=f+b;
  e=e+c;  
  Serial.println(d);
  Serial.println(f);
  Serial.println(e);
if(d>=Rr || d==0 || f>=Gg || e>=Bb)//如果有一个灯颜色的灯加到最亮或者亮度达到最低,将自加值进行正负切换
{
a=-a;
b=-b;
c=-c;
}
  analogWrite(led_red, a);
  analogWrite(led_green, b);
  analogWrite(led_blue, c);
  delay(10);
}
 楼主| 发表于 2021-5-27 23:07 | 显示全部楼层
int_i 发表于 2021-5-27 09:49
我刚刚做了完整的代码,上传主板串口监测了一下数据,变量数据都正常。我没有搭建电路,你可以试试把程序上 ...

明天试试看,多谢了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 05:29 , Processed in 0.076804 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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