Cách lập trình nhiều con LED 7 đoạn (loại đơn)

Nội dung chính, cần nắm

Điều khiển một con LED 7 đoạn loại đơn, loại kép hay loại tứ với Arduino là điều cực kỳ đơn giản. Bạn có thể tham khảo các bài viết sau nếu chỉ muốn lập trình điều khiển 1 con LED 7 đoạn:

Tuy nhiên, để điều khiển nhiều hơn 1 chú LED 7 đoạn thì ta không thể sử dụng hướng dẫn ở 2 bài hướng dẫn trên. Vì sao? Là bởi vì chúng ta không đủ "chân" cho các chú LED thứ 2, 3,... Trong phạm vi bài viết này, tớ có tham khảo một số hình ảnh, thông tin từ 2 bài viết kia để các bạn dễ dàng nắm bắt. Đồng thời, trước khi bắt đầu, bạn bắt buộc phải biết về shiftOut. Vì vậy, nếu chưa biết về shiftOut, đề nghị bạn tham khảm bài viết Điều khiển 8 đèn LED sáng theo ý muốn của bạn, dễ hay khó ?.

Được rồi, đi thẳng vào vấn đề chính ngày hôm nay nào, chúng ta sẽ tìm hiểu cách điều khiển 1 đèn LED 7 đoạn qua 1 chú HC595 được điều khiển bởi Arduino. Sau đó sẽ là 2 chú HC 595, và cứ như thế bạn sẽ làm được nhiều LED 7 đoạn hơn.

Phần cứng

Video demo

Giới thiệu led 7 đoạn

Bạn có thể hiểu một cách vô cùng đơn giản về LED 7 đoạn như sau:

LED 7 đoạn có 2 loại:

  • Chung cực dương: Mỗi đèn LED có 2 chân (1 dương 1 âm). Ở loại LED 7 đoạn này tất cả cực dương sẽ được nối chung cực dương. Để làm các đèn LED trong LED 7 đoạn sáng thì bạn chỉ cần cấp cực âm vào các chân của đèn. Với loại LED 7 đoạn này bạn chỉ cần 1 điện trở là đủ.
  • Chung cực âm: Tương tự nhưng ngược lại và bạn cần đến 8 điện trở cho các chân dương của LED.

Nguyên lý căn bản của LED 7 đoạn đó là cấp nguồn là nó sáng. Để nó sáng theo ý mình thì bạn cần phải nói ngôn ngữ Arduino cho mạch Arduino Uno hiểu, từ đó Arduino Uno sẽ điều khiển IC HC 595 (chỉ tốn 3 chân điều khiển), từ đó IC HC595 sẽ cấp nguồn cho các chân LED 7 đoạn theo yêu cầu của mình!

Lắp mạch

Vì tớ đã yêu cầu bạn xem về bài viết shiftOut trước khi đọc phần bài này nên trong phạm vi bài viết tớ sẽ không nhắc lại về shiftOut. Nếu bạn đã quên về shiftOut, bạn có thể tham khảo tại bài viết Điều khiển 8 đèn LED sáng theo ý muốn của bạn, dễ hay khó ?

Đầu tiên, bạn cần lắp mạch như thế này để bật IC HC595 lên.

Sau đó lắp thêm như thế này để ta có thể shiftOut từ Arduino vào IC HC595

Sau đó bạn lắp tiếp như thế này hoặc tham khảo bảng chỉ dẫn lắp mạch ở dưới

LED 7 đoạn HC 595
1 (e) Q4 (4)
2 (d) Q3 (3)
4 (c) Q2 (2)
5 (dp) Q7 (7)
6 (b) Q1 (1)
7 (a) Q0 (15)
9 (f) Q5 (5)
10 (g) Q6 (6)

Bạn có thể tham khảo file ảnh từ Proteus sau.

Lập trình

/*
shiftOut ra 1 Module LED 7 đoạn đơn
*/
//chân ST_CP của 74HC595
int latchPin = 8;
//chân SH_CP của 74HC595
int clockPin = 12;
//Chân DS của 74HC595
int dataPin = 11;

// Ta sẽ xây dựng mảng hằng số với các giá trị cho trước
// Các bit được đánh số thứ tự (0-7) từ phải qua trái (tương ứng với A-F,DP)
// Vì ta dùng LED 7 đoạn chung cực dương nên với các bit 0
// thì các đoạn của LED 7 đoạn sẽ sáng
// với các bit 1 thì đoạn ấy sẽ tắt

//mảng có 10 số (từ 0-9) và 
const int Seg[10] = {
  0b11000000,//0 - các thanh từ a-f sáng
  0b11111001,//1 - chỉ có 2 thanh b,c sáng
  0b10100100,//2
  0b10110000,//3
  0b10011001,//4
  0b10010010,//5
  0b10000011,//6
  0b11111000,//7
  0b10000000,//8
  0b10010000,//9
};


void setup() {
  //Bạn BUỘC PHẢI pinMode các chân này là OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() { 
  static int point = 0;
  
  //shiftout - start
  digitalWrite(latchPin, LOW);
  //Xuất bảng ký tự ra cho Module LED
  shiftOut(dataPin, clockPin, MSBFIRST, Seg[point]);  
  digitalWrite(latchPin, HIGH);
  //shiftout - end
  
  point = (point + 1) % 10; // Vòng tuần hoàn từ 0--9
  delay(500);//Đợi 0.5 s cho mỗi lần tăng số
}

