プッシュボタンを使用したPWMによる調光ライト
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 11 | ||||
| × | 3 | ||||
| × | 1 | ||||
| × | 4 |
アプリとオンラインサービス
> |
|
このプロジェクトについて
このプロジェクトでは、Arduinoを使用してLED(発光ダイオード)をフェードする方法を紹介します。 3つのセクションに分かれています:
- フェードライト
- プッシュボタン付きのフェードライト
- ボタン付きのフェードライト(遅延の改善)
フェードライト:
このセクションの最後では、プロジェクトは次のようになっているはずです。
ご覧のとおり、信号が明るくなり、信号の順に徐々に暗くなります。さあ、始めましょう。
回路図: <図>
ご覧のとおり、LEDはピン3、6、9に接続されています。LEDは好きなピンに接続できますが、後でコードで変更することを忘れないでください。
コード:
まず、これをコードに追加します。どのコンポーネント、この場合はどのLEDがどのピンに入るのかを示します。
int ledRed =9; int ledYellow =6; int ledGreen =3;
さて、 void setup()で 機能、ピンが入力か出力かを記述します。
void setup(){pinMode(ledRed、OUTPUT); pinMode(ledYellow、OUTPUT); pinMode(ledGreen、OUTPUT);}
最後に、 void loop()に以下を追加します 関数。それはMCUに何をすべきかを伝えます。
void loop(){//これは赤信号をフェードするだけです--ledRed // ledRed for(int i =0; i <=255; i ++){analogWrite(ledRed、i);遅延(30); } for(int i =255; i> =0; i-){analogWrite(ledRed、i);遅延(30); }}
ここで起こっているのは、MCUが整数 'i' かどうかをチェックしていることです。 255未満かどうか。そうである場合、 'i' の値 1つ増えます。プロセスは30ミリ秒遅延し、その後再起動します。 'i' の値 が255以上の場合、チェックされるたびに1ずつ減算されます。値が0に達すると、プロセスが最初からやり直されます。
ただし、フェードにかかる時間を変更する場合は、すべての delay()を変更する必要があります。 あなたが望む量に機能します。それはあまり効率的ではありません。 delay()を変更したいときに、物事をより簡単かつ迅速に行うため 何度も、これをコードの先頭に追加します。
const intおよびfade =30;
デフォルト値を設定します。この場合は、デフォルトの時間です。ここで、すべての delay()を変更します (フェード)への価値 。必要に応じて、別の名前を付けることができます。その結果、 delay() 関数は次のようになります。
delay(fade);
そして、コードは次のようになります。
int ledRed =9; int ledYellow =6; int ledGreen =3; const int feed =10; void setup(){pinMode(ledRed、OUTPUT); pinMode(ledYellow、OUTPUT); pinMode(ledGreen、OUTPUT);} void loop(){// ledRed for(int i =0; i <=255; i ++){analogWrite(ledRed、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledRed、i);遅延(フェード); } // ledYellow for(int i =0; i <=255; i ++){analogWrite(ledYellow、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledYellow、i);遅延(フェード); } // ledGreen for(int i =0; i <=255; i ++){analogWrite(ledGreen、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledGreen、i);遅延(フェード); } // ledYellow for(int i =0; i <=255; i ++){analogWrite(ledYellow、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledYellow、i);遅延(フェード); }}
プッシュボタン付きフェードライト:
このセクションの後、プロジェクトにボタンを追加できるようになります。
ご覧のとおり、LEDはボタンを押した後にのみ変化します。それでは、始めましょう。
回路図: <図>
すべてのLEDが同じ場所に保持されていることに気付いたかもしれませんが、プッシュボタンが追加されています。
コード:
まず、ボタンが接続されているピンをMCUに通知する必要があります。これを行うには、これをコードの先頭に追加します。
int button =7;
さて、 void setup() 関数、これを追加して、ボタンが出力の入力であるかどうかをMCUに通知します。
pinMode(button、INPUT);
これも関数に追加します。
digitalWrite(ledRed、LOW); digitalWrite(ledYellow、LOW); digitalWrite(ledGreen、HIGH);
スタートライトをセットします。今回は、開始LEDは緑色ですが、必要に応じて赤色または黄色に変更できます。
現在、 void loop()に大きな変更があります 関数。 loop()にあったすべてのもの およびfadeLights()という名前の関数に置き換えられました (名前は、必要に応じて異なる場合があります)。 loop()内 これで次のようになります:
void loop(){if(digitalRead(button)==HIGH){delay(15); //ソフトウェアデバウンスif(digitalRead(button)==HIGH){//ボタンが押された場合、関数fadeLights(); // fadeLightsは}} else {digitalWrite(ledRed、LOW);と呼ばれます。 //ボタンが押されていない場合、緑色のLEDはdigitalWrite(ledYellow、LOW);です。 //オンになり、他はオンになりません。 digitalWrite(ledGreen、HIGH); }}
前述のように、 void feedLights() 関数はループ内にあったものを持ちます。
void decodeLights(){for(int i =255; i> =0; i-){//緑から開始するため、緑をフェードさせる必要がありますanalogWrite(ledGreen、i);遅延(フェード); } // ledYellow for(int i =0; i <=255; i ++){analogWrite(ledYellow、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledYellow、i);遅延(フェード); } // ledRed for(int i =0; i <=255; i ++){analogWrite(ledRed、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledRed、i);遅延(フェード); } // ledYellow for(int i =0; i <=255; i ++){analogWrite(ledYellow、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledYellow、i);遅延(フェード); } // ledGreen for(int i =0; i <=255; i ++){analogWrite(ledGreen、i);遅延(フェード); }}
プロジェクトがビデオのように機能する場合は、正しく実行されています。順序が正しくない場合は、次を確認してください。
- コードが正しく記述されている場合
- LEDを正しいピンに接続した場合
ライトが点灯しない場合は、確認してください
- LEDを正しいピンに接続した場合
- ワイヤーを正しく接続した場合
- 数式を正しく記述した場合
ボタン付きのフェードライト(遅延の改善):
お気づきかもしれませんが、ボタンを離すとライトが消えていきます。このセクションの後、ボタンが押されているときにのみLEDがフェードするようにコードを編集できるようになります。
ここでわかるように、ボタンを離すと、LEDはデフォルトの順序である:
に戻ります。赤-オフ
黄色-オフ
緑-オン
回路図:
コンポーネントを追加したり、何か別のことをしたりする必要がないため、回路図は同じままです。LEDをフェードさせたいのです。
<図>
コード:
これ以上追加することはないので、最初に何も追加する必要はありません。ただし、遅延を変更しているため、これを削除する必要があります。
const intおよびfade =10; //これはもう必要ありません
setup()について変更することはありません 関数。 void loop()内 、その他を追加する必要があります ステートメント。
void loop(){if(digitalRead(button)==HIGH){delay(15); if(digitalRead(button)==HIGH){fadeLights(); }} else {//ここに追加digitalWrite(ledRed、LOW); digitalWrite(ledYellow、LOW); digitalWrite(ledGreen、HIGH); }}
これは、ボタンが押されていない場合、プログラムは fadeLights()を終了することを意味します その他に移動します デフォルトのLED順序を持つステートメント。以前とは異なります-以前は、ボタンは一度チェックされませんでした fadeLights() 呼び出されました。
ここで、すべての delay()を変更します これに対する機能:
for(int y =0; y <1000; y ++){//ボタンが離された場合if(digitalRead(button)==LOW){return; }
各ループで、マイクロプロセッサはボタンをチェックします。リリースされている場合は、返品 fadeLights()を停止するためにコマンドが呼び出されます 。私の見積もりによると、各forループが実行されると、おそらく約10マイクロ秒かかります。つまり、必要な速度にするために何度も実行する必要があります。
このチュートリアルを楽しんで、プロジェクトを頑張ってください。
コード
- フェードライト
- プッシュボタン付きのフェードライト
- プッシュボタン付きのフェードライト(遅延の改善)
フェードライト Arduino
int ledRed =9; int ledYellow =6; int ledGreen =3; const intおよびfade =10; void setup(){pinMode(ledRed、OUTPUT); pinMode(ledYellow、OUTPUT); pinMode(ledGreen、OUTPUT);} void loop(){// ledRed for(int i =0; i <=255; i ++){analogWrite(ledRed、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledRed、i);遅延(フェード); } // ledYellow for(int i =0; i <=255; i ++){analogWrite(ledYellow、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledYellow、i);遅延(フェード); } // ledGreen for(int i =0; i <=255; i ++){analogWrite(ledGreen、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledGreen、i);遅延(フェード); } // ledYellow for(int i =0; i <=255; i ++){analogWrite(ledYellow、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledYellow、i);遅延(フェード); }}
プッシュボタン付きフェードライト Arduino
int ledRed =9; int ledYellow =6; int ledGreen =3; int button =7; const int feed =10; void setup(){pinMode(ledRed、OUTPUT); pinMode(ledYellow、OUTPUT); pinMode(ledGreen、OUTPUT); pinMode(button、INPUT); digitalWrite(ledRed、LOW); digitalWrite(ledYellow、LOW); digitalWrite(ledGreen、HIGH);} void loop(){if(digitalRead(button)==HIGH){delay(15); if(digitalRead(button)==HIGH){fadeLights(); }} else {digitalWrite(ledRed、LOW); digitalWrite(ledYellow、LOW); digitalWrite(ledGreen、HIGH); }} void decodeLights(){for(int i =255; i> =0; i-){analogWrite(ledGreen、i);遅延(フェード); } // ledYellow for(int i =0; i <=255; i ++){analogWrite(ledYellow、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledYellow、i);遅延(フェード); } // ledRed for(int i =0; i <=255; i ++){analogWrite(ledRed、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledRed、i);遅延(フェード); } // ledYellow for(int i =0; i <=255; i ++){analogWrite(ledYellow、i);遅延(フェード); } for(int i =255; i> =0; i-){analogWrite(ledYellow、i);遅延(フェード); } // ledGreen for(int i =0; i <=255; i ++){analogWrite(ledGreen、i);遅延(フェード); }}
プッシュボタン付きフェードライト(遅延の改善) Arduino
int ledRed =9; int ledYellow =6; int ledGreen =3; int button =7; const int feed =10; void setup(){pinMode(ledRed、OUTPUT); pinMode(ledYellow、OUTPUT); pinMode(ledGreen、OUTPUT); pinMode(button、INPUT); digitalWrite(ledRed、LOW); digitalWrite(ledYellow、LOW); digitalWrite(ledGreen、HIGH);} void loop(){if(digitalRead(button)==HIGH){delay(15); if(digitalRead(button)==HIGH){fadeLights(); }} else {digitalWrite(ledRed、LOW); digitalWrite(ledYellow、LOW); digitalWrite(ledGreen、HIGH); }} void decodeLights(){for(int i =255; i> =0; i-){analogWrite(ledGreen、i); for(int y =0; y <1000; y ++){//ボタンが離された場合if(digitalRead(button)==LOW){return; }}} // ledYellow for(int i =0; i <=255; i ++){analogWrite(ledYellow、i); for(int y =0; y <400; y ++){//ボタンが離された場合if(digitalRead(button)==LOW){return; }}} for(int i =255; i> =0; i-){analogWrite(ledYellow、i); for(int y =0; y <400; y ++){//ボタンが離された場合if(digitalRead(button)==LOW){return; }}} // ledRed for(int i =0; i <=255; i ++){analogWrite(ledRed、i); for(int y =0; y <1000; y ++){//ボタンが離された場合if(digitalRead(button)==LOW){return; }}} for(int i =255; i> =0; i-){analogWrite(ledRed、i); for(int y =0; y <1000; y ++){//ボタンが離された場合if(digitalRead(button)==LOW){return; }}} // ledYellow for(int i =0; i <=255; i ++){analogWrite(ledYellow、i); for(int y =0; y <400; y ++){//ボタンが離された場合if(digitalRead(button)==LOW){return; }}} for(int i =255; i> =0; i-){analogWrite(ledYellow、i); for(int y =0; y <400; y ++){//ボタンが離された場合if(digitalRead(button)==LOW){return; }}} // ledGreen for(int i =0; i <=255; i ++){analogWrite(ledGreen、i); for(int y =0; y <1000; y ++){//ボタンが離された場合if(digitalRead(button)==LOW){return; }}}}
回路図
製造プロセス