Choć istnieją gotowe moduły do automatycznego sterowania domowymi urządzeniami elektrycznymi, my zbudujemy taki samodzielnie. Będzie to mała lampka wykonana z diody RGB. Emitowane przez nią światło będzie zmieniać się automatycznie w zależności od natężenia oświetlenia zewnętrznego.

Fotorezystor

Będzie nam potrzebny nowy element – fotorezystorfotorezystor, czyli światłoczuły rezystor, którego oporność zależy od natężenia promieniowania zewnętrznego. Innymi słowy, światło padające na fotorezystor zmienia jego rezystancję. Przy dużym oświetleniu oporność maleje, co z kolei skutkuje większym natężeniem prądu płynącego w gałęzi obwodu, w której włączony jest fotorezystor. I odwrotnie – im mniejsze oświetlenie, tym większa rezystancja i mniejsze natężenie prądu.

R1RjmEBQSPE8c
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

W naszym projekcie użyjemy diody RGB ze wspólną katodą. Zakładamy, że jeśli w pomieszczeniu jest jasno, dioda ma emitować tylko światło zielone. W półmroku powinno być włączone światło zielone i czerwone. Gdy się zupełnie ściemni, dioda ma emitować światło we wszystkich trzech kolorach.

Fotorezystor podłączony do płytki Arduino nie wystarczy, aby określić poziom natężenia oświetlenia. Musimy zastosować dodatkowy rezystor pomocniczy i zbudować dzielnik napięcia. Omawialiśmy taki układ podczas lekcji poświęconej podstawom elektroniki. Dodatkowy opornik powinien mieć rezystancję 10 komega.

Jaką rolę pełni dzielnik? Stosuje się go, aby zmierzyć spadek napięcia na rezystorze pomocniczym. Poziom tego napięcia zmienia się wraz ze zmianami oporności fotorezystora. Dopiero na podstawie wartości zmierzonego napięcia określa się natężenie światła padającego na fotorezystor. Schemat połączeń wygląda następująco:

R1YuhWcsDdHyu
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Budowa automatycznej minilampki

Elementy potrzebne do wykonania zadania:

  • płytka Arduino Uno,

  • płytka stykowa,

  • kabel USB typu A‑B,

  • dioda RGB ze wspólną katodą,

  • rezystor 120 omega,

  • rezystory 62 omega (2 sztuki),

  • rezystor 10 komega,

  • fotorezystor,

  • przewody i zworki połączeniowe.

Pora wykonać niezbędne połączenia.

1. Wpinamy diodę RGB do płytki stykowej tak, aby każda nóżka znalazła się w innym wierszu.

2. Katodę diody łączymy przewodem z szyną ujemną.

  1. Anodę dla światła koloru czerwonego łączymy z pinem 9. przez rezystor 120 omega. Anodę dla koloru niebieskiego łączymy przez rezystor 62 omega z pinem 10. Ostatnią nóżkę, anodę dla koloru zielonego, łączymy z pinem numer 11 (także przez rezystor o oporności 62 omega).

R1Yxp7WMwvXqo
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

4. Wpinamy fotorezystor w szynę danych tak, aby nóżki znalazły się w dwóch różnych wierszach.

5. W ten sam wiersz, w którym znajduje się jedna z nóżek fotorezystora, wpinamy nóżkę rezystora pomocniczego. Drugą nóżkę podłączamy do szyny ujemnej.

RxYcSaiyV3uuK
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
  1. Nóżkę fotorezystora łączymy z wyprowadzeniem napięcia 5 V.

7. Wiersz, w którym znajdują się nóżki fotorezystora i rezystora, łączymy z jednym z wyjść analogowych, na przykład A0.

8. Do szyny ujemnej doprowadzamy masę.

R1N5vHSmlExDL
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Podłączamy płytkę Arduino do komputera. Pora przygotować szkic. Uruchamiamy Arduino IDE i zapisujemy nowy szkic pod nazwą lampka_led.

