Điều khiển LED ma trận

Điều khiển LED ma trận

Điều khiển LED ma trận sử dụng cảm biến điện dung

  • Sử dụng board Unox kết hợp với LED matrix (8x32) hiển thị nội dung được nhập từ Serial trên Ardino IDE.
  • Cảm biến điện dung sẽ điều khiển việc hoạt động của LED matrix.

Các linh kiện cần chuẩn bị

Giới thiệu LED ma trận 8x32 MAX7219

  • LED ma trận thực chất là một bảng các LED đơn được xếp theo hàng và cột (thông thường là 8 hàng và 8 cột).
  • Ta có thể điểu khiển LED ở bất kì vị trí nào bằng cách cấp nguồn vào hàng và cột tương ứng với nó. Giả sử để LED vị trí 1:2 sáng ta sẽ nối 3V3 vào hàng 1 và GND vào cột 2.
  • Điều khiển LED ma trận sẽ tốn rất nhiều chân vi điều khiển (16 chân đối với LED ma trận 8x8) vì vậy thông thường sẽ kết hợp với một IC điều khiển để tiết kiệm số chân. IC MAX7219 được sử dụng để điều khiển LED ma trận 8x8, sử dụng giao tiếp SPI để kết nối với vi điều khiển, vì vậy chúng ta chỉ tốn 3 chân so với 16 chân ban đầu.
  • Module LED ma trận 8x32 là tổ hợp 4 LED ma trận 8x8, với mỗi LED ma trận được điều khiển bởi một IC MAX7219. Module giao tiếp với UnoX thông qua giao tiếp SPI (chân DOUT, CS, CLK).

Nút nhấn cảm ứng điện dung

  • Module cảm ứng điện dung HTTM làm việc dựa trên nguyên lí cảm biến điện dung.
  • Module dễ sử dụng, chỉ cần cấp nguồn vào 2 chân VCC và GND, nếu người dùng chạm vào.chân OUT sẽ thay đổi trạng thái ngõ ra (0V hoặc 5V)
  • Ngoài ra, module còn có đèn nền hiển thị nhiều màu sắc giúp người dùng biết được chân OUT đang ở mức nào (đèn sáng ứng với mức 1 và tắt ứng với mức 0)

Kết nối các linh kiện với UnoX

Bảng kết nối LED ma trận với UnoX

UnoXLED ma trận
Chân 5VVCC
Chân GNDGND
Chân 11DIN
Chân 10CS
Chân 13CLK

Bảng kết nối Nút nhấn với UnoX

UnoXCảm biến điện dung
Chân 5VVCC
Chân GNDGND
Chân A0OUT

Ý tưởng xây dựng chương trình

  • Ban đầu, nếu không có dữ liệu trên serial port thì LED sẽ hiện chữ “Hello World!!” và di chuyển từ trái sang phải.
  • Chương trình sẽ kiểm tra Serial port, khi ta viết nội dung trên serial ở terminal của arduino IDE và nút nhấn cảm ứng điện dung được nhấn thì nội dung đó sẽ hiện lên trên LED ma trận và các chữ hiển thị sẽ cuộn liên tục. Nếu nhấn nút cảm ứng điện dung 1 lần nữa thì các chữ sẽ dừng.

Source code

Thư viện:

Mô tả source code

  • Khai báo đối tượng display (sử dụng thư viện MAX7219DotMatrix.h) nhằm điều khiển việc hiển thị của LED ma trận.
  • Đầu tiên, chương trình sẽ chạy dòng chữ “Hello World!!”, đồng thời người dùng có thể thay đổi dữ liệu hiển thị thông qua Serial.
  • Hiệu ứng chạy chữ sẽ do hàm updateDisplay() thực hiện.

Source code

#include <SPI.h>
#include <bitBangedSPI.h>       //  https://github.com/nickgammon/bitBangedSPI
#include <MAX7219_Dot_Matrix.h> //  https://github.com/nickgammon/MAX7219_Dot_Matrix
#define touchPin  3             //  Kết nối chân cảm biến điện dung với chân sô 3.
#define chips     4             //  Khai báo số module LED ma trận 8x8 được sử dụng.

bool enable = true;                     //  Biến quản lý việc bật tắt LED ma trận.
MAX7219_Dot_Matrix display (chips, 10); //  Khai báo đối tượng display để quản lý viêc điều khiển LED ma trận.
char message[50];                       //  Mảng lưu chuối nội dung hiển thị lên LED ma trận.
String messString = "Hello World!!";    //  Chuổi lưu nội dung hiển thị lên LED ma trận.
unsigned long lastMoved = 0;
unsigned long MOVE_INTERVAL = 100;      //  Tốc độ chạy chữ của LED ma trận.
int messageOffset;

void setup ()
{
  pinMode( touchPin, INPUT ); //  Khai báo chân kết nối với cảm biến điện dung là ngõ vào.
  display.begin();            //  Khởi động LED ma trận
  Serial.begin(9600);         //  Khởi động Serial tốc độ 9600
}
/* Chương trình tạo hiệu ứng chạy chữ cho LED ma trận*/
void updateDisplay ()
{
  display.sendSmooth(message, messageOffset);
  if (messageOffset++ >= (int)(strlen(message)*8)) {
    messageOffset = -chips*8;
  }
}

void loop ()
{
  while(Serial.available()) {
    messString = Serial.readString();
    Serial.println(messString);
  }
  messString.toCharArray(message , messString.length()+1);
  enable = digitalRead( touchPin );
  if ( millis() - lastMoved >= MOVE_INTERVAL ) {
    if (enable) {
      updateDisplay();
    }
    lastMoved = millis();
  }
}

Kết quả

  • LED hiển thị chữ “Hello World!!” khi bắt đầu.
  • Khi viết nội dung trên Serial port, LED sẽ hiện thị nội dung đó
  • Khi nhấn nút nhấn cảm ứng điện dung, LED sẽ chạy nội dung cần hiển thị, nhấn nút nhấn 1 lần nữa thì LED sẽ dừng.

Ứng dụng mở rộng

  • Làm biển chỉ dẫn.
  • Làm bảng quảng cáo.