自制 A4 尺寸 7 段显示屏 Arduino 宾果机 – 从零打造大号数码管
组件与物料
| 穿孔板 (Peg Board) – 作为显示屏外壳 | ×3 (两块做 7 段,一块做记分板) |
| 灰色塑料切菜板 – 记分板面板 | ×1 |
| WS2811 幻彩灯带 (5m, 5050 LED, 3 LED/IC) | ×1 |
| WS2812B 灯带 (5m, 300 LED, 60 LED/m) | ×1 |
| 音频线 (连接记分板与 7 段显示屏) | ×1 |
| 半透明塑料切菜板 – 7 段显示面板 | ×2 |
| 柔性灰色切菜板 – 记分板盖板 | ×1 |
| Arduino UNO | ×1 |
| 220Ω 电阻 | ×2 |
| 100µF 电容 | ×2 |
| 大型按键开关 (启动/新号码) | ×1 |
| 小型按键开关 (BINGO 结束) | ×1 |
| LM7805 稳压芯片 (12V 转 5V 供 WS2812B) | ×1 |
所需工具
常规 DIY 手工工具(电烙铁、热熔胶、螺丝刀、钻头等)
项目由来
在 ACTION 超市买到带 IR 遥控的 WS2811 灯带套装,发现每 3 颗 5050 LED 共享一个 WS2811 芯片。灵感:用 8 段灯带 (7 段 + 小数点) 拼成 A4 大小的巨型 7 段显示屏,仅占用 1 个 Arduino 引脚。做两个显示屏 + 记分板,组成宾果机:按键产生 1-75 随机数,显示在双 7 段屏,记分板同步点亮对应号码,直到 BINGO 结束。
步骤 1:制作 7 段显示屏
- 从 WS2811 灯带剪下 16 段 (每段 3 LED),每个数码管 8 段 × 2 = 16 段
- 焊接 +12V、GND、DI/DO 串联
- 外壳用穿孔板,面板用 IKEA 半透明切菜板,表面喷黑漆再用模板雕刻出段码窗口
- 音频插头 (3 极) 作为 12V/GND/DATA 快速连接器
步骤 2:制作记分板
- 同款穿孔板外壳,灰色切菜板面板钻 75 个孔位
- 内贴相纸打印数字 1-75 + "BINGO" 字样,覆盖透明保护膜
- 内部贴装:5 段 WS2812B (每段 15 LED) 对应 75 个号码,另 3×8 LED 做 "BINGO" 背光
步骤 3:软件设计
- 段码查表:
SEGMENTarray[8][10]定义 0-9 各段亮灭 - 流程图辅助梳理逻辑 (ClickCharts 绘制)
SCORE[76]数组记录已出号码 (0/1)- 按键 1 (D2) 触发随机数生成,去重后显示
- 按键 2 (D4) 触发 BINGO 灯光秀并清空记录
- 掉电重启亦可开始新一轮
步骤 4:电子电路
- 12V 2A 适配器供电,Arduino 电源插座加开关
- LM7805 降压供 WS2812B (记分板 99 LED),建议加散热片或改用 DC-DC 模块
- 两路 LED 数据线并联接 Arduino D6,各串 220Ω 电阻
- Fritzing 原理图见附件
完整 Arduino 代码 (BINGO_Machine_rev04.ino)
/* 宾果机 - Pierre Pennings 2018 Nov - GPL3+ */
#include <Adafruit_NeoPixel.h>
const int NewnumberButton = 2;
const int BingoButton = 4;
const int LedPin = 6;
#define NUM_LEDS 99 // 前 16 控制两个 7 段 (WS2811),后 83 控制记分板 (WS2812B)
#define BRIGHTNESS 250
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LedPin, NEO_GRB + NEO_KHZ800);
// 段码表: 8段 × 10数字 (段7/15为小数点)
byte SEGMENTarray[8][10] = {
{1,0,1,1,0,1,1,1,1,1}, // 段0/a
{1,1,1,1,1,0,0,1,1,1}, // 段1/b
{1,1,0,1,1,1,1,1,1,1}, // 段2/c
{1,0,1,1,0,1,1,0,1,1}, // 段3/d
{1,0,1,0,0,0,1,0,1,0}, // 段4/e
{1,0,0,0,1,1,1,0,1,1}, // 段5/f
{0,0,1,1,1,1,1,0,1,1}, // 段6/g
{0,0,0,0,0,0,0,0,0,0} // 段7/DP
};
int SCORE[76] = {0};
int Newnumber = 1, Bingo = 1;
long randNumber;
int NUMBER = 0, NW_NUMBER = 0, TENSNUMBER = 0, UNITNUMBER = 0;
void setup() {
Serial.begin(9600);
pinMode(LedPin, OUTPUT);
pinMode(NewnumberButton, INPUT_PULLUP);
pinMode(BingoButton, INPUT_PULLUP);
strip.setBrightness(BRIGHTNESS);
strip.begin();
strip.show(); // 全灭
// 启动时显示蓝色 BINGO 字样
for (int t = 16; t < 24; t++) {
strip.setPixelColor(t, 0, 0, 250);
strip.show();
}
}
void loop() {
Newnumber = digitalRead(NewnumberButton);
if (Newnumber == LOW) {
randomSeed(millis());
do {
GENERATENEWNUMBER(75);
} while (NW_NUMBER == SCORE[NW_NUMBER] * NW_NUMBER); // 去重
SCORE[NW_NUMBER] = 1;
NUMBER = NW_NUMBER;
TENSNUMBER = NUMBER / 10;
UNITNUMBER = NUMBER % 10;
CLEARDISPLAY();
LIGHTSHOW1(4, 100); // 灯光秀
CLEARDISPLAY();
DISPLAYNUMBER(TENSNUMBER, UNITNUMBER);
DISPLAYSCORE();
} else {
Bingo = digitalRead(BingoButton);
if (Bingo == LOW) {
delay(3000); // 防抖
if (digitalRead(BingoButton) == LOW) {
BINGOLIGHTSHOW();
for (int i = 0; i < 76; i++) SCORE[i] = 0; // 重置
}
}
}
}
// 灯光秀 1:DP 闪烁 + 彩虹流动
void LIGHTSHOW1(int duration, uint8_t wait) {
for (int t = 16; t < 24; t++) { strip.setPixelColor(t, 0, 0, 0); strip.show(); }
for (int k = 0; k < duration; k++) {
strip.setPixelColor(7, 200, 200, 200); strip.show(); delay(wait);
strip.setPixelColor(7, 0, 0, 0);
strip.setPixelColor(15, 200, 200, 200); strip.show(); delay(wait);
strip.setPixelColor(15, 0, 0, 0);
}
byte color_scheme[] = {50,100,200,100,150,250,150,200,50,200,250,100,250,50,150,0,100,200,50,150,250,100,200,0,150,250,50,200,0,100,250,50,200,0,100,250,50,150,0,250,0,0};
for (int k = 1; k < 45; k += 3) {
int r = color_scheme[k], b = color_scheme[k+1], g = color_scheme[k+2];
for (int p = 0; p < 7; p++) {
strip.setPixelColor(p, strip.Color(r, b, g));
strip.setPixelColor(8+p, strip.Color(g, r, b));
strip.show(); delay(30);
}
}
for (int q = 0; q < 7; q++) {
strip.setPixelColor(q, 0, 0, 0);
strip.setPixelColor(8+q, 0, 0, 0);
strip.show();
}
}
// BINGO 灯光秀:记分板白色瀑布 + 双屏青色闪烁
void BINGOLIGHTSHOW() {
for (int l = 0; l < 10; l++) {
for (int k = 24; k < 39; k++) {
strip.setPixelColor(k, 200, 200, 200);
strip.setPixelColor(k+15, 200, 200, 200);
strip.setPixelColor(k+30, 200, 200, 200);
strip.setPixelColor(k+45, 200, 200, 200);
strip.setPixelColor(k+60, 200, 200, 200);
strip.show(); delay(5);
strip.setPixelColor(k, 0, 0, 0);
strip.setPixelColor(k+15, 0, 0, 0);
strip.setPixelColor(k+30, 0, 0, 0);
strip.setPixelColor(k+45, 0, 0, 0);
strip.setPixelColor(k+60, 0, 0, 0);
strip.show();
}
for (int t = 0; t < 24; t++) { strip.setPixelColor(t, 0, 250, 250); strip.show(); }
delay(50);
for (int t = 0; t < 24; t++) { strip.setPixelColor(t, 0, 0, 0); strip.show(); }
}
}
void GENERATENEWNUMBER(int range) {
randNumber = random(1, range + 1);
NW_NUMBER = (int)randNumber;
}
void DISPLAYNUMBER(int TENS, int UNIT) {
for (int t = 16; t < 24; t++) { strip.setPixelColor(t, 200, 0, 0); strip.show(); } // BINGO 红字
for (int s = 0; s < 8; s++) {
int t = SEGMENTarray[s][TENS];
int u = SEGMENTarray[s][UNIT];
strip.setPixelColor(s, u * 250, 0, 0);
if (TENS != 0) strip.setPixelColor(8+s, t * 250, 0, 0);
else strip.setPixelColor(8+s, 0, 0, 0);
strip.show();
}
}
void DISPLAYSCORE() {
for (int t = 16; t < 24; t++) { strip.setPixelColor(t, 200, 0, 0); strip.show(); }
for (int s = 24; s < 100; s++) {
int u = SCORE[s-23];
strip.setPixelColor(s, 0, u * 200, 0); // 已出号码绿色
strip.show();
}
strip.setPixelColor(23 + NUMBER, 200, 0, 0); // 最新号码红色
strip.show();
}
void CLEARDISPLAY() {
for (int q = 0; q < 7; q++) {
strip.setPixelColor(q, 0, 0, 0);
strip.setPixelColor(8+q, 0, 0, 0);
strip.show();
}
for (int t = 16; t < 24; t++) { strip.setPixelColor(t, 0, 0, 0); strip.show(); }
}
自定义零件与外壳
- 面板开孔模板 SVG:
tekening_gaten_patroon_puntjes_xgW76A8Jmw.svg
原理图
Fritzing 文件:bingo_sketch_66WRdQITE2.fzz
制造工艺
- 自制家用作业书写机:Arduino + GRBL 控制的笔绘仪
- 复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电
- Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
- 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
- 高精度空气质量监测仪:Sharp GP2Y1010AU0F 粉尘传感器 + Arduino Nano
- Arduino Nano 与 WS2812 灯带打造 1D 乒乓球游戏——分步 DIY 教程
- 利用 Arduino Nano R3 自制全功能 CNC 雕刻机
- Arduino Pro Micro 实现 HID UPS:将"哑"电源升级为 USB 智能后备电源
- 使用 Arduino 制作便携式 RFID 门锁——分步指南
- Arduino 智能咖啡机:蓝牙控制、温度曲线与自动启停
- 自制高灵敏度 Arduino 金属探测器:铁/非铁金属识别
- DIY Arduino 身高测量仪:超声波非接触测高,精准易制