Bài 16: Điều khiển LED 7 đoạn bằng IR Remote Arduino

Bài 16: Điều khiển LED 7 đoạn bằng IR Remote Arduino

Trong nội dung bài trước mình đã giới thiệu các bạn làm thế nào để hiển thị dãy số lên LED 7 đoạn. Tiếp tục trong chuỗi bài viết hôm nay mình sẽ hướng dẫn các bạn cách dùng IR Remote để điều khiển LED 7 đoạn và để hiểu hơn về bài viết hôm nay các bạn có thể xem lại bài hôm trước để có thể thực hành một cách tốt nhất.

IR Remote là gì?

IR Remote là một thiết bị điều khiển từ xa sử dụng sóng hồng ngoại (IR) để truyền tín hiệu điều khiển đến các thiết bị điện tử như TV, DVD, máy chiếu, điều hòa nhiệt độ, đèn… IR Remote thường có các nút bấm để điều khiển các chức năng khác nhau của thiết bị, và tín hiệu được gửi từ IR Remote sẽ được giải mã và thực hiện tác vụ tương ứng trên thiết bị điện tử. Ngoài ra, IR Remote cũng được sử dụng rộng rãi trong các dự án IoT để điều khiển các thiết bị thông qua mạng internet hoặc các giao thức khác.

Xem thêm: Bài 15: Sơ lược về LED 7 Đoạn ứng dụng làm bộ đếm sản phẩm sử dụng Arduino

Sơ đồ đấu nối

Các linh kiện cần thiết cho dự án

Tên linh kiện Số lượng
Arduino Uno R3 1
Dây cắm 15
Breadboard 1
LED 7 đoạn 1
Trở 220R 8
IR Receiver 1
Điều khiển IR Remote 1

Code

#include <IRremote.h>      
int RECV_PIN = 11;         
IRrecv irrecv(RECV_PIN);   
decode_results results;   
int currentNumber = 0;     

long codes[12]=             // this array is used to store infrared codes
{
   0xFD30CF,0xFD08F7,               // 0 ,1
   0xFD8877,0xFD48B7,               // 2 ,3
   0xFD28D7,0xFDA857,               // 4 ,5
   0xFD6897,0xFD18E7,               // 6 ,7
   0xFD9867,0xFD58A7,               // 8 ,9
   0xFD20DF,0xFD609F,               // advance, move back
};

int number[10][8] =            //the array is used to store the number 0~9
{
  {0,0,0,1,0,0,0,1},//0
  {0,1,1,1,1,1,0,1},//1
  {0,0,1,0,0,0,1,1},//2
  {0,0,1,0,1,0,0,1},//3
  {0,1,0,0,1,1,0,1},//4
  {1,0,0,0,1,0,0,1},//5
  {1,0,0,0,0,0,0,1},//6
  {0,0,1,1,1,1,0,1},//7
  {0,0,0,0,0,0,0,1},//8
  {0,0,0,0,1,1,0,1} //9
};

void numberShow(int i) {                  //this function is used to display numbers
  for(int pin = 2; pin <= 9 ; pin++){
     digitalWrite(pin, number[i][pin - 2]);
  }
}

void setup(){
  Serial.begin(9600);            
  irrecv.enableIRIn();          
  
  for(int pin = 2 ; pin <= 9 ; pin++){   
      pinMode(pin, OUTPUT);
      digitalWrite(pin, HIGH);
  }
}

void loop() {
  if (irrecv.decode(&results)) {
      for(int i = 0; i <= 11; i++){
         
         if(results.value == codes[i]&& i <= 9){
               numberShow(i);  // display number 0~9 on the digital control
               currentNumber = i;  
               Serial.println(i);
               break;        
         }
         else if(results.value == codes[10]&& currentNumber != 0){
               currentNumber--;                 
               numberShow(currentNumber);       
               Serial.println(currentNumber);  
               break;        
         }
         else if(results.value == codes[11]&& currentNumber != 9){
               currentNumber++;                 
               numberShow(currentNumber);      
               Serial.println(currentNumber); 
               break;            
         }
    } 
    
   Serial.println(results.value, HEX); 
   irrecv.resume();   
  }
}

Đây là một ứng dụng để hiển thị số trên một module Led 7 đoạn sử dụng một remote điều khiển hồng ngoại. Code sử dụng thư viện IRremote để đọc thông tin từ remote và thư viện đã được khai báo sẵn.

int RECV_PIN = 11;         
IRrecv irrecv(RECV_PIN);   
decode_results results;   
int currentNumber = 0;

Một số biến được khai báo như sau:

  • RECV_PIN: Đây là chân được sử dụng để nhận tín hiệu hồng ngoại, được gán giá trị bằng 11.
  • irrecv: Đây là đối tượng IRrecv được tạo ra từ thư viện IRremote, để nhận và giải mã tín hiệu hồng ngoại từ remote.
  • results: Đây là biến kiểu decode_results được khai báo để lưu trữ thông tin về tín hiệu hồng ngoại giải mã được từ remote.
  • currentNumber: Biến này sẽ được sử dụng để lưu trữ số hiện tại đang được hiển thị trên module.
