4:34 PM
1
Video hướng dẫn:

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;
  }
}

1 comments:

  1. hiển thị có 4 con 7 đoạn mà cái code chắc 4 tờ A4.
    có 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);
    }

    ReplyDelete

 

Lập trình

-

Arduino Hải Phòng

,