LED’lerin indikatör olarak kullanıldığı projelerde görsellik önemlidir. indikatör LED için AnalogWrite aracılığı ile artan/azalan bir PWM döngüsü kurduğumuzda LED doğrusal olarak kısılır veya parlar. Ancak aşağıda yer alan kod gecikme süresi için logaritmik ölçek kullanıyor. Güzel bir “nefes alan” LED ışık efekti veriyor. Düzgün ayarlanmış ayarlarla, bir macbook’ta uyku LED’i efekti gibi görünebilir. Bu örnek Arduino projesi, dirençle seri olarak pin 11’e bağlanan temel LED’i yakar. Kodun tamamı GitHub’da, burada.
Logaritmik soldurma efekti, LED parlaklığını logaritmik ölçekte değiştirir. Bu, gecikme süresinin tüm adımlar için doğal logaritmanın hesaplanmasının bir sonucu olduğu anlamına gelir (aşağıdaki tabloya bakın).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#include <stdint.h> #include <math.h> /** * The instance of this class can control single LED. * - on, off, toggle (any digital pin) * - brightness (only PWM pins; i.e. for Arduino Uno: 3, 5, 6, 9, 10, 11) */ class BasicLed { public: BasicLed(uint8_t pin): pin_(pin) { pinMode(pin, OUTPUT); } /* Light the LED up */ void on(void) { digitalWrite(pin_, HIGH); } /* Turn the LED off */ void off(void) { digitalWrite(pin_, LOW); } /* Toogle LED on/off */ void toggle(void) { digitalWrite(pin_, !digitalRead(pin_)); } /* Set LED brightness from range <0, 255> */ void setBrightness(uint8_t value) { analogWrite(pin_, value); } private: uint8_t pin_; }; /* End of class BasicLed */ class LogarithmicFade { public: LogarithmicFade(const BasicLed& led, uint16_t extra_delay_us = 3000) : led_(led), extra_delay_us_(extra_delay_us) {} /* fade-in */ void in(void) { for (int16_t i = 0; i < 255; ++i) { led_.setBrightness(i); sleep(i); } } /* fade-out */ void out(void) { for (int16_t i = 255; i >= 0; --i) { led_.setBrightness(i); sleep(i); } } private: BasicLed led_; uint16_t extra_delay_us_; void sleep(uint8_t i) { delayMicroseconds((uint16_t)(log(1. / (i + 1)) + 5.) * 1000); delayMicroseconds(extra_delay_us_); } }; /* End of class LogarithmicFade */ BasicLed led(11); LogarithmicFade fade(led); void setup() { // do nothing } void loop() { fade.in(); fade.out(); } |
Aşağıdaki örnek koddaki gibi ekstra doğrusal gecikme süresini (mikrosaniye) ayarlayarak solma efektinin hızını değiştirebilirsiniz.
1 |
LogarithmicFade fade(led, 1000); |
Aşağıdaki video’dan doğrusal ve logaritmik (eksponansiyel) fade efeklerinin karşılaştırmasını izleyebilirsiniz.
Referans: https://blog.podkalicki.com/arduino-led-logarithmic-fade/