Điều khiển vòng LED với remote control

Dùng remote control hồng ngọai điều khiển màu sắc vòng LED

Board UnoX kết nối với mạch thu hồng ngoại nhằm nhận tín hiệu điều khiển từ remote control và điều khiển màu sắc vòng LED dựa vào thông tin nhận được từ điều khiển.

Linh kiện cần dùng

Giới thiệu chức năng của linh kiện

  • Vòng 12 LED WS2812B

    • Tạo ra những hiệu ứng bắt mắt trên LED , có khả năng hiển thị lên đến 16 triệu màu.
  • Remote control hồng ngoại

    • Sử dụng tia hồng ngoại để truyền tín hiệu, cho khả năng thao tác với 21 phím bấm.
  • Mạch thu hồng ngoại

    • Thu tín hiệu hồng ngoại để gửi dữ liệu đến UnoX.

Chuẩn bị vỏ hộp

  • Cắt giấy bìa theo mẫu như hình bên. Cắt theo đường màu đỏ lớn, các đường màu đỏ nhỏ cần tạo nếp gấp để có thể tạo được hình dạng chiếc hộp.

Kết nối các thiết bị

Bảng kết nối UnoX với vòng LED

UnoXVòng LED
5V5V
GNDGND
4DI

Bảng kết nối UnoX với mạch thu tín hiệu hồng ngoại

UnoXMạch thu tín hiệu
5VVCC
GNDGND
A0DO

Download thư viện

Mô tả source code

  • Download source tại Code arduino IR remote

  • Chương trình sẽ khai báo các đối tượng sau:

    • Đối tượng irrecv nhằm quản lý việc đọc tín hiệu từ remote control hồng ngoại.
    • Đối tượng results nhằm quản lý việc mã hóa tín hiệu đọc được.
    • Đối tượng strip điều khiển hoạt động của vòng LED.
  • Chương trình sẽ thực hiện việc quét tín hiệu phát ra từ remote control, từ tín hiệu nhận được sẽ quy định một chức năng tương ứng.

#include "IRremote.h"
#include <Adafruit_NeoPixel.h>

#define PIXEL_PIN    4  // Chân điều khiển vòng LED.
#define PIXEL_COUNT 12  // Số lượng LED trên vòng.
#define IR_PIN      A0  // Chân đọc dữ liệu hồng ngoại.

int hieuUng;
int soLED = 12;       //  Biến lưu số LED hiển thị.
int brightness = 100; //  Thiết lập độ sáng.
uint32_t color;       //  Biến lưu giá trị màu.
bool onOff = true;    //  Biến lưu trạng thái LED.

IRrecv irrecv(IR_PIN);  // Biến irrecv giúp đọc tín hiệu hồng ngoại.
decode_results results; // Biến results giúp giải mã tín hiệu hồng ngoại.
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT,
                       PIXEL_PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
  strip.setBrightness(brightness);  // Thiết lập độ sáng vòng LED
  strip.begin();
  strip.show();
  Serial.begin(9600);               // Khởi tạo giao tiếp serial
  Serial.println("IR Receiver Raw Data + Button Decode Test");
  irrecv.enableIRIn();
}

void loop()
{
  if ( irrecv.decode(&results) ) {
    translateIR();  // Hàm chuyển đổi tín hiệu IR nhận được
    irrecv.resume();// Tiếp tục nhận tín hiệu từ remote control
  }
}

