Giao tiếp led 7 đoạn với Arduino

0
3045
Giao tiếp Arduino và led 7 đoạn

Trong bài hướng dẫn này, các bạn sẽ được học cách giao tiếp led 7 đoạn với Arduino Uno. Tôi sẽ hướng dẫn các bạn cách sử dụng led 7 đoạn để kết nối với Arduino và viết chương trình hiển thi các số thập phân từ 0 đến 9 trên led 7 đoạn. Chương trình được viết theo nhiều kiểu nhắm giúp cho bạn làm quen và linh hoạt hơn khi lập trình.

Chuẩn bị

Phần cứng: 

Tên linh kiện Số lượng
Arduino Uno 1
Led 7 đoạn (Cathode chung) 1
Điện trở 220 Ω 7
Breadboard 1
Dây cắm Breadboard 10
Tụ điện 47uF 1
 

Phần mềm: Arduino IDE

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

Led 7 đoạn hay Led 7 thanh (Seven Segment Display) là 1 linh kiện điện tử được dùng khá nhiều trong các ứng dụng để hiển thị số, ký tự, chỉ thị các trạng thái trong các loại thiết bị từ dân dụng đến công nghiệp.

Cấu tạo

Bên trong Led 7 đoạn bao gồm 7 led đơn có dạng thanh xếp theo hình dạng số 8 có thể hiển thị được các số từ 0 – 9 và có thêm một led đơn hình tròn nhỏ thể hiện dấu chấm tròn ở góc dưới.

Như trên hình các bạn đã thấy, một LED 7 đoạn đơn gồm 10 chân đó là các chân: a, b, c, d, e, f, g, 2 chân chung và chân dấu chấm tròn. Như vậy nếu như muốn hiển thị ký tự nào thì ta chỉ cần xuất tín hiệu điều khiển vào chân đó là led sẽ sáng như mong muốn .

Led 7 đoạn có 2 loại tùy theo cách kết nối giữa các led đơn bên trong: 

Loại Anode chung (chân + các led mắc chung lại với nhau)

Chân 3 và 8 là 2 chân chung được nối nguồn Vcc (nối ngắn mạch lại với nhau , sau đó nối chung với chân anode của 8 led đơn), vậy muốn led nào đó sáng thì cực cathode của led đó phải được tích mức thấp .

Loại Cathode chung (Chân – các led được mắc chung với nhau)

Chân 3 và 8 là 2 chân chung được đất GND (nối ngắn mạch lại với nhau, sau đó nối chung với chân cathode của 8 led đơn), vậy muốn led nào đó sáng thì cực anode của led đó phải được tích mức cao.

Điện trở hạn dòng cho led

Khi kết nối để điều khiển led 7 đoạn, để các led đơn không bị hỏng do quá dòng ta tính toán các điện trở hạn dòng. Điện áp rơi lên led khi led phân cực thuận khoảng 2 đến 2.2 (led xanh da trời và led trắng cao hơn có thể lên đến 3.6 V). 

Điển hình khi điều khiển Led 7 đoạn màu đỏ, dòng đi qua led khoảng 15 mA. Vì vậy điện trở hạn dòng qua led được tính như sau R= (5V – 2V)/15mA. Ta tính ra R =220 Ohm

Hoạt động của led 7 đoạn

Giả sử bây giờ chúng ta muốn hiển thị số 0 trên led 7 đoạn như hình bên dưới, các bạn suy nghĩ xem chúng ta phải làm thế nào?

Để hiển thị số 0 thì chúng ta phải làm cho các LED đơn a, b, c, d, e, f sáng lên, dấu chấm và g phải tắt đi. Như vậy để tạo số 0 chúng ta phải thể hiện mã code hệ nhị phân (binary) là 00111111B hay hệ thập lục phân là 0x3F.

Tương tự đối với số 1 thì có những cái LED nào sáng? Các bạn có thể viết được mã làm xuất hiện số 1 được không? Đó là: 00000110B hay 0x06.

Tương tự đối với các số 2. 3, 4, 5, 6, 7, 9.

Để dễ hiểu hơn tôi xin đưa ra một bảng sau để thuận tiện các bạn dò. Lưu ý: sáng là 1, tắt là 0.

Bảng mô tả cách tạo ra các chữ số để hiển thị lên LED 7 đoạn (cathode chung):

Số thập phân Số HEX dp g f e d c b a
0 0x3F 0 0 1 1 1 1 1 1
1 0x06 0 0 0 0 0 1 1 0
2 0x5B 0 1 0 1 1 0 1 1
3 0x4F 0 1 0 0 1 1 1 1
4 0x66 0 1 1 0 0 1 1 0
5 0x6D 0 1 1 0 1 1 0 1
6 0x7D 0 1 1 1 1 1 0 1
7 0x07 0 0 0 0 0 1 1 1
8 0x7F 0 1 1 1 1 1 1 1
9 0x6F 0 1 1 0 1 1 1 1

Sơ đồ kết nối Arduino với led 7 đoạn

 Sơ đồ mạch giao tiếp led 7 đoạn với arduino

