Skocz do zawartości

Różne drobiazgi


ethanak

Pomocna odpowiedź

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 🙂

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.