Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

niedziela, 20 marca 2011

DIY: Sterownik diod LED


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



Moje błędy

W trakcie pisania artykułu zauważyłem, że popełniłem kilka błędów, a mianowicie:
  1. Ź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.
  2. Ź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();
      }
    }
  }
}




Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

2 komentarze:

  1. Szkoda że nie jest to sterownik taśm led RGB z płynnym sterowaniem kolorami, bo właśnie się za taki zabieram :)

    OdpowiedzUsuń
  2. A czy można takim mikrokontrolerem sterować kilkoma modułami LED niezależnie??

    OdpowiedzUsuń

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.