Auf Aliexpress.com habe ich ein cooles Modul mit 1,3″ OLED Display und Drehregler gefunden. In diesem Beitrag möchte ich dir gerne zeigen wie du dieses Modul in der Arduino IDE programmierst.
Im letzten Beitrag Eigenes MacroPad bauen: mit Raspberry Pi Pico zum Effizienz-Booster habe ich dir gezeigt, wie du ein MacroPad erstellen und programmieren kannst. Dieses hier vorgestellte Modul wäre eine optimale Ergänzung um dieses noch Effektiver zu machen.
Auf diesem Blog habe ich ebenso bereits das Modul mit einem kleinen 0,96″ OLED Display & einem 4×4 Tastenfeld im Beitrag Einführung in das OLED Display und Tastenfeld Modul für Arduino mit Beispielprojekt vorgestellt.
Dieses ist ebenso recht nützlich, jedoch finde ich einen Drehregler besonders für Menüs deutlich besser.
Inhaltsverzeichnis
- Bezug des Modules
- Aufbau des Modules – OLED Display mit Drehregler
- Technische Daten
- Programmieren des Moduls
Bezug des Modules
Das Modul bekommst du auf ebay.de bereits ab 6,50 € zzgl. Versandkosten*, in meinem Fall habe ich dieses über aliexpress.com für 3 € zzgl. Versandkosten erstanden.
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!
Es gibt zwei Varianten von diesem Model, zum einen mit einem 0,96″ Display und SSD1306 Treiberchip und dieses hier vorgestellte Modell mit einem 1,3″ Display und SH1106 Treiberchip.
Aufbau des Modules – OLED Display mit Drehregler
Das Modul verfügt wie bereits erwähnt über ein 1,3 Zoll (3,7 cm) OLED Display sowie über zwei frei programmierbare Tasten und einen Drehregler mit zusätzlicher Tastfunktion. Rings um das Modul sind vier Bohrungen im Durchmesser von 3 mm angebracht.
Was ich bei diesem Modul sehr gut gelungen finde ist, dass die Beschriftung der Pins beidseitig erfolgt ist, somit hast du beim Anschluss via Breadboardkabel weniger Probleme und musst das Modul nicht hin und her drehen.
Zusätzlich ist hier die Beschriftung auch etwas ausführlicher und nicht wie auf der Vorderseite stark eingekürzt!
Technische Daten
Hier ist eine übersichtliche Tabelle mit den technischen Daten des Moduls:
Komponente | Technische Daten |
---|---|
Betriebsspannung | 3,3 V |
Display | |
Dimension | 1,3″ (3,7 cm) |
Auflösung | 128×64 Pixel |
Farbe | Schwarz/Weiß |
Treiberchip | SH1106 |
Schnittstelle | I2C |
Rotary Encoder | |
Typ | EC11 |
Die beiden Taster sind bereits über Pull-up-Widerstände verbunden! Daher benötigst du im späteren Code keine extra Konfiguration dafür.
Programmieren des Moduls
Das Modul kannst du am Arduino, Raspberry Pi, Raspberry Pi Pico und auch an den ESP Mikrocontrollern programmieren. Durch die I2C Schnittstelle für das Display und die einfachen digitalen Anschlüsse steht dir hier nichts im Wege.
Anleitung zur Programmierung des Moduls am Arduino UNO
Zunächst möchte ich kurz und knapp erläutern, wie du dieses Modul am Arduino UNO in der Arduino IDE programmierst.
Bibliothek zum Auslesen des Rotary Encoder
Für den Rotary Encoder gibt es diverse Bibliotheken, ich habe mit der Bibliothek von CarlosSiles67 welche du unter https://github.com/CarlosSiles67/Rotary als ZIP-Datei herunterladen kannst, sehr gute Erfahrung gesammelt.
Bibliothek zum Ansteuern des Displays
Das OLED Display wird über den Treiberchip SH1106 betrieben und dafür benötigen wir eine spezielle Bibliothek, diese können wir entweder vom GitHub Repository Adafruit / Adafruit_SH110x als ZIP-Datei herunterladen, oder über den internen Bibliotheksverwalter über die Suche nach Adafruit SH110x.
Schritt 1 – Auslesen des Rotary Encoders am Arduino UNO
Über die Bibliothek Rotary können wir mit der Funktion process den aktuellen Wert ablesen. Als Rückgabe erhalten wir entweder einen positiven oder negativen Wert. Diesen können
//Bibliothek zum auslesen eines Drehreglers #include <rotary.h> //Pin-Konfiguration #define push 2 #define a 4 #define b 3 //LED am digitalen PWM Pin D10 angeschlossen #define led 10 //Objektinstanz mit der Pinbelegung anlegen Rotary rotary = Rotary(a, b, push); int brightness = 0; void setup() { //beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); //Pin der LED als Ausgang definieren pinMode(led, OUTPUT); } void loop() { //Auslesen der aktuellen Position als Wert erhalten //wir je nach Drehrichtung einen anderen Wert. char currentPosition = rotary.process(); //Das Rotary Objekt verfügt über Funktionen mit //welcher wir die Drehrichtung einfach auslesen können. if (currentPosition == rotary.clockwise()) { //Wenn der Wert der Helligkeit kleiner als 255 ist, dann... if (brightness < 255) brightness = brightness + 1; } else if (currentPosition == rotary.counterClockwise()) { //Wenn der Wert der Helligkeit größer als 0 ist, dann... if (brightness > 0) brightness = brightness - 1; } //Wenn der Taster betätigt wird, dann wird ebenso eine Ausgabe getätigt. if (rotary.buttonPressedReleased(20)) { Serial.println("Taster gedrückt!"); } //Schreiben der aktuellen Helligkeit an den Pin / der LED analogWrite(led, brightness); }
Schritt 2 – steuern der Helligkeit einer LED mit dem Drehregler
Über den Drehregler lässt sich recht einfach die Helligkeit einer LED steuern, damit möchte ich dir gerne zeigen wie du diesen in deinem Code benutzen kannst.
Die LED muss in diesem Fall an einen der digitalen PWM Pins des Arduinos verbunden werden, diese erkennst du an der kleinen Welle vor der Beschriftung.
//Bibliothek zum auslesen eines Drehreglers #include <rotary.h> //Pin-Konfiguration #define push 2 #define a 4 #define b 3 //LED am digitalen PWM Pin D10 angeschlossen #define led 10 //Objektinstanz mit der Pinbelegung anlegen Rotary rotary = Rotary(a, b, push); int brightness = 0; void setup() { //beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); //Pin der LED als Ausgang definieren pinMode(led, OUTPUT); } void loop() { //Auslesen der aktuellen Position als Wert erhalten //wir je nach Drehrichtung einen anderen Wert. unsigned char currentPosition = rotary.process(); //Das Rotary Objekt verfügt über Funktionen mit //welcher wir die Drehrichtung einfach auslesen können. if (currentPosition == rotary.clockwise()) { //Wenn der Wert der Helligkeit kleiner als 255 ist, dann... if (brightness < 255) brightness = brightness + 1; } else if (currentPosition == rotary.counterClockwise()) { //Wenn der Wert der Helligkeit größer als 0 ist, dann... if (brightness > 0) brightness = brightness - 1; } //Wenn der Taster betätigt wird, dann wird ebenso eine Ausgabe getätigt. if (rotary.buttonPressedReleased(20)) { Serial.println("Taster gedrückt!"); } //Schreiben der aktuellen Helligkeit an den Pin / der LED analogWrite(led, brightness); }
Schritt 3 – Anzeigen der Helligkeit der LED auf dem Display
Im nächsten Schritt möchte ich dir zeigen, wie du den eingestellten Wert für die Helligkeit auf dem Display anzeigen lassen kannst. Dazu lagern wir die Logik in eine separate Funktion aus da wir diese bei Vorwärts-/Rückwärtsdrehungen ausführen wollen.
Das Display wird via I2C mit dem Mikrocontroller verbunden, an den analogen Pins A4 (SDA) und A5 (SCL) findest du diese Schnittstelle (oben links findest du ebenso diese beiden Pin).
//Bibliothek zum auslesen eines Drehreglers #include <rotary.h> //Bibliotheken zum darstellen von Texten //und geometrischen Figuren auf dem Display #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SH110X.h> //Pin-Konfiguration #define push 2 #define a 4 #define b 3 //LED am digitalen PWM Pin D10 angeschlossen #define led 10 //Objektinstanz mit der Pinbelegung anlegen Rotary rotary = Rotary(a, b, push); #define i2c_Address 0x3c Adafruit_SH1106G display = Adafruit_SH1106G(128, 64, &Wire, -1); int brightness = 0; void setup() { //beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); //Pin der LED als Ausgang definieren pinMode(led, OUTPUT); //Beginn der Kommunikation mit dem Display display.begin(i2c_Address, true); //leeren des Displays display.clearDisplay(); } void loop() { //Auslesen der aktuellen Position als Wert erhalten //wir je nach Drehrichtung einen anderen Wert. unsigned char currentPosition = rotary.process(); //Das Rotary Objekt verfügt über Funktionen mit //welcher wir die Drehrichtung einfach auslesen können. if (currentPosition == rotary.clockwise()) { //Wenn der Wert der Helligkeit kleiner als 255 ist, dann... if (brightness < 255) { //erhöhen der Helligkeit um 5 Schritte brightness = brightness + 5; //Aufrufen der Funktion zum schreiben der Helligkeit auf dem Display displayLedBrightness(); } } else if (currentPosition == rotary.counterClockwise()) { //Wenn der Wert der Helligkeit größer als 0 ist, dann... if (brightness > 0) { //verringern der Helligkeit um 5 Schritte brightness = brightness - 5; //Aufrufen der Funktion zum schreiben der Helligkeit auf dem Display displayLedBrightness(); } } //Wenn der Taster betätigt wird, dann wird ebenso eine Ausgabe getätigt. if (rotary.buttonPressedReleased(20)) { Serial.println("Taster gedrückt!"); } //Schreiben der aktuellen Helligkeit an den Pin / der LED analogWrite(led, brightness); } /** * Funktion zum Anzeigen der aktuellen Helligkeit der LED * auf dem Display **/ void displayLedBrightness() { //aktuelle Anzeige löschen display.clearDisplay(); //setzen der Textfarbe auf Weiß display.setTextColor(SH110X_WHITE); //setzen der Textgröße auf 3 display.setTextSize(3); //setzen der Cursorposition display.setCursor(50, 15); //schreiben der Helligkeit an die Cursorposition display.println(String(brightness, DEC)); //absenden der Daten und schreiben auf dem Display display.display(); }