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