Du möchtest dein eigenes digitales Schloss bauen? Mit dem Calliope Mini 3 und einem 3×4 Tastenfeld geht das ganz einfach. Auf der LED-Matrix siehst du ein Schloss, das sich nur mit dem richtigen Code öffnet. Gibst du den falschen Code ein, bleibt es zu, blinkt kurz und der Piezo-Buzzer meldet sich mit einem tiefen Ton. Stimmt der Code, hörst du einen hellen Signalton und das Schloss öffnet sich sichtbar. So lernst du spielerisch den Umgang mit Tastenfeldern, LED-Animationen und Sounds – und hast direkt ein cooles Projekt zum Nachbauen.
Inhaltsverzeichnis
Benötigte Bauteile
Für das Projekt brauchst du nur wenige Komponenten, die sich leicht verbinden lassen:
- Calliope Mini 3* inkl. USB-Datenkabel
- Tastenfeld (Keypad) 3×4*
- sieben Jumperkabel / Breadboardkabel* (männlich–männlich, ca. 10 cm Länge)
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!

Damit hast du alles, um dein digitales Schloss mit dem Calliope Mini umzusetzen. Ein Breadboard ist nicht zwingend nötig – die Kabel können direkt an den Pins des Calliope Mini angeschlossen werden.
Aufbau der Schaltung
Das 3×4-Tastenfeld besitzt 7 Anschlüsse: vier für die Zeilen und drei für die Spalten. Diese werden mit den digitalen Pins des Calliope Mini verbunden. Über die Kombination aus Zeilen und Spalten kann später jede Taste eindeutig erkannt werden.
Anschlussübersicht
Beim Anschluss der Folientastatur gibt es eine kleine Besonderheit: Die Pinleiste des Calliope Mini kann nicht völlig frei genutzt werden – zumindest nicht, wenn gleichzeitig die 5×5 LED-Matrix aktiv sein soll.
Ein Blick in die Pin-Konfiguration lohnt sich daher unbedingt.
Unter https://docs.calliope.cc/tech/hardware/pins/ findest du die vollständige Belegung der 30-Pin-Leiste und erkennst schnell, welche Pins doppelt belegt sind und welche sich für externe Hardware eignen.

Tastenfeld | Funktion | Calliope Mini Pin |
---|---|---|
R1 | Zeile 1 | C4 |
R2 | Zeile 2 | C5 |
R3 | Zeile 3 | C6 |
R4 | Zeile 4 | C7 |
C1 | Spalte 1 | C8 |
C2 | Spalte 2 | C9 |
C3 | Spalte 3 | C10 |
Falls du andere Pins nutzen möchtest, kannst du diese später im Programmcode anpassen. Wichtig ist nur, dass jede Zeile und jede Spalte mit einem eigenen Pin verbunden ist.
Programmieren in Blöcken oder JavaScript
Der Calliope Mini lässt sich in MakeCode auf zwei Arten programmieren:
- mit Blöcken, die sich einfach zusammenklicken lassen und gerade für Einsteiger:innen perfekt geeignet sind,
- oder direkt in JavaScript/TypeScript, was mehr Flexibilität bei komplexeren Projekten bietet.
Ein Vorteil von MakeCode: Auch wenn der Code direkt in JavaScript geschrieben wird, kann man ihn sich anschließend automatisch wieder als Blocklogik anzeigen lassen. So bleiben beide Welten verbunden – ideal für Anfänger:innen und Fortgeschrittene.
Im folgenden Abschnitt findest du den kompletten JavaScript-Code für unser digitales Schloss mit Tastenfeld.
Quellcode
Der Vorteil des Calliope Mini ist es das dieser recht einfach mit Blöcken „programmiert“ werden kann. Neben den Blöcken kann man aber auch selber JavaScript Code schreiben. Dieses ist für das kleine Beispiel am einfachsten und war mein Weg zum Ziel denn die logik in MakeCode Blöcke zu packen ist etwas verzwickter. Das coole an MakeCode ist jedoch das dieser aus der Logik eine Blocklogik generiert und somit trotzdem hinterher mit Blöcken gearbeitet werden kann.

