--- disqus: ahb0222 GA : G-VF9ZT413CG --- > [color=#40f1ef][name=LHB阿好伯, 2024/10/22][:earth_africa:](https://www.facebook.com/LHB0222/) ![20241108_230956](https://hackmd.io/_uploads/B1EQqijb1e.jpg) [TOC] 硬體需求 Arduino開發板(rp2040 or ESP32皆可) 32x8 WS2812B LED矩陣 5V電源供應器(根據LED數量選擇適當電流) rp2040 -> WS2812(8*32bit燈板) 5V -> 5V GND -> GND GPIO16 -> Din 功能特點 - 支援顯示0-99999.9範圍的數字 - 自動根據數值大小改變顯示顏色(可調): 小於100:綠色(低值) 100-499:黃色(中值) 500以上:紅色(高值) - 自動右對齊顯示 - 支援一位小數點顯示 ```cpp= #include <Adafruit_NeoPixel.h> #define PIN 16 #define NUMPIXELS 256 // 8*32 #define MATRIX_WIDTH 32 #define MATRIX_HEIGHT 8 Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // 定義0-9數字的點陣圖案 const bool NUMBERS[10][8][4] = { { // 0 {1,1,1,1}, {1,0,0,1}, {1,0,0,1}, {1,0,0,1}, {1,0,0,1}, {1,0,0,1}, {1,0,0,1}, {1,1,1,1} }, { // 1 {0,0,1,0}, {0,1,1,0}, {1,0,1,0}, {0,0,1,0}, {0,0,1,0}, {0,0,1,0}, {0,0,1,0}, {1,1,1,1} }, { // 2 {1,1,1,1}, {0,0,0,1}, {0,0,0,1}, {1,1,1,1}, {1,0,0,0}, {1,0,0,0}, {1,0,0,0}, {1,1,1,1} }, { // 3 {1,1,1,1}, {0,0,0,1}, {0,0,0,1}, {0,1,1,1}, {0,0,0,1}, {0,0,0,1}, {0,0,0,1}, {1,1,1,1} }, { // 4 {1,0,0,1}, {1,0,0,1}, {1,0,0,1}, {1,1,1,1}, {0,0,0,1}, {0,0,0,1}, {0,0,0,1}, {0,0,0,1} }, { // 5 {1,1,1,1}, {1,0,0,0}, {1,0,0,0}, {1,1,1,1}, {0,0,0,1}, {0,0,0,1}, {0,0,0,1}, {1,1,1,1} }, { // 6 {1,1,1,1}, {1,0,0,0}, {1,0,0,0}, {1,1,1,1}, {1,0,0,1}, {1,0,0,1}, {1,0,0,1}, {1,1,1,1} }, { // 7 {1,1,1,1}, {0,0,0,1}, {0,0,0,1}, {0,0,1,0}, {0,1,0,0}, {0,1,0,0}, {0,1,0,0}, {0,1,0,0} }, { // 8 {1,1,1,1}, {1,0,0,1}, {1,0,0,1}, {1,1,1,1}, {1,0,0,1}, {1,0,0,1}, {1,0,0,1}, {1,1,1,1} }, { // 9 {1,1,1,1}, {1,0,0,1}, {1,0,0,1}, {1,1,1,1}, {0,0,0,1}, {0,0,0,1}, {0,0,0,1}, {1,1,1,1} } }; // 根據數值獲取對應顏色 uint32_t getColorForValue(float value) { if (value < 100) { return pixels.Color(0, 50, 0); // 綠色 } else if (value < 500) { return pixels.Color(50, 50, 0); // 黃色 } else { return pixels.Color(50, 0, 0); // 紅色 } } // 獲取LED在矩陣中的索引 int getPixelIndex(int x, int y) { int index; if (y < MATRIX_HEIGHT/2) { // 上半部分 (0-3行) index = y * MATRIX_WIDTH + x; } else { // 下半部分 (4-7行) index = y * MATRIX_WIDTH + x; } return index; } // 顯示單個數字 void displayNumber(int number, int xOffset, uint32_t color) { if(number < 0 || number > 9) return; for(int y = 0; y < 8; y++) { for(int x = 0; x < 4; x++) { if(NUMBERS[number][y][x]) { int index = getPixelIndex(x + xOffset, y); pixels.setPixelColor(index, color); } } } } // 顯示小數點(白色) void displayDot(int xOffset) { int index = getPixelIndex(xOffset, 7); // 在第6行顯示小數點 pixels.setPixelColor(index, pixels.Color(50, 50, 50)); // 白色 } // 顯示完整數字(包括小數) void displayFullNumber(float value) { pixels.clear(); // 確保數值在範圍內 if(value < 0 || value > 99999.9) { value = 0; } // 獲取對應顏色 uint32_t color = getColorForValue(value); // 分離整數和小數部分 int intPart = (int)value; int decimal = (int)((value - intPart) * 10); // 分解各個位數 int digits[5]; digits[0] = (intPart / 10000) % 10; // 萬位 digits[1] = (intPart / 1000) % 10; // 千位 digits[2] = (intPart / 100) % 10; // 百位 digits[3] = (intPart / 10) % 10; // 十位 digits[4] = intPart % 10; // 個位 // 找到第一個非零數字的位置 int firstNonZero = 0; while(firstNonZero < 4 && digits[firstNonZero] == 0) { firstNonZero++; } // 計算需要的總寬度 int totalDigits = 5 - firstNonZero; // 非零數字的數量 int totalWidth = totalDigits * 5 + 1 + 5; // 每個數字佔5個像素(4位數字+1間隔),加上小數點和小數部分 // 計算起始位置,使其右對齊 int startX = MATRIX_WIDTH - totalWidth; // 顯示數字,跳過前導零 for(int i = firstNonZero; i < 5; i++) { displayNumber(digits[i], startX + (i - firstNonZero) * 5, color); } // 顯示小數點和小數 displayDot(startX + (5 - firstNonZero) * 5); displayNumber(decimal, startX + (5 - firstNonZero) * 5 + 1, color); pixels.show(); } void setup() { Serial.begin(115200); pixels.begin(); pixels.setBrightness(50); pixels.clear(); pixels.show(); } void loop() { // 測試不同區間的數字 float testNumbers[] = {0.5, 5.5, 15.5, 25.5,150.2, 1450.7, 24650.8, 99999.9}; for(int i = 0; i < 6; i++) { displayFullNumber(testNumbers[i]); // 顏色會根據數值自動選擇 delay(2000); } // 測試計數和顏色變化 for(float i = 0; i < 100000; i += 10) { displayFullNumber(i); // 顏色會隨著數值變化 delay(10); } } ``` 🌟 🌟全文可以至下方連結觀看或是補充 全文分享至 https://www.facebook.com/LHB0222/ https://www.instagram.com/ahb0222/ 有疑問想討論的都歡迎於下方留言 喜歡的幫我分享給所有的朋友 \o/ 有所錯誤歡迎指教 # [:page_with_curl: 全部文章列表](https://hackmd.io/@LHB-0222/AllWritings) ![](https://i.imgur.com/nHEcVmm.jpg)