0

ランダムなフェードイン、ランダムなフェードアウト、ランダムなオン/オフの期間で、ランダムな時間にオンとオフを切り替えるために8つの異なるライトが必要なプロジェクトがあります。私の戦略は、フェードオンし、ランダムな時間オンのままにし、フェードオフし、ランダムな時間オフにし、繰り返すことです。現在、各forループの前にランダムなピンを選択していますが、forループを使用して、全体のオン/オフサイクルを実行するピンをランダムに選択したいと思います。

これが私の擬似コードです。または多分それは私のコードです。

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)
} 

ループ(オン、次にオフ)は、サイクルの1つのインスタンスになります。最初のサイクルの実行中にサイクルの2番目のインスタンスを別のピンで開始したい場合、それはプログラムで実行できることですか?または、それぞれが同時にライトをフェードインおよびフェードアウトする8つのコントローラーが必要ですか?

4

2 に答える 2

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

いくつかの提案。面白いプロジェクトのようですね。幸運を!

于 2013-01-12T04:35:22.270 に答える
1

この種のこと(複数のライト/スレッド)は、switch / caseステートメントを使用した手続き型コーディングを使用し、いくつかの変数を介して状態を追跡することで管理できます。Arduinoのメモリが限られているため、これが唯一の方法である場合があります。

一方、私は、カスタムクラスカスタムライブラリを使用して、オブジェクト指向のアプローチでこの種の照明制御を行うことに多くの成功を収めてきました。はるかに簡単で、loop()より高いレベルのロジックを処理し、各インスタンスにサービスを提供するだけで済みます(たとえば、更新するように指示すると、インスタンスがそのロジックを処理します)。

唯一の問題はメモリの制限です。そのため、使用している特定のボードによって異なる場合があります。私はそれを試してみることをお勧めします-おそらくメモリに関しては素晴らしいでしょうし、あなたはかなり多くを学ぶでしょう。

于 2013-01-12T04:46:56.017 に答える