1. Deklarujemy zmienne, czyli piny, do których podłączone są anody diody RGB.

Linia 1. int RedPin znak równości 9 średnik. Linia 2. int GreenPin znak równości 11 średnik. Linia 3. int BluePin znak równości 10 średnik.

2. W ciele funkcji setup() ustalamy, że piny będą wyjściami. Definiujemy port szeregowy (Serial), który łączy płytkę Arduino z komputerem. Pozwoli to na wyświetlenie wyników na ekranie. Podajemy także prędkość połączenia między portem szeregowym a komputerem.

Linia 1. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. pinMode otwórz nawias okrągły RedPin przecinek OUTPUT zamknij nawias okrągły średnik. Linia 3. pinMode otwórz nawias okrągły GreenPin przecinek OUTPUT zamknij nawias okrągły średnik. Linia 4. pinMode otwórz nawias okrągły BluePin przecinek OUTPUT zamknij nawias okrągły średnik. Linia 5. Serial kropka begin otwórz nawias okrągły 9600 zamknij nawias okrągły średnik. Linia 6. zamknij nawias klamrowy.

3. W ciele funkcji loop() definiujemy zmienną wartoscfoto. Ma ona przechowywać wartości odczytane z pinu A0 i zwracane przez funkcję analogRead().

Linia 1. void loop otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. int wartoscfoto znak równości analogRead otwórz nawias okrągły A0 zamknij nawias okrągły średnik. Linia 3. zamknij nawias klamrowy.

4. Wartości, które odczytujemy z pinu analogowego, należą do zakresu 0–1023. Wartość 0 należy traktować jako 0 V, natomiast 1023 – jako 5 V. Ten zakres może być nieco niewygodny podczas dalszych obliczeń i ustalania poziomów oświetlenia. Przekształćmy go więc do postaci zapisanej w bardziej popularnej skali, na przykład od 0 do 100  lub od 0 do 10. Załóżmy, że wybraliśmy pierwszą opcję.

Takie przekształcenie zakresów wykonuje się bardzo łatwo za pomocą funkcji map(), a nazywa się je po prostu mapowaniemmapowaniemapowaniem. Przyjmujemy, że wartość 0 się nie zmienia, natomiast liczbie 1023 będzie odpowiadać 100%. Zwracane wartości będą przechowywane w zmiennej swiatlo.

Linia 1. float swiatlo znak równości map otwórz nawias okrągły wartoscfoto przecinek 0 przecinek 1023 przecinek 0 przecinek 100 zamknij nawias okrągły średnik.

5. Aby sprawdzić, jakie jest natężenie oświetlenia, użyjemy funkcji, dzięki której zaprezentujemy na ekranie wartości odczytane z pinu A0. Wprowadzamy pewne opóźnienie, aby zdążyć odczytać pokazywane liczby. Przesyłamy szkic do płytki.

Linia 1. Serial kropka println otwórz nawias okrągły swiatlo zamknij nawias okrągły średnik. Linia 2. delay otwórz nawias okrągły 500 zamknij nawias okrągły średnik.

Po uruchomieniu szkicu zasłaniamy fotorezystor i sprawdzamy, czy wartości oświetlenia się zmieniają.

RBKw2jNVFK2NI
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

6. Musimy przyjąć pewne poziomy oświetlenia, przy których zmienia się światło emitowane przez diodę. Załóżmy, że przy oświetleniu na poziomie wyższym niż 60% włączone jest światło zielone, a w przedziale 40–60% zapala się dodatkowo światło czerwone. Poniżej poziomu 40% są włączone wszystkie kolory.

Aby ustalić, które światła należy włączyć, wykorzystamy instrukcję if. Zastosujemy kaskadowe (wielopoziomowe) wyrażenie if...else if... else (przypomina to zagnieżdżanie funkcji, czyli wywoływanie jednej funkcji z wnętrza drugiej).

Naszkicujmy schemat, zgodnie z którym w różnych warunkach zapalą się światła o odmiennych barwach:

