亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

自制 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 段显示屏

步骤 2:制作记分板

步骤 3:软件设计

步骤 4:电子电路

完整 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(); }
}

自定义零件与外壳

原理图

Fritzing 文件:bingo_sketch_66WRdQITE2.fzz

制造工艺

  1. 自制家用作业书写机:Arduino + GRBL 控制的笔绘仪
  2. 复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电
  3. Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
  4. 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
  5. 高精度空气质量监测仪:Sharp GP2Y1010AU0F 粉尘传感器 + Arduino Nano
  6. Arduino Nano 与 WS2812 灯带打造 1D 乒乓球游戏——分步 DIY 教程
  7. 利用 Arduino Nano R3 自制全功能 CNC 雕刻机
  8. Arduino Pro Micro 实现 HID UPS:将"哑"电源升级为 USB 智能后备电源
  9. 使用 Arduino 制作便携式 RFID 门锁——分步指南
  10. Arduino 智能咖啡机:蓝牙控制、温度曲线与自动启停
  11. 自制高灵敏度 Arduino 金属探测器:铁/非铁金属识别
  12. DIY Arduino 身高测量仪:超声波非接触测高,精准易制