Thực hiện kết nối led 7 đoạn với Arduino theo bảng dưới đây:

Arduino Led 7 đoạn
0 7(a)
1 6(b)
2 4(c)
3 2(d)
4 1(e)
5 9(f)
6 10(g)
7 5(dp)
GND 3,8 (chân chung)

Chương trình

Chương trình 1

void setup() {

pinMode(0, OUTPUT);

pinMode(1, OUTPUT);

pinMode(2, OUTPUT);

pinMode(3, OUTPUT);

pinMode(4, OUTPUT);

pinMode(5, OUTPUT);

pinMode(6, OUTPUT);

pinMode(7, OUTPUT);

digitalWrite(7, 0);  // tắt chấm tròn “dp”

}

void loop() {

// Hiển thị số ‘0’

digitalWrite(0, 1);

digitalWrite(1, 1);

digitalWrite(2, 1);

digitalWrite(3, 1);

digitalWrite(4, 1);

digitalWrite(5, 1);

digitalWrite(6, 0);

delay(1000);

// Hiển thị số ‘1’

digitalWrite(0, 0);

digitalWrite(1, 1);

digitalWrite(2, 1);

digitalWrite(3, 0);

digitalWrite(4, 0);

digitalWrite(5, 0);

digitalWrite(6, 0);

delay(1000);

// Hiển thị số ‘2’

digitalWrite(0, 1);

digitalWrite(1, 1);

digitalWrite(2, 0);

digitalWrite(3, 1);

digitalWrite(4, 1);

digitalWrite(5, 0);

digitalWrite(6, 1);

delay(1000);

// Hiển thị số ‘3’

digitalWrite(0, 1);

digitalWrite(1, 1);

digitalWrite(2, 1);

digitalWrite(3, 1);

digitalWrite(4, 0);

digitalWrite(5, 0);

digitalWrite(6, 1);

delay(1000);

// Hiển thị số ‘4’

digitalWrite(0, 0);

digitalWrite(1, 1);

digitalWrite(2, 1);

digitalWrite(3, 0);

digitalWrite(4, 0);

digitalWrite(5, 1);

digitalWrite(6, 1);

delay(1000);

// Hiển thị số ‘5’

digitalWrite(0, 1);

digitalWrite(1, 0);

digitalWrite(2, 1);

digitalWrite(3, 1);

digitalWrite(4, 0);

digitalWrite(5, 1);

digitalWrite(6, 1);

delay(1000);

// Hiển thị số ‘6’

digitalWrite(0, 1);

digitalWrite(1, 0);

digitalWrite(2, 1);

digitalWrite(3, 1);

digitalWrite(4, 1);

digitalWrite(5, 1);

digitalWrite(6, 1);

delay(1000);

// Hiển thị số ‘7’

digitalWrite(0, 1);

digitalWrite(1, 1);

digitalWrite(2, 1);

digitalWrite(3, 0);

digitalWrite(4, 0);

digitalWrite(5, 0);

digitalWrite(6, 0);

delay(1000);

// Hiển thị số ‘8’

digitalWrite(0, 1);

digitalWrite(1, 1);

digitalWrite(2, 1);

digitalWrite(3, 1);

digitalWrite(4, 1);

digitalWrite(5, 1);

digitalWrite(6, 1);

delay(1000);

// Hiển thị số ‘9’

digitalWrite(0, 1);

digitalWrite(1, 1);

digitalWrite(2, 1);

digitalWrite(3, 1);

digitalWrite(4, 0);

digitalWrite(5, 1);

digitalWrite(6, 1);

delay(1000);

}​​​​​

Chương trình 2

#define segA 0// kết nối đoạn a với chân 0

#define segB 1// kết nối đoạn b với chân 1

#define segC 2// kết nối đoạn c với chân 2

#define segD 3// kết nối đoạn d với chân 3

#define segE 4// kết nối đoạn e với chân 4

#define segF 5// kết nối đoạn f với chân 5

#define segG 6// kết nối đoạn g với chân 6

int COUNT=0;// đếm số nguyên tăng dần từ 0 đến 9

void setup()

{

for (int i=0;i<7;i++)

{

pinMode(i, OUTPUT);// thiết lập các chân từ 0 đến 6 là ngõ ra

}

}

void loop()

