Opis produktu
Szczegóły
Poziom trudności: ★★★★★
Szacowany czas: 45min
Wymagane elementy
- płytka Arduino, np. Arduino UNO R3
- płytka stykowa z przewodami połączeniowymi
- wyświetlacz LCD 2x16
- potencjometr 10kΩ
- dioda RGB
- 3x rezystor 220Ω
- odbiornik podczerwieni
- pilot
Wstęp
W poradniku zajmiemy się bezprzewodowym sterowaniem intensywnością kolorów diody RGB ze wspólną anodą. W tym celu posłużymy się umiejętnością obsługi PWM w Arduino oraz odbierzemy sześć kodów z pilota podczerwieni w celu zmiany wartości szerokości impulsów kolorów czerwonego, zielonego i niebieskiego, dzięki czemu uzyskamy możliwość płynnej regulacji barwy naszej diody.
Dodatkowo wyświetlimy na ekranie LCD procentową wartość aktualnie ustawionej mocy świecenia każdego z kolorów.
Schemat układu przedstawia poniższy rysunek:
Kod programu:
Kod odpowiedzialny za zdalne sterowanie kolorem diody RGB przedstawiam poniżej. Funkcja odpowiedzialna za wyświetlanie procentowej wartości natężenia kolorów została napisana poza funkcją loop w celu poprawy przejrzystości programu.
Wciśnięcie przycisku powoduje zmianę wartości PWM o +/-50. W funkcji warunkowej odpowiedzialnej za wyświetlanie wartości procentowej mocy koloru należało zastosować dwa warunki, ponieważ przy odejmowaniu i dodawaniu wartości wypełnienia otrzymujemy liczby różniące się o 5, co łatwo zauważyć analizując niżej zamieszczony kod.
#include "IRremote.h"
#include "LiquidCrystal.h"
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Definicja pinów do których podłaczamy wyprowadzenia ekranu
int RECV_PIN = 7; //Pin, do którego podłączamy odbiornik podczerwieni
int led_cz = 6; //Pin, do którego podłczamy nóżke diody odpowiadająca za kolor czerwony
int led_z = 9;
int led_n = 10;
int wartosc_cz = 255; //Zmienna przechowująca wartość PWM koloru czerwonego
int wartosc_z = 255;
int wartosc_n = 255;
//Obsługa podczerwieni
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
lcd.begin(16,2); //Inicjalizacja pracy LCD
irrecv.enableIRIn(); // Start pracy odbiornika podczerwieni
Serial.begin(9600); //Prędkość transmisji w porcie szeregowym
pinMode(led_cz, OUTPUT); //Ustawienie pinu 6 jako wyjście
pinMode(led_z, OUTPUT);
pinMode(led_n, OUTPUT);
}
void loop() {
analogWrite(led_cz, wartosc_cz); //Wystawienie wartości PWM na pin 6
analogWrite(led_z, wartosc_z);
analogWrite(led_n, wartosc_n);
if (irrecv.decode(&results)) {
switch (results.value)
{
//Kolor czerwony
case 0xFFA25D:
wartosc_cz=wartosc_cz-50;
if(wartosc_cz<=5){
wartosc_cz=0;
}
analogWrite(led_cz, wartosc_cz); //ustawienie wartości PWM na nóżkę diody odpowiedzialną za kolor czerwony
break;
case 0xFF22DD:
wartosc_cz=wartosc_cz+50;
if(wartosc_cz>=255){
wartosc_cz=255;
}
analogWrite(led_cz, wartosc_cz); //ustawienie wartości PWM na nóżkę diody odpowiedzialną za kolor czerwony
break;
//Kolor zielony
case 0xFF629D:
wartosc_z=wartosc_z-50;
if(wartosc_z<=5){
wartosc_z=0;
}
analogWrite(led_z, wartosc_z); //ustawienie wartości PWM na nóżkę diody odpowiedzialną za kolor zielony
break;
case 0xFF02FD:
wartosc_z=wartosc_z+50;
if(wartosc_z>=255){
wartosc_z=255;
}
analogWrite(led_z, wartosc_z); //ustawienie wartości PWM na nóżkę diody odpowiedzialną za kolor zielony
break;
//Kolor niebieski
case 0xFFE21D :
wartosc_n=wartosc_n-50;
if(wartosc_n<=5){
wartosc_n=0;
}
analogWrite(led_n, wartosc_n); //ustawienie wartości PWM na nóżkę diody odpowiedzialną za kolor niebieski
break;
case 0xFFC23D :
wartosc_n=wartosc_n+50;
if(wartosc_n>=255){
wartosc_n=255;
}
analogWrite(led_n, wartosc_n); //ustawienie wartości PWM na nóżkę diody odpowiedzialną za kolor niebieski
break;
}
irrecv.resume();
}
funkcja_wyswietlajaca();
}
//Funkcja wyświetlajaca wartość każdego z kolorów na wyświetlaczu LCD 2x16
void funkcja_wyswietlajaca (void)
{
lcd.setCursor(0,0);
lcd.print("RED ");
lcd.print("GREEN ");
lcd.print("BLUE");
//Wyświetlanie intensywności świecenia koloru czerwonego
if(wartosc_cz==255 || wartosc_cz==250) {
lcd.setCursor(2,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(0,1);
lcd.print("0%");
}
if(wartosc_cz==205 || wartosc_cz==200) {
lcd.setCursor(3,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(0,1);
lcd.print("20%");
}
if(wartosc_cz==155 || wartosc_cz==150) {
lcd.setCursor(3,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(0,1);
lcd.print("40%");
}
if(wartosc_cz==105 || wartosc_cz==100) {
lcd.setCursor(3,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(0,1);
lcd.print("60%");
}
if(wartosc_cz==55 || wartosc_cz==50) {
lcd.setCursor(3,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(0,1);
lcd.print("80%");
}
if(wartosc_cz==0) {
lcd.setCursor(0,1);
lcd.print("100%");
}
//Wyświetlanie intensywności świecenia koloru zielonego
if(wartosc_z==255 || wartosc_z==250) {
lcd.setCursor(7,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(5,1);
lcd.print("0%");
}
if(wartosc_z==205 || wartosc_z==200) {
lcd.setCursor(8,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(5,1);
lcd.print("20%");
}
if(wartosc_z==155 || wartosc_z==150) {
lcd.setCursor(8,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(5,1);
lcd.print("40%");
}
if(wartosc_z==105 || wartosc_z==100) {
lcd.setCursor(8,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(5,1);
lcd.print("60%");
}
if(wartosc_z==55 || wartosc_z==50) {
lcd.setCursor(8,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(5,1);
lcd.print("80%");
}
if(wartosc_z==0) {
lcd.setCursor(5,1);
lcd.print("100%");
}
//Wyświetlanie intensywności świecenia koloru niebieskiegp
if(wartosc_n==255 || wartosc_n==250) {
lcd.setCursor(14,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(12,1);
lcd.print("0%");
}
if(wartosc_n==205 || wartosc_n==200) {
lcd.setCursor(15,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(12,1);
lcd.print("20%");
}
if(wartosc_n==155 || wartosc_n==150) {
lcd.setCursor(15,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(12,1);
lcd.print("40%");
}
if(wartosc_n==105 || wartosc_n==100) {
lcd.setCursor(15,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(12,1);
lcd.print("60%");
}
if(wartosc_n==55 || wartosc_n==50) {
lcd.setCursor(15,1);
lcd.print(" "); //Czyszczenie wyświetlacza
lcd.setCursor(12,1);
lcd.print("80%");
}
if(wartosc_n==0) {
lcd.setCursor(12,1);
lcd.print("100%");
}
}
Informacje dodatkowe
Informacje dodatkowe
Kraj pochodzenia |
---|
Recenzje
Napisz własną recenzję
Tylko zarejestrowani kiienci mogą pisać opinie. Prosimy zalogować się lub zarejestrować