2013-01-11 57 views
0

我有一個項目,需要八個不同的燈之間打開和關閉隨機時間與隨機淡入,隨機淡出和隨機開/關持續時間。我的策略是淡入淡出,隨意停留一段時間,淡入淡出,隨意停留一段時間,重複一遍。雖然現在我在每個for循環之前選擇了一個隨機引腳,但我想使用for循環來隨機選擇一個引腳來運行整個開/關循環。同步和隨機輸出引腳與Arduino

這是我的僞代碼。或者也許這是我的代碼。

void setup() { 
    int pin = 0; 
    int fadeIn = 0; 
    int fadeOut = 0; 
    int onDuration = 0; 
    int offDuration = 0; 
} 
void loop() {  
pin = random(2,8) 
onDuration = random(2000,15000) 
    for (fadeIn=0;fadeIn<255;i++) { 
     analogWrite(pin,fadeIn) 
    } 
delay(onDuration) 
pin = random(2,8) 
offDuration = random(1000,7000) 
    for (fadeOut=254;fadeOut>0;fadeOut--) { 
     analogWrite(pin,fadeOut) 
    } 
delay(offDuration) 
} 

循環(on,then off)將是循環的一個實例。如果我希望第二個循環的實例在另一個引腳上啓動,而第一個循環正在運行,那麼我可以通過編程來實現嗎?或者我是否需要八個控制器,每個控制器都會同時淡入淡出?

回答

1

在上面的代碼中,淡入和淡出不是隨機時間。這是你的意圖嗎?如果是這樣,您需要在循環的每次迭代中添加延遲。

無論如何,這是你可以不用8個獨立的板子。

因爲它是嵌入式的,所以很難輕鬆實現多線程。你需要實現自己的任務調度程序,每個LED必須被認爲是它自己的任務。然後,您只需跟蹤每個不同LED所處的狀態(淡入,淡出或熄滅)。當您在不同的任務之間跳動時,請根據狀態控制每個LED。

就基於時序的任務調度程序而言,您有不同的選項。也許最簡單的是實現一個週期性的定時器中斷。 AVR數據表很好地解釋了這一點。對於Arduino,還有一些庫也可以使用。例如: http://playground.arduino.cc/code/timer1

另一種選擇是做一些與此類似: http://arduino.cc/forum/index.php?PHPSESSID=3e72433bc4375ee6c20d56f3998762ca&topic=5686.msg44073#msg44073

只是一些建議。聽起來像一個有趣的項目。祝你好運!

1

您可以使用switch/case語句的程序化風格編碼來管理這類事情(多個燈光/線程),並通過一些變量來跟蹤狀態。由於Arduino內存有限,這有時是唯一的出路。

另一方面,使用custom classescustom libraries進行面向對象的燈光控制,我已經取得了很大的成功。更容易,你只需要處理更高級別的邏輯併爲每個實例提供服務(例如告訴它更新並且實例處理邏輯)。

唯一的問題是有限的內存 - 所以它可能取決於你正在使用哪個特定的電路板。我建議儘量嘗試一下 - 可能會記憶力好,你會學到很多東西。