Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Zelfbouw Arduino Bingomachine met A4 7-Segment Displays

Onderdelen en Benodigdheden

Pegboard (ACTION) – 2x voor 7-segment, 1x voor scorebord 3
Plastisch snijbord (grijs) – scorebord basis 1
Digitale LED-strip WS2811 (5m, 5050 LEDs, 3 LEDs/chip) 1
WS2812B LED-strip (5m, 300 LEDs, 60 LEDs/m, 5V) 1
Audiokabel (3-adrig) – verbinding scorebord ↔ displays 1
Translucent snijbord (wit) – frontplaat 7-segment 2
Flexibel grijs snijbord – deksel scorebord 1
Arduino UNO 1
Weerstand 220 ohm 2
Condensator 100 µF 2
Grote drukknop (momentaan) – nieuw nummer 1
Kleine drukknop – BINGO 1
LM7805 5V regelaar (met koelbody) 1

Benodigd Gereedschap

  • Standaard handgereedschap & meetapparatuur

Over dit Project

Inspiratie: een goedkope WS2811 LED-strip (3 LEDs per chip, 12V) uit de ACTION. Idee: 8 segmenten (7 + DP) per digit → A4-formaat 7-segment display. Twee displays maken een Bingomachine (getallen 1-75). Een scorebord toont getrokken nummers.

Stap 1: 7-Segment Displays Maken

  • 16 segmenten van 3 LEDs uit WS2811-strip gesneden.
  • Segmenten gesoldeerd (+12V, GND, DO/DI).
  • Behuizing: pegboard (ACTION), frontplaat: wit translucent snijbord (IKEA) met zwarte primer en uitgestanzte segmenten.
  • Aansluiting via audiokabel (3 draden: 12V, GND, Data) met 220Ω weerstand.

Stap 2: Scorebord Maken

  • Hetzelfde pegboard, donkergrijze frontplaat (ACTION) met gaten voor LEDs.
  • Binnenin: 5x 15 WS2812 LEDs (getallen 1-75) + 3x 8 WS2812 voor "BINGO" backlight.
  • Tussenlaag: fotopapier + beschermfolie.

Stap 3: Software

Eerste tests op breadboard. Grote drukknop (D2) → nieuw nummer. Na "Light Show 1" verschijnt random getal (1-75) op displays. Getal wordt opgeslagen in array SCORE[76] (0/1). Dubbels worden automatisch hergooid.

Kleine drukknop (D4) → "BINGO" → lightshow → array reset → nieuwe ronde. Auch via power-cycle.

Stroom: 12V/2A adapter → Arduino jack (gemodificeerd met schakelaar) → LM7805 voor 5V (scorebord LEDs). Let op: LM7805 wordt warm, koelbody aanbevolen.

Segmentcodering

2D-array SEGMENTarray[8][10] definieert welke segmenten (0-7, 8-15) per cijfer (0-9) aanstaan. Segment 7 & 15 = decimale punt.

Code (BINGO_Machine_rev04.ino)

/* Bingo Machine – Pierre Pennings (Nov 2018)
   2x A4 7-segment (WS2811, 12V), 1x Scorebord (WS2812, 5V)
   Alle LEDs via 1 pin (D6) en 2x 220Ω
   GPL3+ licentie */
#include <Adafruit_NeoPixel.h>

const int NewNumberButton = 2;
const int BingoButton = 4;
const int LedPin = 6;

int SCORE[76];
long randNumber;
int NW_NUMBER, NUMBER, TENSNUMBER, UNITNUMBER;

#define NUM_LEDS 99   // 0-15: 2x 7-seg (8 seg/digit), 16-23: BINGO backlight, 24-98: scorebord 1-75
#define BRIGHTNESS 250

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LedPin, NEO_GRB + NEO_KHZ800);

// Segment mapping: [segment][cijfer]
byte SEGMENTarray[8][10] = {
  {1,0,1,1,0,1,1,1,1,1}, // seg 0/8
  {1,1,1,1,1,0,0,1,1,1}, // seg 1/9
  {1,1,0,1,1,1,1,1,1,1}, // seg 2/10
  {1,0,1,1,0,1,1,0,1,1}, // seg 3/11
  {1,0,1,0,0,0,1,0,1,0}, // seg 4/12
  {1,0,0,0,1,1,1,0,1,1}, // seg 5/13
  {0,0,1,1,1,1,1,0,1,1}, // seg 6/14
  {0,0,0,0,0,0,0,0,0,0}  // seg 7/15 (DP)
};

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};

void setup() {
  Serial.begin(9600);
  pinMode(LedPin, OUTPUT);
  pinMode(NewNumberButton, INPUT_PULLUP);
  pinMode(BingoButton, INPUT_PULLUP);
  strip.setBrightness(BRIGHTNESS);
  strip.begin();
  strip.show(); // all off
  for (int t = 16; t < 24; t++) { strip.setPixelColor(t, 0, 0, 250); strip.show(); } // BINGO blauw
  for (int i = 0; i < 76; i++) SCORE[i] = 0;
}

void loop() {
  if (digitalRead(NewNumberButton) == 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 if (digitalRead(BingoButton) == LOW) {
    delay(3000); // debounce
    if (digitalRead(BingoButton) == LOW) {
      BINGOLIGHTSHOW();
      for (int i = 0; i < 76; i++) SCORE[i] = 0;
    }
  }
}

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

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) { NW_NUMBER = random(1, range + 1); }

void DISPLAYNUMBER(int TENS, int UNIT) {
  for (int t = 16; t < 24; t++) { strip.setPixelColor(t, 200,0,0); strip.show(); } // BINGO rood
  for (int s = 0; s < 8; s++) {
    int t = SEGMENTarray[s][TENS];
    int u = SEGMENTarray[s][UNIT];
    strip.setPixelColor(s, u*250, 0, 0);
    strip.setPixelColor(8+s, (TENS!=0) ? t*250 : 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); // groen voor getrokken
    strip.show();
  }
  strip.setPixelColor(23+NUMBER, 200,0,0); // rood voor nieuw
  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(); }
}

CAD Bestanden

Sjabloon voor frontplaat 7-segment displays (SVG + afbeelding) bijgevoegd.

Schema

Fritzing-schema (bingo_sketch.fzz) bijgevoegd.

Productieproces

  1. Bouw je eigen DIY huiswerk-schrijfmachine thuis
  2. Bouw een retro Numitron-klok met Arduino: Eenvoudig, betrouwbaar en energiezuinig
  3. Bouw een DIY Voltmeter met Arduino en Nokia 5110 Display – Stap-voor-Stap Handleiding
  4. Een nauwkeurig meetwieltje bouwen met Arduino Nano en draaiencoder
  5. Precieze Luchtkwaliteit Monitor met Sharp GP2Y1010AU0F Sensor
  6. 1D Pong-spel met Arduino en WS2812 LED-strip – Stap-voor-stap DIY handleiding
  7. Bouw een Volledig Functionele CNC-machine met Arduino Nano R3
  8. Arduino-aangedreven HID UPS: Upgrade je dummy voeding naar USB-compatibele backup
  9. Bouw een draagbare RFID-deurslot met Arduino – Stap-voor-stap handleiding
  10. Arduino-gestuurde slimme koffiezetapparaat met Bluetooth-bediening en temperatuurmonitoring
  11. Bouw een gevoelige Arduino-metaaldetector met ferro/non-ferro discriminatie