2017-06-27 18 views
0

Arduinoに接続されたLEDのデューティサイクルを制御してLEDの輝度を測定するサンプルコードを書きました。私は、特定の期間、明るい光を最大限に抑えるために、最も明るい光の範囲を得たいと考えています。 desired_brightness = 1とすると、LEDは93ルクス単位で発光します。最も明るい光を得る方法に関する提案?Arduinoを使用してLEDの明るさを制御する

int led = 3;   // the pin that the LED is attached to 
int brightness =0; // how bright the LED is 
int incrementfactor = 10; // how many points to fade the LED by 
int desired_brightness = 255 ; 
int extra_delay = 1000; 

void setup() {  // declare pin 9 to be an output: 
    pinMode(led, OUTPUT); 
    analogWrite(led, desired_brightness); 
} 
void loop() { 
    analogWrite(led, desired_brightness); 
    brightness=brightness+incrementfactor; 
    if (brightness==desired_brightness) { 
    delay(extra_delay); 
    } 
} 

答えて

0

私はあなたのコードを少しカスタマイズしました。主な問題は、あなたはすぐに最大限の明るさに向かい、決してそれを減らしていないということでした。 analogWrite()は0から255までの値しか取ることができません。あなたは255から始まりそこから増加していたので、明るく留まりました。それはあなたがこれらの日非常に多くの電子機器に見る「ブリージング効果」だ、と永遠にループし、代わりにこれを試してみてください:

int ledPin = 3;  // the pin that the LED is attached to 
int brightness =0; // how bright the LED is 
int extra_delay = 1000; // the extra delay at max 
int super_delay = 5000; // super delay at min 
int direction = 1; // the dimmer-brighter direction 

void setup() {  
    pinMode(ledPin, OUTPUT); 
    analogWrite(ledPin, 0); 
} 

void loop() { 
    analogWrite(ledPin, brightness); // light at certain brightness 
    //delay(5); // wait a bit, stay at this level so we can see the effect! 
    delay(50); // longer delay means much slower change from bright to dim 

    if (direction == 1) // determine whether to go brighter or dimmer 
    brightness += 1; 
    else 
    brightness -= 1; 

    if (brightness == 255) // switch direction for next time 
    { 
    direction = -1; 
    delay(extra_delay); // extra delay at maximum brightness 
    } 
    if (brightness == 0) // switch direction, go brighter next time 
    { 
    direction = 1; 
    delay(super_delay); // super long delay at minimum brightness 
    } 
} 

これは、その後、明るく行く暗く、そして繰り返されます。遅延は非常に重要です。これを減らすか長くすることはできますが、それがなければ、変化は非常に速く起こります。オシロスコープでのみ目で見ることはできません。これがあなたを助けることを願って!

EDIT:

追加したレベルの測定のための最小輝度で「スーパー遅延」。

このようなパルス幅変調は、がまだ出力ピンから完全な駆動電圧を与えることに留意してください。 PWMは、ピンがハイのときとローのときの比率を変更するだけです。このAduinoでは、電圧は0V〜3.3Vの間で即座に急激に変化します。この出力から真のアナログ電圧を得るには、PWMのハイとローをフィルタしてより平滑な平均DC電圧にする回路が必要です。あなたがそれを追求したい場合は、 "RCローパスフィルター"を検索するか、サイトlike this oneにアクセスしてください。

+0

。ありがとうございました。しかし、私はどのように私は長い光を維持するために最低の強度を作るのか分からない。私が書いたコードでは、 'int desired_brightness = 1'を置くと、最も低い光強度が得られます。しかし、その強度で私は93のlux値を取得しています。私はあなたのコードも試しました。私が到達できる光の最低強度は、まだルクス値のままです。93 –

+0

LEDを駆動するピンがオンまたはオフです。問題は、どれくらいの時間を過ごすか、過ごす時間、視力の人間の執拗さ、より低い比率でのオンとオフの比較、より暗く見えます。真の低電圧を得るための唯一の方法は、PWM信号を取ってそれをフィルタリングして、RCまたはLCネットワークのように、上下PWM信号を実際の変化するDC電圧に平滑化することです。それを行うにはもっと多くの電子部品が必要です。 – TomServo

+0

@ Georgeluke私は上記のコードに "super_delay"を5秒間最低限に抑えるために追加しました。ただし、この最小値は基本的に「オフ」です。私の編集の残りの部分を読んで、私がそれを得たと感じたら、upvoteし、これまでのところ私の答えを受け入れる。 – TomServo

関連する問題