{

switch (COUNT)

{

case 0:// khi giá trị đếm là 0 sẽ thấy số 0 hiển trị trên led 7 đoạn

digitalWrite(segA, HIGH);

digitalWrite(segB, HIGH);

digitalWrite(segC, HIGH);

digitalWrite(segD, HIGH);

digitalWrite(segE, HIGH);

digitalWrite(segF, HIGH);

digitalWrite(segG, LOW);

break;

case 1:// khi giá trị đếm là 1 sẽ thấy số 1 hiển trị trên led 7 đoạn

digitalWrite(segA, LOW);

digitalWrite(segB, HIGH);

digitalWrite(segC, HIGH);

digitalWrite(segD, LOW);

digitalWrite(segE, LOW);

digitalWrite(segF, LOW);

digitalWrite(segG, LOW);

break;

case 2:// khi giá trị đếm là 2 sẽ thấy số 2 hiển trị trên led 7 đoạn

digitalWrite(segA, HIGH);

digitalWrite(segB, HIGH);

digitalWrite(segC, LOW);

digitalWrite(segD, HIGH);

digitalWrite(segE, HIGH);

digitalWrite(segF, LOW);

digitalWrite(segG, HIGH);

break;

case 3:// khi giá trị đếm là 3 sẽ thấy số 3 hiển trị trên led 7 đoạn

digitalWrite(segA, HIGH);

digitalWrite(segB, HIGH);

digitalWrite(segC, HIGH);

digitalWrite(segD, HIGH);

digitalWrite(segE, LOW);

digitalWrite(segF, LOW);

digitalWrite(segG, HIGH);

break;

case 4:// khi giá trị đếm là 4 sẽ thấy số 4 hiển trị trên led 7 đoạn

digitalWrite(segA, LOW);

digitalWrite(segB, HIGH);

digitalWrite(segC, HIGH);

digitalWrite(segD, LOW);

digitalWrite(segE, LOW);

digitalWrite(segF, HIGH);

digitalWrite(segG, HIGH);

break;

case 5:// khi giá trị đếm là 5 sẽ thấy số 5 hiển trị trên led 7 đoạn

digitalWrite(segA, HIGH);

digitalWrite(segB, LOW);

digitalWrite(segC, HIGH);

digitalWrite(segD, HIGH);

digitalWrite(segE, LOW);

digitalWrite(segF, HIGH);

digitalWrite(segG, HIGH);

break;

case 6:// khi giá trị đếm là 6 sẽ thấy số 6 hiển trị trên led 7 đoạn

digitalWrite(segA, HIGH);

digitalWrite(segB, LOW);

digitalWrite(segC, HIGH);

digitalWrite(segD, HIGH);

digitalWrite(segE, HIGH);

digitalWrite(segF, HIGH);

digitalWrite(segG, HIGH);

break;

case 7:// khi giá trị đếm là 7 sẽ thấy số 7 hiển trị trên led 7 đoạn

digitalWrite(segA, HIGH);

digitalWrite(segB, HIGH);

digitalWrite(segC, HIGH);

digitalWrite(segD, LOW);

digitalWrite(segE, LOW);

digitalWrite(segF, LOW);

digitalWrite(segG, LOW);

break;

case 8:// khi giá trị đếm là 8 sẽ thấy số 8 hiển trị trên led 7 đoạn

digitalWrite(segA, HIGH);

digitalWrite(segB, HIGH);

digitalWrite(segC, HIGH);

digitalWrite(segD, HIGH);

digitalWrite(segE, HIGH);

digitalWrite(segF, HIGH);

digitalWrite(segG, HIGH);

break;

case 9:// khi giá trị đếm là 9 sẽ thấy số 9 hiển trị trên led 7 đoạn

digitalWrite(segA, HIGH);

digitalWrite(segB, HIGH);

digitalWrite(segC, HIGH);

digitalWrite(segD, HIGH);

digitalWrite(segE, LOW);

digitalWrite(segF, HIGH);

digitalWrite(segG, HIGH);

break;

break;

}

if (COUNT<10)

{

COUNT++;

delay(1000);// tăng số đếm với mỗi giây

}

if (COUNT==10)

{

COUNT=0;// nếu giá trị đếm là 10, reset về 0.

delay(1000);

}

}

Chương trình 3

// Tạo một mảng để lưu cấu hình số chân led 7 đoạn
void Display_Segment(int);

// Lưu trữ tất cả giá trị cấu hình của led 7 đoạn, chúng tôi đã lấy từ bảng
int digit[10][7] = {{ 0,1,1,1,1,1,1}, // Số “0”
{ 0,0,0,0,1,1,0}, // Số “1”
{ 1,0,1,1,0,1,1}, // Số “2”
{ 1,0,0,1,1,1,1}, // Số “3”
{ 1,1,0,0,1,1,0}, // Số “4”
{ 1,1,0,1,1,0,1}, // Số “5”
{ 1,1,1,1,1,0,1}, // Số “6”
{ 0,0,0,0,1,1,1}, // Số “7”
{ 1,1,1,1,1,1,1}, // Số “8”
{ 1,1,0,1,1,1,1 }}; // Số “9”
void setup()
{
// Thiết lập chân ngõ ra
for(int a=0 ; a<=6; a++){
pinMode(a, OUTPUT);
}
}

void loop()
{
// Vóng lặp từ 0 đến 9
for (int value = 0; value<=9; value++)
{
delay(1000);
Display_Segment(value); //Chuyển giá trị cho hàm để hiển thị trên led 7 đoạn
}
delay(2500);
}

// Hàm lấy giá trị và hiển thị lên led 7 đoạn
void Display_Segment(int value)
{
int startPin= 0;
for (int x=6; x >= 0; x–) {
digitalWrite(startPin, digit[value][x]);
startPin++;
}
}

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây