Arduino-电位器调速的跑马灯(2)

沿用Arduino-电位器调速的跑马灯里面用的电路,更改程序,满足以下要求:

使LED灯带两端变量,并向对方LED运动,直到相互碰撞,之后返回两端。

代码只需要增加一句话即可:

digitalWrite(ledPin[9 - currentLED], HIGH);

完整代码如下:

byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};    // 为LED引脚成成数组
int ledDelay; // 变灯之间的延时
int direction = 1;
int currentLED = 0;
unsigned long changeTime;
int potPin = 2;    // 选择给电位器的输入引脚

void setup() {
for (int x=0; x<10; x++) { // 设置所有引脚模式为输出模式
                            pinMode(ledPin[x], OUTPUT); 
                         } 
       changeTime = millis(); 
} 
void loop() 
{ 
  ledDelay = analogRead(potPin); // 从电位器中读值 
  // 如果自最后一次变灯起已经过去了ledDelay毫秒的时间,则变灯
  if ((millis() - changeTime) > ledDelay) {      
    		changeLED();
   		changeTime = millis();
  	}
}

void changeLED() {
    	for (int x=0; x<10; x++) {   // 关闭所有LED
    		digitalWrite(ledPin[x], LOW);
  	}
    	digitalWrite(ledPin[currentLED], HIGH); // 点亮当前LED
digitalWrite(ledPin[9-currentLED], HIGH);//新增语句
        currentLED += direction; // 当前LED号增加direction表示的数值,相当于前进一个LED灯
  	// 如果达到最后LED灯,则变向
 	 if (currentLED == 9) {direction = -1;}
  	if (currentLED == 0) {direction = 1;}
}

如果将小灯改为9个的话,运行起来会很流畅。但是在本程序中中间碰撞会有停顿,如果想要消除停顿感的话,需要将程序做如下改动:

byte ledPin[] = { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };    // 为LED引脚成成数组
int ledDelay; // 变灯之间的延时
int direction = 1;
int currentLED = 0;
unsigned long changeTime;
int potPin = 2;    // 选择给电位器的输入引脚

void setup() {
	for (int x = 0; x<10; x++) { // 设置所有引脚模式为输出模式 pinMode(ledPin[x], OUTPUT); } changeTime = millis(); } void loop() { ledDelay = analogRead(potPin); // 从电位器中读值 // 如果自最后一次变灯起已经过去了ledDelay毫秒的时间,则变灯 if ((millis() - changeTime) > ledDelay) {
		changeLED();
		changeTime = millis();
	}
}

void changeLED() {
	for (int x = 0; x<10; x++) {   // 关闭所有LED
		digitalWrite(ledPin[x], LOW);
	}
	digitalWrite(ledPin[currentLED], HIGH); // 点亮当前LED
	digitalWrite(ledPin[9-currentLED], HIGH);
        //新增,当两灯相遇的时候就跳过一个灯,亮下一个,这样就可以避免中间两灯亮两次的情况了
	if (currentLED == 4 || currentLED == 5)
	{
		currentLED += direction;
	}
	currentLED += direction; // 当前LED号增加direction表示的数值,相当于前进一个LED灯
							 // 如果达到最后LED灯,则变向
	if (currentLED == 9) { direction = -1; }
	if (currentLED == 0) { direction = 1; }
}

0 Comments
Leave a Reply