Skocz do zawartości

Pomocna odpowiedź

Napisano

Jako że na Forum nie ma działu gdzie można umieścić jakieś krótkie kawałki kodu, które nie kwalifikują się do miana DIY - postanowiłem założyć taki wątek. Ciekawe czy się przyjmie...

Na początek - płynne miganie LED. Podobnego (ale bardziej rozbudowanego) kodu użyłem swego czasu w mini-reflektorze do teatru cieni (płynna zmiana barwy i jasności).

//#define USE_MICROS

#define LED_PIN 6

const int PERIOD = 5000;

#define MINV (1.0/256.0)
#define BITWIDTH 8
#define DELAYMS 2

float factor[2];
float wartosc;
uint8_t dir;

void setup()
{
    Serial.begin(115200);
    float pcnt = PERIOD / (2.0 * DELAYMS);
    factor[0] = 1.0 / (factor[1] = pow(1.0/MINV - 1.0, (1.0 / pcnt)));
    wartosc = MINV;
    dir = 1;
    
}

void analogWriteFloat(uint8_t pin, float wartosc)
{
    static uint8_t phase = 0;
    wartosc *= (1 << BITWIDTH);
    uint16_t pwm = (int)wartosc;
    if (wartosc < 16) {
        uint8_t w = (int)(4 * wartosc) & 3;
        if (w > phase) pwm+=1;
    }
    analogWrite(pin, pwm?pwm-1:0);
    phase = (phase + 1) & 3;
}

void loop()
{
    static uint32_t ms=millis();
#ifdef USE_MICROS
    static uint32_t usbeg=micros();
#endif
    wartosc *= factor[dir];
    if (wartosc < MINV) {
        wartosc = MINV; dir = 1;
    }
    else if (wartosc > 1.0) {
        wartosc = 1.0;
        dir = 0;
        Serial.println(millis() - ms);
        ms = millis();
    }
    analogWriteFloat(LED_PIN, wartosc);

    
#ifdef USE_MICROS
    uint32_t delta = micros() - usbeg;
    if (delta < DELAYMS * 1000) 
        delayMicroseconds(DELAYMS*1000 - delta);
    usbeg=micros();
#else
    delay(DELAYMS);
#endif
}

Miał być z komentarzami, ale kolega @farmaceuta podjął się ich napisania 🙂

(edytowany)
1 godzinę temu, ethanak napisał:

Nie zmieniałeś pinu?

Zmieniłem na pin BUILTIN czyli 13 dla Arduino...

Edit...dobra, znowu sie tłukiem okazałem 😉 przecież pin 13 to nie pin PWM na Ardu...

Edytowano przez farmaceuta

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...