Beeindruckende Lichtsequenzen mit Arduino und Schieberegister erstellen
Komponenten und Materialien
| Arduino UNO | × | 1 |
| Steckbrett (Breadboard) | × | 2 |
| Jumper-Kabel | × | 55 |
| 74HC595 Schieberegister | × | 1 |
| Taster (Buttons) | × | 4 |
| Drehpotentiometer | × | 1 |
| LEDs (beliebig) | × | 8 |
| Widerstand 220 Ω | × | 9 |
| Widerstand 10 kΩ | × | 4 |
Benötigte Werkzeuge
- Hände
Apps und Online-Dienste
- Arduino IDE
Projektbeschreibung
Ich habe Spaß an Lichtsteuerungen und Arrays gehabt und wollte das Schieberegister zusammen mit einem LCD-Display nutzen, um ein Programm zu erstellen, mit dem man Lichtanimationen erstellen und anzeigen kann, ohne jedes Mal den Code manuell ändern zu müssen.
Es gibt 4 Tasten (von links nach rechts nummeriert 1–4), die der Menünavigation und dem Ändern von Werten dienen:
- Taste 1: Werte erhöhen / LED auf HIGH setzen
- Taste 2: Werte verringern / LED auf LOW setzen
- Taste 3: Cursor beim Erstellen eines Frames zurückbewegen
- Taste 4: „Zurück“-Funktion
Das Programm erlaubt die Anpassung der Animationsgeschwindigkeit und der Wiederholungsanzahl. Über die Konstante ARR_SIZE im Code lässt sich die Anzahl der Frames ändern.
Schaltplan
Der Schaltplan zeigt die Verdrahtung aller Komponenten. Aufgrund von Darstellungsbeschränkungen konnte das Layout nicht so kompakt wie im Originalaufbau gehalten werden. Nach dem Nachbau lohnt es sich, die Verkabelung aufzuräumen.
Code
Der vollständige Sketch („Light Sequencer“) steuert die 8 LEDs über das 74HC595-Schieberegister, zeigt Menüs auf dem LCD an und reagiert auf Tastendrücke. Der Code umfasst Funktionen für:
- Hauptmenü (Animation abspielen, Frame erstellen, Geschwindigkeit einstellen, Schleifenanzahl setzen)
- Frame-Erstellung mit Live-Vorschau auf dem LCD
- Umwandlung der Boolean-Arrays in Bytes für das Schieberegister
- Eigene
shiftOut-Implementierung für präzises Timing
#include <LiquidCrystal.h>
#define ARR_SIZE 16 // Anzahl der Frames (anpassbar)
#define LIGHTS 8
const int btn1 = 7, btn2 = 8, btn3 = 9, btn4 = 10;
int bs1 = 0, bs2 = 0, bs3 = 0, bs4 = 0;
const int latchPin = 11;
const int clockPin = 13;
const int dataPin = 12;
byte data;
bool ArrOne[ARR_SIZE][LIGHTS] = {false};
byte lightArrOne[ARR_SIZE] = {0xFF};
int animSpeed = 50; // ms pro Frame
int loopCount = 5; // Wiederholungen
const int rs = 15, en = 14, d4 = 3, d5 = 4, d6 = 5, d7 = 6;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
pinMode(btn1, INPUT_PULLUP);
pinMode(btn2, INPUT_PULLUP);
pinMode(btn3, INPUT_PULLUP);
pinMode(btn4, INPUT_PULLUP);
lcd.begin(16, 2);
pinMode(latchPin, OUTPUT);
PrintMenu();
}
void loop() {
bs1 = digitalRead(btn1);
bs2 = digitalRead(btn2);
bs3 = digitalRead(btn3);
bs4 = digitalRead(btn4);
if (bs1 == HIGH) { bs1 = LOW; delay(150); Play(); }
else if (bs2 == HIGH) { bs2 = LOW; delay(150); Create(ArrOne); }
else if (bs3 == HIGH) { bs3 = LOW; delay(150); SetSpeed(); }
else if (bs4 == HIGH) { bs4 = LOW; delay(150); SetLoop(); }
PrintMenu();
delay(150);
}
// Weitere Funktionen: PrintMenu, PrintCreate, PrintSetSpeed, PrintSetLoop,
// Play, Create, IntToHexToByte, BoolArrayToByte, SetSpeed, SetLoop,
// shiftOut, ClearScreen – siehe vollständiger Code im Original.
Herstellungsprozess
- TinyML Spracherkennung mit Edge Impulse auf Arduino Nano 33 BLE Sense
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
- 37-LED-Roulette-Spiel mit Arduino Nano bauen – Europäisches Layout
- ATtiny85 Mini-Arcade: Snake – Handheld OLED-Spielekonsole selbst bauen
- Tragbarer Entfernungsmesser – Arduino Nano DIY-Kit mit HC-SR04, 18650-Akku und 3D-gedrucktem Gehäuse
- Audio-reaktive Schreibtischlampe mit Arduino Nano bauen
- Autonomes Gesichtsverfolgungs-Robotercar mit Arduino Nano & OpenCV
- Kupfer-Galvanik-Projekt: Intelligentes System mit Arduino UNO bauen
- NeoPixel-Matrix Pong auf Arduino Nano: Neon-Pong selbst bauen