---
disqus: ahb0222
GA : G-VF9ZT413CG
---
> [color=#40f1ef][name=LHB阿好伯, 2024/10/22][:earth_africa:](https://www.facebook.com/LHB0222/)

[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)
