Zeilen- (oder Text-) Anzeigen sind für die Bereitstellung von Textinformationen in Form von Zeilen vorgesehen. Es gibt verschiedene Arten (vor allem LCD oder selbstleuchtende OLED), und normalerweise sind in ihrer Kennzeichnung die Nummern 1202, 1602, 1204 oder ähnlich angegeben, die die Anzahl der Zeilen (in den Beispielen 2 oder 4) und die Zeichen in jeder Zeile (12 und 16) angeben. . Es gibt einzeilige Anzeigen dieses Typs, aber in der folgenden Präsentation konzentrieren wir uns auf die am häufigsten verwendeten zweizeiligen Anzeigen.Die meisten dieser Displays sind mit dem HD44780-Controller (Hitachi) kompatibel. Die beliebtesten (zumindest in unserem Land) Displays dieser Sorte werden von Winstar hergestellt. Darüber hinaus sind LCD-Varianten (der Name beginnt mit den Buchstaben WH, z. B. WH1602) eins zu eins mit dem HD44780-Befehlssystem kompatibel, und OLED-Typen (der Name beginnt mit WEH, z. B. WEH001602) verfügen über einen verbesserten WS0010-Controller. Leider oder zum Glück werden wir uns jetzt darum kümmern.Im Gegensatz zu den zuvor auf dem ks0108-Controller untersuchten Grafikdisplays ist der Zeichengenerator in den Kleinbuchstaben integriert. Darüber hinaus besteht für uns der Hauptunterschied zwischen dem WS0010 und dem Standard HD44780 darin, dass mehrere (vier) Codetabellen für die Anzeige von mehrsprachigem Text vorhanden sind. Der HD44780 verfügt nur über eine solche Tabelle, weshalb Unternehmen in jeder Region einen eigenen Anzeigetyp verkaufen müssen. Für WSED10-basierte OLED-Displays sind keine regionalen Aufschlüsselungen erforderlich, was wesentlich praktischer ist. Aber nicht für den Benutzer: Standardmäßig enthalten die WEB-Anzeigen die Tabelle ENGLISH_JAPANESE. Um russische Zeichen zu aktivieren, müssen Sie sie auf ENGLISH_RUSSIAN umschalten.Erfahren Sie mehr über die Tabelle ENGLISH_RUSSIAN.: (. ) , . , , — - -8, (.
19768-93). -, , , EBCDIC, , ( 127 ) ASCII. , , , ASCII .
Die Standard-LiquidCrystal-Bibliothek (im Lieferumfang der Arduino IDE enthalten) weiß natürlich nichts über die vier Tabellen und muss daher zumindest in dieser Hinsicht begradigt werden. Aber nicht nur: Am Ende wäre es möglich, mit der englischen Sprache zu tun. Das Initialisierungsverfahren ist jedoch beim WS0010 deutlich anders. Wenn es nicht korrigiert wird, zeigt das Display dies bei jedem Start an.Weitere Funktionen, OLED- Winstar , ( , ). , , . , , WEH SPI (, « SPI»),
, , ( 3) —
. : , . , I2C (. ,
).
Aus irgendeinem Grund weisen Winstar-Displays ein großes Defizit an verständlicher Dokumentation auf (wie Sie vielleicht bemerkt haben, ist dies im Allgemeinen ein charakteristisches Merkmal chinesischer Produkte). Es ist erwähnenswert, wo Sie mehr oder weniger vollständige Dokumentation ohne Fehler herunterladen können: hier auf dem LCD (WH1602) mit einem HD44780-Controller, hier auf den OLED-Displays (WEH1602), hier auf dem WS0010-Controller separat (wir werden später darauf verweisen) . Und hier, wenn Sie interessiert sind, gibt es eine detaillierte Beschreibung des HD44780-Controllers in russischer Sprache.Nivellieren der LiquidCrystal-Bibliothek
Zur Steuerung der Kleinbuchstaben des HD44780 und seiner Analoga ist die Standard-LiquidCrystal-Bibliothek, die traditionell in der Arduino IDE aller Versionen enthalten ist, gut geeignet. Um den russischen Text anzuzeigen, gibt es die Version von LiquidCrystalRus , die überraschenderweise in allen modernen Versionen der Arduino IDE gut funktioniert (es heißt, dass der Autor die Konvertierung von UTF-8-Zeichen korrekt angegangen ist). Um sich jedoch an OLED-Anzeigen auf dem WS0010-Controller anzupassen, müssen Sie noch Korrekturen vornehmen. In Zukunft werden wir diese Bibliothek verspotten und sie daher in LiquidCrystalRus_OLED umbenennen, um sie nicht mit der üblichen zu verwechseln. Um die Aufgabe zu vereinfachen, werden die Funktionen nicht umbenannt, da die Initialisierung dieselbe ist wie beim ursprünglichen LiquidCrystalRus.Die Änderungen sind wie folgt:1. SeitDie russisch-englische Tabelle in WS0010 (siehe Seite 9 für das Datenblatt zu WS0010 über den obigen Link) ist die Nummer 2. Um zum Umschalten zu wechseln, müssen Sie im Befehl FUNCTION SET die beiden niedrigstwertigen Bits FT1 und FT0 setzen, um den Status 10 (0x02) festzulegen. (In LCDs mit einer Codetabelle werden diese Bits übrigens überhaupt nicht verwendet). Suchen Sie dazu in der Datei LiquidCrystalRus_OLED.cpp nach der Stelle (Zeile 96 der Datei), an der der Wert der Variablen _displayfunction festgelegt ist . Fügen Sie in beiden Zeilen der Initialisierung (Zeilen 97 und 99) einen Anhang " | = 0x02 " hinzu.2. Als nächstes müssen Sie die Initialisierungsverzögerung nach dem Einschalten beheben . Für HD44780 sollte es nicht länger als 40 ms sein (siehe Dokumentation unter den obigen Links). Die Bibliothek nutzt hierfür die Funktion.delayMicroseconds (50000) (Zeile 120 der Datei LiquidCrystalRus_OLED.cpp ). Für den WS0010-Controller muss die Verzögerung zehnmal länger sein - mindestens 500 ms (siehe die letzte Seite des Datenblattes unter dem obigen Link). Diese Anforderung ist so sorgfältig verborgen (die Dateien mit der englischsprachigen Dokumentation auf Winstar zeigen in genau diesem Teil „die Schrift verloren“ an), dass es den Anschein hat, als hätten bisher nur wenige Menschen darüber nachgedacht. Daher ersetzen wir diese Zeile durch 32 Verzögerungswiederholungen von jeweils 16 ms:for (int i = 0; i <=31; i++) delayMicroseconds(16000);
3. Zusätzlich (siehe auch diese letzte Seite des Datenblattes) müssen Sie nach dieser Verzögerung beim Einschalten des Vierdrahtes fünfmal hintereinander (0x00) einen leeren Befehl senden . Da der Arduino erheblich schneller als der Display-Controller ist, sollten Befehle mit einer Zwischenverzögerung gegeben werden. Sie müssen etwas weiter in den Text der Startfunktion eingefügt werden, wo es speziell um die 4-Bit-Aufnahme geht (Zeile 147 der Datei LiquidCrystalRus_OLED.cpp ).4. Aber das ist nicht das Ende. In der ursprünglichen Tabelle hat ENGLISH_RUSSIAN ein Gradsymbol(Code 0xEF). Die Option wird extrem erfolglos grafisch ausgeführt (zu groß), daher bevorzuge ich die Verwendung eines fetten oberen Punkts (Code 0xDF) - es ist viel mehr wie ein Abschluss im üblichen Stil. Es könnte in Form eines Codes eingegeben werden (besser als das Oktal "\ 337"), aber das Problem besteht darin, die Funktion des Ersetzens von Codes russischer Buchstaben durch Codes in der Zeichengeneratortabelle, dem Autor der Bibliothek, basierend auf der UTF-8-Codierung, zu vereinfachen (siehe vorherigen Artikel ). Es wurde eine Ersetzungsbedingung für jeden Code größer als 0x80 eingeführt ( LiquidCrystalRus :: write- Funktion ). Da unser 0xDF deutlich größer als 0x80 ist, wird bei Angabe des Zeichens "\ 337" in der Codezeile stattdessen ein Leerzeichen angezeigt, da es keinem russischen Buchstaben entspricht.Leider ist die Standardfunktion createChar ()Als ich versuchte, damit mein eigenes Abschlusssymbol zu erstellen, betrat ich die Anzeige in einem völligen Stupor, von dem es nur durch erneutes Laden des Programms entfernt werden konnte. Was ich zusätzlich tun muss und ich werde dankbar sein, wenn mir jemand sagt, was los ist. Daher kann der Zeichengenerator in unseren Funktionen nicht bearbeitet werden, aber wir können das benötigte 0xDF-Zeichen von der Bedingung ausschließen. Ersetzen Sie dazu die vorhandene Bedingung (siehe Text der Schreibfunktion ) durch folgende:if ((value>=0x80)&&(value!=0xdf))
5. Schließlich ist die durchgestrichene Null auf diesem Display nicht so auffällig wie auf grafischen LCD-Bildschirmen. Trotzdem habe ich in derselben Schreibfunktion das Ersetzen des Nullcodes (0x30) durch den Code des Buchstabens „O“ (0x4f) eingeführt. Wer möchte, kann die durchgestrichene Null zurückgeben, indem er einfach die Ersatzzeile löscht oder auskommentiert (Zeile 308 der modifizierten Datei LiquidCrystalRus_OLED.cpp ).Die aktualisierte Bibliothek kann über den Link am Ende des Artikels heruntergeladen werden.Verbindung
Jetzt scheint alles optimiert zu sein, Sie können eine Verbindung herstellen. Die Verbindung des WEH001602BG-Displays (16 Zeichen, Bildschirmlänge 100 mm) mit dem Arduino ist in der folgenden Abbildung dargestellt:
Arduino-Pins, an die die RS-, E-, DB4-DB7-Display-Pins angeschlossen sind, sollten bei der Initialisierung des Displays angezeigt werden:
LiquidCrystalRus OLED1(3, 5, 7, 8, 9, 10);
Falls gewünscht, können Sie zwei oder sogar mehr Displays in jeder Schnittstellenoption (acht- oder vieradrig) anschließen. In diesem Fall können Datenleitungen und RS gemeinsam genutzt werden. Die Wahl zwischen Anzeigen erfolgt in diesem Fall über Klemme E, die für verschiedene Anzeigen mit verschiedenen Arduino-Klemmen verbunden ist (die Verbindungsleitungen der zweiten Anzeige sind im Diagramm grau dargestellt, Klemme E der zweiten Anzeige ist hier mit Pin 6 des Arduino verbunden). In diesem Fall müssen Sie natürlich zwei Kopien der Bibliothek erstellen (z. B. OLED1 und OLED2), in denen alle Ausgänge mit Ausnahme von E gleich sind. Außerdem können die Anzeigen unterschiedliche Konfigurationen und Größen haben (8x2, 16x2, 12x2, 12x4 usw.). .). Dies gilt auch für herkömmliche LCD-Displays des HD44780.Und warum gibt es ein Relais für die Stromversorgung? Der Hauptnachteil des WS0010 ist das Fehlen von Hardware "rezet". In HD44780 kann das eingebaute Rezet gerechtfertigt sein - der Autor hat nicht genug Erfahrung mit LCD-Bildschirmen, um dies sicher zu sagen. Aber Winstar, der versuchte, dem Standard in seiner Entwicklung zu folgen, konnte diese Aufgabe eindeutig nicht bewältigen. Ein Neustart des Controllers ohne Ausschalten der Stromversorgung führt zu Trübungen auf dem Display. Sie können diese nur beseitigen, indem Sie die Leistung des gesamten Stromkreises unter einen Hut bringen und das Display von Grund auf neu initialisieren.Darüber hinaus kann die Anzeige beim Ein- und Ausschalten der Stromversorgung die Leitungen stellenweise verwirren. Die Leute behaupten, dass eine vollständige 8-Bit-Aufnahme (anstelle von 4-Bit) hilft, aber es hat für mich noch schlimmer funktioniert. Sie bestehen auch beharrlich darauf, dass in hypothetischen „neuen Chargen“ all dies bereits behoben wurde, aber es ist kaum zu glauben (über welche Art von „neuen“ Chargen sprechen wir, wenn Winstar seit 2008 OLED-Displays herausbringt und ich Displays von 13 und 14 Jahren hatte freigeben?).Relais und so einstellen, dass die Anzeige beim Neustart des Arduino künstlich zurückgesetzt wird, ohne die Stromversorgung auszuschalten. Dadurch wird der Müll auf dem Bildschirm zuverlässig beseitigt. Die Stromversorgung des Displays (oder der Displays) wird separat über dieses Relais eingeschaltet, das zu Beginn des Einrichtungsvorgangs über den freien Arduino-Pin (in diesem Fall Pin 4) eingeschaltet wird, wenn der Controller bereits stabil arbeitet. Und bevor Sie das Relais einschalten, ist es schön, eine zusätzliche Verzögerung von 1000 ms anzugeben (siehe Skizze unten). Das angegebene Relais EDR202A05 ist ein Reed-Relais, der Wicklungsstrom beträgt 10 mA und wird daher leise vom Arduino-Ausgang gesteuert.Was die Verwechslung zwischen den Leitungen beim Einschalten betrifft, so entlastet dieser Effekt zusätzlich zu den obigen Änderungen im Initialisierungsverfahren die Leistung des gesamten Stromkreises perfekt von einer ausreichend starken (mindestens 1-2 A) externen Quelle mit einer stabilen Spannung unter Last von mindestens 7,5 Volt. Diese Abhängigkeit von der Ernährung ist offensichtlich eine Quelle von Diskrepanzen in vielen Veröffentlichungen, in denen viele Autoren behaupten, dass für sie alles gut funktioniert. In diesem Fall kann das Display (oder die Displays) über den internen Arduino-Stabilisator (Pin 5 V der Platine) oder über einen separaten Stabilisator angeschlossen werden. Hauptsache, die Eingangsspannung des Stabilisators sollte unabhängig vom Stoßstoß zum Zeitpunkt des Einschaltens stabil genug sein.Überprüfen Sie
Zur Überprüfung habe ich eine Demoskizze gesendet, Proba_Rus_Liquid_Crystal_OLED , die eine Kalenderuhranzeige mit einem externen Temperatursensor simuliert:Beispiel WEH1602 anzeigen#include <LiquidCrystalRus_OLED.h>
LiquidCrystalRus OLED1(3, 5, 7, 8, 9, 10);
#define RelayPin 4
void setup() {
delay (1000);
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, HIGH);
delay (500);
OLED1.begin(16,2);
OLED1.clear();
OLED1.setCursor(0,0);
OLED1.print("-22,3\337C");
OLED1.setCursor(11,0);
OLED1.print("10:22");
OLED1.setCursor(0,1);
OLED1.print("16.01.17 ");
OLED1.setCursor(13,0);
OLED1.blink();
delay(1000);
}
void loop() {
}
Alle oben genannten charakteristischen Änderungen in der Bibliothek werden hier angewendet. Das Programm zeigt auch, wie der Doppelpunkt mit der Funktion blink () in Stunden: Minuten blinkt . Beachten Sie, dass eine neue Ausgabe an derselben Position das Blinken der Vertrautheit zerstört. Wenn Sie sie aktualisieren, müssen Sie sie erneut fortsetzen, nachdem Sie zuvor den unsichtbaren Cursor auf dieselbe Position 13 in der Nulllinie gesetzt haben. Mit einer echten Uhrenaktualisierung ist es möglicherweise einfacher, nur die Zahlen an den Positionen 11-12 und 14-15 zu aktualisieren, wobei der blinkende Doppelpunkt intakt bleibt.Die Ergebnisse der Beispielausgabe sind auf dem Foto dargestellt:Es ist zu beachten, dass das Foto (in diesem Fall) nicht das Leuchten des grünen OLED-Displays vermittelt. Tatsächlich ist es eine tiefgrüne Farbe mit einer Wellenlänge, die kürzer als die üblichen 568 nm in LED-Anzeigen (Siebensegmente oder Matrix) ist. Warum scheinen letztere vor dem Hintergrund der OLED "verblasst" zu sein, und ihre kombinierte Anwendung ist schwierig.Der WS0010 verfügt über einen grafischen Modus, und die grafischen OLED-Anzeigen von Winstar (z. B. WEG010016) verfügen ebenfalls über diesen Controller. Jemand bemerkte, dass sie sogar die gleiche Matrix haben. Meiner Meinung nach ist der Versuch, den Grafikmodus für eine Textzeilenanzeige zu verwenden, ziemlich sinnlos: Die Zeilenanzeige verfügt über Hardware-festgelegte dunkle Räume zwischen Zeichen und Linien, die das Bild äußerst unästhetisch machen (siehe zahlreiche Beispiele für solche Versuche).Ein letzter Hinweis: zur Haltbarkeit von Winstar OLEDs. In Datenblättern wird die Zeit mit 100.000 Stunden angegeben, dh mit 11 Jahren. Trotzdem hat eines der Displays des 13. Erscheinungsjahres (gelbes Leuchten) bis zum heutigen Moment (Winter des 16.) in mir stark an Helligkeit verloren. Es ist lustig, dass der Rest der gleichen (grün) und späteren (gelb und grün 14 Jahre alt) Partei keine Anzeichen von Sterben zeigt. Daher nehme ich mit Sicherheit nicht an, etwas zu sagen, aber für den Fall rate ich Ihnen, die Displays nicht in die Platine zu löten, sondern an den Steckverbindern zu installieren, damit sie im Falle eines Problems problemlos ausgetauscht werden können.Sie können das Archiv mit einer kostenlosen Bibliothek und einem Beispiel von hier herunterladen .UPD: Es gab eine Lösung für das Problem eines stabilen Starts ohne Manipulation der Leistung:https://geektimes.ru/post/287234/