不莣初芯:花样流水灯

还怕在家办公没有星辰大海:流水灯这样玩!

小编理解的流水灯就是一组LED灯,可以在系统控制下按照设定的样式来点亮和熄灭,从而形成一定的视觉效果。
Alt

电路中是将7个LED灯的负极(较短引脚)接GND,将LED的正极(较长引脚)通过电阻连接到Arduino的2~8引脚,注意尽量不要使用Arduino的0和1引脚(这两个引脚主要用于串口通信,上传程序时也要用这两个引脚)。

这里小编要考考小伙伴们啦,LED灯的正极为什么必须要接电阻?这种接法是灌电流方式还是拉电流方式?想不起来的童鞋快去看看小编的上一篇文章吧。

样式一

7个LED灯同时闪烁,虽然我们看上去是同时,但是程序中还是一个一个点亮的,只是程序执行特别快,我们人的眼睛看不出间隔。


void setup() {
  //设置2~8号引脚为输出模式
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
void loop() {
  for (int i = 2; i <= 8; i++) {//for循环,用变量i代表Arduino的2~8号引脚
    digitalWrite(i, HIGH);//设置引脚i输出高电平,从而点亮LED
  }
  delay(300);//延时300毫秒,可以根据闪烁效果自行更改
  for (int i = 2; i <= 8; i++) {//循环
    digitalWrite(i, LOW);//设置引脚i输出低电平,从而熄灭LED
  }
  delay(300);//延时300毫秒
}

样式二

7个LED灯,从两端向中间依次点亮,再由中间向两端依次点亮

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
int k;
void loop() {
  k = 2;//定义变量,值为2代表2号引脚
  int q =8;//定义变量,值为8代表8号引脚
  while (k <= 8)//当k的值小于8时执行while循环
  {
    digitalWrite(k, HIGH);//k号引脚输出高电平,点亮连接到对应引脚的LED灯
    digitalWrite(q, HIGH);//q号引脚输出高电平,点亮连接到对应引脚的LED灯
    delay(300);//适当延时,有延时点亮的效果即可
    digitalWrite(k, LOW);//k号引脚输出低电平,熄灭连接到对应引脚的LED灯
    digitalWrite(q, LOW);//k号引脚输出低电平,熄灭连接到对应引脚的LED灯
    k++;//k从2依次增加到8
    q--;//q从8依次减小到2
  }
}

样式三

1.一个一个点亮

7个LED灯,一个一个的点亮


void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
int k;//定义变量,代表引脚号
void loop() {
    k = 2;//引脚从2开始
    while (k <= 8)
    {
      digitalWrite(k, HIGH);
      delay(300);
      digitalWrite(k, LOW);
      k++;
    }
}

2.两个两个点亮

7个LED灯,两个两个的点亮,逻辑跟一个一个点亮是一样的。

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
int k;//定义变量,代表引脚号
void loop() {
    k = 2;//引脚从2开始
    while (k <= 8)
    {
      digitalWrite(k, HIGH);//点亮第k个LED灯
      digitalWrite(k - 1, HIGH);//同时点亮第k-1个LED灯,也就是k引脚前面的一个
      delay(300);//延时
      digitalWrite(k - 1, LOW);//熄灭第k-1个LED灯
      k++;//k从2开始依次增加,一直加到8
    }
    delay(300);//延时
    digitalWrite(k - 1, LOW);//最后再熄灭最后点亮的一个LED灯
    delay(300);//延时
}

3.难度升级

7个LED灯,先一个一个点亮,再两个两个点亮,再三个三个点亮,再…一直到7个全部点亮,再重复这个过程。

感觉好难!!!其实做完一个一个点亮和两个两个点亮的程序,我们只要找出程序中的规律就可以了,只不过会嵌套循环语句,多定义几个变量。


void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
int k, deg, i;//定义变量
void loop() {
  deg = 1;//标记每次点亮几个LED灯
  while (deg <= 7)//一共7个LED灯
  {
    k = 2;//代表2号引脚
    while (k <= 8)
    {
      i = 0;//表示k前面要点亮/熄灭的LED灯有几个
      while (i < deg)
      {
        digitalWrite(k - i, HIGH);//点亮k-i号LED灯,也就是k前面的第i个
        i++;
      }
      delay(300);
      digitalWrite(k - deg + 1, LOW);//熄灭k-(deg-1)号LED灯
      k++;
    }
    i = deg - 1;//最后有几个LED灯要单独熄灭
    while (i > 0)
    {
      delay(300);
      digitalWrite(k - i, LOW);//熄灭第k-i号LED灯
      i--;
    }
    delay(300);
    deg++;//deg加1,准备下次循环点亮几个LED灯
  }
}

综合显示效果

把上面的几种花样写到一个程序里,先让7个LED灯闪烁,然后再从两端向中间点亮,再依次点亮,最后再配上点音乐,感觉更嗨了。


void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
int k, deg, i;//定义变量
void loop() {
  for (int j = 0; j < 3; j++)//先闪烁3次
  {
    for (int i = 2; i <= 8; i++) {//for循环,用变量i代表Arduino的2~8号引脚
      digitalWrite(i, HIGH);//设置引脚i输出高电平,从而点亮LED
    }
    delay(300);//延时300毫秒,可以根据闪烁效果自行更改
    for (int i = 2; i <= 8; i++) {//循环
      digitalWrite(i, LOW);//设置引脚i输出低电平,从而熄灭LED
    }
    delay(300);//延时300毫秒
  }
  k = 2;//定义变量,值为2代表2号引脚
  int q = 8; //定义变量,值为8代表8号引脚
  while (k <= 8)//当k的值小于8时执行while循环
  {
    digitalWrite(k, HIGH);//k号引脚输出高电平,点亮连接到对应引脚的LED灯
    digitalWrite(q, HIGH);//q号引脚输出高电平,点亮连接到对应引脚的LED灯
    delay(300);//适当延时,有延时点亮的效果即可
    digitalWrite(k, LOW);//k号引脚输出低电平,熄灭连接到对应引脚的LED灯
    digitalWrite(q, LOW);//k号引脚输出低电平,熄灭连接到对应引脚的LED灯
    k++;//k从2依次增加到8
    q--;//q从8依次减小到2
  }
  deg = 1;//标记每次点亮几个LED灯
  while (deg <= 7)//一共7个LED灯
  {
    k = 2;//代表2号引脚
    while (k <= 8)
    {
      i = 0;//表示k前面要点亮/熄灭的LED灯有几个
      while (i < deg)
      {
        digitalWrite(k - i, HIGH);//点亮k-i号LED灯,也就是k前面的第i个
        i++;
      }
      delay(300);
      digitalWrite(k - deg + 1, LOW);//熄灭k-(deg-1)号LED灯
      k++;
    }
    i = deg - 1;//最后有几个LED灯要单独熄灭
    while (i > 0)
    {
      delay(300);
      digitalWrite(k - i, LOW);//熄灭第k-i号LED灯
      i--;
    }
    delay(300);
    deg++;//deg加1,准备下次循环点亮几个LED灯
  }
}

关于Arduino控制流水灯的案例就分享这些了,大家还有更好玩的流水灯案例吗?有的话请留言告诉小编。更多精彩案例内容,请关注小编的微信公众号《不莣初芯》。

不莣初芯

花样最多 8 灯流水灯代码 #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include /******************************************************************/ /* 花样表格 */ /******************************************************************/ unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加 /******************************************************************/ /* 延时函数 */ /******************************************************************/ void delay(unsigned int cnt)//简易延时 { while(--cnt); } /******************************************************************/ /* 主函数 */ /******************************************************************/ main() { unsigned char i; while(1) { P2=0xFE; //第一个LED亮 for(i=0;i<8;i++) { delay(10000); P2 <<=1; } P2=0x7F; //第七个LED亮 for(i=0;i>=1; } P2=0xFE; //第一个LED亮 for(i=0;i<8;i++) { delay(10000); P2 <<=1; P2 |=0x01; } P2=0x7F; //第七个LED亮 for(i=0;i>=1; P2 |=0x80; } /*下面通过查表方法获得花样参数*/ for(i=0;i<16;i++)//查表可以简单的显示各种花样 实用性更强 { delay(20000); P2=seg[i]; } } } 补充: 再给你一个流星雨灯,这个程序有点暴力。。。 #include #include #define uint unsigned int void delay(uint n) { while(n--); } main() { mmm:P1=0xfe; delay(15000); while(1) { P1=P1<<1; delay(15000); if(P1==0x00) {P1=0x01;delay(15000);goto mm;} } mm: while(1) { P1=_crol_(P1,1)+1; delay(15000); if(P1==0xff) {delay(15000);goto mmm;} } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值