Autor: hiszpan5
Redakcja: Dondu
W czasach, gdy oszczędność energii elektrycznej ma coraz większe znaczenie, często spotykane są oświetlenia zrealizowane za pomocą diod LED.
Bardzo popularne są tzw. taśmy LED. Składają się one z diod LED połączonych szeregowo, najczęściej po 3 w jednej grupie, a z kolei grupy połączone są ze sobą równolegle. Taśmy są samoprzylepne i elastyczne, niektóre nawet wodoodporne.
Zasilane są one najczęściej napięciem stałym o wartości 12V. Znalazły zastosowanie jako oświetlenie pomieszczeń, wystaw sklepowych lub są stosowane jako element dekoracyjny (efektowne podświetlenie np. sufitu).
Chcąc zamontować w swoim mieszkaniu np. oświetlenie zrealizowane za pomocą taśm LED, należy zaopatrzyć się dodatkowo w zasilacz oraz sterownik. Na polskim rynku jest wiele różnych sterowników. Są to gotowe rozwiązania, toteż wiele osób zaczyna zauważać po pewnym czasie jakieś niedogodności, coś im przeszkadza w danym sterowniku np. brak określonej funkcji.
Rozwiązaniem tego problemu jest skonstruowanie własnego, programowalnego sterownika. Jego zaletą jest to, że użytkownik może zaprogramować takie funkcje, z których będzie korzystał. Może też stworzyć takie funkcje, których gotowe produkty nie posiadają, a gdy uzna, że coś należy zmienić, może dowolnie przeprogramować układ.
Porównując zalety gotowego sterownika oraz takiego, który każdy we własnym zakresie może wykonać, zdecydowaną przewagę ma ten domowej produkcji. W tym artykule opiszę sterownik diod LED, który został wykonany w celu automatycznego lub zdalnego sterowania oświetleniem LED, w zależności od jasności w danym pomieszczeniu.
Ogólny opis sterownika
Układ sterowania oparty jest o mikrokontroler ATmega16/ATmega32 firmy Atmel, który w zależności od oświetlenia w danym pomieszczeniu steruje jasnością diod LED za pomocą tranzystora mocy. Zmiana parametrów lub włączenie/wyłączenie sterownika możliwe jest przy pomocy przycisków umieszczonych na płytce, bądź na pilocie zdalnego sterowania. Informacje o natężeniu światła oraz jasności świecenia diod LED wyświetlane są na wyświetlaczu LCD 20x4.Sterownik LED |
Szczegółowy opis sterownika
Po lewej stronie sterownika znajdują się dwa złącza zasilania: jedno zrealizowane za pomocą złączy ARK, natomiast drugie to gniazdo do podłączenia wtyku zasilacza. Układ musi być zasilany napięciem stałym 12V, takim samym jak napięcie zasilania sterowanych przez niego diod LED. Natężenie zależy od ilości diod LED, które mają być podłączone do sterownika.Do mikrokontrolera oraz do pozostałych elementów dostarczane jest napięcie 5V, dzięki popularnemu stabilizatorowi LM7805. Prąd pobierany przez układ sterowania wraz z wyświetlaczem (nie licząc prądu pobieranego przez sterowane diody LED) to około 133mA. Jako zabezpieczenie użyty został bezpiecznik rurkowy o wartości 200mA. Zielona dioda LED w lewej części układu informuje użytkownika o obecności napięcia 5V.
Urządzenie może komunikować się z użytkownikiem zarówno za pomocą przycisków umieszczonych na płytce, jak i za pomocą pilota zdalnego sterowania. Na płytce sterownika znajdują się 4 przyciski: trzy w lewej dolnej części służą do komunikacji między użytkownikiem a urządzeniem (ustawianie czułości układu, jasności świecenia diod LED, przełączanie pomiędzy trybami pracy oraz włączenie/wyłączenie sterownika), natomiast czwarty przy mikrokontrolerze to przycisk RESET.
Użytkownik może sterować urządzeniem za pomocą dowolnego pilota, który obsługuje standard RC5. Obecnie zaprogramowane są tylko 3 przyciski, lecz można zaprogramować o wiele więcej. Sygnał z pilota odbierany jest za pomocą scalonego odbiornika podczerwieni TSOP, który znajduje się w prawym dolnym rogu.
W górnej części sterownika znajduje się 16 pinowe złącze umożliwiające podłączenie dowolnego wyświetlacza LCD. Kontrast wyświetlacza ustawiany jest ręcznie za pomocą potencjometru znajdującego się pod złączem. Podświetlenie wyświetlacza załączane jest przez tranzystor NPN BC547, którym steruje mikrokontroler. Układ posiada 3 informacyjne diody LED (zieloną, żółtą oraz czerwoną). Czerwona dioda świeci się, gdy układ jest w trybie czuwania, żółta dioda informuje o świeceniu się diod LED, natomiast zielona informuje o pracy urządzenia, a mrugając sygnalizuje zmianę trybu pracy.
Pracą układu zarządza mikrokontroler ATmega16/ATmega32 pracujący z zewnętrznym rezonatorem kwarcowym o wartości 16MHz. Programowanie odbywa się poprzez interfejs ISP lub JTAG. 10 pinowe złącza IDC obydwu interfejsów znajdują się na płytce sterownika, przy mikrokontrolerze. Należy na to zwrócić szczególną uwagę, ponieważ obydwa złącza są identyczne i dlatego zastosowano różne kolory w celu ich łatwiejszej identyfikacji. Złącze ISP jest w kolorze czarnym, natomiast złącze programatora JTAG ma kolor szary.
Program napisany został w języku C. Kod programu może być dowolnie modyfikowany i dostosowywany do indywidualnych potrzeb użytkownika. Podczas programowania zostały wykorzystane biblioteki:
Płynne sterowanie diodami LED odbywa się za pomocą sygnału PWM (ang. Pulse-width modulation). Elementem wykonawczym jest tranzystor mocy IRF530, który pozwala na podłączenie diod lub innych elementów, mających właściwość uśredniania mocy czynnej pobierających prąd do 4A.
Pomiar natężenia światła został zrealizowany za pomocą fotorezystora wchodzącego w skład dzielnika napięcia. Mikrokontroler za pomocą przetwornika ADC (ang. Analog to Digital Converter), odczytuje wartość napięcia, która jest 'proporcjonalna' do natężenia światła a następnie generuje odpowiedni sygnał PWM.
Wszystkie, nie wymienione wyżej, informacje na temat zastosowanych układów znajdują się w notach katalogowych.
Zdjęcia układu
Schematy elektryczne
Płytka została wytrawiona metodą "żelazkową". Po przeniesieniu tonera na laminat została wstępnie przycięta do pożądanych wymiarów. Jako środek trawiący został użyty roztwór nadsiarczanu sodu (B327). Po wytrawieniu płytka została ostatecznie przycięta, następnie zostały wywiercone otwory, a w kolejnym etapie wszystko polutowano.Zdecydowałem się zastosować mikrokontroler oraz wszystkie inne elementy w wersji przewlekanej. W razie awarii mikrokontrolera lub innego elementu można go szybko i bez problemu wymienić. Ma to swoje konsekwencje w postaci znacznie większego rozmiaru płytki sterownika, porównując ją do wersji, w której zastosowano by elementy SMD.
Poniżej schematy elektryczne układu wykonane w programie CadSoft EAGLE.
Schemat ideowy wykonany w programie CadSoft EAGLE |
Schemat montażowy wykonany w programie CadSoft EAGLE |
Koszty wykonania
Prawie wszystkie wykorzystane w projekcie elementy miałem w swoim 'warsztacie', więc podane koszty mają charakter orientacyjny.ATmega 16 Podstawka precyzyjna DIP40 Stabilizator 7805 Złącza ARK Złącza IDC - 10 pin Przyciski microswitch Odbiornik podczerwieni TSOP Tranzystor mocy NPN IRF530 Tranzystor NPN BC547 Fotorezystor Złącze zasilania Diody LED Dioda prostownicza 1N4004 Kondensatory ceramiczne Kondensatory elektrolityczne Cewka Rezonator kwarcowy 16MHz Rezystory Potencjometr mont. 10KΩ Gniazdo bezpiecznika Listwa kołkowa (GOLDPIN) |
x 1 x 1 x 1 x 2 x 2 x 4 x 1 x 1 x 1 x 1 x 1 x 4 x 1 x 8 x 5 x 1 x 1 x 10 x 2 x 1 x 1 |
12 zł 1 zł 1 zł 2 zł 1 zł 1 zł 3 zł 2 zł 1 zł 1 zł 1 zł 1 zł 1 zł 1 zł 1 zł 1 zł 1 zł 1 zł 2 zł 1 zł 1 z |
Doliczając koszty wykonania płytki całkowity koszt wyniósł około 40 zł
Przerwanie
Podczas projektowania obwodu drukowanego nie zostało uwzględnione to, że funkcja odczytująca dane z odbiornika TSOP korzysta z tego samego timera, z którego korzysta sprzętowy generator sygnału PWM. Uniemożliwiło to skorzystanie ze sprzętowej obsługi sygnału PWM.Rozwiązaniem tego problemu okazała się implementacja obsługi sygnału PWM w sposób programowy. Dokonano tego za pomocą przerwania od przepełnienia Timera0. Poniżej znajduje się fragment kodu przedstawiający przerwanie oraz jego konfigurację.
// TIEMER 0 TCCR0 |= (1<<CS00); // preskaler = 1 TIMSK = (1<<TOIE0); // zezwolenie na przerwanie od przepełnienia timera (...) int pwm; // zmienna pwm int t; // zmienna przerwania od timer0 ISR (TIMER0_OVF_vect) // przerwanie od TIMER'a 0 { t++; // inkrementacja zmiennej t if (t>pwm) PORTD &= ~(1<<4); // dioda 1 on else PORTD |= (1<<4); // dioda 1 off if (t==255) t=0; // wyzerowanie zmiennej }
Tryb pracy urządzenia
Zmiana trybu pracy urządzenia odbywa się poprzez naciśnięcie środkowego przycisku na płytce sterownika lub za pomocą pilota poprzez naciśnięcie przycisku on/off (włącz/wyłącz). Poniższy kod programu ilustruje funkcje wykonujące się podczas zmiany trybu pracy sterownika.Za tryb pracy sterownika odpowiada zmienne "tryb". Funkcja "zmien_tryb" wykonywana jest wtedy, gdy zostanie wciśnięty odpowiedni przycisk na pilocie lub na płytce sterownika. Następnie zmienna "tryb" zostaje zmieniona oraz zostaje wywołana funkcja konfigurująca diody LED, podświetlenie wyświetlacza LCD, w określony dla danego trybu pracy sposób. Na wyświetlaczu zostaje wyświetlona nazwa aktualnego trybu pracy.
void zmien_tryb(void) // włączenie lub wyłączenie urządzenia { for (int i=0;i<5;i++) // mruganie diodą { PORTD |= (1<<0); // dioda 1 on _delay_ms(100); PORTD &= ~(1<<0); // dioda 1 off _delay_ms(100); } switch(tryb) // wybór trybu { case 0: // jeżeli tryb = 0 to { tryb = 1; // zmień tryb na tryb 1 tryb_auto(); // wykonaj funkcje tryb auto } break; case 1: // jeżeli tryb = 1 { tryb = 2; // zmien tryb na tryb 2 tryb_man(); // wykonaj funkcje tryb man } break; case 2: // jeżeli tryb = 2 { tryb = 0; // zmień tryb na tryb 0 tryb_stand_by(); // wykonaj funkcje tryb stand_by } break; } } void tryb_auto (void) // funkcja przejścia w tryb auto { PORTD |= (1<<0); // dioda 1 on PORTD |= (1<<1); // dioda 2 on PORTD &= ~(1<<2); // dioda 3 off PORTD |= (1<<5); // podswietlenie on PORTD |= (1<<4); // pwm on LCD_GoTo(0,0); // ustawienie kursora LCD_WriteText("TRYB AUTOMATYCZNY"); // tryb stand_by LCD_GoTo(0,20); LCD_WriteText("CZULOSC: "); LCD_WriteData(ustaw); } void tryb_man (void) // funkcja przejścia w tryb manualny { PORTD |= (1<<0); // dioda 1 on PORTD |= (1<<1); // dioda 2 on LCD_Clear(); LCD_GoTo(0,0); // ustawienie kursora LCD_WriteText("TRYB MANUALNY"); // tryb stand_by } void tryb_stand_by (void) // funkcja przejścia w tryb standby { PORTD &= ~(1<<0); // dioda 1 off PORTD &= ~(1<<1); // dioda 2 off PORTD |= (1<<2); // dioda 3 on PORTD &= ~(1<<5); // podswietlenie off PORTD &= ~(1<<4); // pwm off pwm = 0; // pwm = 0 LCD_Clear(); // czyszczenie wyswietlacza LCD_GoTo(0,0); // ustawienie kursora LCD_WriteText("TRYB STAND BY"); // wyswietlenie tryb stand_by }
RC5 - kody z pilota
Poniżej przedstawiona została funkcja odpowiedzialna za odbiór danych z pilota zdalnego sterowania. Gdy dane z pilota zostaną odebrane, wykonana zostaje instrukcja warunkowa. Jeżeli wartość logiczna funkcji będzie prawdą, to zostaną sprawdzone kolejne instrukcje odpowiadające za wykonanie określonych funkcji, gdy określony przycisk na pilocie został naciśnięty. Do każdego przycisku przypisany jest określony numer komendy.if(RC5_NewCommandReceived(&command)) { RC5_Reset(); if (command == 12) zmien_tryb(); // jeżeli power off wciśnięte if ((command == 16) & (tryb == 1)) nastawa_up(); // jeżeli vol_up to nastawa up if ((command == 17) & (tryb == 1)) nastawa_down(); // jeżeli vol_down to nastawa down if ((command == 16) & (tryb == 2)) pwm_up(); // jeżeli vol_up to nastawa up if ((command == 17) & (tryb == 2)) pwm_down(); // jeżeli vol_down to nastawa down }
Objaśnienie działania przycisków:
W trybie "STAND BY": - prawy przycisk - nieaktywny - środkowy przycisk - zmiana trybu na automatyczny, włączenie sterownika - lewy przycisk - nieaktywny |
W trybie automatycznym: - prawy przycisk - zwiększenie czułości - środkowy przycisk - zmiana trybu na manualny - lewy przycisk - zmniejszenie czułości |
W trybie manualnym: - prawy przycisk - zwiększenie jasności oświetlenia - środkowy przycisk - zmiana trybu na STAND BY, wyłączenie sterownika - lewy przycisk - zmniejszenie jasności oświetlenia |
Literatura
- Dondu Jacek. Zasilanie mikrokontrolera [online]. [dostęp: 11 marca 2014], Dostępny w Internecie: http://mikrokontrolery.blogspot.com/2011/04/zasilanie-mikrokontrolera.html
- Dondu Jacek. Minimalne podłączanie pinów mikrokontrolera [online]. [dostęp: 11 marca 2014], Dostępny w Internecie: http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html
- Atmel Corporation: ATmega16 datasheet. [dostęp: 11 marca 2014], Dostępny w Internecie: www.atmel.com/Images/doc2466.pdf (kopia 1, kopia 2)
- Vishay Semiconductors: TSOP312.., TSOP314.., IR Receiver Modules for Remote Control Systems. [dostęp: 11 marca 2014], Dostępny w Internecie: www.vishay.com/docs/82492/tsop312.pdf (kopia 1, kopia 2)
- Fairchild Semiconductor: LM7805 Datasheet. [dostęp: 11 marca 2014], Dostępny w Internecie: www.fairchildsemi.com/ds/LM/LM7805.pdf (kopia 1, kopia 2)
- Vishay Semiconductors: Power MOSFET IRF530, SiHF530. [dostęp: 11 marca 2014], Dostępny w Internecie: www.vishay.com/docs/91019/91019.pdf (kopia 1, kopia 2)
Moje błędy
W trakcie pisania artykułu zauważyłem, że popełniłem kilka błędów, a mianowicie:
- Źle podłączony przycisk RESET do mikrokontrolera. Aby poprawnie podłączyć przycisk RESET do mikrokontrolera niezbędne jest zastosowanie: dodatkowego kondensatora filtrującego podłączonego do masy - przed przyciskiem, rezystora podłączonego szeregowo z przyciskiem do masy oraz diody zabezpieczającej - podłączonej równolegle z rezystorem podciągającym (pull-up) pin RESET do +5V.
- Źle jest również podłączony tranzystor mocy. Aby wszystko było poprawnie, należy rezystor podłączony szeregowo, pomiędzy mikrokontrolerem a tranzystorem, wymienić na rezystor o wartości 1K i ponadto dołączyć rezystor pull-down do bramki tranzystora o wartości 10K, aby zapobiec stanowi nieustalonemu.
Pliki do pobrania
W programie wykorzystałem bibliotekę wyświetlacza LCD Radosława Kwietnia oraz bibliotekę RC5 Filipa Sobalskiego.Do pobrania komplet plików programu: sterownik_led.zip (kopia)
main.c
#include <avr/io.h> // biblioteka wejsc wyjsc #include <avr/delay.h> // biblioteka opóźnień #include <avr/pgmspace.h> // biblioteka #include <avr/interrupt.h> // biblioteka przerwań #include "HD44780/hd44780.h" // biblioteka wyswietlacza lcd #include "RC5/rc5.h" // biblioteka RC-5 #define VREF_VCC (1<<REFS0) // ustawienia napięcia odniesienia #define VREF_256 (1<<REFS1)|(1<<REFS0) // ustawienia napiecia odniesienia int value; // zmienna wartosc adc (0-1023) int ustaw; // zmienna załączenia pwm int pwm; // zmienna pwm int t; // zmienna przerwania od timer0 int command; int tryb = 0; // zmienna trybu pracy ISR(TIMER0_OVF_vect) // przerwanie od TIMER'a 0 { t++; // inkrementacja zmioennej t if(t>pwm) { PORTD &= ~(1<<4); // dioda 1 on } else { PORTD |= (1<<4); // dioda 1 off } if(t==255) { t=0; // wyzerowanie zmiennej } } void zmien_tryb(void) // włączenie lub wyłączenie urządzenia { for(int i=0; i<5; i++) { // mruganie diodą PORTD |= (1<<0); // dioda 1 on _delay_ms(100); PORTD &= ~(1<<0); // dioda 1 off _delay_ms(100); } switch(tryb) { // wybór trybu case 0: { // jeżeli tryb = 0 to tryb = 1; // zmień tryb na tryb 1 tryb_auto(); // wykonaj funkcje tryb auto } break; case 1: { // jeżeli tryb = 1 tryb = 2; // zmien tryb na tryb 2 tryb_man(); // wykonaj funkcje tryb man } break; case 2: { // jeżeli tryb = 2 tryb = 0; // zmień tryb na tryb 0 tryb_stand_by(); // wykonaj funkcje tryb stand_by } break; } } void tryb_auto(void) // funkcja przejścia w tryb auto { PORTD |= (1<<0); // dioda 1 on PORTD |= (1<<1); // dioda 2 on PORTD &= ~(1<<2); // dioda 3 off PORTD |= (1<<5); // podswietlenie on PORTD |= (1<<4); // pwm on LCD_GoTo(0,0); // ustawienie kursora LCD_WriteText("TRYB AUTOMATYCZNY"); // tryb stand_by LCD_GoTo(0,20); LCD_WriteText("CZULOSC: "); LCD_WriteData(ustaw); } void tryb_man(void) // funkcja przejścia w tryb manualny { PORTD |= (1<<0); // dioda 1 on PORTD |= (1<<1); // dioda 2 on LCD_Clear(); LCD_GoTo(0,0); // ustawienie kursora LCD_WriteText("TRYB MANUALNY"); // tryb stand_by } void tryb_stand_by(void) // funkcja przejścia w tryb standby { PORTD &= ~(1<<0); // dioda 1 off PORTD &= ~(1<<1); // dioda 2 off PORTD |= (1<<2); // dioda 3 on PORTD &= ~(1<<5); // podswietlenie off PORTD &= ~(1<<4); // pwm off pwm = 0; // pwm = 0 LCD_Clear(); // czyszczenie wyswietlacza LCD_GoTo(0,0); // ustawienie kursora LCD_WriteText("TRYB STAND BY"); // wyswietlenie tryb stand_by } void nastawa_up(void) // zwiększanie wartosci NASTAWA //i wyswietlanie na ekranie { ustaw +=10; if(ustaw>1023) { ustaw=1020; } LCD_GoTo(0,20); LCD_WriteText("CZULOSC: "); LCD_WriteData(ustaw); _delay_ms(50); } void nastawa_down(void) // zmniejszanie wartosci nastawa //i wyswietlanie na ekranie { ustaw -=10; if(ustaw<0) { ustaw=0; } LCD_GoTo(0,20); LCD_WriteText("CZULOSC: "); LCD_WriteData(ustaw); LCD_WriteText(" "); _delay_ms(50); } void pwm_up(void) // funkcja recznego zwiekszania pwm { pwm++; // inkrementacja zmiennej pwm _delay_ms(50); if(pwm > 255) { pwm = 255; } } void pwm_down(void) // funkcja recznego zmniejszania pwm { pwm--; // dekrementacja zmiennej pwm _delay_ms(50); if(pwm < 0) { pwm = 0; } } int main(void) // funkcja główna { DDRD=0b00110111; // diody led, podczerwien, pwm, podswietlenie DDRB=0b00000000; // przyciski PORTB |= (1<<0); // S1 pull-up PORTB |= (1<<1); // S2 pull-up PORTB |= (1<<2); // S3 pull-up // TIEMER 0 TCCR0 |= (1<<CS00); // preskaler = 1 TIMSK = (1<<TOIE0); // zezwolenie na przerwanie od przepełnienia timera // PWM sprzetowy - konfiguracja //TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10); //TCCR1B = (1<<CS10)|(1<<WGM12); //ICR1 = 255; LCD_Initalize(); // inicjalizacja lcd RC5_Init(); // inicjalizacja dekodowania IR sei(); // włączenie globalnego systemu przerwań ADMUX = 0; // ustawienie kanalu adc ADMUX |= VREF_256; // ustawienie adc ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // ustawienia adc LCD_Clear(); // czyszczenie lcd tryb_stand_by(); // tryb stand_by while(1) { if(!tryb) if(bit_is_clear(PINB,1)) { zmien_tryb(); } // jeżeli odebrano prawidłowe kody z pilota if(RC5_NewCommandReceived(&command)) { RC5_Reset(); // jeżeli power off wciśnięte if(command == 12) { zmien_tryb(); } // jeżeli vol_up to nastawa up if((command == 16) & (tryb == 1)) { nastawa_up(); } // jeżeli vol_down to nastawa down if((command == 17) & (tryb == 1)) { nastawa_down(); } // jeżeli vol_up to nastawa up if((command == 16) & (tryb == 2)) { pwm_up(); } // jeżeli vol_down to nastawa down if((command == 17) & (tryb == 2)) { pwm_down(); } } if(tryb == 1) { // tryb 1 - automatyczny // odczyt ADC ADCSRA |= (1<<ADSC); while(!(ADCSRA & (1<<ADSC))); value = ADCW; // odczyt wartosci // wyswietlanie wartosci LCD_GoTo(1,0); // lokalizacja napisu LCD_WriteText("ADC= "); // wyswietlenie napisu LCD_WriteData(value); // wyswietlenie wartosci ADC LCD_WriteText(" "); // wyswietlenie " " // jeżeli adc bedzie wieksze od nastawy - pwm on if(value>ustaw) { PORTD |= (1<<1); // dioda 2 on pwm=value/4; // pwm = adc / 4 LCD_GoTo(1,11); // lokalizacja napisu LCD_WriteText("PWM= "); // wyswietlenie napisu LCD_WriteData(pwm); // wyswietlenie zmiennej LCD_WriteText(" "); // wyswietlenie napisu - maska } else { // pwm off PORTD &= ~(1<<1); // dioda 2 off pwm=0; // wyłącz pwm LCD_GoTo(1,11); // lokalizacja napisu LCD_WriteText("PWM= "); // wyswietlenie napisu LCD_WriteData(pwm); // wyswietlenie zmiennej LCD_WriteText(" "); // wyswietlenie napisu - maska } // jeżeli S1 wciśnięty zwiększ nastawa if(bit_is_clear(PINB,2)) { nastawa_up(); } // jeżeli S3 wciśnięty zmniejsz nastawa if(bit_is_clear(PINB,0)) { nastawa_down(); } if(bit_is_clear(PINB,1)) { zmien_tryb(); } } if(tryb == 2) { // tryb 2 - reczny LCD_GoTo(1,0); // lokalizacja napisu LCD_WriteText("PWM= "); // wyswietlenie napisu LCD_WriteData(pwm); // wyswietlenie zmiennej LCD_WriteText(" "); // wyswietlenie napisu - maska // jeżeli S1 wciśnięty zwiększ pwm if(bit_is_clear(PINB,2)) { pwm_up(); } // jeżeli S3 wciśnięty zmniejsz pwm if(bit_is_clear(PINB,0)) { pwm_down(); } // włączenie lub wyłączenie urządzenia z przycisku if(bit_is_clear(PINB,1)) { zmien_tryb(); } } } }
Szkoda że nie jest to sterownik taśm led RGB z płynnym sterowaniem kolorami, bo właśnie się za taki zabieram :)
OdpowiedzUsuńA czy można takim mikrokontrolerem sterować kilkoma modułami LED niezależnie??
OdpowiedzUsuń