Bạn có thể tải về file Proteus và file hex của ví dụ trên tại đây.

Tiếp theo sẽ là 2 Module LED 7 đoạn đơn và hơn thế nữa trong tương lai

Kể từ con IC HC595 thứ 2 trở đi, bạn sẽ lắp như thế này. Con thứ 2 thì mắc vào con thứ 1, con thứ 3 thì mắc vào con thứ 2,... Sau đó xem phần lập trình của tớ để xây dựng bảng số. Tớ có viết một hàm đơn giản để sau này bạn lắp bao nhiêu thì tùy ý hehe. Con sau sẽ lắp trước con liền kề nó nhé!

LED 7 đoạn HC 595 thứ 2
1 (e) Q4 (4)
2 (d) Q3 (3)
4 (c) Q2 (2)
5 (dp) Q7 (7)
6 (b) Q1 (1)
7 (a) Q0 (15)
9 (f) Q5 (5)
10 (g) Q6 (6)
HC 595 thứ 1 HC 595 thứ 2
11 11
12 12
9 14

Bạn có thể tham khảo cách lắp từ proteus

/*
shiftOut ra 1 Module LED 7 đoạn đơn
*/
//chân ST_CP của 74HC595
int latchPin = 8;
//chân SH_CP của 74HC595
int clockPin = 12;
//Chân DS của 74HC595
int dataPin = 11;

// Ta sẽ xây dựng mảng hằng số với các giá trị cho trước
// Các bit được đánh số thứ tự (0-7) từ phải qua trái (tương ứng với A-F,DP)
// Vì ta dùng LED 7 đoạn chung cực dương nên với các bit 0
// thì các đoạn của LED 7 đoạn sẽ sáng
// với các bit 1 thì đoạn ấy sẽ tắt

//mảng có 10 số (từ 0-9) và 
const byte Seg[10] = {
  0b11000000,//0 - các thanh từ a-f sáng
  0b11111001,//1 - chỉ có 2 thanh b,c sáng
  0b10100100,//2
  0b10110000,//3
  0b10011001,//4
  0b10010010,//5
  0b10000010,//6
  0b11111000,//7
  0b10000000,//8
  0b10010000,//9
};


void setup() {
  //Bạn BUỘC PHẢI pinMode các chân này là OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void HienThiLED7doan(unsigned long Giatri, byte SoLed = 2) {
  
  byte *array= new byte[SoLed];
  for (byte i = 0; i < SoLed; i++) {
    //Lấy các chữ số từ phải quá trái
    array[i] = (byte)(Giatri % 10UL);
    Giatri = (unsigned long)(Giatri /10UL);
  }
  digitalWrite(latchPin, LOW);
  for (int i = SoLed - 1; i >= 0; i--)
    shiftOut(dataPin, clockPin, MSBFIRST, Seg[array[i]]); 
  
  digitalWrite(latchPin, HIGH);
  free(array);
}


void loop() { 
  static unsigned long point = 0;
  
  HienThiLED7doan(point, 2);
  
  point = (point + 1) % 100UL; // Vòng tuần hoàn từ 0--99
  delay(500);//Đợi 0.5 s cho mỗi lần tăng số
}

Bạn hãy tải về file proteus và file hex của ví dụ này tại đây.

Lời kết

Càng nghiên cứu Arduino nhiều bạn sẽ cảm thấy nó cực kỳ hay (giống như tôi bây giờ). Càng nghiên cứu rành rọt những thứ cơ bản bạn sẽ dễ dàng được nhiều thứ phức tạp. Ở bài viết này, những điều đơn giản là nguyên lý led 7 đoạn rồi shiftout. Tớ tập hợp lại shiftout + nhiều led 7 đoạn. Hehe, sau này sẽ còn nhiều thứ kết hợp lại lắm. Chỉ cần bạn chịu khó nghiên cứu và sáng tạo thôi!

Uống nước nhiều vô nhé, do thời gian này là mùa hè mà!

lên
39 thành viên đã đánh giá bài viết này hữu ích.
Hướng dẫn sử dụng các loại module

Nếu bạn đang muốn thực hiện hóa ý tưởng của mình mà không biết dùng loại module nào? Hãy tham khảo các module trong danh sách sau

Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

LED_BUILTIN

Hầu hết các mạch Arduino đều có một pin kết nối với một on-board LED (led nằm trên mạch) nối tiếp với một điện trở. LED_BUILTIN là một hằng số thay thế cho việc tuyên bố một biến có giá trị điều khiển on-board LED. Hầu hết trên các mạch Arduino, chúng có giá trị là 13

lên
8 thành viên đã đánh giá bài viết này hữu ích.

Cách dữ liệu được truyền đi trong sóng vô tuyến

Có 2 phương thức truyền dữ liệu bằng sóng vô tuyến, đó là AM và FM. Chắc hẳn, bạn đã từng nghe qua 2 khái niệm đó rồi phải không nào? Nếu không nhớ thì bạn hãy tìm ngay một chiếc radio và bật lên để cùng nghe những thông tin bổ ích từ các đài phát thanh qua sóng FM. Hôm nay, chúng ta sẽ cùng nhau tìm hiểu về 2 phương thức này, cái nào tốt hơn cái nào nhé.

lên
15 thành viên đã đánh giá bài viết này hữu ích.