[113] Budujemy ze zrozumieniem - elektroniczny budzik cz. 7
![[113] Budujemy ze zrozumieniem - elektroniczny budzik cz. 7](/_next/image?url=https%3A%2F%2Farduino.pl%2Fimgproxy%2FKgV_XeC4aZAyoioU1K4zL3fQMEjOQBU7EVJcf__qCOY%2Ff%3Awebp%2Fw%3A1200%2FbG9jYWw6Ly8vaW1hZ2VzLzAtNjgzLzFlZWQ3L2I0NTVmLzAtNjgzMWVlZDdiNDU1ZjUzOTI0NjUyNS5wbmc%3D.webp&w=3840&q=75)
My, elektronicy, najbardziej lubimy bajery. A w mikroelektronice, gdzie podstawę urządzeń stanowią mikrokontrolery, bajery nie kosztują nic poza dodatkową pracą nad programem. I coś takiego spróbujemy teraz wdrożyć do naszego nowo powstałego budzika. Nie wiem jak wy, ale ja nie lubię tych mrugających dwukropków. Byłoby ładniej, gdyby rozjarzały się jakoś płynnie. Dlatego – jak pisałem wcześniej, dwukropek podłączyłem do pinu wspierającego PWM, mającego możliwość wystawiania zmiennego przebiegu, dającego zmienną jasność diody. Zróbmy więc z tego pożytek.
void przerwanie() { // Tutaj lądujemy za każdym razem, gdy wewnętrzny timer odliczy 2500 mikrosekund.
if (trybEdycji == LOW) { // Efekt animacji dwukropka.
analogWrite(dwukropek, 255 - licznikPrzerwan / 2);
}
W pierwszej wersji – prościutko. Fragment odpowiedzialny za mruganie dwukropka zamienimy wysyłaniem tam wartości PWM, którą uzyskamy z podzielenia przez dwa licznika przerwań. Dzielimy, bo ten sięga 400, a PWM oferuje zakres ośmiobitowy. I to wszystko. Działa to nieco ładniej od dwukropka migającego, ale trochę zbyt szybko no i w jedną stronę tylko. Skomplikujmy tę procedurę.
void przerwanie() { // Tutaj lądujemy za każdym razem, gdy wewnętrzny timer odliczy 2500 mikrosekund.
if (kierunekAnimacji == HIGH) { // Rozjaśnianie diody dwukropka.
animacja++;
if (animacja == 1023) {
kierunekAnimacji = LOW;
}
} else { // Ściemnianie diody dwukropka.
animacja--;
if (animacja == 0) {
kierunekAnimacji = HIGH;
}
}
analogWrite(dwukropek, animacja / 4); // Ładuj wartość animacji /4 do PWM sterującego dwukropkiem.
Równolegle z licznikiem przerwań będziemy teraz zwiększać bądź zmniejszać zmienną o nazwie animacja. Ustawimy pułapkę na 1023. Gdy tam dojdziemy, przestawimy flagę kierunku zliczania kierunekAnimacji i odtąd będziemy zmniejszać ową wartość do zera, by znowu ją zwiększać. Ja na to mówię wahadełko, bo procedura ta daje nam nieskończone wahania wartości między skrajnymi, raz do góry, raz na dół.
Dlaczego akurat 1023? Bo ładnie się to dzieli na przedział od zera do 255, a jednocześnie 1023 razy 2,5 ms daje ponad 2 i pół sekundy rozjaśniania i tyleż ściemniania. Tak pulsująca dioda dwukropka wygląda dostojnie i nie denerwuje, zwłaszcza nocą. Współczynnik podziału jak i przesunięcie pozwolą nam osłabić amplitudę pulsów – w razie potrzeby. Takich ubogaceń animacjami, piskami i różnymi dziwactwami możemy zrobić więcej, jednak należy zachować umiar, by nie przedobrzyć zarówno estetycznie jak i skomplikowaniem programu, który przez użycie wieloznaczności działania klawiatury i tak już jest dość nieczytelny.
Na razie to już wszystko, jeśli mowa o naszym budziku. Ale nie wszystko w temacie czasu i wkrótce zaproszę do kolejnych artykułów, tym razem odpowiadających na pytanie: skąd wziąć wzorniki czasu, by nie trzeba było bazować na własnym, niezbyt dokładnym źródle kwarcowym.