Quellcode
/** * **************************************************** * * Calliope Mini 3 – Digitales Schloss mit 3×4 Keypad * * *************************************************** */ function schlossAuf () { basic.showLeds(` . # # # . . # . # . . . . # . # # # # # # # # # # `) } function schlossZu () { basic.showLeds(` . # # # . . # . # . . # . # . # # # # # # # # # # `) } // ********** Pins vorbereiten / wiederherstellen ********** function pinsWiederherstellen () { // Zeilen als Ausgänge -> HIGH (idle) for (let z of zeilenPins) { pins.digitalWritePin(z, 1) } // Spalten als Eingänge -> Pull-Up aktiv (gedrückt = LOW) for (let s of spaltenPins) { pins.setPull(s, PinPullMode.PullUp) } } // Diese Funktion blockiert NICHT mit der LED und liefert: // - "", wenn keine Taste gedrückt wurde // - "1".."9","0","*","#" bei neu erkanntem Tastendruck function tasteEinmalLesen () { for (let r = 0; r <= zeilenPins.length - 1; r++) { // Zeile aktivieren (LOW) pins.digitalWritePin(zeilenPins[r], 0) basic.pause(SETTLE_MS) for (let c = 0; c <= spaltenPins.length - 1; c++) { // Spalte lesen: LOW = Taste gedrückt if (pins.digitalReadPin(spaltenPins[c]) == 0) { // kurzes Entprellen basic.pause(ENTPRELL_MS) if (pins.digitalReadPin(spaltenPins[c]) == 0) { k = tastenMatrix[r][c] // Auf Loslassen warten -> ein Event pro Druck while (pins.digitalReadPin(spaltenPins[c]) == 0) { basic.pause(5) } // Zeile zurück auf HIGH und kleiner Cooldown pins.digitalWritePin(zeilenPins[r], 1) basic.pause(COOLDOWN_MS) return k } } } // Zeile zurück auf HIGH (idle) pins.digitalWritePin(zeilenPins[r], 1) } return "" } // ********** Initialisierung ********** function initialisieren () { // LED-Matrix von Beginn an AUS (vermeidet Pin-Konflikte) led.enable(false) // Rows/Cols in Grundzustand bringen pinsWiederherstellen() } let eingabe = "" let taste = "" let schlossIstOffen = false let k = "" let SETTLE_MS = 0 let COOLDOWN_MS = 0 let ENTPRELL_MS = 0 let tastenMatrix: string[][] = [] let spaltenPins: number[] = [] let zeilenPins: number[] = [] // Pins für Keypad zeilenPins = [ DigitalPin.C4, DigitalPin.C5, DigitalPin.C6, DigitalPin.C7 ] spaltenPins = [DigitalPin.C8, DigitalPin.C9, DigitalPin.C10] // Tastenbelegung (Zeile x Spalte) tastenMatrix = [ ["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"], ["*", "0", "#"] ] // Schloss-Code (anpassen) let geheimCode = "0815" // kurzes Entprellen nach Erkennung ENTPRELL_MS = 10 // kleine Abklingzeit nach einem Tastendruck COOLDOWN_MS = 80 // wie lange Zahl/Icon angezeigt wird let ANZEIGE_MS = 120 // kurze Settle-Time beim Aktivieren einer Zeile SETTLE_MS = 1 initialisieren() // ********** Hauptlogik ********** basic.forever(function () { // Hinweis: Wenn du hier wieder scannen möchtest (z. B. zum Schließen), // schalte nach der Anzeige die LED wieder aus und rufe pinsWiederherstellen() auf. if (!(schlossIstOffen)) { // Taste abfragen taste = tasteEinmalLesen() if (taste) { // LED-Matrix nur für die kurze Anzeige einschalten led.enable(true) if (taste >= "0" && taste <= "9") { // Ziffer zeigen und an den Eingabecode anhängen basic.showNumber(parseInt(taste)) eingabe = "" + eingabe + taste basic.pause(ANZEIGE_MS) } else if (taste == "*") { // Clear: Eingabe löschen eingabe = "" basic.showString("CLS") basic.pause(ANZEIGE_MS) } else { // taste == "#": Prüfen if (eingabe == geheimCode) { // Richtig -> Schloss auf schlossAuf() schlossIstOffen = true music.play(music.builtinPlayableSoundEffect(soundExpression.happy), music.PlaybackMode.UntilDone) } else { // Falsch -> Schloss zu + Fehler-Sound schlossZu() eingabe = "" schlossIstOffen = false music.play(music.builtinPlayableSoundEffect(soundExpression.sad), music.PlaybackMode.UntilDone) } basic.pause(ANZEIGE_MS) } // LED-Matrix wieder AUS und Pins sicher zurücksetzen led.enable(false) pinsWiederherstellen() } } else { // Schloss ist offen: gleichbleibende Anzeige (ohne Scannen) led.enable(true) schlossAuf() } // kurze Loop-Pause hält alles reaktionsschnell basic.pause(5) })
Letzte Aktualisierung am: 29. September 2025