Community project
Digital Magic 8-Ball
Generated with AIBuild a digital Magic 8-Ball that displays mystical answers on an LCD screen. Press the button to ask a question and receive one of eight randomized responses, from "Ja" to "Vielleicht." This project combines an Arduino Uno, a 16x2 I2C LCD display, and a push button to create an interactive fortune-telling device.
This guide provides a complete parts list, wiring diagram showing how to connect the LCD and button to the Arduino, and ready-to-upload firmware with debounce logic for reliable button detection. Follow the assembly steps to connect your components safely, verify all connections, and load the code to start divining answers to your questions.
Wiring diagram
Interactive · read-only
Pan and zoom to explore the wiring. Remix the project to edit it in your own workspace.
Parts list
Bill of materials| Component | Qty | Notes |
|---|---|---|
| LCD 16x2 I2C16×2, I2C-Adresse 0x27 | 1 | 16x2 character LCD display with I2C backpack |
| Push ButtonMomenttaster | 1 | Momentary push button switch |
Assembly
4 stepsArduino noch nicht mit Strom versorgen
Lege den Arduino Uno, das LCD und den Taster vor dich. Ziehe das USB-Kabel ab, während du die Steckverbindungen setzt; so kann ein versehentlich falsch gestecktes Kabel nichts beschädigen.
- Tip: Nutze verschiedene Farben: Rot für 5V, Schwarz für GND und zwei andere Farben für die beiden Datenleitungen.
- ⚠ Stecke das USB-Kabel erst an, wenn alle Verbindungen noch einmal geprüft sind; vertauschte Stromanschlüsse können das Display beschädigen.
LCD-Display anschließen
Verbinde am I²C-Display VCC mit dem 5V-Pin des Arduino (Strom). Verbinde GND mit einem GND-Pin des Arduino (Rückweg für Strom). Verbinde SDA mit A4 (Daten) und SCL mit A5 (Takt). Die Pins A4 und A5 sind beim Uno zugleich die Anschlüsse für dieses vierpolige Display.
- Tip: Auf einigen Uno-Boards sind SDA und SCL zusätzlich neben AREF beschriftet; sie sind elektrisch dieselben Leitungen wie A4 und A5.
- Tip: Falls nur leere Kästchen zu sehen sind, drehe vorsichtig die kleine Kontrastschraube auf der Rückseite des LCD.
- ⚠ VCC und GND dürfen nicht vertauscht werden — falsch angeschlossene Stromleitungen können das Display beschädigen.
Taster anschließen
Stecke den Taster so über die Mittelrille des Steckbretts, dass seine zwei verbundenen Seiten nicht in derselben Reihe landen. Verbinde eine Tasterseite mit D2 am Arduino (Signal) und die gegenüberliegende Seite mit GND (Masse). Der Sketch verwendet einen eingebauten Widerstand im Arduino, daher ist kein weiterer Widerstand nötig.
- Tip: Ein Taster hat meist je zwei intern verbundene Beinchen auf jeder Seite. Nimm ein Beinchen von einer Seite und eines von der gegenüberliegenden Seite.
- Tip: Beim Drücken verbindet der Taster D2 mit GND und löst genau eine neue Antwort aus.
- ⚠ Wenn bei einem Druck nichts passiert, steckt der Taster wahrscheinlich um 90 Grad gedreht oder beide Kabel sitzen auf derselben Tasterseite.
Verbindungen prüfen und starten
Prüfe alle vier LCD-Kabel und beide Tasterkabel noch einmal. Verbinde dann den Arduino über USB mit dem Computer. Nach dem Einspielen des Programms steht auf dem LCD „Magic 8 Ball“; drücke den Taster für eine zufällige Antwort.
- Tip: Das Projekt wird über Schematik eingespielt; du brauchst dafür keine zusätzliche Entwicklungsumgebung.
- ⚠ Wenn das LCD keine Schrift zeigt, trenne USB wieder und kontrolliere zuerst VCC, GND, SDA und SCL.
Pin assignments
Board wiring reference| Pin | Connection | Type |
|---|---|---|
| 5V | lcd_1 VCC | power |
| GND | lcd_1 GND | ground |
| GPIO 18 | lcd_1 SDA | i2c |
| GPIO 19 | lcd_1 SCL | i2c |
| GND | button_1 GND | ground |
| GPIO 2 | button_1 SIGNAL | digital |
Firmware
Arduino#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Forward declarations
void showWelcome();
void showAnswer();
const byte BUTTON_PIN = 2;
const unsigned long DEBOUNCE_MS = 35;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const char *answers[] = {
"Ja",
"Nein",
"Frag spaeter",
"Ganz sicher",
"Eher nicht",
"Sieht gut aus",
"Nochmals fragen",
"Vielleicht"
};
const byte ANSWER_COUNT = sizeof(answers) / sizeof(answers[0]);
bool lastRawState = HIGH;
bool stableState = HIGH;
unsigned long lastChangeMs = 0;
unsigned long pressNumber = 0;
void showWelcome() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Magic 8 Ball");
lcd.setCursor(0, 1);
lcd.print("Taste druecken");
}
void showAnswer() {
pressNumber++;
randomSeed(micros() ^ (pressNumber * 1103515245UL));
byte answerIndex = random(ANSWER_COUNT);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Die Antwort:");
lcd.setCursor(0, 1);
lcd.print(answers[answerIndex]);
}
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
lcd.init();
lcd.backlight();
showWelcome();
}
void loop() {
bool rawState = digitalRead(BUTTON_PIN);
if (rawState != lastRawState) {
lastChangeMs = millis();
lastRawState = rawState;
}
if (millis() - lastChangeMs >= DEBOUNCE_MS && rawState != stableState) {
stableState = rawState;
if (stableState == LOW) {
showAnswer();
}
}
}“Deploy to device” opens this project in Schematik, where you can flash it to your board over USB.
Remix this project
Make it yours in one click
Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.