Już od dłuższego czasu chodziła mi po głowie myśl napisania jakiegoś driverka programowalnego (ileż można działać na tych chińskich 3-trybowcach ). Według mnie wyszło fajnie, więc stwierdziłem, że upublicznię kod
Możliwości:
- 8 predefiniowanych poziomów jasności
- 3 predefiniowane stroboskopy
- ignorowanie pierwszego kliknięcia
- ochrona ogniwa (napięcie predefiniowane)
- 8 dowolnie programowalnych slotów (na każdy slot możemy "wrzucić" jeden z powyżej wymienionych poziomów jasności i jeden z 3 stroboskopów (albo oczywiście tryb ciągły )
- wybór ilości aktywnych slotów (1-8)
- tryb rowerowy (blokada zmiany slotów i zablokowanie drivera na podanym slocie)
Opis konfiguracji oprogramowania
Kod sterownika składa się z 2 plików:
main.c - cały program, ale nie musicie go analizować, jest potrzebny tylko do kompilacji
setup.h - w tym pliku zwykły śmiertelnik ( ) może w wygodny sposób skonfigurować driver
Zacznę od omówienie pliku setup.h (potem na jego podstawie będzie wygodniej omówić obsługę drivera)
Wszystkie wartości w nim podawane muszą być liczbami naturalnymi ! ! !
Kod: Zaznacz cały
#define LVL1 255 // Jasnosci opcji w menu oraz slotow
...
#define LVL8 8
Kod: Zaznacz cały
#define STRB_TIME1 20 // Wspolne mnozniki czasu dla stroboskopow
#define STRB_TIME2 20
// 255 max w ponizszych ustawieniach STRBx
#define STRB1_TIME1 6 //*STRB_TIME1 Czas swiecenia stroboskopu przy danym podzielniku jasnosci
#define STRB1_FACTOR1 1 // Przez ile podzielic jasnosc
#define STRB1_TIME2 6 //*STRB_TIME2
#define STRB1_FACTOR2 255
...
Stroboskop 1 skonfigurowany jak powyżej będzie działać następująco:
- przez 120ms (6*20ms) będzie świecić jasnością zdefiniowaną przy programowaniu (jasność podana / 1)
- przez 120ms (6*20ms) LED będzie wyłączony (jakakolwiek jasność podzielona przez 255 spowoduje wyłączenie LEDa)
Czyli stroboskop ten to po prostu ~4Hz 100%-0%
W ustawieniach STRB..._... wartości czasu muszą zawierać się od 0 do 255, a dzielniki od 1 do 255 (bo przez 0 nie wolno dzielić )
Ustawienie czasu = 0 spowoduje "wyłączenie" stroboskopu (ale za to w drugiej części tego stroboskopu możemy ustawić dzielnik pozwalający nam na uzyskanie wcześniej niedostępnego poziomu jasności niż by to wynikało z podanych LVL...)
Wskazane jest dążenie do jak największych wartości STRB..._TIME... (czyli staramy się aby wspólne mnożniki były jak najmniejsze - ale nie musimy rezygnować z "wydziwionych" czasów stroboskopów, nie jest to warunek konieczny do poprawnego działania drivera).
Gdybyśmy w powyższym przykładzie linijkę
Kod: Zaznacz cały
#define STRB1_FACTOR2 255
Kod: Zaznacz cały
#define STRB1_FACTOR2 2
Kod: Zaznacz cały
#define IGN_CLICK_TIME 16 // (max 255)*128 Po jakim czasie ignorowac klikniecie
#define IGN_CLICK_SIG 100 // Dlugosc sygnalizacji zignorowania klikniecia
#define IGN_CLICK_FACTOR 2 // Przez ile podzielic jasnosc podczas ingnorowania klikniecia
Jak widać czas ten wynosi ~2s (16*128ms).
W celu zasygnalizowanie tego wydarzenia driver przez 100ms podzieli jasność przypisaną do slotu (którym oczywiście teraz świecimy) przez 2.
Kod: Zaznacz cały
#define MENU_IN 20 // Ile minimalnie klikniec do wejscia w tryb programowania
#define ROWER_STOP 10 // Ile klikniec do wylaczenia trybu rowerowego
Kod: Zaznacz cały
#define MENU_LVL1 100 // Jasnosci i czasy informujace o wejsciu w tryb programowania
#define MENU_TIME1 500
#define MENU_LVL2 40
#define MENU_TIME2 500
#define MENU_SIG_RPT 3 // Ile razy powtorzyc powyzsza kombinacje
Kod: Zaznacz cały
#define MENU_CHOOSE_RPT 3 // Ile razy pokazywac dostepne opcje
#define MENU_CHOOSE_TIME 1000 // Ile dac czasu na zaakceptowanie opcji
Kod: Zaznacz cały
#define BATT_LEVEL 134 // Napiecie przy ktorym zadziala zabezpieczenie
#define BATT_TIME 250 // Jak dlugo informowac
#define BATT_FACTOR 2 // Przez ile podzielic jasnosc
#define BATT_PAUSE 32 // (max 255)*128 Przerwa miedzy pomiarami
// BATT_PAUSE*128>BATT_TIME+10 Konieczny warunek do spełnienia!!!
Dalej w setup.h są już wartości początkowe konfiguracji drivera, których powinny być zrozumiałe (jeżeli nie są to wracamy i czytamy opis setupu od nowa - przed nimi są bardziej skomplikowane rzeczy )
Zmiany slotów chyba nie muszę opisywać - po prostu klikamy jak w każdym driverze
Po wykonaniu ~MENU_IN kliknięć wchodzimy w programowanie slotów (czyli w to, po co wszyscy to czytają ).
Menu składa się z 3 etapów
I Wybór slotu względem którego chcemy coś robić
II Co chcemy zrobić w oparciu o slot
III (opcjonalne) przypisywanie jasności do slotu
1. Programowanie danego slotu jako tryb ciągły
2. Programowanie danego slotu jako stroboskop 1
3. Programowanie danego slotu jako stroboskop 2
4. Programowanie danego slotu jako stroboskop 3
5. Zablokowanie zmiany slotów (tryb rowerowy) i ustawienie trybu na ten wybrany w etapie I
6. Zmiana ilości aktywnych slotów na wszystkie do slotu wybranego w etapie I (włącznie z tym slotem).
7. Pusta opcja, jej wybranie spowoduje opuszczenie programowania bez zmiany czegokolwiek.
8. Pusta opcja, jej wybranie spowoduje opuszczenie programowania bez zmiany czegokolwiek.
Jeżeli w którymkolwiek etapie nie klikniemy przed upływem MENU_CHOOSE_RPT powtórzeń możliwości to opuścimy menu bez zmiany czegokolwiek.
Możliwe jest zaprogramowanie slotu, który nie jest slotem należącym do aktywnego zakresu oraz zablokowanie zmiany slotów na slocie nie należącym do aktywnego zakresu
Programowania itp. nie będę opisywać, jest tego w internecie na tony.
Podziękowania dla:
- Mirosław Kardaś - za książkę "Mikrokontrolery AVR Język C Podstawy Programowania" bez której w życiu bym tego nie napisał
- Krauser (forum.atnel.pl) - za znalezienie błędów w kodzie
- Fredek - programowanie dropa, wartości domyślne w Setup.h, przeliczanie napięcia do protekcji ogniwa, przekonanie mnie do uproszczenia pliku Setup.h (wcześniej liczylibyście bardzo wesołe wzorki )
Proponowane FUSY:
LOW 0x35
HIGH 0xEB
Download:
http://fredek.no-ip.org/barney/bLEDd13/