Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Gartenautomation
  • Arduino
  • ESP32 & Co.
  • Calliope Mini
  • Raspberry Pi & Pico
  • Solo Mining
  • Deutsch
  • English
Menu

Calliope Mini 3: So baust du ein digitales Schloss mit Tastenfeld

Veröffentlicht am 29. September 202529. September 2025 von Stefan Draeger

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.

Calliope Mini 3: So baust du ein digitales Schloss mit Tastenfeld
Dieses Video auf YouTube ansehen.

Inhaltsverzeichnis

  • Benötigte Bauteile
  • Aufbau der Schaltung
    • Anschlussübersicht
  • Programmieren in Blöcken oder JavaScript
    • Quellcode

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!

Calliope Mini mit Folientastatur
Calliope Mini mit Folientastatur

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.

Schaltung - Calliope Mini 3 mit 3x4 Folientastatur
Schaltung – Calliope Mini 3 mit 3×4 Folientastatur

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.

Calliope Mini 3 - Belegung der Pinleiste
Calliope Mini 3 – Belegung der Pinleiste
TastenfeldFunktionCalliope Mini Pin
R1Zeile 1C4
R2Zeile 2C5
R3Zeile 3C6
R4Zeile 4C7
C1Spalte 1C8
C2Spalte 2C9
C3Spalte 3C10

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.

MakeCode - digitales Schloss mit Folientastatur
MakeCode – digitales Schloss mit Folientastatur
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

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen
Tel.: 015565432686
E-Mail: info@draeger-it.blog

Folge mir auf

link zu Fabook
link zu LinkedIn
link zu YouTube
link zu TikTok
link zu Pinterest
link zu Instagram
  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}