R1CYx9G6XYKhW
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Dwa razy sprawdzamy kryterium, którym jest wartość progowa natężenia oświetlenia. Można oczywiście sprawdzić je w odwrotnej kolejności – najpierw określić, czy poziom natężenia światła przekracza 60%, a następnie, czy jest wyższy niż 40%. Instrukcję warunkową zapiszemy w szkicu przed funkcją delay().

Linia 1. if otwórz nawias okrągły swiatlo otwórz nawias ostrokątny 40 zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. digitalWrite otwórz nawias okrągły RedPin przecinek HIGH zamknij nawias okrągły średnik. Linia 3. digitalWrite otwórz nawias okrągły GreenPin przecinek HIGH zamknij nawias okrągły średnik. Linia 4. digitalWrite otwórz nawias okrągły BluePin przecinek HIGH zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy else if otwórz nawias okrągły swiatlo otwórz nawias ostrokątny 60 zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. digitalWrite otwórz nawias okrągły RedPin przecinek HIGH zamknij nawias okrągły średnik. Linia 7. digitalWrite otwórz nawias okrągły GreenPin przecinek HIGH zamknij nawias okrągły średnik. Linia 8. digitalWrite otwórz nawias okrągły BluePin przecinek LOW zamknij nawias okrągły średnik. Linia 9. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 10. digitalWrite otwórz nawias okrągły RedPin przecinek LOW zamknij nawias okrągły średnik. Linia 11. digitalWrite otwórz nawias okrągły GreenPin przecinek HIGH zamknij nawias okrągły średnik. Linia 12. digitalWrite otwórz nawias okrągły BluePin przecinek LOW zamknij nawias okrągły średnik. Linia 13. zamknij nawias klamrowy.

Przesyłamy szkic do płytki Arduino. Możemy uruchomić monitor portu szeregowego, przysłonić fotorezystor i obserwować, jak zmienia się barwa światła emitowanego przez diodę RGB.

Oto pełny kod programu:

Linia 1. int RedPin znak równości 9 średnik. Linia 2. int GreenPin znak równości 11 średnik. Linia 3. int BluePin znak równości 10 średnik. Linia 5. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. pinMode otwórz nawias okrągły RedPin przecinek OUTPUT zamknij nawias okrągły średnik. Linia 7. pinMode otwórz nawias okrągły GreenPin przecinek OUTPUT zamknij nawias okrągły średnik. Linia 8. pinMode otwórz nawias okrągły BluePin przecinek OUTPUT zamknij nawias okrągły średnik. Linia 9. Serial kropka begin otwórz nawias okrągły 9600 zamknij nawias okrągły średnik. Linia 10. zamknij nawias klamrowy. Linia 12. void loop otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. int wartoscfoto znak równości analogRead otwórz nawias okrągły A0 zamknij nawias okrągły średnik. Linia 14. float swiatlo znak równości map otwórz nawias okrągły wartoscfoto przecinek 0 przecinek 1023 przecinek 0 przecinek 100 zamknij nawias okrągły średnik. Linia 15. Serial kropka println otwórz nawias okrągły swiatlo zamknij nawias okrągły średnik. Linia 17. if otwórz nawias okrągły swiatlo otwórz nawias ostrokątny 40 zamknij nawias okrągły otwórz nawias klamrowy. Linia 18. digitalWrite otwórz nawias okrągły RedPin przecinek HIGH zamknij nawias okrągły średnik. Linia 19. digitalWrite otwórz nawias okrągły GreenPin przecinek HIGH zamknij nawias okrągły średnik. Linia 20. digitalWrite otwórz nawias okrągły BluePin przecinek HIGH zamknij nawias okrągły średnik. Linia 21. zamknij nawias klamrowy else if otwórz nawias okrągły swiatlo otwórz nawias ostrokątny 60 zamknij nawias okrągły otwórz nawias klamrowy. Linia 22. digitalWrite otwórz nawias okrągły RedPin przecinek HIGH zamknij nawias okrągły średnik. Linia 23. digitalWrite otwórz nawias okrągły GreenPin przecinek HIGH zamknij nawias okrągły średnik. Linia 24. digitalWrite otwórz nawias okrągły BluePin przecinek LOW zamknij nawias okrągły średnik. Linia 25. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 26. digitalWrite otwórz nawias okrągły RedPin przecinek LOW zamknij nawias okrągły średnik. Linia 27. digitalWrite otwórz nawias okrągły GreenPin przecinek HIGH zamknij nawias okrągły średnik. Linia 28. digitalWrite otwórz nawias okrągły BluePin przecinek LOW zamknij nawias okrągły średnik. Linia 29. zamknij nawias klamrowy. Linia 31. delay otwórz nawias okrągły 500 zamknij nawias okrągły średnik. Linia 32. zamknij nawias klamrowy.