long codes[12]=             // this array is used to store infrared codes
{
   0xFD30CF,0xFD08F7,               // 0 ,1
   0xFD8877,0xFD48B7,               // 2 ,3
   0xFD28D7,0xFDA857,               // 4 ,5
   0xFD6897,0xFD18E7,               // 6 ,7
   0xFD9867,0xFD58A7,               // 8 ,9
   0xFD20DF,0xFD609F,               // advance, move back
};

int number[10][8] =            //the array is used to store the number 0~9
{
  {0,0,0,1,0,0,0,1},//0
  {0,1,1,1,1,1,0,1},//1
  {0,0,1,0,0,0,1,1},//2
  {0,0,1,0,1,0,0,1},//3
  {0,1,0,0,1,1,0,1},//4
  {1,0,0,0,1,0,0,1},//5
  {1,0,0,0,0,0,0,1},//6
  {0,0,1,1,1,1,0,1},//7
  {0,0,0,0,0,0,0,1},//8
  {0,0,0,0,1,1,0,1} //9
};

Đoạn code trên sử dụng hai mảng, một mảng để lưu trữ mã tín hiệu hồng ngoại tương ứng với mỗi số và một mảng khác để lưu trữ thông tin về các chân điều khiển digitalWrite(); để hiển thị mỗi số.

void numberShow(int i) {                  //this function is used to display numbers
  for(int pin = 2; pin <= 9 ; pin++){
     digitalWrite(pin, number[i][pin - 2]);
  }
}

Hàm numberShow(int i) được sử dụng để hiển thị số trên module với đối số truyền vào là số cần hiển thị.

void setup(){
  Serial.begin(9600);            
  irrecv.enableIRIn();          
  
  for(int pin = 2 ; pin <= 9 ; pin++){   
      pinMode(pin, OUTPUT);
      digitalWrite(pin, HIGH);
  }
}

Ở hàm setup(), đầu tiên Serial được bắt đầu với tốc độ truyền dữ liệu là 9600. Sau đó, hàm enableIRIn() được gọi từ đối tượng irrecv, đây là để kích hoạt chức năng thu sóng hồng ngoại từ đầu thu hồng ngoại kết nối đến chân 11 trên bo mạch Arduino. Cuối cùng, một vòng lặp được sử dụng để thiết lập chân số 2 đến chân số 9 là đầu ra và đặt chúng ở trạng thái HIGH (điện áp cao).

void loop() {
  if (irrecv.decode(&results)) {
      for(int i = 0; i <= 11; i++){
         
         if(results.value == codes[i]&& i <= 9){
               numberShow(i);  // display number 0~9 on the digital control
               currentNumber = i;  
               Serial.println(i);
               break;        
         }
         else if(results.value == codes[10]&& currentNumber != 0){
               currentNumber--;                 
               numberShow(currentNumber);       
               Serial.println(currentNumber);  
               break;        
         }
         else if(results.value == codes[11]&& currentNumber != 9){
               currentNumber++;                 
               numberShow(currentNumber);      
               Serial.println(currentNumber); 
               break;            
         }
    } 
    
   Serial.println(results.value, HEX); 
   irrecv.resume();   
  }
}

Trong hàm loop(), điều kiện if được sử dụng để kiểm tra xem đầu thu hồng ngoại có nhận được dữ liệu không. Nếu đầu thu hồng ngoại đã nhận được dữ liệu, các thông số nhận được sẽ được lưu trữ trong đối tượng results. Một vòng lặp for được sử dụng để so sánh các giá trị nhận được với giá trị trong mảng codes.

Nếu giá trị nhận được là một số từ 0 đến 9, hàm numberShow(i) được gọi để hiển thị số tương ứng trên các chân đầu ra từ chân số 2 đến chân số 9 của bo mạch Arduino và giá trị hiện tại của số được lưu trữ trong biến currentNumber. Sau đó, giá trị của số đó được in ra trên Serial Monitor và vòng lặp được ngắt.

Nếu giá trị nhận được là giá trị “advance” (codes[10]), biến currentNumber được giảm đi một đơn vị và số được hiển thị trên chân đầu ra. Nếu giá trị hiện tại của số không phải là 0, giá trị mới của số sẽ được in ra trên Serial Monitor.

Nếu giá trị nhận được là giá trị “move back” (codes[11]), biến currentNumber được tăng lên một đơn vị và số được hiển thị trên chân đầu ra. Nếu giá trị hiện tại của số không phải là 9, giá trị mới của số sẽ được in ra trên Serial Monitor.

Cuối cùng, giá trị của dữ liệu nhận được từ đầu thu hồng ngoại được in ra trên Serial Monitor và hàm resume() được gọi từ đối tượng irrecv để đặt đầu thu hồng ngoại vào trạng thái chờ nhận.

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments