先前在準備製作 APS9960 手勢感測器當作方向燈控制時,發現一個可以編輯 8x8 LED 畫面自動產生程式碼的網站,利用實作的過程介紹給大家。這個網站提供一個 8x8 的 LED 編輯工具,編輯的結果可以產生 Arduino 16 進位或 2 進位的動畫程式碼,讓每次要算哪個點明或暗的複雜工作變的簡單許多。
網站網址:https://xantorohara.github.io/led-matrix-editor
畫面左上方有三組預設圖案可供選擇,包括不同字型的數字、文字或符號等,右方是編輯畫面後自動產生的 Arduino/C 程式碼,可以選擇 16 進位或 2 進位,直接將這段程式碼複製至程式中使用。
如果要繪製屬於自己的圖案,也可以在畫面中央的矩陣圖點選 LED,如果要連續圖案,也可以按下方的「Insert」繼續編輯第 2、3...張圖。我用這個編輯網站繪製往右的箭頭方向燈,編輯完成後,可以按下往右箭頭的播放按鈕,以 500 ms的速度播放,這個速度是可以修改的。
編輯完成後,右方窗格出現以下這段程式可複製使用:
網站網址:https://xantorohara.github.io/led-matrix-editor
畫面左上方有三組預設圖案可供選擇,包括不同字型的數字、文字或符號等,右方是編輯畫面後自動產生的 Arduino/C 程式碼,可以選擇 16 進位或 2 進位,直接將這段程式碼複製至程式中使用。
如果要繪製屬於自己的圖案,也可以在畫面中央的矩陣圖點選 LED,如果要連續圖案,也可以按下方的「Insert」繼續編輯第 2、3...張圖。我用這個編輯網站繪製往右的箭頭方向燈,編輯完成後,可以按下往右箭頭的播放按鈕,以 500 ms的速度播放,這個速度是可以修改的。
編輯完成後,右方窗格出現以下這段程式可複製使用:
const uint64_t IMAGES[] = {
0x0000000100000000,
0x0000010301000000,
0x0001030703010000,
0x0103070f07030100,
0x02060f1f0f060200,
0x040c1f3f1f0c0400,
0x08183f7f3f180800,
0x08183f7f3f180800,
0x10307fff7f301000,
0x2060fefefe602000,
0x40c0fcfcfcc04000,
0x8080f8f8f8808000,
0x0000f0f0f0000000,
0x0000e0e0e0000000,
0x0000c0c0c0000000,
0x0000808080000000,
0x0000000000000000
};
const int IMAGES_LEN = sizeof(IMAGES)/8;
這個網站還可將編輯的結果儲存起來,用的方法也很特別,就是將這個網址新增/儲存到「書籤」或「我的最愛」中,或是直接按下 CTRL + D 儲存目前的網址。儲存的網址會變成以下這樣:https://xantorohara.github.io/led-matrix-editor/#0000000100000000|0000010301000000|0001030703010000|0103070f07030100|02060f1f0f060200|040c1f3f1f0c0400|08183f7f3f180800|08183f7f3f180800|10307fff7f301000|2060fefefe602000|40c0fcfcfcc04000|8080f8f8f8808000|0000f0f0f0000000|0000e0e0e0000000|0000c0c0c0000000|0000808080000000|0000000000000000如果按下上方的 Code Samples 或網頁往下拉,可以看到範例程式,這個範例程式可以將您編輯的幾張圖,變成連續的動畫。要注意的是模組與 Arduino 的接腳是否跟程式一致。
[接線圖]
| Arduino Uno | MAX7219 8x8 Led模組 |
|---|---|
| +5V | VCC |
| GND | GND |
| D10 | CS |
| D11 | CLK |
| D12 | Data |
[程式]
#include <LedControl.h>
// Pin 12:Data in, Pin 11: Clock, Pin 10: CS(Load)
LedControl display = LedControl(12,11,10,1);
const uint64_t R_IMAGES[] = { //往右箭頭
0x0000000100000000,
0x0000010301000000,
0x0001030703010000,
0x0103070f07030100,
0x02060f1f0f060200,
0x040c1f3f1f0c0400,
0x08183f7f3f180800,
0x08183f7f3f180800,
0x10307fff7f301000,
0x2060fefefe602000,
0x40c0fcfcfcc04000,
0x8080f8f8f8808000,
0x0000f0f0f0000000,
0x0000e0e0e0000000,
0x0000c0c0c0000000,
0x0000808080000000,
0x0000000000000000
};
const int R_IMAGES_LEN = sizeof(R_IMAGES)/8;
void setup()
{
display.clearDisplay(0); // 清除螢幕
display.shutdown(0, false); // 關閉省電模式
display.setIntensity(0, 10); // 設定亮度為 8 (介於0~15之間)
}
void displayImage(uint64_t image) {
for (int i = 0; i < 8; i++) {
byte row = (image >> i * 8) & 0xFF;
for (int j = 0; j < 8; j++) {
display.setLed(0, i, j, bitRead(row, j));
}
}
}
int i = 0;
void loop() {
displayImage(R_IMAGES[i]);
if (++i >= R_IMAGES_LEN ) {
i = 0;
}
delay(100);
}



請教displayImage和loop內的程式可否解釋?
回覆刪除張貼留言