Q&A
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- 3つのLEDテープをそれぞれ遅延させて発火させたい。
前提
Arduino言語やマイコン系について素人です。
なるべくわかりやすく教えて頂けると嬉しいです。
全体的につたない文章で申し訳ありません_(..)
(FastLEDでなく、このライブラリを使った方がいいなどのアドバイスも嬉しいです。)
Arduino に WS2811を繋ぎLEDを制御しています。
FastLEDを利用して3つのテープを遅延させて発火させたいです。
例
任意のアクション(シリアル通信で何か受け取ったらなど)
- LED1発火
- delay(100)
- LED2発火
- delay(100)
- LED3発火
- delay(100)
のようなイメージです。
発生している問題・エラーメッセージ
一つのテープだけを光らせた場合、綺麗にすべてのLEDが光るのですが、以下のコードですと、3つのテープが飛び飛びで光る形になります。
一つのテープ | 三つのテープ |
---|---|
![]() | ![]() |
おそらく(?) 3つの関数によって光らせる場所のLEDが書き換えられてしまって飛び飛びになっている?と考えているのですが、それが正しいのかと、どのように直せるのかがわからず困っています。これが、Arduino言語の仕様なのか?など自分なりにドキュメントや調査したのですが、わかりませんでした。
Q関数Aが2度呼び出された場合、中の変数は共有されているのでしょうか?
該当のソースコード
arduino
1CRGB leds[3][100]; 2 3void setup() { 4 delay(3000); 5 FastLED.addLeds<LED_TYPE, 5, COLOR_ORDER>(leds[0], 100).setCorrection(TypicalLEDStrip); 6 FastLED.addLeds<LED_TYPE, 6, COLOR_ORDER>(leds[1], 100).setCorrection(TypicalLEDStrip); 7 FastLED.addLeds<LED_TYPE, 7, COLOR_ORDER>(leds[2], 100).setCorrection(TypicalLEDStrip); 8 9 FastLED.setBrightness(96); 10} 11 12void loop() { 13 shower(led[0]); 14 delay(100); 15 shower(led[1]); 16 delay(100); 17 shower(led[2]); 18} 19 20 21// 発火させたいコード 22void shower(CRGB l[NUM_STRIPS]) { 23 fadeToBlackBy(l, NUM_LEDS, 50); 24 int pos = beatsin16(20, 0, NUM_LEDS); 25 static int prevpos = 0; 26 if (pos > prevpos) { 27 fill_solid(l + prevpos, (pos - prevpos) + 1, CHSV(gHue, 220, 255)); 28 } 29 prevpos = pos; 30 FastLED.show(); 31}
試したこと
このコードは1ループ単位でLEDを一つずつずらして、光らせる形です。
おそらく、LEDの個数分forで回す関数を作って光らせる形に変えればもっと簡単に出来ると思うのですが、for一回回る速度(?)より、loopの速度の方が早く光が滑らかに発光する為上記のshower
的関数をなるべく利用したいです。
補足情報(FW/ツールのバージョンなど)
回答2件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。