Fortgeschrittene Display Funktionen

Fortgeschrittene Display Funktionen

In diesem Projekt wird dir gezeigt, wie man fortgeschrittene Programme mit dem Display erstellen kann. Zum einen werden wir das Display so programmieren, dass es nach einem Knopfdruck die Anzeige wechselt, als auch dass das Display automatisch nach einem Zeitintervall die Anzeige ändert.

Aufbau

Zuerst verbindest du das Display mit dem JST-JST-Kabel. Dies schließt du an einem der fünf I2C/Wire-Anschlüssen deiner senseBox MCU an.

Programmierung: Wechsle die Anzeige auf Knopfdruck

Das Ziel der Programmierung ist es, dass sich das Display nach einem Klick auf den ‘Switch’ Knopf auf der senseBox MCU die Anzeige ändert. Nutze den senseBox - Code Editor oder die Arduino IDE, um die Programmierung für dieses Projekt durchzuführen.

Schritt 1: Librarys importieren

Zuerst müssen die benötigten Librarys aus dem Board-Support-Package eingeladen werden. Darüber hinaus wird ein Objekt sowohl für das Display als auch für den “Switch” Knopf auf der senseBox erstellt sowie ein OLED Reset definiert. Letztlich muss noch eine Variable mit dem Namen page erstellt werden.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "SenseBoxMCU.h"
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
Button switchButton(0);
int page = 0;

Schritt 2: Display und Knopf im setup() starten

In der setup Funktion werden nun sowohl das Display als auch der “Switch” Knopf gestartet.

void setup()
{
  senseBoxIO.powerI2C(true);
  delay(2000);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
  display.display();
  delay(100);
  display.clearDisplay();

  switchButton.begin();
}

Schritt 3.1: Hochzählen der Variable per Knopfdruck

Im loop() müssen wir nun unsere Programmlogik definieren. Fangen wir an mit dem “Switch” Knopf. Wir möchten, immer wenn der “Switch” Knopf gedrückt wird die Variable page ändern. Die Abfrage, ob der Knopf gedrückt wurde, lässt sich mit switch.isPressed() herausfinden. Demnach steht am Anfang in unserem Sketch:

if(switch.isPressed()){
    // Wenn der Knopf gedrueckt wurde...
    page+=1; // Erhöhe um 1
}

Nun zählt eine Variable jedes Mal hoch, wenn der Knopf betätigt wurde. Um zu verhindern, dass die Variable ins Unendliche hochzählt, bauen wir noch eine else Abfrage ein, sodass wir auch immer zu unserem Ausgangszustand zurückkommen können.

if(switchButton.isPressed()){
    // Wenn der Knopf gedrueckt wurde...
    if(page == 3){
        page = 0;
    }
    else {
        page+=1;
    }
}

Mit dieser Abfrage sagen wir, dass wir insgesamt 4 Seiten haben (von 0 bis 3) und sind wir bei der letzten Seite (3) angekommen und der Knopf wird gedrückt, soll auf die erste Seite zurückgesprungen werden.

Schritt 3.2: Hochzählen der Variable nach 5 Sekunden

In dieser Variante möchten wir die Variable page nicht per Knopfdruck, sondern automatisch alle 5 Sekunden hochzählen. Hierfür müssen wir ein Zeitintervall definieren. Dafür ersetzen wir im Programmcode oben:

Button switchButton(0);
int page = 0;

Mit

const long interval = 5000; // 5000 Millisekunden
long time_start = 0;
long time_actual = 0;

Diese drei Variablen brauchen wir, um festzuhalten, wieviel Zeit seit Programmstart vergangen ist. Die Arduino Funktion millis() gibt die Anzahl an Millisekunden zurück, seitdem die senseBox gestartet ist. Am Start jedes loop() Durchlaufs aktualisieren wir die Variable time_start mit

time_start = millis();

Nun können wir mit folgender Abfrage überprüfen, ob 5 Sekunden vergangen sind.

if (time_start > time_actual + interval) {
    time_actual = millis();
 }

Innerhalb der if-Bedingung kann nun wieder die Variable page aktualisiert werden.

if (time_start > time_actual + interval) {
    time_actual = millis();
    if (page == 3) {
        page = 0;
    }
    else {
        page += 1;
    }
}

Schritt 4: Verschiedene Anzeigen auf dem Display

Nun, da wir den Knopfdruck fertig haben, müssen wir nur noch die Anzeige auf dem Display bestimmen, je nachdem welchen Wert die Variable page gerade hat. Wir starten damit, die vorher angezeigte Schrift zu entfernen, bevor wir etwas auf dem Display anzeigen. Zusätzlich setzen wir noch weitere Eigenschaften wie Schriftgröße und Farbe.

  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextSize(1);
  display.setTextColor(WHITE, BLACK);

Anschließend definieren wir, was auf welcher Seite angezeigt werden soll. Dafür benutzen wir switch…case. Dies funktioniert ähnlich zu den dir schon bekannten if/else Bedinungen.

  switch (page)
  {
    case 0:
      display.println("Seite 1");
      break;
    case 1:
      display.println("Seite 2");
      break;
    case 2:
      display.println("Seite 3");
      break;
    case 3:
      display.println("Seite 4");
      break;
  }
  display.display();
}

Je nachdem, welchen Wert die Variable page hat, wird hier also etwas Unterschiedliches auf dem Display angezeigt. Wichtig ist, nicht zu vergessen, den Befehl display.display() einzufügen!

Gesamter Code

Den Sketch für die Displaykontrolle per Knopfdruck findest du hier und den per Zeitintervall hier