Zróbmy symulację układu diody RGB z fotorezystorem, za pomocą środowiska Tinkercad.

Zaloguj się na swoje konto na platformie Tinkercad.

RKevCJGCYZElD
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Na liście komponentów, znajdującej się po prawej stronie okna, znajdź płytkę stykową.

Kliknij na nią i umieść w głównym oknie.

RP4jkkjLtW9Yp
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Na liście komponentów znajdź diodę RGB i wstaw ją na płytkę stykową.

RTf2QCzOnAGwC
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Jeśli nie wiesz, które wyprowadzenie odpowiada jakiemu kolorowi, wystarczy najechać kursorem na nóżkę w miejscu, w którym jest ona wpięta do płytki stykowej.

R4aPX3I3vARRc
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Znajdź rezystor i dodaj go do każdej anody diody LED. Ustaw wartość 120 omega dla wszystkich rezystorów.

R1OwkinGC9PxR
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Znajdź na liście fotorezystor i podepnij go do płytki stykowej.

R1Cy3GGsupHHK
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Do jednej z nóg fotorezystora dodaj rezystor o wartości 10 komega.

Ryfsw1rYG337c
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Dodaj teraz moduł Arduino Uno do okna symulacji.

R1GAnH6qhC3Mh
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Do ujemnej szyny płytki stykowej podłączymy: katodę diody LED, wolną nóżkę rezystora wpiętego do fotorezystora oraz pin GND Arduino UNO.

RQFlvNQmeMd0S
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Wolną nóżkę fotorezystora podpinamy do pinu 5V Arduino Uno.

RUcd5qXbD8yST
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Punkt, w którym mamy podłączony fotorezystor i rezystor łączymy z pinem A0 Arduino Uno.

R1FaNI4ZT05E6
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Wolne nóżki rezystorów wpiętych w anody diody podpinamy do Arduino Uno:

  • kolor czerwonego diody do pinu D9,

  • kolor niebieski diody do pinu D10,

  • kolor zielony diody do pinu D11.

RmTQctG05G3Jw
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Przejdźmy teraz do pisania kodu. W tym celu klikamy na przycisk Kod, z listy rozwijanej wybieramy Tekst, potwierdzamy chęć zmiany widoku i czyścimy zawartość.

Przepisz kod układu diody RGB z fotorezystorem.

RmCsZL5823iMP
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

W naszym kodzie mamy uruchomione połączenie z Monitorem portu szeregowego. Aby otworzyć Monitor w Tinkercad, kliknij na belkę z napisem Konsola szeregowa.

R18ITy8dRYA8w
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Uruchom symulację.

R14B6mVDpgoLR
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Aby móc regulować wartość docierającego do fotorezystora światła, kliknij na niego. Nad fotorezystorem pojawi się suwak, którym możesz regulować natężenie światła.

R1ZTa4aXmXT2H
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Film z działania programu.

R1U9QHFYKoLWY
Film nawiązujący do treści materiału

Słownik

fotorezystor
fotorezystor

opornik, którego rezystancja zależy od natężenia padającego światła

mapowanie
mapowanie

przekształcenie jednego zakresu liczbowego w inny