/* Quy định chức năng từ các phím nhận được */
void translateIR()
{
  switch(results.value) {
  case 0xFFA25D:                    //  Phím CH-
    if ( soLED >= 1 )
      soLED--;
    showLED();
    break;

  case 0xFF629D:                    //  Phím CH
    soLED = 6;
    showLED();
    break;

  case 0xFFE21D:                    //  Phím CH+
    if ( soLED <= 11 )
      soLED++;
    showLED();
    break;

  case 0xFF22DD:                    //  Phím Prev
    if ( hieuUng > 1 )
      hieuUng--;
    showLED();
    break;

  case 0xFF02FD:                    //  Phím Next
    if ( hieuUng < 11 )
      hieuUng++;
    showLED();
    break;

  case 0xFFC23D:                    //  Phím Pause
    onOffLED();
    break;

  case 0xFFE01F:                    //  Phím -
    if ( brightness > 21 )
      brightness-=20;
    strip.setBrightness( brightness );
    showLED();
    break;

  case 0xFFA857:                    //  Phím +
    if ( brightness < 235 )
      brightness+=20;
    strip.setBrightness( brightness );
    showLED();
    break;

  case 0xFF906F:                    //  Phím 0
    hieuUng = 10;
    showLED();
    break;

  case 0xFF6897:                    //  Phím EQ
    hieuUng = 11;
    showLED();
    break;

  case 0xFF9867:                    //  Phím 100+
    Serial.println(" Phim chua co chuc nang ");
    break;

  case 0xFFB04F:                    //  Phím 200+
    Serial.println(" Phim chua co chuc nang ");
    break;

  case 0xFF30CF:                    //  Phím 1
    hieuUng = 1;
    showLED();
    break;

  case 0xFF18E7:                    //  Phím 2
    hieuUng = 2;
    showLED();
    break;

  case 0xFF7A85:                    //  Phím 3
    hieuUng = 3;
    showLED();
    break;

  case 0xFF10EF:                    //  Phím 4
    hieuUng = 4;
    showLED();
    break;

  case 0xFF38C7:                    //  Phím 5
    hieuUng = 5;
    showLED();
    break;

  case 0xFF5AA5:                    //  Phím 6
    hieuUng = 6;
    showLED();
    break;

  case 0xFF42BD:                    //  Phím 7
    hieuUng = 7;
    showLED();
    break;

  case 0xFF4AB5:                    //  Phím 8
    hieuUng = 8;
    showLED();
    break;

  case 0xFF52AD:                    //  Phím 9
    hieuUng = 9;
    showLED();
    break;

  default:
    Serial.println(" other button   ");
  }
  delay(500);
}

/* Bật tắt vòng LED */
void onOffLED()
{
  onOff= !onOff;
  if ( onOff == true ) {
    colorWipe(strip.Color(0,0,0), 50);
  } else
    showLED();
}

/* Cho phép hiển thị hiệu ứng lên Vòng LED */
void showLED()
{
  if ( hieuUng <10 && hieuUng >0 ) {
    color = strip.Color((hieuUng-1)*31,(9-hieuUng)*31,(4-hieuUng%5)*56);
    colorWipe(color, 50);
  }
  else if ( hieuUng == 10 )
    rainbow(50);
  else if( hieuUng == 11 )
    rainbowCycle(5);
}

/* Hiệu ứng hiển thị một màu tùy chọn */
void colorWipe(uint32_t c, uint8_t wait)
{
  for ( uint16_t i=0; i<12; i++ ) {
    if ( i<soLED )
      strip.setPixelColor(i, c);
    else
      strip.setPixelColor(i,strip.Color(0, 0, 0));
    strip.show();
  }
}

/* Hiệu ứng cầu vòng 1 */
void rainbow(uint8_t wait)
{
  uint16_t i, j;
  for ( j=0; j<256; j++ ) {
    for ( i=0; i<soLED; i++ ) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

/* Hiệu ứng cầu vòng 2*/
void rainbowCycle(uint8_t wait)
{
  uint16_t i, j;

  for( j=0; j<256*5; j++ ) {
    for( i=0; i< soLED; i++ ) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

void theaterChase(uint32_t c, uint8_t wait)
{
  for ( int j=0; j<10; j++ ) {
    for ( int q=0; q < 3; q++ ) {
      for ( int i=0; i < strip.numPixels(); i=i+3 ) {
        strip.setPixelColor(i+q, c);
      }
      strip.show();
      delay(wait);
      for ( int i=0; i < strip.numPixels(); i=i+3 ) {
        strip.setPixelColor(i+q, 0);
      }
    }
  }
}

void theaterChaseRainbow(uint8_t wait)
{
  for ( int j=0; j < 256; j++ ) {
    for ( int q=0; q < 3; q++ ) {
      for ( int i=0; i < strip.numPixels(); i=i+3 ) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));
      }
      strip.show();
      delay(wait);
      for ( int i=0; i < strip.numPixels(); i=i+3 ) {
        strip.setPixelColor(i+q, 0);
      }
    }
  }
}

uint32_t Wheel(byte WheelPos)
{
  WheelPos = 255 - WheelPos;
  if ( WheelPos < 85 ) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if( WheelPos < 170 ) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Kết quả

  • Điều khiển vòng LED bằng Remote Control.
PhímChức năng
CH-Giảm số LED sáng
CHĐặt số LED sáng là 6
CH+Tăng số LED sáng
PrevLùi về một hiệu ứng
NextChuyển hiệu ứng tiếp theo
PauseBật/tắt vòng LED
-Giảm độ sáng
+Tăng độ sáng
EQHiệu ứng cầu vòng 1
0Hiệu ứng cầu vòng 2
100+Không có chức năng
200+Không có chức năng
1-99 hiệu ứng màu