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 Zeitinterval 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.

Schritt 1: Librarys importieren

Zuerst müssen die benötigten Librarys aus dem Board-Support-Package eingeladen werden. Darüber hinaus wird ein Objekt für das Display als auch für den “Switch” Knopf auf der senseBox erstellt, sowie ein OLED Reset definiert. Letzlich 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 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, wenn immer 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 hoch jedes Mal, wenn der Knopf betätigt wurde. Um zu verhindern, dass die Variable ins unendliche hoch zä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ück gesprungen 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 Zeitinterval 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 nurnoch die Anzeige auf dem Display bestimmen, je nachdem welchen Wert die Variable page gerade hat. Wir starten damit, dass bevor wir etwas auf dem Display anzeigen möchten, wir die vorher angezeigte Schrift entfernen. 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 noch den Befehl display.display() einzufügen!

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