Les affichages de ligne (ou de texte) sont destinés à la fourniture d'informations textuelles sous forme de lignes. Ils sont de plusieurs types (tout d'abord, LCD ou OLED auto-lumineux), et généralement dans leur marquage, il y a des numéros 1202, 1602, 1204 ou similaires, indiquant le nombre de lignes (dans les exemples 2 ou 4) et les caractères de chaque ligne (12 et 16) . Il existe des affichages sur une seule ligne de ce type, mais dans la présentation suivante, nous nous concentrons sur les affichages sur deux lignes les plus couramment utilisés.La majorité de ces écrans sont compatibles avec le contrôleur HD44780 (Hitachi). Les présentoirs les plus populaires (au moins dans notre pays) de cette variété sont produits par Winstar. De plus, les variétés LCD (le nom commence par les lettres WH, par exemple WH1602) sont compatibles individuellement avec le système de commande HD44780, et les types OLED (le nom commence par WEH, par exemple WEH001602) ont un contrôleur WS0010 amélioré. Malheureusement, ou heureusement, nous allons traiter maintenant.Contrairement aux affichages graphiques que nous avons examinés précédemment sur la base du contrôleur ks0108, le générateur de caractères dans les affichages en minuscules est intégré. De plus, pour nous, la principale différence entre le WS0010 et le HD44780 standard est la présence de plusieurs (quatre) tables de codes pour l'affichage de texte multilingue. Le HD44780 n'a qu'une seule table de ce type, c'est pourquoi les entreprises doivent vendre un type d'affichage distinct dans chaque région. Les écrans OLED basés sur WS0010 ne nécessitent pas de pannes régionales, ce qui est beaucoup plus pratique. Mais pas à l'utilisateur: par défaut, la table ENGLISH_JAPANESE est activée dans les écrans WEH, et pour activer les caractères russes, vous devez la basculer sur ENGLISH_RUSSIAN.En savoir plus sur la table ENGLISH_RUSSIAN.: (. ) , . , , — - -8, (.
19768-93). -, , , EBCDIC, , ( 127 ) ASCII. , , , ASCII .
La bibliothèque LiquidCrystal standard (fournie avec l'IDE Arduino), bien sûr, ne sait rien des quatre tables et nécessite donc un redressement, au moins à cet égard. Mais pas seulement: au final, ce serait possible avec la langue anglaise. Cependant, la procédure d'initialisation est sensiblement différente pour le WS0010, et si elle n'est pas corrigée, l'écran affichera cela à chaque démarrage.Autres fonctionnalités, OLED- Winstar , ( , ). , , . , , WEH SPI (, « SPI»),
, , ( 3) —
. : , . , I2C (. ,
).
Pour une raison quelconque, les écrans Winstar ont un grand déficit en termes de documentation intelligible (comme vous l'avez peut-être remarqué, c'est généralement une caractéristique des produits chinois). Il convient de préciser où vous pouvez télécharger une documentation plus ou moins complète sans erreur: ici sur l'écran LCD (WH1602) avec un contrôleur HD44780, ici sur les écrans OLED (WEH1602), ici sur le contrôleur WS0010 séparément (nous y ferons référence plus tard) . Et ici, si vous êtes intéressé, il y a une description détaillée du contrôleur HD44780 en russe.Niveler la bibliothèque LiquidCrystal
Pour contrôler les affichages en minuscules sur le HD44780 et ses analogues, la bibliothèque LiquidCrystal standard, qui est traditionnellement incluse dans l'IDE Arduino de toutes les versions, est tout à fait appropriée. Pour afficher le texte russe, il y a sa version de LiquidCrystalRus , qui fonctionne étonnamment bien dans toutes les versions modernes de l'IDE Arduino (il dit que l'auteur a correctement abordé la conversion des caractères UTF-8). Mais pour s'adapter aux écrans OLED sur le contrôleur WS0010, vous devez toujours apporter des corrections. À l'avenir, nous nous moquerons de cette bibliothèque et donc nous la renommerons LiquidCrystalRus_OLED, afin de ne pas la confondre avec celle habituelle. Pour simplifier la tâche, nous ne renommerons pas les fonctions, car l'initialisation sera la même que pour le LiquidCrystalRus d'origine.Les changements sont les suivants:1. Depuisle tableau russe-anglais dans WS0010 (voir page 9 pour la fiche technique sur WS0010 en utilisant le lien ci-dessus) est le numéro 2, puis pour y basculer, vous devez définir les deux bits les moins significatifs FT1 et FT0 dans la commande FUNCTION SET pour le mettre à l'état 10 (0x02). (Dans les écrans LCD avec une table de codes, ces bits, en passant, ne sont pas du tout utilisés). Pour ce faire, dans le fichier LiquidCrystalRus_OLED.cpp , recherchez l' emplacement (ligne 96 du fichier) où la valeur de la variable _displayfunction est définie . Dans les deux lignes de son initialisation (lignes 97 et 99), ajoutez un ajout " | = 0x02 ".2. Ensuite, vous devez corriger le délai d'initialisation après la mise sous tension. Pour HD44780, elle ne devrait pas dépasser 40 ms (voir la documentation sur les liens ci-dessus). La bibliothèque utilise la fonction pour cela.delayMicroseconds (50000) (ligne 120 du fichier LiquidCrystalRus_OLED.cpp ). Pour le contrôleur WS0010, vous devez avoir un retard dix fois plus long - au moins 500 ms (voir la dernière page de la fiche technique sur le lien ci-dessus). Cette exigence est si soigneusement cachée (les fichiers avec la documentation en anglais sur Winstar affichent «perdu la police» dans cette partie précisément), qu'il semble que peu de gens y aient pensé jusqu'à présent. Par conséquent, nous remplaçons cette ligne par 32 répétitions de retard de 16 ms chacune:for (int i = 0; i <=31; i++) delayMicroseconds(16000);
3. En plus de cela (voir également cette dernière page de la fiche technique), après ce délai, lors de l'activation de quatre fils, vous devez envoyer une commande vide cinq fois de suite (0x00). Étant donné que l'Arduino est nettement plus rapide que le contrôleur d'affichage, les commandes doivent être données avec un retard intermédiaire. Ils doivent être insérés un peu plus loin dans le texte de la fonction begin, où il s'agit spécifiquement de l'inclusion 4 bits (ligne 147 du fichier LiquidCrystalRus_OLED.cpp ).4. Mais ce n'est pas la fin. La table originale ENGLISH_RUSSIAN a une icône de degré(code 0xEF). L'option est extrêmement mal exécutée graphiquement (trop grande), donc je préfère utiliser un point supérieur en gras (code 0xDF) - cela ressemble beaucoup plus à un degré dans le style habituel. Il pourrait être entré sous la forme d'un code (meilleur que l'octal "\ 337"), mais le problème est - en essayant de simplifier la fonction de remplacement des codes des lettres russes par des codes dans la table du générateur de caractères, l'auteur de la bibliothèque, basé sur l'encodage UTF-8 (voir l' article précédent ), introduit une condition de remplacement pour tout code supérieur à 0x80 (fonction LiquidCrystalRus :: write ). Puisque notre 0xDF est clairement supérieur à 0x80, lorsque vous spécifiez le caractère "\ 337" dans la ligne de code, un espace vide sera affiché à la place, car il ne correspond à aucune lettre russe.Malheureusement, la fonction standard createChar ()lorsque j'ai essayé de l'utiliser pour créer ma propre icône de diplôme, je suis entré dans l'affichage dans une stupeur complète, dont il ne pouvait être supprimé qu'en rechargeant le programme. Ce que je dois faire en plus et je serai reconnaissant si quelqu'un me dit quel est le problème. Le générateur de caractères ne peut donc pas être modifié dans nos capacités, mais nous pouvons exclure le caractère 0xDF dont nous avons besoin de la condition. Pour ce faire, remplacez la condition existante (voir le texte de la fonction d' écriture ) par ce qui suit:if ((value>=0x80)&&(value!=0xdf))
5. Enfin, le zéro barré sur cet écran n'est pas aussi frappant que sur les écrans LCD graphiques. Néanmoins, dans la même fonction d' écriture , j'ai introduit le remplacement du code zéro (0x30) par le code de la lettre «O» (0x4f). Ceux qui le souhaitent peuvent retourner le zéro barré en supprimant ou en commentant simplement la ligne de remplacement (ligne 308 du fichier LiquidCrystalRus_OLED.cpp modifié ).La bibliothèque mise à jour peut être téléchargée à partir du lien à la fin de l'article.Connexion
Maintenant, tout semble être modifié, vous pouvez vous connecter. La connexion de l'écran WEH001602BG (16 caractères, longueur d'écran 100 mm) à l'Arduino est illustrée dans la figure suivante:
Les broches Arduino auxquelles les broches d'affichage RS, E, DB4-DB7 sont connectées doivent être indiquées lors de l'initialisation de l'affichage:
LiquidCrystalRus OLED1(3, 5, 7, 8, 9, 10);
Si vous le souhaitez, vous pouvez connecter deux ou plusieurs écrans dans n'importe quelle option d'interface (huit ou quatre fils). Dans ce cas, les lignes de données et RS peuvent être partagées. Le choix entre les écrans dans ce cas se fait via la borne E, qui pour différents écrans est connectée à différentes bornes Arduino (les lignes de connexion du deuxième écran sont représentées en gris sur le schéma, la borne E du deuxième écran est ici connectée à la broche 6 de l'Arduino). Bien sûr, dans ce cas, vous devez créer deux copies de la bibliothèque (par exemple, OLED1 et OLED2), dans lesquelles toutes les sorties sont les mêmes, sauf pour E. De plus, les écrans peuvent être de différentes configurations et tailles (8x2, 16x2, 12x2, 12x4, etc. .). Cela s'applique également aux écrans LCD conventionnels du HD44780.Et pourquoi y a-t-il un relais de puissance? Le principal inconvénient du WS0010 est le manque de matériel "rezet". Dans HD44780, le rezet intégré peut être justifié - l'auteur n'a pas suffisamment d'expérience avec les écrans LCD pour le dire avec certitude. Mais Winstar, essayant de suivre la norme dans son développement, ne pouvait clairement pas faire face à cette tâche. Le redémarrage du contrôleur sans couper l'alimentation entraîne l'apparition de toute turbidité sur l'écran, et vous ne pouvez vous en débarrasser qu'en jonglant avec la puissance de l'ensemble du circuit et en initialisant l'affichage à partir de zéro.De plus, l'affichage lors de la mise hors / sous tension peut perturber les lignes par endroits. Les gens affirment qu'une inclusion complète sur 8 bits (au lieu de 4 bits) aide, mais cela a encore pire fonctionné pour moi. Ils insistent également sur le fait que dans de "nouveaux lots" hypothétiques, tout cela a déjà été corrigé, mais il est difficile de croire (de quel type de "nouveaux" lots parlons-nous lorsque Winstar a publié des écrans OLED depuis 2008 , et j'avais des écrans de 13 et 14 ans libération?).Relayer et régler pour réinitialiser artificiellement l'affichage lors du redémarrage de l'Arduino sans couper l'alimentation. Cela élimine de manière fiable les déchets sur l'écran. L'alimentation du ou des écrans est mise sous tension séparément via ce relais, qui est allumé à partir de la broche Arduino libre (dans ce cas, la broche 4) au début de la procédure de configuration, lorsque le contrôleur fonctionne déjà de manière stable. Et avant d'activer le relais, il est agréable de donner un délai supplémentaire de 1000 ms (voir croquis ci-dessous). Le relais indiqué EDR202A05 est un relais reed, le courant d'enroulement est de 10 mA, il est donc contrôlé silencieusement à partir de la sortie Arduino.Quant à la confusion entre les lignes une fois allumées, en plus des changements ci-dessus dans la procédure d'initialisation, cet effet libère parfaitement la puissance de tout le circuit d'une source externe suffisamment puissante (au moins 1-2 A) avec une tension stable sous charge d'au moins 7,5 volt. Cette dépendance à la nutrition est, évidemment, une source de divergences dans de nombreuses publications, où de nombreux auteurs affirment que tout fonctionne bien pour eux. Dans ce cas, l'écran (ou les écrans) peut être connecté via le stabilisateur interne Arduino (broche 5V de la carte), ou via un stabilisateur séparé, mais l'essentiel est que la tension d'entrée du stabilisateur doit être suffisamment stable quelle que soit la surtension au moment de la mise sous tension.Vérifier
Pour vérifier, j'ai envoyé un croquis de démonstration, Proba_Rus_Liquid_Crystal_OLED , simulant un affichage de l'horloge du calendrier avec un capteur de température externe:Exemple d'affichage WEH1602#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() {
}
Tous les changements caractéristiques de la bibliothèque mentionnés ci-dessus sont appliqués ici. Le programme montre également comment faire clignoter le côlon en heures: minutes en utilisant la fonction blink () . Notez qu'une nouvelle sortie dans la même position détruit le clignotement de familiarité, et lors de la mise à jour, vous devez la reprendre à nouveau, après avoir précédemment placé le curseur invisible à la même position 13 sur la ligne zéro. Avec une véritable mise à jour de l'horloge, il peut être plus facile de ne mettre à jour que les nombres aux positions 11-12 et 14-15, en laissant intact le côlon clignotant.Les résultats de la sortie de l'exemple sont montrés sur la photo:Il convient de noter que la photo ne transmet pas la lueur de l'écran OLED vert (dans ce cas). En fait, c'est une couleur vert foncé, avec une longueur d'onde plus courte que les 568 nm habituels dans les écrans LED (sept segments ou matrice). Pourquoi ces derniers dans le contexte de l'OLED semblent-ils "fanés" et leur application combinée est difficile.Le WS0010 a un mode graphique et les écrans OLED graphiques Winstar (tels que WEG010016) ont également ce contrôleur. Quelqu'un a remarqué qu'ils avaient même la même matrice. À mon avis, essayer d'appliquer un mode graphique sur un affichage de ligne de texte est plutôt inutile: l'affichage de ligne a des espaces sombres définis par le matériel entre les caractères et les lignes qui rendent l'image extrêmement inesthétique (voir de nombreux exemples de telles tentatives).Une dernière remarque: sur la durabilité des OLED Winstar. Dans les fiches techniques, le temps est indiqué 100 000 heures, soit 11 ans. Néanmoins, l'un des affichages de la 13e année de libération (lueur jaune) à l'instant présent (hiver du 16e) a fortement perdu en moi la luminosité. C'est drôle que le reste de la même fête (verte) et plus tard (jaune et verte de 14 ans) ne montre aucun signe de mort. Par conséquent, avec certitude, je ne prétends rien dire, mais juste au cas où, je vous conseille de ne pas souder les écrans dans la carte, mais de les installer sur les connecteurs, de sorte que dans le cas où ils pourraient être remplacés sans problème.Vous pouvez télécharger l'archive avec une bibliothèque gratuite et un exemple d'ici .UPD: il y avait une solution au problème d'un démarrage stable sans manipuler la puissance:https://geektimes.ru/post/287234/