本篇文章由 VeriMake 旧版论坛中备份出的原帖的 Markdown 源码生成
原帖标题为:开关|控制流水灯
原帖作者为:hi(旧版论坛 id = 187)
原帖由作者初次发表于 2021-03-30 14:11:00
开关控制led流水灯
实现一个流水灯点亮是很简单的,因此在此基础上我加上了一个开关,用开关来控制流水灯,什么开关都可以,因为我手头上只有一个微动开关所有就选择了这个,大家在做实验的时候选择普通的按键开关就可以,不加开关也可以,单纯实现流水灯效果。led 灯连接330Ω电阻,开关连接1kΩ电阻。
准备材料:
NanoC 1,数据线 1,400孔面包板 1,发光二极管 4,330Ω电阻 4,开关 1,1kΩ电阻 1,公对母杜邦线 3,公对公杜邦线 *1。
接线图:
![](https://verimake.com/assets/files/2022-01-23/1642907506-306603-15.png)
LED从左到右依次为1,2,3,4
LED1 — 11(330Ω电阻)
LED2 — 10(330Ω电阻)
LED3 — 9(330Ω电阻)
LED4 — 8(330Ω电阻)
开关 — 2(1kΩ电阻)
led长脚为正极,分别接数字引脚,为了防止电流过大烧坏二极管,再分别加一个电阻,短脚是负极,接地。
![](https://verimake.com/assets/files/2022-01-23/1642907543-555604-16.png)
按照如图所示连接就可以,上图圈出来的是一个微动开关,他有三个脚,从左到右依次是共用端(c),常开端(no),常闭端(nc),共用端接开发板引脚并连接一个电阻,开关按下前常开端断开,常闭端导通,按下开关后常开端闭合,常闭端断开,根据需要连接不同地方。
程序:
void setup() {
pinMode(8,OUTPUT); //定义8-11引脚为输出模式,连接led灯
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(2,INPUT); //定义2号引脚为输入模式。连接开关
}
void blink_led(char led1,char led2,char led3,char led4) //一个定义灯亮灭的函数
{
digitalWrite( 8,led1); //led1-4为每次调用函数需要输入的值
digitalWrite( 9,led2);
digitalWrite(10,led3);
digitalWrite(11,led4);
}
char test_key(char pin_num) //开关函数,调用函数时输入开关引脚
{
int val=digitalRead(pin_num); //读取连接开关引脚的值
if(val==1) //开关易发生震荡,因此加一个判断语句更加精确
{
delay(20);
int val=digitalRead(pin_num); //20毫秒后再次读取开关值。此时已经稳定
if(val==1)
{
return 1; //若开关按下则返回值为1
}
}
return 0; //开关没有按下则返回值为0
}
void loop() {
blink_led(1,0,0,0); //1和0分别对应着HIGH和LOW,表示灯的亮灭
delay(100); //8号引脚连接的led灯亮100毫秒
while(test_key(2)); //开关按下返回1,继续执行接下来的语句,开关未按下返回0,当前灯亮
blink_led(0,1,0,0); //9号引脚连接的led灯亮100毫秒
delay(100);
while(test_key(2)); //开关按下返回1,继续执行接下来的语句,开关未按下返回0,当前灯亮
blink_led(0,0,1,0); //9号引脚连接的led灯亮100毫秒
delay(100);
while(test_key(2)); //开关按下返回1,继续执行接下来的语句,开关未按下返回0,当前灯亮
blink_led(0,0,0,1); //9号引脚连接的led灯亮100毫秒
delay(100);
while(test_key(2)); //开关按下返回1,继续执行接下来的语句,开关未按下返回0,当前灯亮
}
运行结果
![](https://verimake.com/assets/files/2022-01-23/1642907889-496248-8-1.gif)
因为开关的不同,这个实验结果是,开关按下不动,这四个不同颜色的led灯轮流一直闪烁,松开时,随机停留在某个led灯点亮的状态。