1. Chuẩn bị dụng cụ:
- Mạch Arduino
- Led 7 thanh 4 số
- Đế gắn linh kiện
- Dây kết nối
- Máy tính cài đặt phần mềm lập trình
2. Tên chân linh kiện lắp ráp
Tên lập trình
|
Chân Led 7 thanh 4 số
|
Chân Arduino
|
Nối thêm
điện trở
Ohm
|
Ghi chú
|
Digit 1
|
12
|
2
|
||
Digit 2
|
9
|
3
|
||
Digit 3
|
8
|
4
|
||
Digit 4
|
6
|
5
|
||
Segment A (oben)
|
11
|
6
|
680
|
|
Segment B
(rechts oben) |
7
|
7
|
680
|
|
Segment C
(rechts unten) |
4
|
8
|
680
|
|
Segment D (unten)
|
2
|
9
|
680
|
|
Segment E
(links unten) |
1
|
10
|
680
|
|
Segment F
(links oben) |
10
|
11
|
680
|
|
Segment G (Mittelstrich)
|
5
|
12
|
680
|
|
DP Dezimalpunkt
|
3
|
13
|
680
|
3. Sơ đồ chân Led 7 thanh 4 số
4. Phần code lập trình
/*
22-6-2015
GV hướng dẫn: Đoàn Văn Huân
Trường THCS Hồng Bàng - Hải Phòng
*Hướng dẫn bài: Lập trình Mạch đếm 4 số led 7 thanh
*Chuẩn bị:
Mạch Arduino, Led 7 thanh 4 số, các phụ kiện đi kèm
Lắp ráp mạch theo ý thưởng thiết kế
*Tài liệu tham khảo: http://www.Arduino24h.blogspot.com
/*Khai báo giá trị nhập vào
*/
int digit1 = 2; //Khai báo giá trị chân DIG1 là chân số 12 của Led 7 thanh vào chân 2 của Arduino
int digit2 = 3; //Tương tự như trên, cái tên digit2 là do ta tự đặt ra,
int digit3 = 4; //các em có thể đặt khác đi nhưng ko để trùng với từ khóa
int digit4 = 5;
//Khai báo giá trị của các thanh Led 7 thanh
int segA = 6; //Khai báo giá trị chân segA là chân số 11 của Led 7 thanh vào chân 6 của Arduino
int segB = 7; //Tương tự như trên, cái tên segB là do ta tự đặt ra, các em có thể đặt khác đi nhưng ko để trùng với từ khóa
int segC = 8;
int segD = 9;
int segE = 10;
int segF = 11;
int segG = 12;
void setup() { // Khởi tạo biến đã khai báo
pinMode(segA, OUTPUT); // Khai báo tên Pin đầu ra
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(digit1, OUTPUT);
pinMode(digit2, OUTPUT);
pinMode(digit3, OUTPUT);
pinMode(digit4, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() { //Khởi tạo giá trị ban đầu cho vòng lặp
displayNumber(millis()/1000); //Thời gian bắt đầu khởi động gán bằng millis();
}
// Một số kế hoạch yêu cầu thiết kế như sau:
// 1.Hiển thị thời gian sáng của các con số
// Mỗi con số trên sẽ hiển thị một khoảng thời gian rất nhỏ của giây
// Sau đó, nó tắt cho đến khi các con số khác đã hiển thị xong cho một vòng
// Giả sử mỗi chữ số trên hiển thị 1000us=1ms
// Mỗi con số là trên cho 1ms, có 4 chữ số, vì vậy màn hình là tắt cho 16ms.
// Đó là một tỷ lệ 1ms để 16ms hay 6,25% về thời gian (PWM).
// 2.Xác định độ sáng của Led
// Đặt một biến gọi là độ sáng của Led là: Display_Brightness
// Thông số của led thay đổi từ:
// 5000: độ sáng tối đa sáng (dòng 15.7mA cho mỗi số)
// 2000: độ sáng kinh hoàng (dòng 11.4mA cho mỗi chữ số)
// 1000: khá sáng (5.9mA)
// 500 bình thường (3mA)
// 200: mờ nhưng có thể đọc được (1.4mA)
// 50 mờ nhưng có thể đọc được (0.56mA)
// 5 mờ nhưng có thể đọc được (0.31mA)
// 1 mờ nhưng có thể đọc được trong bóng tối (0.28mA)
// Vậy ta có thế chọn mức trung bình là 500
void displayNumber(int toDisplay) { //Khởi tạo giá trị độ sáng
#define DISPLAY_BRIGHTNESS 500 //Khai báo tên và giá trị không đổi
#define DIGIT_ON HIGH //Khai báo tên và giá trị không đổi
#define DIGIT_OFF LOW //Khai báo tên và giá trị không đổi
long beginTime = millis(); //Gán giá trị Độ dài thời gian bắt đầu là mili giây
for(int digit = 4 ; digit > 0 ; digit--) { //Bật số Led hiện thị, có thể là 1,2,3,4, vòng lặp này để hiển thị số led 7 thanh
switch(digit) { //Chuyển đổi các trường hợp, bằng cách cấp điện cho 1 trong 4 chân Dig của Led
case 1:
digitalWrite(digit1, DIGIT_ON); // Nhập số Pin và khai báo giá trị của Pin đó
break; //Lệnh nghỉ
case 2:
digitalWrite(digit2, DIGIT_ON);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
break;
}
//Bật các thanh led phù hợp với chữ số này
lightNumber(toDisplay % 10); //Thời gian cho 1 vòng Led đếm,
toDisplay /= 10; //nếu giá trị =10 thì đếm từ 0 đến 9 và quay lại,
//giá trị = 6 thì đếm từ 0-5 rồi quay lại
delayMicroseconds(DISPLAY_BRIGHTNESS); //Độ trễ mili giây
lightNumber(10); //nhập giá trị độ sáng
//Tắt tất cả các số
digitalWrite(digit1, DIGIT_OFF); // Nhập số Pin và khai báo giá trị của Pin
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
}
while( (millis() - beginTime) < 10) ; //Chờ cho 16ms để hiển thi các số khác,
//Nếu Number == 10 thì tắt số đó
// Các thanh hiển thị sẽ quay lập lại từ 0-9
}
void lightNumber(int numberToDisplay) { // Khởi tạo giá trị số hiển thị
#define SEGMENT_ON LOW // Đặt tên không đổi cho các thanh Led
#define SEGMENT_OFF HIGH
switch (numberToDisplay){ // //Chuyển đổi các trường hợp, để có các giá trị hiển thị của Led
case 0: //Để có được số 0 thì thanh G sẽ tắt,
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_OFF);
break; //LỆNH NGHỈ
case 1: //Để có được số 1 thì thanh A,D,E,F,G sẽ tắt,
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
case 2: //Để có được số 2 thì thanh C,F sẽ tắt,
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
case 3: //Để có được số 3 thì thanh E,F sẽ tắt,
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
case 4: //Để có được số 4 thì thanh A,D sẽ tắt,
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 5: //Để có được số 5 thì thanh B,E sẽ tắt,
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 6: //Để có được số 6 thì thanh B sẽ tắt,
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 7: //Để có được số 7 thì thanh D,E,F,G sẽ tắt,
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
case 8: //Để có được số 8 thì các thanh đều bật,
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 9: //Để có được số 0 thì thanh E sẽ tắt,
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 10: //Để có được số 10 thì các thanh đều tắt,
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
}
}
hiển thị có 4 con 7 đoạn mà cái code chắc 4 tờ A4.
ReplyDeletecó thể tham khảo code dưới đây không có phần chỉnh độ sáng led nhưng ngắn hơn rất nhiều:
byte dataPin[] = {15,11,16,14,0,7,12,6}; //8 Pins data 7 seg
byte ctrlPin[] = {1,13,8,9}; //4 Pins control 7 seg
byte code[10]={0xd7, 0x14, 0xcd, 0x5d, 0x1e, 0x5b, 0xdb, 0x17, 0xdf, 0x5f}; // mã 7 đoạn, thay đổi tùy theo cách lắp mạch
byte hours, minute, second;
unsigned long stateTime7Seg = 0;
byte ctrl = 0; // biến con trỏ địa chỉ led
void setup()
{
for(byte i=0;i<17;i++){
pinMode(i,OUTPUT);
}
}
/////////////////////////////////
//Ham xuat du lieu ra 8 chan led
////////////////////////////////
void exportData(unsigned int data){
for(char i=7;i>=0;i--){
digitalWrite(dataPin[i],1-data%2);
data/=2;
}
}
/////////////////////////
//Ham quet led 7 doan
/////////////////////////
void display7Seg(byte hours, byte minute){
byte dataSeg;
if((micros() - stateTime7Seg) > 200){ //thời gian sáng 1 led là 200 micro seconds
stateTime7Seg = micros(); //cập nhật lại trạng thái thời gian
exportData(0); //xóa các đường dữ liệu
digitalWrite(ctrlPin[ctrl],0); //đưa đường điều khiển hiện tại 0
ctrl ++; //con trỏ sang vị trí tiếp theo
ctrl %= 4;
digitalWrite(ctrlPin[ctrl],1); //đưa đường điều khiển tiếp theo lên 1
}
switch (ctrl){
case 0:
dataSeg = code[hours/10];
if (hours < 10) dataSeg = 0;
break;
case 1:
dataSeg = code[hours%10];
break;
case 2:
dataSeg = code[minute/10];
break;
case 3:
dataSeg = code[minute%10];
break;
}
exportData(dataSeg);
}