[065] To i owo o LED-ach średniej mocy – cz. 2

[065] To i owo o LED-ach średniej mocy – cz. 2

Spójrzmy na zdjęcie uczynione kamerą termowizyjną. O ile układ nagrzewa się do pięćdziesięciu stopni i ta temperatura stabilizuje się mniej więcej na tym etapie, świecąca struktura po chwili zaczyna przekraczać 60 stopni i to jest już niezdrowe. Zdecydowanie potrzeba tutaj radiatora, inaczej dioda przestanie jasno świecić – może po roku, a może po tygodniu.


Nie musi to być duża powierzchnia. Często w praktyce wykorzystuje się element montażowy, spełniający równocześnie dwie role. Do artykułu przygotowałem się odpowiednio, kolekcjonując różnego rodzaju pasty i kleje termoprzewodzące oraz radiatory.

Dla naszej diody szaleć nie musimy, po prostu trzeba zapewnić poprawny kontakt z aluminium czy miedzią, a nawet stalą i spokojnie możemy tutaj użyć kleju, nie zawracając sobie głowy śrubkami, które zapewniłyby lepszy kontakt. Wszak to tylko trzy waty. Gdy spojrzymy na nasz układ okiem termowizji, widzimy teraz zdecydowaną poprawę.

Jak mówiłem, scalakowi przegrzanie nie grozi, ale jeśli ktoś chce, może nakleić kawałek aluminiowej blaszki. Trzeba jednak pamiętać, że układ siedzi tu w płytce stykowej, docelowo winien być przylutowany do płytki drukowanej i już ten kontakt znakomicie go wychłodzi. Podłączmy się teraz do Arduino.

Użyję płytki edukacyjnej TME bo – jak zwykle – mam tu wygodę z dostępem do pinów. I nie będę tym razem odkrywał koła, skorzystam ze szkicu niegdyś już prezentowanego. Wykorzystam też znajdujący się na płytce potencjometr i będę nim wybierał barwę w specyficzny sposób. W miarę obracania jego osi zrobimy wędrówkę po całym paśmie światła widzialnego. Rozpoczniemy od czerwieni, przechodząc przez pomarańcz i żółć ku zieleni – w 1/3 zakresu. Następnie, przechodząc przez turkusy wylądujemy w błękitach – w 2/3 zakresu i przez fiolety wrócimy do czerwieni.

const byte potencjometr = A1;  // Port, który będzie mierzyć napięcie.
const byte LEDr = 11;          // Czerwona dioda świecąca.
const byte LEDg = 10;          // Zielona dioda świecąca.
const byte LEDb = 9;           // Niebieska dioda świecąca.
int napiecie;                  // Wartość napięcia bez jednostek.

void setup() {
  pinMode(LEDr, OUTPUT);  // Zadeklaruj port LEDr jako wyjście.
  pinMode(LEDg, OUTPUT);  // Zadeklaruj port LEDg jako wyjście.
  pinMode(LEDb, OUTPUT);  // Zadeklaruj port LEDb jako wyjście.
}

Będziemy pracować wprost na wartościach odczytanych z potencjometru, jak wiemy – dziesięciobitowych, aby zwiększyć precyzję obliczeń i dopiero ostatnią operacją będzie przejście w przestrzeń ośmiobitową, bo na takiej pracują wyjścia PWM. Deklarujemy więc zmienną „napięcie” typu int.

