Arduino LED流水燈·基礎實驗


Arduino初學IO控制,流水燈實驗是很好的學習對象。分兩個進程學習。
一、假流水燈,即基礎效果實現
二、真流水燈,即采用PWM模擬真實流水漸變效果

我們設立5盞燈,正極分別連接數字口(Digital Pin)3 5 9 10 11口 ,負極共地(GND)

假流水燈

int LED1 = 3;
int LED2 = 5;
int LED3 = 9;
int LED4 = 10;
int LED5 = 11;
void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
}

void loop() {
  //狀態1
  digitalWrite(LED1, 1);  //1 代表 HIGH   0 代表 LOW
  digitalWrite(LED2, 0);
  digitalWrite(LED3, 0);
  digitalWrite(LED4, 0);
  digitalWrite(LED5, 0);

  delay(1000);
  //狀態2
  digitalWrite(LED1, 0);
  digitalWrite(LED2, 1);
  digitalWrite(LED3, 0);
  digitalWrite(LED4, 0);
  digitalWrite(LED5, 0);

  delay(1000);
  //狀態3
  digitalWrite(LED1, 0);
  digitalWrite(LED2, 0);
  digitalWrite(LED3, 1);
  digitalWrite(LED4, 0);
  digitalWrite(LED5, 0);

  delay(1000);
  //狀態4
  digitalWrite(LED1, 0);
  digitalWrite(LED2, 0);
  digitalWrite(LED3, 0);
  digitalWrite(LED4, 1);
  digitalWrite(LED5, 0);

  delay(1000);
  //狀態5
  digitalWrite(LED1, 0);
  digitalWrite(LED2, 0);
  digitalWrite(LED3, 0);
  digitalWrite(LED4, 0);
  digitalWrite(LED5, 1);
  delay(1000);

}

使用狀態控制法去實現,方便理解和修改,每個狀態持續一段時間,即使用delay()。【Arduino程序的運行機制和Processing不太一樣,P5是等待一次draw函數執行完才刷新畫布,得到結果,而Arduino是即時,也就是執行一條語句后立馬能反饋到結果!!】
當然有人用循環語句來搭建,可以,但是對初學者真是不友好。首先循環語句本來就不熟悉,而且還有delay延遲函數參與,不好理解其運行邏輯的,所以不推薦。

真流水燈

因為要模擬過渡效果,因此簡單的數字式讀寫沒法滿足要求,使用PWM調節機制能模擬出來。

int LED1 = 3;
int LED2 = 5;
int LED3 = 9;
int LED4 = 10;
int LED5 = 11;

int fadeValue1 = 0;     //定義亮度
int fadeValue2 = 60;
int fadeValue3 = 120;
int fadeValue4 = 180;
int fadeValue5 = 240;

int state1 = 0;
int state2 = 0;
int state3 = 0;
int state4 = 0;
int state5 = 0;

void setup() {

}

void loop() {
  //更新
  //1
  if (state1 == 0)
  {
    fadeValue1 += 1;
  }
  else if(state1 == 1)
  {
    fadeValue1 -= 1;
  }

  if (fadeValue1 > 254)
  {
    state1 = 1;
  }
  else if (fadeValue1 < 1)
  {
    state1 = 0;
  }

////////////////2/////////////////////////
 if (state2 == 0)
  {
    fadeValue2 += 1;
  }
  else if(state2 == 1)
  {
    fadeValue2 -= 1;
  }

  if (fadeValue2 > 254)
  {
    state2 = 1;
  }
  else if (fadeValue2 < 1)
  {
    state2 = 0;
  }

////////////////3/////////////////////////
 if (state3 == 0)
  {
    fadeValue3 += 1;
  }
  else if(state3 == 1)
  {
    fadeValue3 -= 1;
  }

  if (fadeValue3 > 254)
  {
    state3 = 1;
  }
  else if (fadeValue3 < 1)
  {
    state3 = 0;
  }

  ////////////////4/////////////////////////
 if (state4 == 0)
  {
    fadeValue4 += 1;
  }
  else if(state4 == 1)
  {
    fadeValue4 -= 1;
  }

  if (fadeValue4 > 254)
  {
    state4 = 1;
  }
  else if (fadeValue4 < 1)
  {
    state4 = 0;
  }

  ////////////////5/////////////////////////
 if (state5 == 0)
  {
    fadeValue5 += 1;
  }
  else if(state5 == 1)
  {
    fadeValue5 -= 1;
  }

  if (fadeValue5 > 254)
  {
    state5 = 1;
  }
  else if (fadeValue5 < 1)
  {
    state5 = 0;
  }

  //執行 相當於 P5繪畫
  analogWrite(LED1, fadeValue1);
  analogWrite(LED2, fadeValue2);
  analogWrite(LED3, fadeValue3);
  analogWrite(LED4, fadeValue4);
  analogWrite(LED5, fadeValue5);

  delay(4);
}

沿用P5的更新-繪畫原理,慢慢地刷新亮度值,最后統一執行analogWrite()
不過還能簡化一些操作,使用sin函數來更新數值,如:

int LED1 = 3;
int LED2 = 5;
int LED3 = 9;
int LED4 = 10;
int LED5 = 11;

int fadeValue1 = 0;
int fadeValue2 = 60;
int fadeValue3 = 120;
int fadeValue4 = 180;
int fadeValue5 = 240;

//為了方便 偏移 sin函數的相位,設置一個不同的初相
int state1 = 0;
int state2 = 10;
int state3 = 20;
int state4 = 30;
int state5 = 40;
void setup() {
  // put your setup code here, to run once:
  // analogWrite 函數不用pinMode定義
}

void loop() {
  fadeValue1 = abs(cos(millis()/200.0 + state1)) * 250 + 1;
  fadeValue2 = abs(cos(millis()/200.0 + state2)) * 250 + 1;
  fadeValue3 = abs(cos(millis()/200.0 + state3)) * 250 + 1;
  fadeValue4 = abs(cos(millis()/200.0 + state4)) * 250 + 1;
  fadeValue5 = abs(cos(millis()/200.0 + state5)) * 250 + 1;
//  analogWrite(LED1, fadeValue1);
//  analogWrite(LED2, fadeValue2);
//  analogWrite(LED3, fadeValue3);
//  analogWrite(LED4, fadeValue4);
//  analogWrite(LED5, fadeValue5);


  analogWrite(LED1, 255-fadeValue1);
  analogWrite(LED2, 255-fadeValue2);
  analogWrite(LED3, 255-fadeValue3);
  analogWrite(LED4, 255-fadeValue4);
  analogWrite(LED5, 255-fadeValue5);
  
  delay(4);
}

因為sin函數的數值變化本就帶緩動,因此效果很理想。

上述代碼只是模型參考,任意數值都能自行修改。其實這里應該貼上實驗結果來完善這篇博文,但是么。。。為了保有讀者的好奇心,鼓勵讀者自行實操看效果,這也是學習硬件,學習Arduino另外的樂趣和意義,祝好運 @~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM