Daljinac i RGB
Da bi se napravila višebojna rasveta u DIY varijanti ne treba nam ni električar, ni brdo skupocene opreme, dovoljna je jedna Arduino ploča, IR set (daljinac i prijemna dioda i RGB LED. Primer koji sledi je samo demonstracija šta se sve može, da pobudi maštu a nikako nije gotovo rešenje.
Ja sam za primer iskoristio stari dobri Uno. IR set koji sam upotrebio se sastoji iz CHQ1838 prijemne diode i pratećeg daljinca. Daljinac ima 21 dugme u tri kolone sa oznakama koje su predviđene za neki audio projekat a napaja se preko CR2032 žeton baterije. Prijemna dioda ima tri nožice gde su s leva na desno OUT, GND i VCC. RGB koju sam upotrebio ima zajedničku katodu a za nju sam na RGB anode dodao po jedan otpornik od 220 oma. Breadboard ploča, malo žica i možemo da počnemo.
Prijemnu diodu sam povezao na 5V i GND dok je OUT povezan na pin 7. RGB dioda je povezana na sledeći način: R nožica ide na pin 9, katoda ide na GND, zelena nožica na pin 10 a plava na pin 6. RGB nožice se povezuju na PWM (puls with modulation) pinove Arduina preko otpornika. Ti pinovi su obečeženi tildom (~). Biblioteka koju smo koristili IRremote ima određene konflikte sa PWM funkcijom na pinovima 11 i 3, a to se može videti i na mreži kod drugih.
Prvo što radimo je skeniranje i mapiranje kodova našeg daljinca.
------------------------------------
#include <IRremote.h>
decode_results data;
IRrecv recPin = 7;
void setup() {
Serial.begin(9600);
recPin.enableIRIn();
recPin.blink13(true);
}
void loop() {
if (recPin.decode(&data)) {
Serial.println(data.value, HEX );
recPin.resume();
}
}
--------------------------------------
Prvo uključejmo IRremote biblioteku koju možete preuzeti ovde. Zatim pravimo data objekat i dodeljujemo pin priejmnika. U setup funkciji pokrećemo konzolu, aktiviramo prijem a sa recPin.blink13(true) palimo ugrađenu LED na pinu 13 svaki put kada prijemnik primi signal daljinca. Na taj način ćemo znati da li sve radi kako treba, može biti problem do baterije, lošeg ugla, povezivanja i slično. U loop funkciji proveravamo da li ima prijema i ako ima, ispisujemo ih heksadecimalno. Dobijene kodove ispisujemo u prikladnu tabelu radi lakšeg mapiranja i dodeljivanja zadataka.Na isti način se mogu mapirati i neki drugi daljinci, a kod mene su bez problema radili daljinci Filipsovog televizora i totala.
CH- FFA25D
CH FF629D
CH+ FFE21D
|<< FF22DD
>>| FF02FD
>|| FFC23D
- FFE01F
+ FFA857
EQ FF906F
0 FF6897
100+ FF9867
200+ FFB04F
1 FF30CF
2 FF18E7
3 FF7A85
4 FF10EF
5 FF38C7
6 FF5AA5
7 FF42BD
8 FF4AB5
9 FF52AD
Nakon toga prebacujemo sledeći skeč na Uno:
----------------------------------
#include <IRremote.h>
IRrecv recPin = 7;
decode_results data;
int redPin = 9;
int greenPin = 10;
int bluePin = 6;
int ch = 1;
int ch_R = 0;
int ch_G = 0;
int ch_B = 0;
int multiplier = 5;
int wait = 10;
int plusMinus = 0;
int x = 0;
int y = 250;
void setup() {
Serial.begin(9600);
recPin.enableIRIn();
recPin.blink13(true);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(6,OUTPUT);
}
void loop() {
if(recPin.decode(&data)){
Serial.println(data.value,HEX);
switch(data.value){
case 0xFFA25D: //CH-
if(ch==1){ //pwm u minus red
ch_R = ch_R-multiplier;
if(ch_R <=0){
ch_R=0;
}
analogWrite(redPin,ch_R);
Serial.println(ch_R);
}
if(ch==2){ //pwm u minus green
ch_G = ch_G-multiplier;
if(ch_G <=0){
ch_G=0;
}
analogWrite(greenPin,ch_G);
Serial.println(ch_G);
}
if(ch==3){ //pwm u minus blue
ch_B = ch_B-multiplier;
if(ch_B <=0){
ch_B=0;
}
analogWrite(bluePin,ch_B);
Serial.println(ch_B);
}
break;
case 0xFF629D: //ch
ch = ch+1;
if(ch == 4){
ch = 1;
}
Serial.println(ch);
break;
case 0xFFE21D: //CH+
if(ch==1){ //pwm u plus red
ch_R = ch_R+multiplier;
if(ch_R >=255){
ch_R=255;
}
analogWrite(redPin,ch_R);
Serial.println(ch_R);
}
if(ch==2){ //pwm u plus green
ch_G = ch_G+multiplier;
if(ch_G >=255){
ch_G=255;
}
analogWrite(greenPin,ch_G);
Serial.println(ch_G);
}
if(ch==3){ //pwm u plus blue
ch_B =ch_B+multiplier;
if(ch_B >=255){
ch_B=255;
}
Serial.println(ch_B);
analogWrite(bluePin,ch_B);
}
break;
case 0xFF22DD: //|<<
for(int i=0; i<6; i++){
y=y-50;
if(y<0){y=250;}
analogWrite(redPin, y);
analogWrite(greenPin, y);
analogWrite(bluePin, y);
delay(500);
Serial.println(y);
}
break;
case 0xFF02FD: //>>|
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
for(int i=0; i<6; i++){
x=x+50;
if(x>250){x=0;}
analogWrite(redPin, x);
analogWrite(greenPin, x);
analogWrite(bluePin, x);
delay(500);
Serial.println(x);
}
break;
case 0xFFC23D: //>||
for(int i=0; i<9999; i++){
int redValue=random(255);
int greenValue=random(255);
int blueValue=random(255);
analogWrite(redPin,redValue);
analogWrite(greenPin,greenValue);
analogWrite(bluePin,blueValue);
Serial.println(i);
delay(wait);
}
break;
case 0xFFE01F: //-
plusMinus=plusMinus-1;
if(plusMinus<1){
plusMinus=1;
}
if(plusMinus==1){
digitalWrite(redPin,HIGH);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
}else if(plusMinus==2){
digitalWrite(redPin,LOW);
digitalWrite(greenPin, HIGH);
digitalWrite(bluePin, LOW);
}else if(plusMinus==3){
digitalWrite(redPin,LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, HIGH);
}
Serial.println(plusMinus);
break;
case 0xFFA857: //+
plusMinus=plusMinus+1;
if(plusMinus>3){
plusMinus=1;
}
if(plusMinus==1){
digitalWrite(redPin,HIGH);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
}else if(plusMinus==2){
digitalWrite(redPin,LOW);
digitalWrite(greenPin, HIGH);
digitalWrite(bluePin, LOW);
}else if(plusMinus==3){
digitalWrite(redPin,LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, HIGH);
}
Serial.println(plusMinus);
break;
case 0xFF906F: //EQ
for(ch_R=0;ch_R<256;ch_R++){
analogWrite(redPin,ch_R);
Serial.println(ch_R);
delay(wait);
}
for(ch_R=255;ch_R>-1;ch_R--){
analogWrite(redPin,ch_R);
Serial.println(ch_R);
delay(wait);
}
for(ch_G=0;ch_G<256;ch_G++){
analogWrite(greenPin,ch_G);
Serial.println(ch_G);
delay(wait);
}
for(ch_G=255;ch_G>-1;ch_G--){
analogWrite(greenPin,ch_G);
Serial.println(ch_G);
delay(wait);
}
for(ch_B=0;ch_B<256;ch_B++){
analogWrite(bluePin,ch_B);
Serial.println(ch_B);
delay(wait);
}
for(ch_B=255;ch_B>-1;ch_B--){
analogWrite(bluePin,ch_B);
Serial.println(ch_B);
delay(wait);
}
break;
case 0xFF6897: //0 -- sve brisemo u rgb gasimo
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
ch_R=0;ch_G=0;ch_B = 0; x=0; y=250;
break;
case 0xFF9867: //100+
if(ch==1){ //pwm u plus red
ch_R = ch_R+100;
if(ch_R >=255){
ch_R=255;
}
analogWrite(redPin,ch_R);
Serial.println(ch_R);
}
if(ch==2){ //pwm u plus green
ch_G = ch_G+100;
if(ch_G >=255){
ch_G=255;
}
analogWrite(greenPin,ch_G);
Serial.println(ch_G);
}
if(ch==3){ //pwm u plus blue
ch_B = ch_B+100;
if(ch_B >=255){
ch_B=255;
}
analogWrite(bluePin,ch_B);
Serial.println(ch_B);
}
break;
case 0xFFB04F: //200+
if(ch==1){ //pwm u plus red
ch_R = ch_R+200;
if(ch_R >=255){
ch_R=255;
}
analogWrite(redPin,ch_R);
Serial.println(ch_R);
}
if(ch==2){ //pwm u plus green
ch_G = ch_G+200;
if(ch_G >=255){
ch_G=255;
}
analogWrite(greenPin,ch_G);
Serial.println(ch_G);
}
if(ch==3){ //pwm u plus blue
ch_B = ch_B+200;
if(ch_B >=255){
ch_B=255;
}
analogWrite(bluePin,ch_B);
Serial.println(ch_B);
}
break;
case 0xFF30CF: //1 --red
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
digitalWrite(redPin, HIGH);
break;
case 0xFF18E7: //2 --green
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
digitalWrite(greenPin,HIGH);
break;
case 0xFF7A85: //3 --blue
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
digitalWrite(bluePin,HIGH);
break;
case 0xFF10EF: //4 --orange
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
analogWrite(redPin, 255);
analogWrite(greenPin, 170);
break;
case 0xFF38C7: // 5 --lime
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
analogWrite(redPin, 170);
analogWrite(greenPin, 255);
analogWrite(bluePin, 100);
break;
case 0xFF5AA5: // 6 --cyan
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
analogWrite(redPin, 50);
analogWrite(greenPin, 255);
analogWrite(bluePin, 255);
break;
case 0xFF42BD: // 7 --rose
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
analogWrite(redPin, 255);
analogWrite(greenPin, 155);
analogWrite(bluePin, 255);
break;
case 0xFF4AB5: // 8 --violet
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
analogWrite(redPin, 155);
analogWrite(greenPin, 55);
analogWrite(bluePin, 255);
break;
case 0xFF52AD: // 9 --magenta
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
analogWrite(redPin, 255);
analogWrite(bluePin, 255);
break;
}
delay(100);
recPin.resume();
}
}
---------------------------------------------
Nakon dodavanja biblioteke, dodeljivanja RGB pinova i pravljenja data objekta slede promenjljive koje ćemo koristiti u okviru skeča. Menjanjem vrednsoti nekima od njih jednim potezom možemo promeniti način kako će nam RGB raditi. U setup funkciji pokrećemo konzolu, prijemnik, omogućujemo da nam LED na ploči blinka po prijemu i postavljamo RGB pinove kao OUTPUT. U loop funkciji smo po prijemu podataka sa switch() zadali razne zadatke za svaki taster. Tako ćemo sa tasterima od 1 - 9 upaliti neku od boja a sa 0 ćemo sve pogasiti i sve parametre resetovati na 0. Odabirom kanala CH ćemo birati neki od RGB izlaza a zatim sa analogWrite() "dimovati u plus i minus preko CH- i CH+. Sa EQ će se RGB dimovati a sa play/pause paliti random.
Mogućnosti je bezbroj a neke vaše predloge i rešenja možete postaviti ispod.
Hvala. Izvini na kasnom odgovoru.
Ovo je odlicno. Slucajno sam naisao na ovaj sajt. Pocetnik sam u ovome i jako je zanimljivo, a vidim da ima svasta na sajtu. Sam ne znam ni koje mogucnosti postoje i polako to otkrivam.