Beruflich Dokumente
Kultur Dokumente
Vielen Dank, dass sie sich für unseren AZ-Delivery 128x64 LCD Bildschirm
entschieden haben. In den nachfolgenden Seiten werden wir Ihnen erklären
wie Sie das Gerät einrichten und nutzen können.
Viel Spaß!
Eine Flüssigkristallanzeige, auch LCD genannt, ist ein Gerät, dass
Flüssigkristalle verwendet, um das Licht aus der Hintergrundbeleuchtung
der Anzeige zu blockieren. Flüssigkristalle selber strahlen kein Licht aus,
sondern blockieren das aus dem Gegenlicht kommende Licht und erzeugen
monochrome oder farbige Bilder. Die Flüssigkristalle leiten Strom, und wenn
Strom durch diese Kristalle fließt, verändern sie ihre Struktur, um Licht
durchzulassen. Fließt kein Strom, kehren die Kristalle in ihren
Ausgangszustand zurück. In diesem Zustand wird kein Licht durchgelassen.
Technische Daten
Das 128x64-Modell besitzt zwei Treiberchips. Einer davon ist der "KS0108"
(davon wurden zwei verbaut) und der andere ist der "KS0107". Einer der
"KS0108"-Chips betreibt 64x64 Pixel und der andere "KS0108" weitere
64x64 Pixel. Das bedeutet, dass das 128x64 Display tatsächlich aus zwei
64x64 Bildschirmen besteht. Mit den CS1- und CS2-Pins können wir
auswählen, welcher der Chips die Daten im Datenbus empfängt
(DB0 - DB7-Pins). Wenn der Chip die Daten empfängt, aktiviert er das Pixel
für seinen Teil des Displays.
Der V0-Pin wird für den Kontrast verwendet. Schließen Sie es an eine
analoge Spannung an. Der Wert dieser analogen Spannung wird benötigt,
um den Farbton des Displays anzupassen. In unserem Beispiel verwenden
wir ein Potentiometer, bei dem ein Pin mit +5V, der zweite mit GND und der
mittlere Pin mit V0 verbunden ist. Durch Drehen der Welle des
Potentiometers ändern wir die Analogspannung und damit den Kontrast der
Anzeige.
Das Display kann parallel und seriell arbeiten. Diese Modi werden über den
PSB-Pin ausgewählt. Wenn wir diesen Pin hochziehen, dann ist der
Parallelmodus ausgewählt. Wird der Pin runtergezogen, dann ist der serielle
Modus ausgewählt. Der Parallelmodus arbeitet in zwei anderen Modi, 8bit
und 4bit. Das bedeutet, dass die Daten von allen D0 - D7 Pins im 8bit- und
von allen D4 - D7 Pins im 4bit-Modus gelesen werden. Parallele Modi
werden in diesem E-Book nicht näher behandelt.
Danach gehen Sie zu File > Examples und scrollen bis zu den“U8g2”-
Skizzenbeispielen. Wir werden File > Examples > U8g2 > full_buffer >
GraphicsTest benutzen, aber passen es an unsere Bedürfnisse an.
Code:
#include <U8g2lib.h>
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, 13, 11, 10);
// clock=13, data=11, CS=10
const char COPYRIGHT_SYMBOL[] = {0xa9, '\0'};
void u8g2_prepare() {
u8g2.setFont(u8g2_font_6x10_tf);
u8g2.setFontRefHeightExtendedText();
u8g2.setDrawColor(1);
u8g2.setFontPosTop();
u8g2.setFontDirection(0);
}
void u8g2_box_frame() {
u8g2.drawStr(0, 0, "drawBox");
u8g2.drawBox(5, 10, 20, 10);
u8g2.drawStr(60, 0, "drawFrame");
u8g2.drawFrame(65, 10, 20, 10);
}
void u8g2_r_frame_box() {
u8g2.drawStr(0, 0, "drawRFrame");
u8g2.drawRFrame(5, 10, 40, 15, 3);
u8g2.drawStr(70, 0, "drawRBox");
u8g2.drawRBox(70, 10, 25, 15, 3);
}
void u8g2_disc_circle() {
u8g2.drawStr(0, 0, "drawDisc");
u8g2.drawDisc(10, 18, 9);
u8g2.drawDisc(30, 16, 7);
u8g2.drawStr(60, 0, "drawCircle");
u8g2.drawCircle(70, 18, 9);
u8g2.drawCircle(90, 16, 7);
}
void u8g2_string_orientation() {
u8g2.setFontDirection(0);
u8g2.drawStr(5, 15, "0");
u8g2.setFontDirection(3);
u8g2.drawStr(40, 25, "90");
u8g2.setFontDirection(2);
u8g2.drawStr(75, 15, "180");
u8g2.setFontDirection(1);
u8g2.drawStr(100, 10, "270");
}
void u8g2_line() {
u8g2.drawStr( 0, 0, "drawLine");
u8g2.drawLine(7, 10, 40, 32);
u8g2.drawLine(14, 10, 60, 32);
u8g2.drawLine(28, 10, 80, 32);
u8g2.drawLine(35, 10, 100, 32);
}
void u8g2_triangle() {
u8g2.drawStr( 0, 0, "drawTriangle");
u8g2.drawTriangle(14, 7, 45, 30, 10, 32);
}
void u8g2_unicode() {
u8g2.drawStr(0, 0, "Unicode");
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.setFontPosTop();
u8g2.setFontDirection(0);
u8g2.drawUTF8(10, 15, "☀");
u8g2.drawUTF8(30, 15, "☁");
u8g2.drawUTF8(50, 15, "☂");
u8g2.drawUTF8(70, 15, "☔");
u8g2.drawUTF8(95, 15, COPYRIGHT_SYMBOL); //COPYRIGHT SIMBOL
u8g2.drawUTF8(115, 15, "\xb0"); // DEGREE SYMBOL
}
void setup() {
u8g2.begin();
u8g2_prepare();
}
void loop() {
u8g2.clearBuffer();
u8g2_prepare();
u8g2_box_frame();
u8g2_disc_circle();
u8g2.sendBuffer();
delay(1500);
u8g2.clearBuffer();
u8g2_r_frame_box();
u8g2.sendBuffer();
delay(1500);
u8g2.clearBuffer();
u8g2_line();
u8g2.sendBuffer();
delay(1500);
u8g2.clearBuffer();
u8g2_triangle();
u8g2.sendBuffer();
delay(1500);
u8g2.clearBuffer();
u8g2_unicode();
u8g2_prepare();
u8g2_string_orientation();
u8g2.sendBuffer();
delay(1500);
}
Die Funktion "drawStr()" zeigt nur konstante Zeichenketten an, das heißt
nur Zeichenketten, die sich nicht ändern. Wenn Sie jedoch einige
Variablenwerte in der Zeichenkette anzeigen möchten, gibt es eine weitere
Funktion für die Anzeige der Zeichenkettenwerte, genannt "print()". Diese
Funktion akzeptiert nur ein Argument, nämlich den Zeichenkettenwert, der
angezeigt wird. Dieser Wert kann eine beliebige Variable, Float, Integer,
Zeichen, etc. sein. ABER diese Funktion muss im Zusammenhang mit einer
anderen Funktion verwendet werden, da sie allein nicht weiß, wo sie
angezeigt werden soll. Die zweite Funktion ist "setCursor(x, y)", die zwei
Argumente akzeptiert, die X- und Y-Position des Cursors. An diesen
Punkten wird mit dem Anzeigen des Zeichenkettenwertes begonnen.
Beispiel:
Es gibt eine Funktion zum Anzeigen von Boxen oder Rahmen mit einem
Radius an den Ecken. Mithilfe von "drawRFrame()" und "drawRBox()".
Beide Funktionen besitzen ein fünftes Argument für den Radius.
Zuerst müssen Sie ein Bild erstellen oder auswählen. Dann müssen Sie es
in ein zweifarbiges Bild (vorzugsweise ein Schwarz-Weiß-Bild)
posterisierien. Dann müssen Sie es skalieren, um die Breite und Höhe der
Anzeige anzupassen. Dann müssen Sie es als ".xbm" exportieren. Am Ende
müssen Sie die exportierte ".xbm"-Datei in einem Texteditor öffnen (wir
verwenden Sublime Text https://www.sublimetext.com/ , aber Sie können
auch den Texteditor oder ähnliches benutzen) und diesen Text in unsere
Skizze einfügen. Lassen Sie uns die einzelnen Schritte durchgehen.
Danach gehen Sie zu Image > Scale and skalieren das Bild indem Sie die
Breite auf “128” festlegen. Die Höhe wird automatisch skaliert. Sollte die
Höhe "64" übersteigen, ändern sie die Höhe auf "64". Die Breite wird
entsprechend auf einen geringeren Wert als "128" geändert.
Danach müssen Sie das Bild bearbeiten, damit Sie nur noch Pixel mit
schwarzer Farbe für das Bild und weiße für den Hintergrund haben. Sollten
Sie diesen Schritt unterlassen, kann es zu Fehldarstellungen kommen.
Danach exportieren Sie die “.xbm”-Datei, indem Sie File > Export As…
auswählen oder CTRL + SHIFT + E drücken. In dem sich öffnenden
Fenster, wählen sie die “.xbm”-Einstellung und den Namen des Bildes.
Danach öffnen Sie die exportiere “.xbm”-Datei mit einem Texteditor. Sie
werden ein ähnliches Ergebnis, wie unten abgebildet, bekommen.
Wir brauchen den gesamten Text. Kopieren Sie das in Ihren Arduino IDE,
und ändern Sie nur diese Zeile:
static unsigned char image_bits[] = {
zu
static const unsigned char image_bits[] U8X8_PROGMEM = {
Dann sollte die Skizze für die Anzeige des Bildes wie eine der unten
abgebildeten Skizzen aussehen.
#include <U8g2lib.h>
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, 13, 11, 10);
#define image_width 128
#define image_height 21
static const unsigned char image_bits[] U8X8_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00,
0xfc, 0x1f, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xfe, 0x1f, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x00, 0x00,
0x0c, 0xc0, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x18, 0x00, 0x00, 0x0c, 0xc0, 0xf0, 0x1f, 0x06, 0x63, 0x80, 0xf1,
0x1f, 0xfc, 0x33, 0xc0, 0x03, 0x18, 0x00, 0x00, 0x0c, 0xc0, 0xf8, 0x3f,
0x06, 0x63, 0xc0, 0xf9, 0x3f, 0xfe, 0x33, 0xc0, 0x03, 0x18, 0x00, 0x00,
0x0c, 0xc0, 0x18, 0x30, 0x06, 0x63, 0xc0, 0x18, 0x30, 0x06, 0x30, 0xc0,
0xff, 0xff, 0xdf, 0xff, 0x0c, 0xc0, 0x18, 0x30, 0x06, 0x63, 0xe0, 0x18,
0x30, 0x06, 0x30, 0xc0, 0xff, 0xff, 0xdf, 0xff, 0x0c, 0xc0, 0x98, 0x3f,
0x06, 0x63, 0x60, 0x98, 0x3f, 0x06, 0x30, 0xc0, 0x03, 0x18, 0x0c, 0x00,
0x0c, 0xc0, 0x98, 0x1f, 0x06, 0x63, 0x70, 0x98, 0x1f, 0x06, 0x30, 0xc0,
0x03, 0x18, 0x06, 0x00, 0x0c, 0xc0, 0x18, 0x00, 0x06, 0x63, 0x38, 0x18,
0x00, 0x06, 0x30, 0xc0, 0x03, 0x18, 0x03, 0x00, 0x0c, 0xe0, 0x18, 0x00,
0x06, 0x63, 0x1c, 0x18, 0x00, 0x06, 0x30, 0xc0, 0x00, 0x80, 0x01, 0x00,
0xfc, 0x7f, 0xf8, 0x07, 0x1e, 0xe3, 0x0f, 0xf8, 0x07, 0x06, 0xf0, 0xcf,
0x00, 0xc0, 0x00, 0x00, 0xfc, 0x3f, 0xf0, 0x07, 0x1c, 0xe3, 0x07, 0xf0,
0x07, 0x06, 0xe0, 0xcf, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xe0, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0xfc, 0x1f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f };
void u8g2_prepare() {
u8g2.setFont(u8g2_font_open_iconic_all_4x_t);
u8g2.setFontRefHeightExtendedText();
u8g2.setDrawColor(1);
u8g2.setFontPosTop();
u8g2.setFontDirection(0);
}
void u8g2_bitmap() {
u8g2.drawXBMP(0, 22, image_width, image_height, image_bits);
}
void setup() {
u8g2.begin();
u8g2_prepare();
u8g2.clearBuffer();
u8g2_bitmap();
u8g2.sendBuffer();
}
void loop() { }
Verbinden Sie das Display mit dem Raspberry Pi, wie unten abgebildet.
Bei einem Raspberry Pi gibt es keine libraries in Python, die mit unserem
128x64-LCD funktionieren. Aber es gibt einen Weg die "u8g2"-library
(welche wir für den Atmega328P Board benutzt haben) mit einem
Raspberry Pi zu nutzen (ohne Python).
Starten Sie Ihren Raspberry Pi, und öffnen Sie die Terminal App. Geben Sie
diese Befehle ein:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libcurl4-openssl-dev
git clone https://github.com/Kitware/CMake.git
cd CMake
Dann haben wir noch zwei weitere Befehle, die ausgeführt werden müssen:
sudo make
Es kann 10-15 Minuten dauern, bis dieser Befehl ausgeführt worden ist.
Danach gehen Sie zum Home-Ordner. Falls Sie die Terminal App noch nicht
geschlossen haben, führen Sie “cd ..” aus. Das bringt Sie direkt zu ihrem
Home-Ordner.
Dann laden Sie die "u8g2"-library rutner und installieren diese auf Rasbian.
Führen Sie diese Befehle nacheinander aus:
git clone https://github.com/ribasco/u8g2-rpi-demo.git
cd u8g2-rpi-demo
Wenn Sie nichts installiert haben, erfahren Sie durch den Befehl
"compile.sh" was Sie vorher installieren müssen. Installieren Sie alles
notwendige und führen “compile.sh” erneut aus.
Alle Funktionen, die Sie im Arduino IDE mit der “u8g2”-library benutzt haben
sind nahezu identisch. Anschließend zeigen wir Ihnen, wie Sie diese im
Raspberry Pi nutzen können.
Dieser Code nutzt “wiringPi” GPIO Verbindungsnamen. So werden die drei
Pins benannt:
HW Pin > GPIO Pin > WiringPi Pin > SPI Pin > LCD Pin
Pin 24 > GPIO8 > 10 > CE > RS
Pin 19 > GPIO10 > 12 > MOSI > R/W
Pin 23 > GPIO11 > 14 > SCLK >E
#include <iostream>
#include <wiringPi.h>
#include <cstring>
#include <csignal>
#include <unistd.h>
#include "u8g2_hal_rpi.h"
void exitHandler(int s) {
if (forced_exit_attempts >= 2) {
cout << "Forcing shutdown" << endl;
u8g2_ClearDisplay(&u8g2);
exit(1);
}
complete = true;
forced_exit_attempts++;
}
u8g2_SetFont(u8g2, u8g2_font_unifont_t_symbols);
u8g2_SetFontPosTop(u8g2);
u8g2_SetFontDirection(u8g2, 0);
u8g2_ClearBuffer(u8g2);
u8g2_DrawStr(u8g2, 0, 0, text.c_str());
u8g2_SendBuffer(u8g2);
}
std::string& rtrim(std::string& str, const std::string& chars = "\t\n\v\f\r0. ") {
str.erase(str.find_last_not_of(chars) + 1);
return str;
}
int main() {
struct sigaction sigIntHandler{};
sigIntHandler.sa_handler = exitHandler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, nullptr);
// this variable is just bis show you have bis print variable strings
float b = 0.0;
wiringPiSetup(); // Initialize Wiring Pi
// Configure the SPI Pins
// clock (EN) = 14, mosi (R/W) = 12, cs (RS) = 10
u8g2_rpi_hal_t u8g2_rpi_hal = {14, 12, 10};
u8g2_rpi_hal_init(u8g2_rpi_hal);
u8g2_Setup_st7920_s_128x64_f(&u8g2, U8G2_R2, cb_byte_spi_hw, cb_gpio_delay_rpi);
// Initialize Display
u8g2_InitDisplay(&u8g2);
u8g2_SetPowerSave(&u8g2, 0);
u8g2_ClearDisplay(&u8g2);
cout << "Running display demo...Press Ctrl+C bis exit" << endl;
// one tab
while (!complete) { //Run display loop
/* this part is from demo
//Draw U8G2 Logo
drawU8G2Logo(&u8g2);
delay(5000);
Wenn Sie dieses Skript ausführen, sollte es wie folgt aussehen (nach
Bearbeitung der "main.cpp"-Datei):
Sollte eine Funktion kein Argument erlauben, muss sie nun das “u8g2"-
Objekt erlauben. Beispielsweise:
u8g2_ClearBuffer(u8g2);
u8g2_SendBuffer(u8g2);
Wenn Sie nur konstante oder variable Zeichenketten mit dieser Funktion
anzeigen möchten, gehen Sie wie folgt vor:
string text = "Draw Box";
u8g2_ClearBuffer(u8g2);
u8g2_DrawStr(u8g2, 0, 0, text.c_str());
u8g2_SendBuffer(u8g2);
Nun kann die Variable "text" konstant oder variabel sein. Wenn wir einen
Float-Wert auf diese Weise anzeigen möchten, müssen wir Float in eine
Zeichenkette konvertieren und überschüssige Nullen entfernen. Um dies zu
tun führen wir Folgendes aus:
std::string& rtrim(std::string& str, const std::string& chars="\t\n\v\f\r0. ")
{
str.erase(str.find_last_not_of(chars) + 1);
return str;
}
Die Zahl "15" bedeutet, dass die Funktion den ganz Kreis anzeigen wird.
Dabei können Sie eine Zahl von 0 bis 15 benutzen:
0 - keine Anzeige
1 - zeigt das erste Viertel des Kreises an
2 - zeigt das vierte Quartal des Kreises
3 - zeigt die obere Hälfte des Kreises
4 - zeigt das dritte Quartal des Kreises
5 - zeigt das erste und dritte Viertel des Kreises
6 - zeigt die linke Hälfte des Kreises
7 - zeigt das erste, dritte und vierte Quartal des Kreises
8 - zeigt das zweite Viertel des Kreises
9 - zeigt die rechte Hälfte des Kreises
10 - zeigt das zweite und vierte Viertel des Kreises
11 - zeigt das erste, zweite und vierte Viertel des Kreises.
12 - zeigt die untere Hälfte des Kreises
13 - zeigt das erste, zweite und dritte Viertel des Kreises.
14 - zeigt das zweite, dritte und vierte Viertel des Kreises.
15 - zeigt den vollen Kreis
Alle anderen Funktionen sind mit denen des Arduino IDE identisch (Nur das
erste Argument muss das "u8g2"-Objekt sein).
https://az-delivery.de
Viel Spaß!
Impressum
https://az-delivery.de/pages/about-us