A Swift class to drive the TM1637 chipset (i.e. 7-segment LK-Digi Display)


Swift4 tuxOS

A SwiftyGPIO based driver for the TM1637 7-segment chipset, as used in the LK-Digi LinkerKit element.

The module is heavily inspired by the Python code example shown at the LK-Digi wiki.


A simple digital clock:

import Foundation
import SwiftyGPIO
import SwiftyTM1637

let gpios   = SwiftyGPIO.GPIOs(for: .RaspberryPi3)

// E.g. a LK-Digi connected to the P4/P5 digital pins
let display = TM1637(clock: gpios[.P4]!, data: gpios[.P5]!)

display.brightness = .typical

while true {
  let cal = Calendar.current
  let now = cal.dateComponents([.hour, .minute, .second], from: Date())
  let hour   = now.hour   ?? 0
  let minute = now.minute ?? 0
  let second = now.second ?? 0
  let segment2 = SevenSegment(digit: hour % 10, dot: second % 2 != 0)
  display.show(s1: hour   / 10, s2: segment2,
               s3: minute / 10, s4: minute % 10)
  Thread.sleep(forTimeInterval: 0.5)

How to setup and run

Note: This is for 32-bit, 64-bit doesn't seem to work yet.

Raspi Docker Setup

You don't have to, but I recommend running things in a HypriotOS docker container.

Setup is trivial. Grab the flash tool, then insert your empty SD card into your Mac and do:

$ flash --hostname zpi3 \

Boot your Raspi and you should be able to reach it via zpi3.local.

I also recommend to use docker-machine (e.g. see here), but that is not necessary either.

Running an ARM Swift container

Boot the container like so:

$ docker run --rm \
  --cap-add SYS_RAWIO \
  --privileged \
  --device /dev/mem \
  -it --name swiftfun \
  helje5/rpi-swift-dev:4.1.0 /bin/bash

You end up in a Swift 4.1 environment with some dev tools like emacs pre-installed. Sudo password for user swift is swift.

Creating a small clock

In the container:

swift@fb630076e0ec:~/testit$ mkdir testit && cd testit && swift package init --type executable
Creating executable package: testit
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/testit/main.swift
Creating Tests/

Then edit the Package.swift file to look like this:

// swift-tools-version:4.0

import PackageDescription

let package = Package(
    name: "testit",
    dependencies: [
        .package(url: "https://github.com/uraimo/SwiftyGPIO.git",
                 from: "1.0.0"),
        .package(url: "https://github.com/SwiftyLinkerKit/SwiftyTM1637.git",
                 from: "0.1.2"),
    targets: [
            name: "testit",
            dependencies: [ "SwiftyTM1637", "SwiftyGPIO" ]),

Edit the Sources/testit/main.swift and add the Swift code above.

Build everything:

swift@fb630076e0ec:~/testit$ swift build
Fetching https://github.com/uraimo/SwiftyGPIO.git
Fetching https://github.com/AlwaysRightInstitute/SwiftyTM1637.git
Cloning https://github.com/uraimo/SwiftyGPIO.git
Resolving https://github.com/uraimo/SwiftyGPIO.git at 1.0.5
Cloning https://github.com/SwiftyLinkerKit/SwiftyTM1637.git
Resolving https://github.com/SwiftyLinkerKit/SwiftyTM1637.git at 0.1.0
Compile Swift Module 'SwiftyGPIO' (10 sources)
Compile Swift Module 'SwiftyTM1637' (4 sources)
Compile Swift Module 'testit' (1 sources)
Linking ./.build/armv7-unknown-linux-gnueabihf/debug/testit

You need to run it using sudo, password is swift:

swift@fb630076e0ec:~/testit$ sudo .build/armv7-unknown-linux-gnueabihf/debug/testit

If your LK-Digi is connected to port D4/D5, it should now show a nice digital clock!

Want to see it in action? SwiftyGPIO driven input/output using LinkerKit components


SwiftyTM1637 is brought to you by AlwaysRightInstitute. We like feedback, GitHub stars, cool contract work, presumably any form of praise you can think of.

There is a channel on the Swift-ARM Slack.


  • Swift Tools 4.0.0
View More Packages from this Author


Last updated: Fri Mar 17 2023 09:46:10 GMT-0500 (GMT-05:00)