找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 877|回复: 2
打印 上一主题 下一主题
收起左侧

这个单片机程序为什么蓝色灯不和红和绿一样改变亮度

[复制链接]
跳转到指定楼层
楼主
ID:644246 发表于 2019-11-20 11:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
char buffer[18];
int red,green,blue;
int RedPin = 6;
int GreenPin = 5;
int BluePin = 4;
int length;//定义一个变量用来表示共有多少个音符
int tonePin = 7; //蜂鸣器的pin


int tune[] =
{
  356,450,600,
};

//曲子的节拍,即音符持续时间
float duration[] =
{
   1,0.5 ,1,
};


void setup()
{
  {
  pinMode(tonePin, OUTPUT); //设置蜂鸣器的pin为输出模式
  length = sizeof(tune) / sizeof(tune[0]); //这里用了一个sizeof函数,查出数组里有多少个音符
  }
  Serial.begin(9600);
  Serial.flush();
  pinMode(RedPin, OUTPUT);
  pinMode(GreenPin, OUTPUT);
  pinMode(BluePin, OUTPUT);
}


void loop()
{
  if (Serial.available() > 0)
  {
    int index=0;
    delay(100);
    int numChar = Serial.available();
    if (numChar>15)
    {
      numChar=15;
    }
    while (numChar--)
    {
      buffer [index++] = Serial.read();
    }
    splitString(buffer);
  }
}


void splitString(char* data)
{
  Serial.print("Data entered: ");
  Serial.println(data );
  char* parameter;
  parameter = strtok (data, ",");
  while (parameter !=NULL)
  {
    setLED(parameter);
    parameter = strtok (NULL, ",");
  }
  for (int x=0; x<16; x++)
  {
    buffer[x]='\0';
  }
  Serial.flush();
}


void setLED(char* data)
{
    delay(500);
     if ((data[0] == 'g')|| (data[0] == 'G'))
     {
      int Ans = strtol(data+1,NULL,10);
      Ans = constrain(Ans,0,255);
      analogWrite(GreenPin, Ans);
      Serial.print("Green is set to: ");
      Serial.println(Ans);
    }
     if ((data[0] == 'b')|| (data[0] == 'B'))
     {
      int Ans = strtol(data+1,NULL,10);
      Ans = constrain(Ans,0,255);
      analogWrite(BluePin, Ans);
      Serial.print("Blue is set to: ");
      Serial.println(Ans);
     }
      if ((data[0] == 'r')|| (data[0] == 'R'))
    {
      int Ans = strtol(data+1,NULL,10);
      Ans = constrain(Ans,0,255);
      analogWrite(RedPin, Ans);
      Serial.print("Red is set to: ");
      Serial.println(Ans);
    }
   
    yinyue();
  }


  void yinyue()
{
   for (int x = 0; x < length; x++) //循环音符的次数
   {
     tone(tonePin, tune[x]); //依次播放tune数组元素,即每个音符
     delay(400 * duration[x]); //每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快
     noTone(tonePin);//停止当前音符,进入下一音符
   }
   delay(500);//等待0.5秒后,循环重新开始
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2019-11-20 12:05 | 只看该作者
不同颜色的发光二极管要求的电流不一样,电压降也不一致,需根据元件参数调整好后才能控制其亮度
回复

使用道具 举报

板凳
ID:645755 发表于 2019-11-20 14:39 | 只看该作者
不用颜色的LED灯,相同亮度下所需的电流不同。要么你修改外部LED灯匹配的限流电阻,要么就要修改程序里面控制LED灯的时间才间接调节亮度
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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