3. Die Ausgabe auf Displays
3.1 Die Ansteuerung des TC-1602 2-zeiligen LCD Display
Mit diesem simplen Code kann das TC1602 Display getestet werden.
eventuell die Bibliothek LiquidCrystal.h installieren
Hier der Programmcode:
#include <LiquidCrystal.h> //LCD-Bibliothek laden
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //In dieser Zeile wird festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet wird
void setup()
{
lcd.begin(16, 2); //Im Setup wird angegeben, wie viele Zeichen und Zeilen verwendet werden. Hier: 16 Zeichen in 2 Zeilen.
}
void loop()
{
lcd.setCursor(0, 0); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(" WIFI OOE"); //16 Zeichen Text.
lcd.setCursor(0, 1); // lcd.setCursor(0,1) bedeutet: Erstes Zeichen in der zweiten Zeile.
lcd.print(" WMS 2025/26"); //16 Zeichen Text.
}
3.15 Kaffeevollautomat-Steuerung mit
2 Tasten und Relaismodul
In dieser Programmvariante wird die Stuerung eines Kaffeevollautomaten nachgebaut, der nur mit 2 Tasten bedient wird.
Hier der Programmcode:
#include <LiquidCrystal.h> //LCD-Bibliothek laden
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //In dieser Zeile wird festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet wird
int buttonKAFFEEGROSS = 8; // Taster zum Einschalten
int buttonKAFFEEKLEIN = 9; // Taster zum Ausschalten
int Relais = 7; // Relaisausgang soll die Kaffeemaschinen-Elemente simulieren
int Kaffeecounter; // Variable zum Kaffeezählen für den Satzbehälter
void setup()
{
lcd.begin(16, 2); //Im Setup wird angegeben, wie viele Zeichen und Zeilen verwendet werden. Hier: 16 Zeichen in 2 Zeilen.
pinMode(buttonKAFFEEGROSS, INPUT_PULLUP);
pinMode(buttonKAFFEEKLEIN, INPUT_PULLUP);
pinMode(Relais, OUTPUT);
}
void loop()
{
lcd.setCursor(0, 0); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(" SAECO "); //16 Zeichen Text.
lcd.setCursor(0, 1); // lcd.setCursor(0,1) bedeutet: Erstes Zeichen in der zweiten Zeile.
lcd.print("Getraenk waehlen"); //16 Zeichen Text.
if (digitalRead(buttonKAFFEEGROSS) == LOW) //Einlesen der Taste KAFFEE GROSS
{
lcd.setCursor(0, 0);
lcd.print(">>KAFFEE GROSS<<");
lcd.setCursor(0, 1);
lcd.print("Zubereitung ");
digitalWrite(Relais, HIGH); //aktiviere Kaffeemaschine
Kaffeecounter ++;
delay(500);
lcd.setCursor(0, 1);
lcd.print("Zubereitung . ");
delay(500);
lcd.setCursor(0, 1);
lcd.print("Zubereitung .. ");
delay(500);
lcd.setCursor(0, 1);
lcd.print("Zubereitung ... ");
delay(500);
lcd.setCursor(0, 1);
lcd.print("Zubereitung ....");
delay(1000);
lcd.setCursor(0, 1);
lcd.print(" fertig! ");
delay(2000);
digitalWrite(Relais, LOW);
}
if (digitalRead(buttonKAFFEEKLEIN) == LOW) //Einlesen der Taste KAFFEE KLEIN
{
lcd.setCursor(0, 0);
lcd.print(">>KAFFEE KLEIN<<");
lcd.setCursor(0, 1);
lcd.print("Zubereitung ");
digitalWrite(Relais, HIGH); //aktiviere Kaffeemaschine
Kaffeecounter ++;
delay(500);
lcd.setCursor(0, 1);
lcd.print("Zubereitung . ");
delay(500);
lcd.setCursor(0, 1);
lcd.print("Zubereitung .. ");
delay(500);
lcd.setCursor(0, 1);
lcd.print("Zubereitung ... ");
delay(500);
lcd.setCursor(0, 1);
lcd.print("Zubereitung ....");
delay(1000);
lcd.setCursor(0, 1);
lcd.print(" fertig! ");
delay(2000);
digitalWrite(Relais, LOW);
}
if(Kaffeecounter == 3)
{
lcd.setCursor(0, 0);
lcd.print("KAFFEE-BEHAELTER");
lcd.setCursor(0, 1);
lcd.print("bitte ausleeren!");
delay(2000);
lcd.setCursor(0, 0);
lcd.print(" beide Tasten ");
lcd.setCursor(0, 1);
lcd.print(" dr. fuer Reset ");
delay(2000);
if ( (digitalRead(buttonKAFFEEGROSS) == LOW) || (digitalRead(buttonKAFFEEKLEIN) == LOW) )
{
lcd.setCursor(0, 0);
lcd.print("KAFFEE-BEHAELTER");
lcd.setCursor(0, 1);
lcd.print(" entleert! ");
delay(3000);
Kaffeecounter = 0;
}
}
}
3.2 Die Ansteuerung des ST7735 1,8" Farb-TFT Display
Ein weiteres kostengünstiges Display ist das 1,8" TFT Display ST7735. Dieses hat verschiedene Farben und 160x128 Pixel. Programmiert wird in Unterprogrammen void(), um verschiedene Texte auszugeben. Später werden wir hier Uhrzeit, Datum, Temperatur, verschiedene Statusmeldung usw. ausgeben.
Im folgenen Code wird ein kurzes Testprogramm angezeigt.
Hier der Programmcode:
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>
// For ST7735-based displays, we will use this call
#define TFT_CS 3
#define TFT_RST 4
#define TFT_DC 5
#define TFT_MOSI 6
#define TFT_SCLK 7
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
void setup() {
tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab
tft.fillScreen(ST77XX_BLACK);
tft.drawRect (0,0,128,160,ST7735_WHITE); // zeichne ein weisses Rechteck Maximum möglich ist 0,0,128x160 = Displayauflösung
tft.drawRect (5,5,118,150,ST7735_GREEN); // zeichne ein grünes Rechteck
Zeile1("WIFI", ST77XX_GREEN);
Zeile2("Oberoesterreich", ST77XX_GREEN);
Zeile3("Werkmeisterschule", ST77XX_WHITE);
Zeile4("2025/26", ST77XX_WHITE);
}
void loop() {}
void Zeile1(char *text, uint32_t color) {
tft.setCursor(53, 50); // (erste Zahl,zweite Zahl); erste Zahl = Stelle bon links beginnend zweite Zahl = Zeile von oben (nicht Anschlussseite) beginnend
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void Zeile2(char *text, uint32_t color) {
tft.setCursor(20, 70);
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void Zeile3(char *text, uint32_t color) {
tft.setCursor(13, 90);
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void Zeile4(char *text, uint32_t color) {
tft.setCursor(45, 110);
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
3.3 Die gleichzeitige Ansteuerung beider Displays als Entwicklungsbasis
In dieser Übung werden beide Displays gleichzeit mit "Dummy-Werten" angesteuert. Dies soll als zukünftigte Entwicklungsbasis dienen. Je nach Wunsch und Anwendung kann dann nur 1 Display eingesteckt/verwendet werden. Dies erspart aufwendiges Immer-Wieder-Neuverdrahten.
Hier der Programmcode:
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>
#include <LiquidCrystal.h> //LCD-Bibliothek laden
LiquidCrystal lcd(14, 15, 16, 17, 18, 19); //In dieser Zeile wird festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet wird
int Temperatur = 26;
int Luftfeuchte = 58;
// For ST7735-based displays, we will use this call
#define TFT_CS 3
#define TFT_RST 4
#define TFT_DC 5
#define TFT_MOSI 6
#define TFT_SCLK 7
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
void setup() {
lcd.begin(16, 2); //Im Setup wird angegeben, wie viele Zeichen und Zeilen verwendet werden. Hier: 16 Zeichen in 2 Zeilen.
lcd.clear();
tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab
tft.fillScreen(ST77XX_BLACK);
tft.drawRect (0,0,128,160,ST7735_WHITE); // zeichne ein weisses Rechteck Maximum möglich ist 0,0,128x160 = Displayauflösung
tft.drawRect (5,5,118,37,ST7735_RED); // zeichne ein grünes Rechteck
tft.drawRect (5,5,118,75,ST7735_RED); // zeichne ein grünes Rechteck
tft.drawRect (5,5,118,112,ST7735_RED); // zeichne ein grünes Rechteck
tft.drawRect (5,5,118,150,ST7735_RED); // zeichne ein grünes Rechteck
Zeile1("Uhrzeit:", ST77XX_CYAN);
Zeile2_Wert("17:22", ST77XX_WHITE);
Zeile3("Datum:", ST77XX_CYAN);
Zeile4_Wert("01.01.2023", ST77XX_WHITE);
Zeile5("Temperatur:", ST77XX_CYAN);
Zeile6_Wert("", ST77XX_WHITE);
Zeile6_Einheit1("o", ST77XX_WHITE);
Zeile6_Einheit2("C", ST77XX_WHITE);
Zeile7("Luftfeuchtigkeit:", ST77XX_CYAN);
Zeile8_Wert("", ST77XX_WHITE);
Zeile8_Einheit("%", ST77XX_WHITE);
}
void loop() {
lcd.clear();
lcd.setCursor(0, 0); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print("Temperatur"); //16 Zeichen Text.
lcd.setCursor(12, 0); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(Temperatur); //16 Zeichen Text.
lcd.setCursor(15, 0); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print("C"); //16 Zeichen Text.
lcd.setCursor(0, 1); // lcd.setCursor(0,1) bedeutet: Erstes Zeichen in der zweiten Zeile.
lcd.print("Luftfeuchte"); //16 Zeichen Text.
lcd.setCursor(12, 1); // lcd.setCursor(0,1) bedeutet: Erstes Zeichen in der zweiten Zeile.
lcd.print(Luftfeuchte); //16 Zeichen Text.
lcd.setCursor(15, 1); // lcd.setCursor(0,1) bedeutet: Erstes Zeichen in der zweiten Zeile.
lcd.print("%"); //16 Zeichen Text.
Temperatur = 22;
lcd.setCursor(12, 0); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(Temperatur); //16 Zeichen Text.
Luftfeuchte = 60;
lcd.setCursor(12, 1); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(Luftfeuchte); //16 Zeichen Text.
delay(1000);
Temperatur = 21;
lcd.setCursor(12, 0); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(Temperatur); //16 Zeichen Text.
Luftfeuchte = 62;
lcd.setCursor(12, 1); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(Luftfeuchte); //16 Zeichen Text.
delay(1000);
Temperatur = 22;
lcd.setCursor(12, 0); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(Temperatur); //16 Zeichen Text.
Luftfeuchte = 64;
lcd.setCursor(12, 1); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(Luftfeuchte); //16 Zeichen Text.
delay(1000);
Temperatur = 23;
lcd.setCursor(12, 0); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(Temperatur); //16 Zeichen Text.
Luftfeuchte = 62;
lcd.setCursor(12, 1); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(Luftfeuchte); //16 Zeichen Text.
delay(1000);
Temperatur = 22;
lcd.setCursor(12, 0); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(Temperatur); //16 Zeichen Text.
Luftfeuchte = 60;
lcd.setCursor(12, 1); //Startposition Erstes Zeichen in der ersten Zeile.
lcd.print(Luftfeuchte); //16 Zeichen Text.
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Balkenhochauf:");
lcd.setCursor(0,1);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.print("|");
delay(100);
lcd.setCursor(15,1);
lcd.print(" ");
delay(100);
lcd.setCursor(14,1);
lcd.print(" ");
delay(100);
lcd.setCursor(13,1);
lcd.print(" ");
delay(100);
lcd.setCursor(12,1);
lcd.print(" ");
delay(100);
lcd.setCursor(11,1);
lcd.print(" ");
delay(100);
lcd.setCursor(10,1);
lcd.print(" ");
delay(100);
lcd.setCursor(9,1);
lcd.print(" ");
delay(100);
lcd.setCursor(8,1);
lcd.print(" ");
delay(100);
lcd.setCursor(7,1);
lcd.print(" ");
delay(100);
lcd.setCursor(6,1);
lcd.print(" ");
delay(100);
lcd.setCursor(5,1);
lcd.print(" ");
delay(100);
lcd.setCursor(4,1);
lcd.print(" ");
delay(100);
lcd.setCursor(3,1);
lcd.print(" ");
delay(100);
lcd.setCursor(2,1);
lcd.print(" ");
delay(100);
lcd.setCursor(1,1);
lcd.print(" ");
delay(100);
lcd.clear();
}
void Zeile1(char *text, uint32_t color) {
tft.setCursor(43, 13); // (erste Zahl,zweite Zahl); erste Zahl = Stelle von links beginnend zweite Zahl = Zeile von oben (nicht Anschlussseite) beginnend
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void Zeile2_Wert(char *text, uint32_t color) {
tft.setCursor(50, 27); // (erste Zahl,zweite Zahl); erste Zahl = Stelle von links beginnend zweite Zahl = Zeile von oben (nicht Anschlussseite) beginnend
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void Zeile3(char *text, uint32_t color) {
tft.setCursor(48, 48);
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void Zeile4_Wert(char *text, uint32_t color) {
tft.setCursor(35, 62); // (erste Zahl,zweite Zahl); erste Zahl = Stelle von links beginnend zweite Zahl = Zeile von oben (nicht Anschlussseite) beginnend
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void Zeile5(char *text, uint32_t color) {
tft.setCursor(35, 86);
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void Zeile6_Wert(char *text, uint32_t color) {
tft.setCursor(50, 100); // (erste Zahl,zweite Zahl); erste Zahl = Stelle von links beginnend zweite Zahl = Zeile von oben (nicht Anschlussseite) beginnend
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(Temperatur);
}
void Zeile6_Einheit1(char *text, uint32_t color) {
tft.setCursor(65, 98); // (erste Zahl,zweite Zahl); erste Zahl = Stelle von links beginnend zweite Zahl = Zeile von oben (nicht Anschlussseite) beginnend
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void Zeile6_Einheit2(char *text, uint32_t color) {
tft.setCursor(71, 100); // (erste Zahl,zweite Zahl); erste Zahl = Stelle von links beginnend zweite Zahl = Zeile von oben (nicht Anschlussseite) beginnend
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void Zeile7(char *text, uint32_t color) {
tft.setCursor(15, 124);
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}
void Zeile8_Wert(char *text, uint32_t color) {
tft.setCursor(52, 138); // (erste Zahl,zweite Zahl); erste Zahl = Stelle von links beginnend zweite Zahl = Zeile von oben (nicht Anschlussseite) beginnend
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(Luftfeuchte);
}
void Zeile8_Einheit(char *text, uint32_t color) {
tft.setCursor(68, 138); // (erste Zahl,zweite Zahl); erste Zahl = Stelle von links beginnend zweite Zahl = Zeile von oben (nicht Anschlussseite) beginnend
tft.setTextColor(color);
tft.setTextWrap(true);
tft.print(text);
}