Trong bài viết này, chúng ta sẽ học cách điều khiển 8 đèn LED và chúng ta sẽ hiểu được cách làm thế nào để điều khiển nhiều led bằng cách sử dụng các chân digital, hoặc sử dụng IC HC595!
Phần cứng cần chuẩn bị cho việc điều khiển 8 đèn LED sáng theo yêu cầu.
+ 8 điện trở 560 Ohm (hoặc 220 Ohm hoặc 1kOhm).
+ Breadboard.
+ Dây cắm breadboard.
+ 8 đèn LED siêu sáng.
Ta tiến hành lắp mạch:
Ta nối các chân từ chân số 2 đến chân số 9 lần lượt cho 8 led
Sau đây là đoạn code lập trình, các bạn chỉ cần copy vào dán vào Arduino IDE thôi.
byte ledPin[] = {2,3,4,5,6,7,8,9}; // Mảng lưu vị trí các chân Digital mà các đèn LED sử dụng theo thứ tự từ 1->8. Bạn có thể thêm các LED bằng cách thêm các chân digital vào mảng này
byte pinCount; // Khai báo biến pinCount dùng cho việc lưu tổng số chân LED
void setup() {
pinCount = sizeof(ledPin); //Xem thêm thông tin về hàm sizeof
for (int i=0;i<pinCount;i++) {
pinMode(ledPin[i],OUTPUT); //Các chân LED là OUTPUT
digitalWrite(ledPin[i],LOW); //Mặc định các đèn LED sẽ tắt
}
}
void loop() {
/*
Bật tuần tự các đèn LED
*/
for (int i=0; i < pinCount; i++) {
digitalWrite(ledPin[i],HIGH); //Bật đèn
delay(500); // Dừng để các đèn LED sáng dần
}
/*
Tắt tuần tự các đèn LED
*/
for (int i = 0;i < pinCount; i += 1) {
digitalWrite(ledPin[i],LOW); // Tắt đèn
delay(500); // Dừng để các đèn LED tắt dần
}
}
Nếu các bạn chưa biết cách nạp chương trình thì hãy xem
bài viết này.
2. Điều khiển 8 LED với 1 IC 595 và arduino uno r3.
Datasheet của IC hc595:
Datasheet IC hc595
Trước hết chúng ta cần bật IC hc595 lên. Bạn hãy nối mạch như sau:
+ GND (pin 8) nối đến cực âm
+ Vcc (pin 16) nối đến chân 5V
+ OE (pin 13) nối đến cực âm
+ MR (pin 10) nối đến chân 5V
Cấp nguồn cho IC HC595 bằng arduino
Tiếp theo, chúng ta sẽ nối Arduino với IC HC595.
+ DS (pin 14)đến Arduino DigitalPin 11
+ SH_CP (pin 11)đến Arduino DigitalPin 12
+ ST_CP (pin 12)đến ArduinoDigitalPin 8.
Sau đó, bạn sử dụng 8 đèn LED của chúng ta đã mắc ban đầu và mắc theo như sơ đồ dưới đây.
Sơ đồ đấu nối Arduino, IC HC595 và 8 led.
Để điều khiển được LED qua IC HC 595, chúng ta phải làm quen với một kỹ thuật, được gọi là shiftOut. Bạn chỉ cần hiểu đơn giản, shiftOut là việc gửi tín hiệu cho 1 IC có hỗ trợ shiftOut (ví dụ HC 595 này), cứ mỗi lần gửi nó gửi 1 byte, mỗi 1 bit (có tổng cộng 8 bit trong 1 byte) sẽ quản lý giá trị điện tại chân tín hiệu của HC 595 (các chân có tên là Q0-Q7).
Còn IC 595 sẽ nhận lệnh shiftOut của Arduino và sẽ quản lý 8 chân tín hiệu của nó (các chân có tên Q0-Q7) bằng 1 byte ⇔ 8 bit (từ bit 0 đến bit 7). Nếu tại bit 0 có giá trị là 1 ⇒ Q0 được nối với nguồn 5V, nếu bit 0 có giá trị là 0 thì Q0 sẽ được nối tới cực âm, tương tự với các 7 bit còn lại.
Code chương trình điều khiển 8 đèn led bằng arduino và IC HC595.
/*
shiftOut với 8 LED bằng 1 IC HC595
*/
//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;
//Trạng thái của LED, hay chính là byte mà ta sẽ gửi qua shiftOut
byte ledStatus;
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() {
/*
Trong tin học, ngoài các phép +, -, *, / hay % mà bạn đã biết trên hệ cơ số 10.
Thì còn có nhiều phép tính khác nữa. Và một trong số đó là Bit Math (toán bit) trên hệ cơ số 2.
Để hiểu những gì tôi viết tiếp theo sau, bạn cần có kiến thức về Bit Math.
*/
//Sáng tuần tự
ledStatus = 0;//mặc định là không có đèn nào sáng hết (0 = 0b00000000)
for (int i = 0; i < 8; i++) {
ledStatus = (ledStatus << 1) | 1;//Đẩy toàn bộ các bit qua trái 1 bit và cộng bit có giá trị là 1 ở bit 0
/**
Bắt buộc phải có để shiftOut
**/
digitalWrite(latchPin, LOW); //các đèn LED sẽ không sáng khi bạn digital LOW
//ShiftOut ra IC
shiftOut(dataPin, clockPin, MSBFIRST, ledStatus);
digitalWrite(latchPin, HIGH);//các đèn LED sẽ sáng với trạng thái vừa được cập nhập
/**
Kết thúc bắt buộc phải có
**/
delay(500); // Dừng chương trình khoảng 500 mili giây để thấy các hiệu ứng của đèn LED
}
//Tắt tuần tự
for (int i = 0;i<8;i++) {
ledStatus <<= 1; //Đẩy tất cả các bit qua bên trái 1 bit
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, ledStatus);
digitalWrite(latchPin, HIGH);
delay(500);
}
}