HƯỚNG DẪN LÀM ĐÈN LED ĐÁNH LỪA THỊ GIÁC THEO TÙY
Ý
Persistence of Vision hay [POV] là một
ảo ảnh quang học mà nhờ đó nhiều hình ảnh rời rạc được ghép lại thành một hình
ảnh duy nhất khi con người quan sát. Nghĩa là: khi bạn nhìn vào một quạt làm
việc, bạn sẽ thấy các cánh quạt của nó tạo thành một vòng tròn trong suốt!
Nhưng, tại sao ?!
Đôi mắt giữ thông tin
hình ảnh trong một khoảng thời gian lâu hơn nó ở đó và não kết hợp những hình
ảnh với nhau trong một cảnh. Điều này là do những hình ảnh chúng ta thấy mất
khoảng 1/10 giây để được ghi nhớ trong não của chúng ta, vì vậy khi cánh quạt
di chuyển trong một thời gian ít hơn 1/10 giây, não kết hợp những hình ảnh của
các vị trí khác nhau của cánh quạt với nhau và chúng ta bắt đầu nhìn thấy vòng
tròn đó.
HƯỚNG DẪN THỰC HIỆN
1. Linh kiện
·
Dây nối
2. Đấu dây
Đặt các Arduino và
breadboard buộc chúng lai với nhau
Các bạn có thể buộc pin 9V
vào Arduino luôn để cấp nguồn thay vì dùng cáp USB kết nối với máy tính xách
tay
3. Mã lập trình
/*
Written by Ahmad Saeed on 22
August 2015
This code is capable of displaying
the following characters;
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
.-_!%&#$,()@?
*/
//////////////////// Message to Customize
///////////////////
#define msgLength 11 ///
String msgBody = "Ahmad Saeed"; ///
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
#define delayInChar 3
#define delayBetweenChar 5
#define LED1 1
#define LED2 2
#define LED3 3
#define LED4 4
#define LED5 5
#define LED6 6
#define LED7 7
byte msgCode[(5 * msgLength) + 10];
boolean pintState;
int columnNum = -1;
String charToWrite;
void setup() {
msgBody.toUpperCase();
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(LED7, OUTPUT);
}
void loop() {
//// Convert all text to binary array ////////////////////////
if ( columnNum == -1 ) // This
block needs to be done once//
{
//
for (int c = 0; c <
(msgBody.length()); c++) { //
//Separate the following
character //
charToWrite =
msgBody.substring(c, c + 1);
//
//Send the separated characted to addChar
function //
addChar(charToWrite); //
}
//
//Add a little space after
each character //
addChar(" "); //
addChar(" "); //
}
//
//////////////////////////////////////////////////////////////
//// Display the binary arrays after all characters are coded //
for (int c = 0; c <
(sizeof(msgCode)); c++) { //
pintState = (msgCode[c] /
B1000000) % B10; //
digitalWrite(LED1,
pintState); //
//
pintState = (msgCode[c] /
B100000) % B10; //
digitalWrite(LED2,
pintState); //
//
pintState = (msgCode[c] /
B10000) % B10; //
digitalWrite(LED3,
pintState); //
//
pintState = (msgCode[c] /
B1000) % B10; //
digitalWrite(LED4,
pintState); //
//
pintState = (msgCode[c] / B100)
% B10; //
digitalWrite(LED5,
pintState); //
//
pintState = (msgCode[c] / B10)
% B10; //
digitalWrite(LED6,
pintState); //
//
pintState = msgCode[c] %
B10;; //
digitalWrite(LED7,
pintState); //
//
delay(delayInChar); //
// if the character is
finished, take a longer off period //
if ((c + 1) % 5 == 0 ) { //
digitalWrite(LED1, LOW); //
digitalWrite(LED2, LOW); //
digitalWrite(LED3, LOW); //
digitalWrite(LED4, LOW); //
digitalWrite(LED5, LOW); //
digitalWrite(LED6, LOW); //
digitalWrite(LED7, LOW); //
delay(delayBetweenChar); //
} //
}
//
//
////////////////////////////////////////////////////////////////
}
void addChar(String y) {
if (y == "1") {
addColumn(B0010001);
addColumn(B0100001);
addColumn(B1111111);
addColumn(B0000001);
addColumn(B0000001);
}
else if (y == "2") {
addColumn(B0100001);
addColumn(B1000011);
addColumn(B1000101);
addColumn(B1001001);
addColumn(B0110001);
}
else if (y == "3") {
addColumn(B0100010);
addColumn(B1000001);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B0110110);
}
else if (y == "4") {
addColumn(B0001100);
addColumn(B0010100);
addColumn(B0100100);
addColumn(B1111111);
addColumn(B0000100);
}
else if (y == "5") {
addColumn(B1110010);
addColumn(B1010001);
addColumn(B1010001);
addColumn(B1010001);
addColumn(B1001110);
}
else if (y == "6") {
addColumn(B0111110);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B0100110);
}
else if (y == "7") {
addColumn(B1000000);
addColumn(B1000111);
addColumn(B1001000);
addColumn(B1010000);
addColumn(B1100000);
}
else if (y == "8") {
addColumn(B0110110);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B0110110);
}
else if (y == "9") {
addColumn(B0110010);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B0111110);
}
else if (y == "0") {
addColumn(B0111110);
addColumn(B1000101);
addColumn(B1001001);
addColumn(B1010001);
addColumn(B0111110);
}
else if (y == "A") {
addColumn(B0011111);
addColumn(B0100100);
addColumn(B1000100);
addColumn(B1000100);
addColumn(B1111111);
}
else if (y == "B") {
addColumn(B1111111);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B0110110);
}
else if (y == "C") {
addColumn(B0111110);
addColumn(B1000001);
addColumn(B1000001);
addColumn(B1000001);
addColumn(B0100010);
}
else if (y == "D") {
addColumn(B1111111);
addColumn(B1000001);
addColumn(B1000001);
addColumn(B1000001);
addColumn(B0111110);
}
else if (y == "E") {
addColumn(B1111111);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B1000001);
}
else if (y == "F") {
addColumn(B1111111);
addColumn(B1001000);
addColumn(B1001000);
addColumn(B1001000);
addColumn(B1000000);
}
else if (y == "G") {
addColumn(B0111110);
addColumn(B1000001);
addColumn(B1000001);
addColumn(B1000101);
addColumn(B0100110);
}
else if (y == "H") {
addColumn(B1111111);
addColumn(B0001000);
addColumn(B0001000);
addColumn(B0001000);
addColumn(B1111111);
}
else if (y == "I") {
addColumn(B0000000);
addColumn(B1000001);
addColumn(B1111111);
addColumn(B1000001);
addColumn(B0000000);
}
else if (y == "J") {
addColumn(B0000000);
addColumn(B0000010);
addColumn(B1000001);
addColumn(B1000001);
addColumn(B1111110);
}
else if (y == "K") {
addColumn(B1111111);
addColumn(B0001000);
addColumn(B0010100);
addColumn(B0100010);
addColumn(B1000001);
}
else if (y == "L") {
addColumn(B1111111);
addColumn(B0000001);
addColumn(B0000001);
addColumn(B0000001);
addColumn(B0000001);
}
else if (y == "M") {
addColumn(B1111111);
addColumn(B0100000);
addColumn(B0011000);
addColumn(B0100000);
addColumn(B1111111);
}
else if (y == "N") {
addColumn(B1111111);
addColumn(B0010000);
addColumn(B0001000);
addColumn(B0000100);
addColumn(B1111111);
}
else if (y == "O") {
addColumn(B0111110);
addColumn(B1000001);
addColumn(B1000001);
addColumn(B1000001);
addColumn(B0111110);
}
else if (y == "P") {
addColumn(B1111111);
addColumn(B1001000);
addColumn(B1001000);
addColumn(B1001000);
addColumn(B0110000);
}
else if (y == "Q") {
addColumn(B0111100);
addColumn(B1000010);
addColumn(B1000010);
addColumn(B1000010);
addColumn(B0111101);
}
else if (y == "R") {
addColumn(B1111111);
addColumn(B1001000);
addColumn(B1001100);
addColumn(B1001010);
addColumn(B0110001);
}
else if (y == "S") {
addColumn(B0110010);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B1001001);
addColumn(B0100110);
}
else if (y == "T") {
addColumn(B1000000);
addColumn(B1000000);
addColumn(B1111111);
addColumn(B1000000);
addColumn(B1000000);
}
else if (y == "U") {
addColumn(B1111110);
addColumn(B0000001);
addColumn(B0000001);
addColumn(B0000001);
addColumn(B1111110);
}
else if (y == "V") {
addColumn(B1111100);
addColumn(B0000010);
addColumn(B0000001);
addColumn(B0000010);
addColumn(B1111100);
}
else if (y == "W") {
addColumn(B1111110);
addColumn(B0000001);
addColumn(B0000110);
addColumn(B0000001);
addColumn(B1111110);
}
else if (y == "X") {
addColumn(B1100011);
addColumn(B0010100);
addColumn(B0001000);
addColumn(B0010100);
addColumn(B1100011);
}
else if (y == "Y") {
addColumn(B1110000);
addColumn(B0001000);
addColumn(B0001111);
addColumn(B0001000);
addColumn(B1110000);
}
else if (y == "Z") {
addColumn(B1000011);
addColumn(B1000101);
addColumn(B1001001);
addColumn(B1010001);
addColumn(B1000011);
}
else if (y == "Z") {
addColumn(B1000011);
addColumn(B1000101);
addColumn(B1001001);
addColumn(B1010001);
addColumn(B1000011);
}
else if (y == " ") {
addColumn(B0000000);
addColumn(B0000000);
addColumn(B0000000);
addColumn(B0000000);
addColumn(B0000000);
}
else if (y == ".") {
addColumn(B0000000);
addColumn(B0000011);
addColumn(B0000011);
addColumn(B0000000);
addColumn(B0000000);
}
else if (y == "_") {
addColumn(B0000001);
addColumn(B0000001);
addColumn(B0000001);
addColumn(B0000001);
addColumn(B0000001);
}
else if (y == "-") {
addColumn(B0000000);
addColumn(B0001000);
addColumn(B0001000);
addColumn(B0001000);
addColumn(B0000000);
}
else if (y == "!") {
addColumn(B0000000);
addColumn(B0000000);
addColumn(B1111101);
addColumn(B0000000);
addColumn(B0000000);
}
else if (y == "(") {
addColumn(B0000000);
addColumn(B0000000);
addColumn(B0000000);
addColumn(B0111110);
addColumn(B1000001);
}
else if (y == ")") {
addColumn(B1000001);
addColumn(B0111110);
addColumn(B0000000);
addColumn(B0000000);
addColumn(B0000000);
}
else if (y == "%") {
addColumn(B1100010);
addColumn(B1100100);
addColumn(B0001000);
addColumn(B0010011);
addColumn(B0100011);
}
else if (y == ",") {
addColumn(B0000000);
addColumn(B0000101);
addColumn(B0000110);
addColumn(B0000000);
addColumn(B0000000);
}
else if (y == "?") {
addColumn(B0100000);
addColumn(B1000101);
addColumn(B1001000);
addColumn(B0110000);
addColumn(B0000000);
}
else if (y == "#") {
addColumn(B0010100);
addColumn(B0111110);
addColumn(B0010100);
addColumn(B0111110);
addColumn(B0010100);
}
else if (y == "@") {
addColumn(B0111110);
addColumn(B1000001);
addColumn(B1011101);
addColumn(B1011101);
addColumn(B0111000);
}
else if (y == "$") {
addColumn(B0110010);
addColumn(B1001001);
addColumn(B1111111);
addColumn(B1001001);
addColumn(B0100110);
}
}
void addColumn(byte x) {
columnNum += 1;
msgCode[columnNum] = (x);
}
HƯỚNG DẪN CÁCH LẬP TRÌNH
Ý tưởng chính của mã
này là để phân chia đầu vào bất kỳ văn bản nhập vào, sau đó chia cho mỗi nhân
vật thành các cột, sau đó hiển thị các cột trên một mảng cột LED với một khoảng
thời gian ngắn hiển thị tách mỗi cột. Giả sử rằng bạn đang hiển thị chữ
"S" trên một 5x7 LED Matrix. Bạn có thể mô tả trạng thái của các đèn
LED ở mỗi cột (từ trên xuống) trong hệ nhị phân như thế này:
Cột 1:[ Row1: LOW Row2: HIGH Row3: HIGH Row4: LOW Row5:
LOW Row6: HIGH Row7:
LOW ]
rút ngắn lại là: Cột 1: LOW - HIGH - HIGH - LOW - LOW - HIGH - LOW hay 0 1 1 0
0 1 0
và cho phần còn lại
của cột nó sẽ là như thế này:
Cột 1: 0 1 1 0 0 1 0
Cột 2: 1 0 0 1 0 0 1
Cột 3: 1 0 0 1 0 0 1
Cột 4: 1 0 0 1 0 0 1
Cột 5: 0 1 0 0 1 1 0
Trên 7 đèn LED, mã sẽ
hiển thị Cột 1 khoảng 8 mili giây, sau đó -- Cột 2, và cứ tiếp tục như vậy.
VIDEO THỰC
HIỆN
khá tuyệt, cảm ơn bạn đã chia sẻ.
Trả lờiXóalàm biển quảng cáo
biển quảng cáo led
làm biển quảng cáo led
biển quảng cáo chữ nổi
biển mica
biển phòng ban
biển số nhà
làm biển quảng cáo giá rẻ tại hà nội