Öffi Monitor

March 21, 2019 Felix De Montis

Öffi Monitor

Idee

Die Idee war eine miniatur version der Wiener Linien Anzeige zu bauen, die mir neben meinen bevorzugten Stationen auch die Anzahl an freien City Bikes anzeigt.

Konzept

Als erstes ging es darum, die genauen Maße für eine Anzeige zu bekommen. Die Wiener Linien sind sehr Nett, und haben mir die genaue Größe des Monitors zugeschickt.

860 mm x 591 mm x 270 mm (LxHxT)

Das verwendete Display (siehe Komponenten) hat ein sehr ähnliches Verhältnis zu dem echten Display, dadurch entsteht ein Maßstab von 1:13.

Um Daten auf die kleine Anzeige zu bekommen, gibt es diese Struktur. Ein eigener Server greif auf die API von citybik.es und die der Wiener Linien zu, und holt sich somit Echtzeitdaten. Falls sich diese verändern, werden sie per MQTT an den ESP32 geschickt.

Data Flow von API zum ESP32

Komponenten

Folgende Hardware Komponenten sind in der Anzeige verbaut:
Heltec ESP32 LoRa w/ Oled Display
Rotary Encoder w/ Push Button
Waveshare 2.13″ E-Ink display in Schwarz-Rot-Weiß
Breadboard

Eigentlich hätte das Projekt folgende Komponenten statt dem Heltec ESP32 benützen sollen:
Adafruit HUZZAH32
Große LiPo Batterie
Mit diesen Komponenten gab es jedoch Probleme in Kombination mit dem E-Ink Display, weshalb der Heltec verwendet wird.

Aufbau

Die Miniaturanzeige hat keinen komplizierten technischen Aufbau. Das Display und der Rotary Encoder werden angeschlossen, das Display an SPI Pins und der Encoder an irgendwelche die frei sind.

Für beide Komponenten gibt es Libraries, die die Kommunikation sehr einfach machen.

Der gestalterische Aufbau ist bisschen komplizierter. Der ESP32, der Rotary Encoder und die Anzeigen Stange sind auf eine Bodenplatte von 9cm x 9cm angeschraubt oder angeklebt.

Die Stange hat 2 Löcher, einmal Unten und einmal Oben, damit die Kabel vom ESP32 zum Display gelangen. Über den ESP32, dem Kabel loch und dem Encoder kommt eine Kartonschachtel mit einer Höhe von 3cm.

Am oberen Ende der Stande ist eine weitere Kartonschachtel mit den Maßen von ca. 7.5 cm x 4.5cm x 2cm (LxHxT). Darin befindet sich das Display eingeklemmt.

Verwendung

Durch drehen kann zwischen unterschiedlichen Linien / Stationen / verfügbaren Fahrrädern gewechselt werden. Durch klicken kann bei den Öffentlichen Verkehrsmitteln die Richtung der Station geändert werden. Am besten sieht man die Anzeige in Verwendung in folgendem Video:

Probleme

Im laufe der Projekts sind immer wieder Probleme bei sowohl der Hardware als auch der Software aufgetaucht.

Display

Die E-Ink Displays sind ziemlich kompliziert zum verwenden. Es gibt zwar eine sehr gute library (GxEPD2), jedoch nur diese eine. Der von Hersteller bereitgestellte Code / Library funktioniert nicht. Außerdem sind nicht alle (jedoch fast alle) Microcontroller unterstütz. Den Microcontroller den ich eigentlich verwenden wollte, Adafruit HUZZAH32, wird nicht unterstützt. Deshalb muss doch der Heltect ESP32 verwendet werden.

Außerdem weiß man oft nicht, ob die Pins falsch sind oder nicht, weil etwas angezeigt wird, auch wenn keine Verbindung besteht. Das ist ein Feature von E-Ink DIsplays, dass sie immer den letzten Zustand anzeigen.

Rotary Encoder

Der Rotary Encoder den ich als erstes benutzt habe hatte Probleme. Als erstes war die Vermutung, dass die Library nicht kompatibel war. Durch Hilfe und einen Ersatzencoder von Adam Lamine hat sich herausgestellt, dass die Komponente das Problem ist. Die Library hat einwandfrei funktioniert.

ArduinoJson

Die Daten von der API kommen als JSON Strings an den ESP32. Als erster versuch war, die Strings einfach an einem Komma zu trennen. Das Trennen von strings ist jedoch schwieriger als erwartet in C. Auch wenn sehr viel mehr Speicher verwendet wird, ging das Daten verarbeiten einfacher mit der ArduinoJson Library.

Code

Arduino

Der Arduino verwendet mehrere Libraries:

#include <WiFi.h>
#include <AsyncMqttClient.h>
#include <ArduinoJson.h>
#include "ESPRotary.h"
#include "Button2.h"
#include <GxEPD2_3C.h>
#include <U8g2_for_Adafruit_GFX.h>

Welche Stationen angezeigt werden, ist nur statisch im Code definiert. Plan war es, diese Konfiguration mithilfe einer App zu bearbeiten, dafür hat aber die Zeit gefehlt.

Sobald der Arduino startet verbindet er sich mit dem MQTT Server und subscribed pro Station einen Channel. Dadurch bekommt er die neuen Daten.

Für die WiFi und MQTT Verbindung, muss man nur die Infos in eine config.h speichern.

Unter github.com/dervondenbergen/tuif-arduino-code findet man den Arduino Code.

Server

Der Server verwendet node.js und die Library Mosca, um selbst zum MQTT Server zu werden, statt die Daten an einen externen Broker zu schicken.

Wenn sich der Arduino mit einer Station subscribed, beginnt der Server für diese Station die Echtzeitdaten im 5 Sekunden Takt zu holen. Falls sich der Arduino wieder trennt, wird das Daten abfragen beendet.

Um den Server zu nutzen braucht man einen API Key von den Wiener Linien, den man neben den Port Einstellungen in einer config.js festlegt.

Unter github.com/dervondenbergen/tuif-data-server findet man den Server Code.

Dieses Projekt wurde im Wintersemester 2018/2019 für die Lehrveranstaltung Tangible User Interfaces (TUIF) bei Matthias Husinsky realisiert.

, , , , , electronics, interaction, interactive