void loop() {
  napiecie = analogRead(potencjometr);  // Pobierz wartość napięcia z portu woltomierza

Potencjometr będzie pracować w trzech przedziałach. W każdym poziom świecenia jednej diody maleje, drugiej rośnie, a trzecia jest wygaszona. Ilość pozycji potencjometru wynosi 1024, więc 1/3 wypadnie w miejscu o numerze 341, a 2/3 – 682. Zajmijmy się każdą diodą z osobna, tak będzie przejrzyściej.

if (napiecie <= 341) {                        // Przedział pierwszy
  analogWrite(LEDg, napiecie / 1.337);        // Ustaw przebieg na porcie LEDg

Zaczynamy od zielonej. Najpierw wykrywamy przedział pierwszy. Jeśli pozycja potencjometru jest równa lub mniejsza od 341, ustawiamy poziom świecenia diody równy tej wartości podzielonej przez 1.337, a to dlatego, że dla największej wartości pozycji, czyli 341, po podzieleniu otrzymamy 255, czyli największą dozwoloną wartość dla wyjścia PWM. Teraz trzeba zaprogramować jej działanie dla drugiego przedziału.

if (napiecie > 341 && napiecie <= 682) {      // Przedział drugi
  analogWrite(LEDg, 511 - napiecie / 1.337);  // Ustaw przebieg na porcie LEDg

Najpierw ów przedział zidentyfikujemy: musi on spełnić dwa warunki. Wartość oczytana z pozycji potencjometru musi być większa od 341 i zarazem nie większa niż 682. Teraz musimy przeprowadzić odrobinę bardziej skomplikowany rachunek: będziemy odejmować od stałej wartość odczytaną, już przeskalowaną do ośmiobitowego przedziału, ale wciąż przesuniętą o 255 do góry. Wartość ta będzie wynosić 511, a nie jak poprzednio – 255.

if (napiecie > 682) {                         // Przedział trzeci
  analogWrite(LEDg, 0);                       // Wygaś LEDg

Trzeci przedział zidentyfikuje tylko jeden warunek, a na dodatek dioda ma tu być wygaszona, czyli żadnych obliczeń nie będzie. Bierzmy się teraz za diodę niebieską.

if (napiecie <= 341) {                        // Przedział pierwszy
  analogWrite(LEDb, 0);                       // Wygaś LEDb

Dla niej zakazanym przedziałem jest przedział pierwszy. Już wiemy co zrobić.

if (napiecie > 341 && napiecie <= 682) {      // Przedział drugi
  analogWrite(LEDb, napiecie / 1.337 - 255);  // Ustaw przebieg na porcie LEDb 

W drugim przedziale jasność ma rosnąć. Zatem postępujemy jak z diodą zieloną w pierwszym przedziale, pamiętając o tym, że od wyniku musimy jeszcze odjąć 255, bowiem poruszamy się w drugim przedziale, gdzie obowiązuje takie właśnie przesunięcie.

if (napiecie > 682) {                         // Przedział trzeci
  analogWrite(LEDb, 766 - napiecie / 1.337);  // Ustaw przebieg na porcie LEDb

W trzecim przedziale dioda niebieska ma przygasać, zatem zastosujemy znowu metodę diody zielonej z przedziału drugiego, z tym że wprowadzimy przesunięcie o – no właśnie, nie o 767, a 766. Wykonujemy tu bowiem dzielenia z pewną skończoną dokładnością i czasem zaokrąglenie mogłoby sprawić, że diody nie dałoby się wyciemnić do końca. Coś takiego nastąpiło tutaj, zatem należy przedział przesunąć o jeden.

Pozostała dioda czerwona.

if (napiecie > 341 && napiecie <= 682) {      // Przedział drugi
  analogWrite(LEDr, 0);                       // Wygaś LEDr

Tym razem zacznijmy od przedziału zakazanego, czyli drugiego.

if (napiecie > 682) {                         // Przedział trzeci
  analogWrite(LEDr, napiecie / 1.337 - 510);  // Ustaw przebieg na porcie LEDr

Teraz rozjaśnimy ją w przedziale trzecim, postępując jak z diodą niebieską w przedziale drugim, tylko zmienimy przesunięcie na wartość… znowu nie 511, a 510, co wynika z zaokrągleń.

if (napiecie <= 341) {                        // Przedział pierwszy
  analogWrite(LEDr, 255 - napiecie / 1.337);  // Ustaw przebieg na porcie LEDr

No i na koniec już przedział pierwszy, czyli wyciemnianie czerwonej diody.

Program jest prosty i umiarkowanie użyteczny, ale w tym opracowaniu chciałem się skupić na diodzie, a nie jej sterowaniu, bo na ten temat powstało już sporo materiału i tamte szkice możemy przenieść wprost do naszej sytuacji. W takich aplikacjach aż prosi się o użycie małego ATtiny, który obsłuży nam diodę z potencjometrem. W kolejnych artykułach jeszcze bardziej zwiększymy moce i będziemy musieli się już pożegnać z ULN-em, który może nam obsłużyć najwyżej dwie takie diody jednocześnie. A na koniec – raz jeszcze szkic, już w całości.

const byte potencjometr = A1;  // Port, który będzie mierzyć napięcie.
const byte LEDr = 11;          // Czerwona dioda świecąca.
const byte LEDg = 10;          // Zielona dioda świecąca.
const byte LEDb = 9;           // Niebieska dioda świecąca.
int napiecie;                  // Wartość napięcia bez jednostek.

void setup() {
  pinMode(LEDr, OUTPUT);  // Zadeklaruj port LEDr jako wyjście.
  pinMode(LEDg, OUTPUT);  // Zadeklaruj port LEDg jako wyjście.
  pinMode(LEDb, OUTPUT);  // Zadeklaruj port LEDb jako wyjście.
}

void loop() {
  napiecie = analogRead(potencjometr);  // Pobierz wartość napięcia z portu woltomierza

  if (napiecie <= 341) {                        // Przedział pierwszy
    analogWrite(LEDr, 255 - napiecie / 1.337);  // Ustaw przebieg na porcie LEDr
    analogWrite(LEDg, napiecie / 1.337);        // Ustaw przebieg na porcie LEDg
    analogWrite(LEDb, 0);                       // Wygaś LEDb
  }
  if (napiecie > 341 && napiecie <= 682) {      // Przedział drugi
    analogWrite(LEDr, 0);                       // Wygaś LEDr
    analogWrite(LEDg, 511 - napiecie / 1.337);  // Ustaw przebieg na porcie LEDg
    analogWrite(LEDb, napiecie / 1.337 - 255);  // Ustaw przebieg na porcie LEDb
  }
  if (napiecie > 682) {                         // Przedział trzeci
    analogWrite(LEDr, napiecie / 1.337 - 510);  // Ustaw przebieg na porcie LEDr
    analogWrite(LEDg, 0);                       // Wygaś LEDg
    analogWrite(LEDb, 766 - napiecie / 1.337);  // Ustaw przebieg na porcie LEDb
  }
}
Płytka edukacyjna TME-EDU-ARD-2Płytka edukacyjna TME-EDU-ARD-2Sprawdź tutaj

Przeczytaj również

Nasi partnerzy

TMETech Master EventTME EducationPoweredby
Copyright © 2024 arduino.pl