Parfois, il est nécessaire de faire des entrées. Ce billet de blog est destiné à montrer comment utiliser l’écran tactile de la ArduiTouch (ArduiTouch) et un ESP32 ESP32 un clavier d’entrée simple.
Le clavier a 41 touches et trois niveaux (lowercase, uppercase, et les nombres et les caractères). Au-dessus des boutons se trouve la ligne d’entrée. En plus de la clé de l’espace, la ligne inférieure contient une clé pour passer aux nombres et aux caractères, un bouton pour basculer entre les lettres supérieures et les lettres minuscules, une clé de suppression et la clé Enter pour sortir de l’entrée. Cette fonction clavier fera également partie d’une bibliothèque qui vous permet de créer une interface graphique confortable avec l’écran tactile TFT.
Code:
#include <Spi.H (en)> #include "Adafruit_GFX.h" Bibliothèque graphique #include "Adafruit_ILI9341.h" Pilote d’affichage #include <XPT2046_Touchscreen.H (en)> Pilote d’écran tactile #include "KbdBold12pt7b.h" police étendue avec des umlauts allemands et icônes bouton spécial pour le fonctionnement #define _debug 1 Active ou éteint les messages sur le moniteur de série Épingles pour l’affichage et l’écran tactile #define TFT_CS 5 #define TFT_DC 4 #define TFT_MOSI 23 #define TFT_CLK 18 #define TFT_RST 22 #define TFT_MISO 19 #define TFT_LED 15 #define HAVE_TOUCHPAD #define TOUCH_CS 14 #define TOUCH_IRQ 2 Paramètres pour l’écran tactile #define MINPRESSURE 10 #define MAXPRESSURE 2000 #define TS_MINX 370 #define TS_MINY 470 #define TS_MAXX 3700 #define TS_MAXY 3600 Définition des couleurs #define ILI9341_LIGHT_GRAY 0B11010101010100110101010 Affichage pour l’affichage et l’écran tactile Adafruit_ILI9341 Tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST); XPT2046_Touchscreen Toucher(TOUCH_CS, TOUCH_IRQ); /* Mise en page du clavier Niveau 0 - lowercase - Niveau 1 - majuscules Niveau 2 - Nombres et caractères * L’ensemble de caractères spécial contient les caractères supplémentaires suivants : 0x18 24 Flèche vers la droite 0x19 25 flèche vers la gauche 0x1A 26 Up Arrow 0x1B 27 Flèche farcie 0x1C 28 Entrez la clé 0x1D 29 Lettres de commutation 0x1E 30 chiffres de commutation Bouton 0x1F 31 Supprimer et à l’extrémité supérieure 0x7F 127 0x80 128 0x81 129 0x82 130 0x83 131 0x84 132 0x85 133 0x86 134 */ Const Char Char Clés[3][42] = { {'a','b','c','d','e','f', 'g','h','i','j','k','l', 'm','n','o','p','q','r', 's','t','u','v','w','x', 'y','z',130,131,132,133, ',','.','-','_','/','@', 30,26,' ',' ',31,28}, {'A','B','C','D','E','F', 'G','H','Je','J','K','L', 'M','N','O','P','Q','R', 'S','T','U','V','W','X', 'Y','Z',127,128,129,133, ',','.','-','_','/','@', 30,27,' ',' ',31,28}, {'0','1','2','3','4','5', '6','7','8','9',';',':', '!','?','#',34,39,92, '(','[','{','}',']',')', '+','*','=','$','%','@', '|',134,'^','&','<','>', 29,26,' ',' ',31,28} }; Variable globale uint8_t Niveau = 0; niveau actuel Bool Cliqué = Faux; Toucher détecté Bool Ko; Drapeau lorsque le clavier est actif String Texte = ""; Texte d’entrée TS_Point P; Structure de point pour écran tactile Vide Configuration() { #ifdef _debug Série.Commencer(115200); #endif pinMode(TFT_LED, Sortie); digitalWrite (en)(TFT_LED, Haute); Afficher l’éclairage sur Démarrer l’affichage et touchscrteen Tft.Commencer(); Toucher.Commencer(); #ifdef _debug Série.Imprimer("tftx"); Série.Imprimer(Tft.Largeur()); Série.Imprimer("tfty"); Série.println(Tft.Hauteur()); #endif Clavier de sortie draw_screen(); Ko = Vrai; } Vide Boucle() { uint8_t R,C,Index; Char Char Ch; Vérifier les retours d’écran tactile vrai lorsque l’écran est touché la variable mondiale p contient la position Si (Ko && Touch_Event()) { Si (!Cliqué) { nous n’avons pas encore détecté de contact donc nous déterminons le bouton qui a été touché Si (P.X>40) { seulement en dessous de la ligne d’entrée nous déterminons la ligne et la colonne de la clé R = (P.X-40) / 40; C = (P.Y (Y)) / 40; Calcul de l’index dans le tableau du clavier Index = R*6+C; Valeur du bouton touché Ch = Clés[Niveau][Index]; Si (Ch > 31) { plus de 31 caractères valides nous l’attachons au texte d’entrée Texte = Texte + Ch; et la sortie du nouveau texte draw_text(); } Autre { un bouton de contrôle a été touché Interrupteur (Ch) { Cas 26: Niveau = 1; Sur les majuscules draw_screen(); Pause; Cas 27: Niveau = 0; Du cas supérieur à la caisse inférieure draw_screen(); Pause; Cas 29: Niveau = 0; De Ziggern à lowercase draw_screen(); Pause; Cas 30: Niveau = 2; Sur les chiffres draw_screen(); Pause; Cas 31: Texte.Retirer(Texte.Longueur()-1); Supprimer le dernier caractère draw_text(); Pause; Cas 28: draw_result(Texte); Arrêtez de taper Pause; } } } Cliqué = Vrai; cliqué est réglé pour vrai de sorte qu’avec une touche prolongée le bouton n’est déclenché qu’une seule fois } } Autre { Cliqué = Faux; Le toucher a été terminé, nous sommes prêts pour le bouton suivant } } Écran tactile est interrogé la variable mondiale p obtient la position la valeur de retour est vraie lorsque l’écran tactile est touché. Attention due à l’orientation de l’écran sont x et y échangé! Bool Touch_Event() { P = Toucher.getPoint (en)(); Retard(1); P.X = Carte(P.X, TS_MINX, TS_MAXX, 0, 320); P.Y (Y) = Carte(P.Y (Y), TS_MINY, TS_MAXY, 240, 0); Si (P.Z > MINPRESSURE) Retour Vrai; Retour Faux; } Fin de l’entrée supprimer l’écran et afficher le texte d’entrée Vide draw_result( String Res) { Ko = Faux; #ifdef _debug Sortie du texte d’entrée au moniteur de série Les Umlauts doivent être convertis en UTF8 Série.println(deKeyboard(Res)); #endif Tft.fillScreen (en)(ILI9341_BLACK); Tft.setTextColor(ILI9341_WHITE, ILI9341_BLUE); Tft.setCursor(3,160); Tft.Imprimer(Res); } Texte d’entrée Redisplay Vide draw_text() { uint16_t W,H (en); int16_t x1,y1 (en); nous devons d’abord supprimer l’ancien texte sur l’écran Tft.getTextBounds (en)(Texte, 0, 0, &x1, &y1 (en), &W, &H (en)); Tft.fillRect(1,1,238,38,ILI9341_LIGHT_GRAY); Tft.setCursor(3,28); Sortie du nouveau texte Tft.Imprimer(Texte); sortie curseur bleu Si (Texte.Longueur() > 0) { Tft.fillRect(7+W,10,3,20,ILI9341_BLUE); } Autre { Tft.fillRect(7,10,3,20,ILI9341_BLUE); } } Afficher le clavier Vide draw_screen() { uint8_t Ix = 0; uint16_t W,H (en); int16_t x1,y1 (en); Char Char Tmp[2]; Supprimer l’affichage et afficher le texte d’entrée Tft.fillScreen (en)(ILI9341_BLACK); Tft.setTextColor(ILI9341_BLACK, ILI9341_LIGHT_GRAY); Tft.setFont(&KbdBold12pt7b); draw_text(); Pour (uint8_t Ⅰ. = 1; Ⅰ.<8; Ⅰ.++) { Pour (uint8_t J = 0; J<6; J++) { Si ((Ⅰ.==7) && ((J==2) || (J == 3))) { Si (J==2) { Cas spécial pour le bouton espace Tft.fillRoundRect(J*40+1,Ⅰ.*40+1,78,38,9,ILI9341_LIGHT_GRAY); Tft.drawRoundRect(J*40+1,Ⅰ.*40+1,78,38,9,ILI9341_BLUE); Tft.drawRoundRect(J*40+2,Ⅰ.*40+2,76,36,7,ILI9341_BLUE); } } Autre { Afficher les boutons normaux Tft.fillRoundRect(J*40+1,Ⅰ.*40+1,38,38,9,ILI9341_LIGHT_GRAY); Tft.drawRoundRect(J*40+1,Ⅰ.*40+1,38,38,9,ILI9341_BLUE); Tft.drawRoundRect(J*40+2,Ⅰ.*40+2,36,36,7,ILI9341_BLUE); Afficher la valeur clé centrée Ix = (Ⅰ.-1)*6+J; Si (Ix < 42) { Tmp[0] = Clés[Niveau][Ix]; Tmp[1] = 0; Tft.getTextBounds (en)(Tmp, 0, 0, &x1, &y1 (en), &W, &H (en)); Tft.setCursor(J*40+20-W/2,Ⅰ.*40+20+H (en)/2); Tft.Imprimer(Tmp); } } } } } Convertir une chaîne UTF8 en code clavier 8 bits String àKeyboard(String Texte) { String Res = ""; uint8_t Ⅰ. = 0; Char Char C; Tandis que (Ⅰ.<Texte.Longueur()) { C=Texte[Ⅰ.]; Si (C==195) { UTF8 Caractère Umlauts Ⅰ.++; Interrupteur (Texte[Ⅰ.]) { Cas 164: C=130; Pause; Cas 182: C=130; Pause; Cas 188: C=130; Pause; Cas 159: C=133; Pause; Cas 132: C=127; Pause; Cas 150: C=128; Pause; Cas 156: C=129; Pause; Par défaut: C=0; } } Autre Si (C == 194) { Symbole de degré de caractère d’UTF8 Ⅰ.++; Si (Texte[Ⅰ.] == 176) C=134; Autre C=0; } Autre Si (C > 128) { caractères normaux restent inchangés C=0; } Si (C>0) Res.Concat(C); Ⅰ++; } Retour Res; } Eingabetext von8-Bit Keyboardcode nach UTF8 wandeln String deKeyboard(String Texte) { String Res = ""; char C; Pour (uint8_t Ⅰ=0; Ⅰ<Texte.Longueur(); Ⅰ++) { C = Texte[Ⅰ]; Si (C > 126){ wir haben Sonderzeichen Si (C==134) { Res.Concat("°"); } Autre { Interrupteur (C) { Cas 130: Res.Concat(""); Pause; Cas 131: Res.Concat(""); Pause; Cas 132: Res.Concat("ô"); Pause; Cas 133: Res.Concat(""); Pause; Cas 127: Res.Concat(""); Pause; Cas 128: Res.Concat(""); Pause; Cas 129: Res.Concat(""); Pause; } } } Autre { normales Zeichen Res.Concat(C); } } Retour Res; }
Der Code ist ausfàhrlich kommentiert. Er sollte eine Basis f’r eigene Experimente darstellen.
Und hier noch der Font:
Einfach als KbdBold12pt7b.h Datei in den selben Ordner wie den Sketch abspeichern.
Const uint8_t KbdBold12pt7bBitmaps[] PROGMEM = { 0x10, 0x03, 0x00, 0x70, 0x0F, 0xff, 0xff, 0xF7, 0x00, 0x30, 0x01 (en), 0x00, 0x00, 0x80, 0x0C, 0x00, 0xEF, 0xff, 0xff, 0xF0, 0x0E, 0x00, 0xC0, 0x08, 0x02, 0x00, 0x38, 0x03, 0x60, 0x31, 0x83, 0x06, 0x30, 0x1B, 0x00, 0x7F, 0x1F, 0xF8, 0xF8, 0xC6, 0x06, 0x30, 0x31, 0x81, 0x8C, 0x0C, 0x60, 0x63, 0x03, 0xF8, 0x1F, 0xC0, 0x00, 0x02, 0x00, 0x38, 0x03, 0xE0, 0x3f, 0x83, 0xFE (en), 0x3f, 0xFB, 0xff, 0xff, 0xff, 0xff, 0xF8, 0xFE (en), 0x07, 0xF0, 0x3f, 0x81, 0xFC (en), 0x0F, 0xE0, 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x62, 0x00, 0xCC, 0x01 (en), 0xB8 (en), 0x03, 0xff, 0xff, 0xff, 0xFD, 0xC0, 0x01 (en), 0x80, 0x01 (en), 0x00, 0x00, 0x10, 0xE0, 0x87, 0x1E, 0x38, 0xE3, 0x6D, 0x94, 0x6D, 0xB6 (en), 0xCD (en), 0xB6 (en), 0xD9, 0xB6 (en), 0x1B, 0x36, 0xC6, 0x37, 0x98, 0xC6, 0xE3, 0x18, 0xDC (en), 0x63, 0xFB, 0xCC, 0x7F, 0x6D, 0x8C, 0x6D, 0xB1 (en), 0x8D, 0xB6 (en), 0xF1, 0xB6 (en), 0xDE, 0x36, 0xDB (en), 0xC6, 0xF1, 0xD8, 0xDC (en), 0x10, 0x00, 0x30, 0x22, 0x3C, 0x33, 0xB3 (en), 0x3B, 0x79 (en), 0xBD (en), 0xBC (en anglais), 0xDE, 0xD8, 0x63, 0x0C, 0x31, 0x86, 0x18, 0xC3, 0x18, 0x63, 0x18, 0x31, 0x8C, 0x19, 0x86, 0x0C, 0xC3, 0x06, 0xC1, 0x83, 0x60, 0x01 (en), 0xB0, 0x00, 0xD8, 0x30, 0x6F, 0x98, 0x37, 0xC0, 0x07, 0xff, 0xC3, 0xff, 0xF1, 0x80, 0x0C, 0xC6, 0x33, 0x60, 0xD8, 0xF0, 0x1C, 0x3C, 0x07, 0x0D (0x0D), 0x83, 0x63, 0x31, 0x8C, 0xC6, 0x00, 0x30, 0xff, 0xFC (en), 0x1F, 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0x66, 0x60, 0xff, 0xF0, 0xF3, 0xFC (en), 0xff, 0x3f, 0xCF, 0x61, 0x98, 0x60, 0x0E, 0x70, 0x73, 0x83, 0x18, 0xff, 0xF7, 0xff, 0xBF, 0xFC (en), 0x73, 0x83, 0x18, 0x18, 0xC7, 0xff, 0xBF, 0xFD, 0xff, 0xE3, 0x18, 0x39, 0xC1, 0xCE, 0x0E, 0x70, 0x02, 0x00, 0x7E, 0x0F, 0xF8, 0x7F, 0xE7, 0xAF, 0xB9 (en), 0x3D, 0xC8, 0x0F, 0x40, 0x3f, 0x00, 0xff, 0x00, 0xFC (en), 0x05, 0xff, 0x27, 0xF9, 0x3f, 0xEB, 0xEF, 0xFE (en), 0x3f, 0xE0, 0x7C, 0x00, 0x80, 0x04, 0x00, 0x3C, 0x06, 0x0F, 0xC1, 0x81, 0xFC (en), 0x30, 0x73, 0x8C, 0x0C, 0x31, 0x81, 0xCE, 0x60, 0x1F, 0xCC, 0x03, 0xF3, 0x00, 0x3C, 0x67, 0x80, 0x19, 0xF8, 0x02, 0x7F, 0x80, 0xCE, 0x70, 0x11, 0x86, 0x06, 0x39, 0xC1, 0x87, 0xF8, 0x30, 0x7E, 0x0C, 0x07, 0x80, 0x07, 0x80, 0x1F, 0xC0, 0x3f, 0xE0, 0x3C, 0xE0, 0x3C, 0xE0, 0x3E, 0xE0, 0x0F, 0xC0, 0x07, 0x00, 0x3f, 0x8C, 0x7F, 0xCC, 0xF1, 0xFC (en), 0xF0, 0xF8, 0xF0, 0x78, 0xF8, 0xF8, 0x7F, 0xFC (en), 0x3f, 0xDE, 0x1F, 0x8E, 0xff, 0xff, 0x66, 0x0C, 0x73, 0x8E, 0x71 (en), 0xC7, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x1C, 0x71 (en), 0xC3, 0x8E, 0x18, 0x70, 0xC3, 0x87, 0x1C, 0x38, 0xE3, 0x87, 0x1C, 0x71 (en), 0xC7, 0x1C, 0x71 (en), 0xCE, 0x38, 0xE7, 0x1C, 0x63, 0x80, 0x10, 0x23, 0x5F, 0xF3, 0x87, 0x1B, 0x14, 0x0E, 0x01 (en), 0xC0, 0x38, 0x07, 0x0F, 0xff, 0xff, 0xff, 0xF8, 0x70, 0x0E, 0x01 (en), 0xC0, 0x38, 0x00, 0xff, 0xF3, 0x36, 0xC0, 0xff, 0xff, 0xC0, 0xff, 0xF0, 0x0C, 0x30, 0x86, 0x18, 0x61, 0x0C, 0x30, 0xC2, 0x18, 0x61, 0x84, 0x30, 0xC0, 0x1F, 0x83, 0xFC (en), 0x7F, 0xE7, 0x9E, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xF7, 0x9E, 0x7F, 0xE3, 0xFC (en), 0x0F, 0x00, 0x06, 0x1C, 0x7F, 0xff, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x1F, 0x83, 0xFC (en), 0x7F, 0xEF, 0x9F, 0xF0, 0xff, 0x0F, 0x00, 0xF0, 0x0F, 0x01 (en), 0xE0, 0x3C, 0x0F, 0x81, 0xE0, 0x3C, 0x03, 0x80, 0x7F, 0xF7, 0xff, 0x7F, 0xF0, 0x1F, 0x07, 0xFC (en), 0xff, 0xEF, 0x1E, 0xF1, 0xE0, 0x1E, 0x03, 0xC0, 0x78, 0x07, 0xC0, 0x1E, 0x00, 0xF0, 0x0F, 0xF0, 0xff, 0x1F, 0x7F, 0xE7, 0xFC (en), 0x1F, 0x80, 0x03, 0xC0, 0xF8, 0x1F, 0x07, 0xE1, 0xBC (en anglais), 0x27, 0x8C, 0xF3, 0x1E, 0x63, 0xD8, 0x7B, 0xff, 0xff, 0xff, 0xFE (en), 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x3f, 0xE7, 0xFE (en), 0x7F, 0xE7, 0x00, 0x60, 0x06, 0xF8, 0x7F, 0xCF, 0xFE (en), 0xF1, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xFE (en), 0x1E, 0xff, 0xE7, 0xFC (en), 0x3f, 0x00, 0x0F, 0x83, 0xFC (en), 0x7F, 0xE7, 0x9F, 0xF0, 0x0F, 0x78, 0xff, 0xCF, 0xFE (en), 0xF9, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xF7, 0x9F, 0x7F, 0xE3, 0xFC (en), 0x0F, 0x80, 0xff, 0xff, 0xff, 0xff, 0x80, 0xE0, 0x1C, 0x07, 0x01 (en), 0xE0, 0x38, 0x0F, 0x01 (en), 0xC0, 0x78, 0x0F, 0x01 (en), 0xE0, 0x38, 0x0F, 0x01 (en), 0xE0, 0x3C, 0x00, 0x0F, 0x03, 0xFC (en), 0x7F, 0xC7, 0x9E, 0x70, 0xE7, 0x0E, 0x39, 0xC1, 0xF8, 0x3f, 0xC7, 0x9E, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x9F, 0x7F, 0xE3, 0xFC (en), 0x1F, 0x80, 0x1F, 0x03, 0xFC (en), 0x7F, 0xEF, 0x9E, 0xF0, 0xEF, 0x0F, 0xF0, 0xff, 0x0F, 0xF9, 0xF7, 0xff, 0x3f, 0xF1, 0xEF, 0x00, 0xEF, 0x1E, 0x7F, 0xE7, 0xFC (en), 0x1F, 0x00, 0xff, 0xF0, 0x00, 0x00, 0x0F, 0xff, 0xff, 0xF0, 0x00, 0x00, 0x0F, 0xff, 0x11, 0x6C, 0x00, 0x10, 0x07, 0x03, 0xF1, 0xFC (en), 0x7E, 0x0F, 0x80, 0xE0, 0x0F, 0xC0, 0x3f, 0x80, 0x7F, 0x00, 0xF0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xF0, 0x00, 0x0E, 0x00, 0xFC (en), 0x07, 0xF0, 0x0F, 0xE0, 0x1F, 0x00, 0xF0, 0x7F, 0x1F, 0x8F, 0xE0, 0xF0, 0x08, 0x00, 0x1F, 0x07, 0xFC (en), 0x7F, 0xEF, 0x9F, 0xF0, 0xff, 0x0F, 0x00, 0xF0, 0x0F, 0x01 (en), 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x0E, 0x00, 0xE0, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x00, 0xFE (en), 0x00, 0x1F, 0xFC (en), 0x03, 0xC0, 0xF0, 0x38, 0x01 (en), 0xC3, 0x80, 0x07, 0x18, 0x3D, 0x99, 0x87, 0xEC, 0x6C, 0x71 (en), 0xC3, 0xC3, 0x06, 0x1E, 0x18, 0x30, 0xF1, 0x81, 0x87, 0x8C, 0x18, 0x7C, 0x60, 0xC3, 0x63, 0x8E, 0x3B, 0x8F, 0xDF (en anglais), 0x8C, 0x3C, 0xF0, 0x70, 0x00, 0x01 (en), 0xC0, 0x00, 0x07, 0x80, 0x80, 0x1F, 0xFE (en), 0x00, 0x1F, 0xC0, 0x00, 0x03, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x07, 0xF0, 0x07, 0xF0, 0x07, 0x70, 0x0F, 0x78, 0x0E, 0x78, 0x0E, 0x38, 0x1E, 0x3C, 0x1C, 0x3C, 0x3f, 0xFC (en), 0x3f, 0xFE (en), 0x3f, 0xFE (en), 0x78, 0x0E, 0x78, 0x0F, 0x70, 0x0F, 0xF0, 0x07, 0xff, 0xC3, 0xff, 0xCF, 0xff, 0x3C, 0x3E, 0xF0, 0x7B, 0xC1, 0xEF, 0x0F, 0xBF, 0xFC (en), 0xff, 0xE3, 0xff, 0xCF, 0x07, 0xBC (en anglais), 0x0F, 0xF0, 0x3f, 0xC0, 0xff, 0x07, 0xff, 0xFE (en), 0xff, 0xFB, 0xff, 0x80, 0x07, 0xE0, 0x1F, 0xF8, 0x3f, 0xFC (en), 0x7C, 0x3E, 0x78, 0x1F, 0xF8, 0x0F, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF8, 0x0F, 0x78, 0x1F, 0x7C, 0x3E, 0x3f, 0xFE (en), 0x1F, 0xFC (en), 0x07, 0xF0, 0xff, 0xE1, 0xff, 0xE3, 0xff, 0xE7, 0x83, 0xEF, 0x03, 0xDE, 0x07, 0xFC (en), 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0x3f, 0xC0, 0x7F, 0x80, 0xff, 0x03, 0xFE (en), 0x07, 0xBC (en anglais), 0x1F, 0x7F, 0xFC (en), 0xff, 0xF1, 0xff, 0x80, 0xff, 0xF7, 0xff, 0xBF, 0xFD, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xFC (en), 0xff, 0xE7, 0xff, 0x3C, 0x01 (en), 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xff, 0xff, 0xff, 0xff, 0xC0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0xFE (en), 0xff, 0xEF, 0xFE (en), 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0x03, 0xF0, 0x0F, 0xFC (en), 0x3f, 0xFE (en), 0x3E, 0x1F, 0x78, 0x07, 0x78, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x7F, 0xF0, 0x7F, 0xF0, 0x7F, 0xF0, 0x07, 0x78, 0x07, 0x7C, 0x0F, 0x3E, 0x1F, 0x3f, 0xFB, 0x0F, 0xFB, 0x03, 0xE3, 0xF0, 0x3f, 0xC0, 0xff, 0x03, 0xFC (en), 0x0F, 0xF0, 0x3f, 0xC0, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xFC (en), 0x0F, 0xF0, 0x3f, 0xC0, 0xff, 0x03, 0xFC (en), 0x0F, 0xF0, 0x3f, 0xC0, 0xF0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01 (en), 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01 (en), 0xE0, 0x3C, 0x07, 0xF8, 0xff, 0x1F, 0xE3, 0xFC (en), 0x7B, 0xFE (en), 0x7F, 0xC3, 0xE0, 0xF0, 0x3E, 0xF0, 0x3C, 0xF0, 0x78, 0xF0, 0xF0, 0xF1, 0xE0, 0xF3, 0xC0, 0xF7, 0x80, 0xff, 0x00, 0xff, 0x80, 0xff, 0x80, 0xFB, 0xC0, 0xF1, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x78, 0xF0, 0x3C, 0xF0, 0x3E, 0xF0, 0x1E, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01 (en), 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01 (en), 0xE0, 0x3C, 0x07, 0xff, 0xff, 0xff, 0xFC (en), 0xF8, 0x1F, 0xFE (en), 0x0F, 0xff, 0x0F, 0xff, 0x87, 0xff, 0xC3, 0xff, 0xE1, 0xff, 0xF9, 0xff, 0xFC (en), 0xEF, 0xFE (en), 0x77, 0xFB, 0x3B, 0xFD, 0xDD, 0xFE (en), 0xFC (en), 0xff, 0x7E, 0x7F, 0x9F, 0x3f, 0xCF, 0x9F, 0xE7, 0x8F, 0xF3, 0xC7, 0xF8, 0xE3, 0xC0, 0xF0, 0x1F, 0xF0, 0x3f, 0xF0, 0x7F, 0xE0, 0xff, 0xE1, 0xff, 0xC3, 0xFD, 0xC7, 0xFB, 0x8F, 0xF3, 0x9F, 0xE7, 0x3f, 0xC7, 0x7F, 0x8F, 0xff, 0x0F, 0xFE (en), 0x1F, 0xFC (en), 0x1F, 0xF8, 0x1F, 0xF0, 0x3f, 0xE0, 0x3C, 0x03, 0xE0, 0x0F, 0xFC (en), 0x0F, 0xff, 0x87, 0xC7, 0xC7, 0x80, 0xF3, 0xC0, 0x7B, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC (en), 0x01 (en), 0xFE (en), 0x00, 0xF7, 0x80, 0xF3, 0xC0, 0x78, 0xF0, 0xF8, 0x7F, 0xFC (en), 0x1F, 0xFC (en), 0x03, 0xF8, 0x00, 0xff, 0xE3, 0xff, 0xEF, 0xff, 0xBC (en anglais), 0x1F, 0xF0, 0x3f, 0xC0, 0xff, 0x03, 0xFC (en), 0x1F, 0xff, 0xFB, 0xff, 0xCF, 0xFE (en), 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x00, 0x03, 0xE0, 0x0F, 0xFC (en), 0x0F, 0xff, 0x87, 0xC7, 0xC7, 0x80, 0xF3, 0xC0, 0x7B, 0xC0, 0x1F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, 0xFC (en), 0x01 (en), 0xFE (en), 0x04, 0xF7, 0x87, 0xF3, 0xC3, 0xF8, 0xF0, 0xF8, 0x7F, 0xFC (en), 0x1F, 0xff, 0x83, 0xF1, 0x80, 0x00, 0x00, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xFC, 0xF0, 0x3E, 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x1E, 0xF0, 0x3C, 0xFF, 0xF8, 0xFF, 0xF0, 0xFF, 0xF8, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x1F, 0x0F, 0xC0, 0x7F, 0xE1, 0xFF, 0xE7, 0xC3, 0xEF, 0x03, 0xDE, 0x00, 0x3C, 0x00, 0x7F, 0x00, 0x7F, 0xF0, 0x3F, 0xF8, 0x0F, 0xF8, 0x01, 0xF0, 0x01, 0xFE, 0x03, 0xDE, 0x0F, 0xBF, 0xFE, 0x3F, 0xF8, 0x1F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0xF7, 0x87, 0x9F, 0xFE, 0x3F, 0xF0, 0x3F, 0x00, 0x70, 0x0E, 0xF0, 0x3D, 0xE0, 0x79, 0xC0, 0xE3, 0x81, 0xC7, 0x87, 0x87, 0x0E, 0x0E, 0x1C, 0x1E, 0x78, 0x1C, 0xE0, 0x39, 0xC0, 0x73, 0x80, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x70, 0x38, 0x1C, 0xE0, 0xF0, 0x79, 0xE1, 0xF0, 0xF3, 0xC3, 0xE1, 0xE3, 0x87, 0xC3, 0x87, 0x0F, 0x87, 0x0E, 0x3B, 0x9E, 0x1E, 0x77, 0x38, 0x1C, 0xEE, 0x70, 0x39, 0xCC, 0xE0, 0x73, 0x99, 0xC0, 0x6E, 0x3F, 0x00, 0xFC, 0x7E, 0x01, 0xF8, 0xFC, 0x03, 0xF0, 0xF8, 0x03, 0xE1, 0xE0, 0x07, 0x83, 0xC0, 0x0F, 0x07, 0x80, 0xF0, 0x3C, 0xF0, 0xF9, 0xE1, 0xE1, 0xE7, 0x83, 0xCF, 0x03, 0xFC, 0x03, 0xF0, 0x07, 0xE0, 0x07, 0x80, 0x0F, 0x00, 0x3F, 0x00, 0xFF, 0x01, 0xFE, 0x07, 0x9E, 0x0F, 0x1E, 0x3C, 0x3C, 0xF8, 0x3D, 0xE0, 0x78, 0xF0, 0x1E, 0x78, 0x1E, 0x78, 0x3C, 0x3C, 0x3C, 0x3C, 0x78, 0x1E, 0x78, 0x0E, 0x70, 0x0F, 0xF0, 0x07, 0xE0, 0x07, 0xE0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF8, 0x07, 0x80, 0x78, 0x07, 0x80, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xFF, 0xFF, 0xC0, 0xC1, 0x81, 0x03, 0x06, 0x04, 0x0C, 0x18, 0x10, 0x30, 0x60, 0x40, 0xC1, 0x81, 0x03, 0x06, 0xFF, 0xFF, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xFF, 0xFF, 0xC0, 0x0F, 0x00, 0xF0, 0x0F, 0x01, 0xF8, 0x1B, 0x83, 0x9C, 0x39, 0xC3, 0x0C, 0x70, 0xE7, 0x0E, 0xE0, 0x70, 0xFF, 0xFF, 0xFF, 0xFC, 0xE6, 0x30, 0x1F, 0x83, 0xFF, 0x1F, 0xFD, 0xE1, 0xE0, 0x0F, 0x03, 0xF9, 0xFF, 0xDF, 0x1E, 0xF0, 0xF7, 0x8F, 0xBF, 0xFC, 0xFF, 0xE3, 0xCF, 0x80, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7B, 0xC3, 0xFF, 0x9F, 0xFE, 0xF8, 0xF7, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xE3, 0xDF, 0xFE, 0xFF, 0xE7, 0xBE, 0x00, 0x0F, 0x83, 0xFE, 0x7F, 0xF7, 0x8F, 0xF0, 0x7F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x77, 0x8F, 0x7F, 0xF3, 0xFE, 0x0F, 0x80, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x8F, 0xBC, 0xFF, 0xEF, 0xFF, 0x78, 0xFF, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3D, 0xE3, 0xEF, 0xFF, 0x3F, 0xF8, 0xFB, 0xC0, 0x1F, 0x81, 0xFE, 0x1F, 0xF9, 0xF1, 0xCF, 0x07, 0x7F, 0xFB, 0xff, 0xDE, 0x00, 0xF0, 0x03, 0xC3, 0x9F, 0xFC (en), 0x7F, 0xC0, 0xF8, 0x00, 0x3E, 0xFD, 0xFB, 0xC7, 0x9F, 0xBF, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF0, 0x1E, 0x79 (en), 0xFB, 0xDF (en anglais), 0xFE (en), 0xF1, 0xff, 0x07, 0xF8, 0x3f, 0xC1, 0xFE (en), 0x0F, 0xF0, 0x7F, 0xC7, 0xDF (en anglais), 0xFE (en), 0x7F, 0xF1, 0xF7, 0x80, 0x3C, 0x01 (en), 0xff, 0x1E, 0x7F, 0xF0, 0xFE (en), 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x7C, 0xff, 0xEF, 0xff, 0xF9, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xff, 0xF0, 0x0F, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3C, 0xF3, 0xC0, 0x00, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0xff, 0xff, 0x80, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x0F, 0xF1, 0xEF, 0x3C, 0xF7, 0x8F, 0xF0, 0xff, 0x0F, 0xF8, 0xff, 0x8F, 0x3C, 0xF1, 0xCF, 0x1E, 0xF0, 0xEF, 0x0F, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xF7, 0x8F, 0x9F, 0xFB, 0xFB, 0xff, 0xff, 0xFC (en), 0xF8, 0xff, 0x1E, 0x1F, 0xE3, 0xC3, 0xFC (en), 0x78, 0x7F, 0x8F, 0x0F, 0xF1, 0xE1, 0xFE (en), 0x3C, 0x3f, 0xC7, 0x87, 0xF8, 0xF0, 0xff, 0x1E, 0x1E, 0xF7, 0xCF, 0xFE (en), 0xff, 0xff, 0x9F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xF0, 0x0F, 0x81, 0xff, 0x1F, 0xFC (en), 0xF1, 0xEF, 0x07, 0xF8, 0x3f, 0xC1, 0xFE (en), 0x0F, 0xF0, 0x7B, 0xC7, 0x9F, 0xFC (en), 0x7F, 0xC0, 0xF8, 0x00, 0xF7, 0xC7, 0xff, 0x3f, 0xFD, 0xF1, 0xEF, 0x07, 0xF8, 0x3f, 0xC1, 0xFE (en), 0x0F, 0xF0, 0x7F, 0xC7, 0xBF, 0xFD, 0xff, 0xCF, 0x78, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x00, 0x0F, 0x79 (en), 0xff, 0xDF (en anglais), 0xFE (en), 0xF1, 0xff, 0x07, 0xF8, 0x3f, 0xC1, 0xFE (en), 0x0F, 0xF0, 0x7B, 0xC7, 0xDF (en anglais), 0xFE (en), 0x7F, 0xF1, 0xF7, 0x80, 0x3C, 0x01 (en), 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0xF3, 0xF7, 0xff, 0xF8, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x1F, 0x87, 0xFC (en), 0xff, 0xEF, 0x0F, 0xF8, 0x0F, 0xF0, 0x7F, 0xE0, 0xff, 0x01 (en), 0xff, 0x0F, 0xff, 0xE7, 0xFE (en), 0x1F, 0x80, 0x79 (en), 0xE7, 0xBF, 0xFD, 0xE7, 0x9E, 0x79 (en), 0xE7, 0x9E, 0x7D, 0xF3, 0xC0, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x1F, 0xff, 0xF7, 0xff, 0x3E, 0xF0, 0xF0, 0x7B, 0x83, 0x9E, 0x1C, 0xF1, 0xE3, 0x8E, 0x1C, 0x70, 0x77, 0x83, 0xB8 (en), 0x1D, 0xC0, 0x7E, 0x03, 0xE0, 0x1F, 0x00, 0x70, 0x00, 0xF0, 0xE1, 0xDC (en), 0x78, 0x77, 0x1F, 0x3D, 0xE7, 0xCF, 0x79 (en), 0xB3 (en), 0x8E, 0x6C, 0xE3, 0xBB, 0x38, 0xEE (en), 0xFC (en), 0x1F, 0x3f, 0x07, 0xC7, 0xC1, 0xF1, 0xF0, 0x7C, 0x78, 0x0E, 0x1E, 0x00, 0x78, 0xF3, 0xC7, 0x8F, 0x78, 0x3B, 0x81, 0xFC (en), 0x07, 0xC0, 0x1E, 0x01 (en), 0xF0, 0x1F, 0xC0, 0xEF, 0x0F, 0x78, 0xF1, 0xE7, 0x87, 0x00, 0xF0, 0x7B, 0x83, 0x9E, 0x1C, 0x71 (en), 0xE3, 0x8E, 0x1E, 0x70, 0x73, 0x83, 0xB8 (en), 0x1F, 0xC0, 0x7E, 0x03, 0xE0, 0x0F, 0x00, 0x70, 0x03, 0x80, 0x3C, 0x07, 0xC0, 0x3E, 0x01 (en), 0xE0, 0x00, 0xff, 0xff, 0xff, 0xFC (en), 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x0F, 0xff, 0xff, 0xff, 0xC0, 0x1C, 0xF3, 0xCE, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0xBC (en anglais), 0xF0, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x3C, 0xF1, 0xC0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xF0, 0xE3, 0x8F, 0x1C, 0x71 (en), 0xC7, 0x1C, 0x71 (en), 0xC7, 0x0F, 0x3D, 0xC7, 0x1C, 0x71 (en), 0xC7, 0x1C, 0xF3, 0xCE, 0x00, 0x78, 0x0F, 0xE0, 0xCF, 0x30, 0x7F, 0x01 (en), 0xE0, 0x61, 0xC6, 0xF1, 0xCF, 0xF1, 0xCF, 0x63, 0xE6, 0x03, 0xE0, 0x07, 0x60, 0x0F, 0x78, 0x0E, 0x78, 0x0E, 0x38, 0x1E, 0x3C, 0x1C, 0x3C, 0x3f, 0xFC (en), 0x3f, 0xFE (en), 0x3f, 0xFE (en), 0x78, 0x0E, 0x78, 0x0F, 0x70, 0x0F, 0xF0, 0x07, 0x60, 0x03, 0x78, 0x03, 0xFC (en), 0x01 (en), 0xEC, 0x7C, 0x61, 0xff, 0x81, 0xff, 0xF0, 0xF8, 0xF8, 0xF0, 0x1E, 0x78, 0x0F, 0x78, 0x03, 0xFC (en), 0x01 (en), 0xFE (en), 0x00, 0xF7, 0x80, 0xF3, 0xC0, 0x78, 0xF0, 0xF8, 0x7F, 0xFC (en), 0x1F, 0xFC (en), 0x03, 0xF8, 0x00, 0x60, 0x1B, 0xC0, 0xff, 0x03, 0xD8, 0x06, 0x00, 0x03, 0xC0, 0xff, 0x03, 0xFC (en), 0x0F, 0xF0, 0x3f, 0xC0, 0xff, 0x03, 0xFC (en), 0x0F, 0xF0, 0x3f, 0xC0, 0xF7, 0x87, 0x9F, 0xFE (en), 0x3f, 0xF0, 0x3f, 0x00, 0x60, 0x67, 0x87, 0xBC (en anglais), 0x3C, 0xC0, 0xC0, 0x00, 0x0F, 0xC1, 0xff, 0x8F, 0xFE (en), 0xF0, 0xF0, 0x07, 0x81, 0xFC (en), 0xff, 0xEF, 0x8F, 0x78, 0x7B, 0xC7, 0xDF (en anglais), 0xFE (en), 0x7F, 0xF1, 0xE7, 0xC0, 0x60, 0x37, 0x83, 0xFC (en), 0x1E, 0xC0, 0x60, 0x00, 0x07, 0xC0, 0xff, 0x8F, 0xFE (en), 0x78, 0xF7, 0x83, 0xFC (en), 0x1F, 0xE0, 0xff, 0x07, 0xF8, 0x3D, 0xE3, 0xCF, 0xFE (en), 0x3f, 0xE0, 0x7C, 0x00, 0x60, 0x6F, 0x0F, 0xF0, 0xF6, 0x06, 0x00, 0x00, 0x00, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x0F, 0xF1, 0xff, 0xff, 0x7F, 0xF3, 0xEF, 0x3f, 0x07, 0xFC (en), 0xff, 0xEF, 0x1E, 0xF1, 0xEF, 0x1E, 0xF3, 0xCF, 0x78, 0xF7, 0xCF, 0x1E, 0xF0, 0xff, 0x0F, 0xF0, 0xff, 0x1F, 0xF7, 0xEF, 0x7C, 0xF7, 0x80, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00 }; Const GFXglyph KbdBold12pt7bGlyphes[] PROGMEM = { { 0, 12, 8, 13, 0, -11 } // '' ,{ 12, 12, 8, 13, 0, -11 } // '' ,{ 24, 13, 17, 14, 0, -16 } // '' ,{ 53, 13, 17, 14, 0, -16 } // '' ,{ 82, 15, 13, 16, 0, -14 } // '' ,{ 107, 19, 18, 20, 0, -17 } // '' ,{ 151, 17, 18, 18, 0, -17 } // '' ,{ 190, 18, 12, 19, 0, -14 } // '' ,{ 217, 0, 0, 7, 0, 1 } // ' ' ,{ 217, 4, 17, 8, 3, -16 } // '!' ,{ 226, 10, 6, 11, 1, -17 } // '"' ,{ 234, 13, 16, 13, 0, -15 } // '#' ,{ 260, 13, 20, 13, 0, -17 } // '$' ,{ 293, 19, 17, 21, 1, -16 } // '%' ,{ 334, 16, 17, 17, 1, -16 } // '&' ,{ 368, 4, 6, 6, 1, -17 } // ''' ,{ 371, 6, 22, 8, 1, -17 } // '(' ,{ 388, 6, 22, 8, 1, -17 } // ')' ,{ 405, 7, 8, 9, 1, -17 } // '*' ,{ 412, 11, 11, 14, 2, -10 } // '+' ,{ 428, 4, 7, 6, 1, -2 } // ',' ,{ 432, 6, 3, 8, 1, -7 } // '-' ,{ 435, 4, 3, 6, 1, -2 } // '.' ,{ 437, 6, 17, 7, 0, -16 } // '/' ,{ 450, 12, 17, 13, 1, -16 } // '0' ,{ 476, 7, 17, 14, 3, -16 } // '1' ,{ 491, 12, 17, 13, 1, -16 } // '2' ,{ 517, 12, 17, 13, 1, -16 } // '3' ,{ 543, 11, 17, 13, 1, -16 } // '4' ,{ 567, 12, 17, 13, 1, -16 } // '5' ,{ 593, 12, 17, 13, 1, -16 } // '6' ,{ 619, 11, 17, 13, 1, -16 } // '7' ,{ 643, 12, 17, 13, 1, -16 } // '8' ,{ 669, 12, 17, 13, 1, -16 } // '9' ,{ 695, 4, 12, 6, 1, -11 } // ':' ,{ 701, 4, 16, 6, 1, -11 } // ';' ,{ 709, 12, 12, 14, 1, -11 } // '<' ,{ 727, 12, 9, 14, 1, -9 } // '=' ,{ 741, 12, 12, 14, 1, -11 } // '>' ,{ 759, 12, 18, 15, 2, -17 } // '?' ,{ 786, 21, 21, 23, 1, -17 } // '@' ,{ 842, 16, 18, 17, 0, -17 } 'A' ,{ 878, 14, 18, 17, 2, -17 } 'B' ,{ 910, 16, 18, 17, 1, -17 } 'C' ,{ 946, 15, 18, 17, 2, -17 } 'D' ,{ 980, 13, 18, 16, 2, -17 } 'E' ,{ 1010, 12, 18, 15, 2, -17 } 'F' ,{ 1037, 16, 18, 18, 1, -17 } 'G' ,{ 1073, 14, 18, 18, 2, -17 } 'H' ,{ 1105, 4, 18, 7, 2, -17 } 'Je' ,{ 1114, 11, 18, 14, 1, -17 } 'J' ,{ 1139, 16, 18, 17, 2, -17 } 'K' ,{ 1175, 11, 18, 15, 2, -17 } 'L' ,{ 1200, 17, 18, 21, 2, -17 } 'M' ,{ 1239, 15, 18, 18, 2, -17 } 'N' ,{ 1273, 17, 18, 19, 1, -17 } 'O' ,{ 1312, 14, 18, 16, 2, -17 } 'P' ,{ 1344, 17, 19, 19, 1, -17 } 'Q' ,{ 1385, 16, 18, 17, 2, -17 } 'R' ,{ 1421, 15, 18, 16, 1, -17 } 'S' ,{ 1455, 12, 18, 15, 2, -17 } 'T' ,{ 1482, 14, 18, 18, 2, -17 } 'U' ,{ 1514, 15, 18, 16, 0, -17 } 'V' ,{ 1548, 23, 18, 23, 0, -17 } 'W' ,{ 1600, 15, 18, 16, 1, -17 } 'X' ,{ 1634, 16, 18, 15, 0, -17 } 'Y' ,{ 1670, 13, 18, 15, 1, -17 } 'Z' ,{ 1700, 6, 23, 8, 2, -17 } // '[' ,{ 1718, 7, 17, 7, 0, -16 } // '\' ,{ 1733, 6, 23, 8, 0, -17 } // ']' ,{ 1751, 12, 11, 14, 1, -16 } // '^' ,{ 1768, 15, 2, 13, -1, 4 } // '_' ,{ 1772, 4, 3, 6, 0, -17 } // '`' ,{ 1774, 13, 13, 14, 1, -12 } 'a' ,{ 1796, 13, 18, 15, 2, -17 } 'b' ,{ 1826, 12, 13, 13, 1, -12 } 'c' ,{ 1846, 13, 18, 15, 1, -17 } 'd' ,{ 1876, 13, 13, 14, 1, -12 } 'e' ,{ 1898, 7, 18, 8, 1, -17 } 'f' ,{ 1914, 13, 18, 15, 1, -12 } 'g' ,{ 1944, 12, 18, 14, 2, -17 } 'h' ,{ 1971, 4, 18, 7, 2, -17 } 'i' ,{ 1980, 6, 23, 7, 0, -17 } 'j' ,{ 1998, 12, 18, 14, 2, -17 } 'k' ,{ 2025, 4, 18, 6, 2, -17 } 'l' ,{ 2034, 19, 13, 21, 2, -12 } 'm' ,{ 2065, 12, 13, 15, 2, -12 } 'n' ,{ 2085, 13, 13, 15, 1, -12 } 'o' ,{ 2107, 13, 18, 15, 2, -12 } 'p' ,{ 2137, 13, 18, 15, 1, -12 } 'q' ,{ 2167, 8, 13, 9, 2, -12 } 'r' ,{ 2180, 12, 13, 13, 1, -12 } 's' ,{ 2200, 6, 15, 8, 1, -14 } 't' ,{ 2212, 12, 13, 15, 2, -12 } 'u' ,{ 2232, 13, 13, 13, 0, -12 } 'v' ,{ 2254, 18, 13, 19, 0, -12 } 'w' ,{ 2284, 13, 13, 13, 0, -12 } 'x' ,{ 2306, 13, 18, 13, 0, -12 } 'y' ,{ 2336, 10, 13, 12, 1, -12 } 'z' ,{ 2353, 6, 23, 9, 1, -17 } // '{' ,{ 2371, 2, 22, 7, 2, -17 } // '|' ,{ 2377, 6, 23, 9, 3, -17 } // '}' ,{ 2395, 12, 5, 12, 0, -7 } // '~' ,{ 2403, 16, 18, 17, 0, -17 } // '' ,{ 2439, 17, 18, 19, 1, -17 } // '' ,{ 2478, 14, 18, 18, 2, -17 } // '' ,{ 2510, 13, 18, 14, 1, -17 } // '' ,{ 2540, 13, 18, 15, 1, -17 } // '' ,{ 2570, 12, 18, 15, 2, -17 } // '' ,{ 2597, 12, 17, 13, 1, -16 } // ' ' ,{ 2623, 8, 13, 12, 2, -17 } // '' }; Const GFXfont KbdBold12pt7b PROGMEM = { (uint8_t *)KbdBold12pt7bBitmaps, (GFXglyph *)KbdBold12pt7bGlyphes, 0x18, 0x86, 29 }; Environ 2858 octets
Joyeux codage.
8 commentaires
Rüdiger Schwarz
Hallo
/ COM 9600habe den Touchscreen jetzt als eigeständige Tastaur geändert
Info: RSW 01_2022
Benutze Seriellen Ausgang am ESP32 = PIN 5(RX)/PIN 4(TX)
so ändere folgende Zeilen.***RSW***
(Teil 1)
Void loop
case 28: draw_result(text);//Eingabe beenden
text.remove(0);
//setup();
draw_screen(); //Eingabe beenden
kb = true; //* RSW *
delay (300); //* RSW *
break;
************************************************************
(Teil 2) kompl. ersetzten
//Ende der Eingabe Bildschirm löschen und Eingabetext anzeigen
void draw_result( String res) {
kb = false;
#ifdef debug
//Ausgabe des Eingabetexts auf den seriellen Monitor
//Umlaute müssen nach UTF8 gewandelt werden
Serial.println(fromKeyboard(res));
delay (100);
draw_screen();
//wir müssen zuerst den alten Text am Display löschen
tft.fillRect(1, 1, 238, 38, ILI9341_LIGHTGRAY);
tft.setCursor(3, 28);
delay (500);
#endif
*****************************************************************
zum testen geht auch der USB am ESP32 und er Software Arduino
Siggi
Hallo Gerald,
danke für Dein Beispiel, es hat mir sehr geholfen.
Mein AZ-Touch mit 2,8" ist vom Dezember 2021, TFT mit gelber Stiftleiste.
Damit Sketch richtig funktioniert, musste ich folgende Änderungen vornehmen:
//Instanzen für Display und Touch-Screen
//XPT2046_Touchscreen touch(TOUCH_CS, TOUCH_IRQ);
XPT2046_Touchscreen touch(TOUCH_CS); // TOUCH_IRQ entfernt
Bei: void setup()
digitalWrite(TFT_LED, LOW); // Display Beleuchtung ein
Bei: bool Touch_Event() {
// p.x = map(p.x, TS_MINX, TS_MAXX, 0, 320);
// p.y = map(p.y, TS_MINY, TS_MAXY, 240, 0);
p.x = map(p.x, TS_MINX, TS_MAXX, 320, 0); // 320 und 0 getauscht
p.y = map(p.y, TS_MINY, TS_MAXY, 0, 240);// 240 und 0 getauscht
Der Lösung für den 2. Fehler ist von “mike” .
Der 3. Fehler war ähnlich bei “Andreas”.
Danke euch beiden, die Umsetzung war somit deutlich leichter.
Liebe Grüße
Siggi
Gerald Lechner
Hallo Andreas,
der ganze Sketch ist als Beispiel gedacht und zeigt daher den eingegeben Text nur an. Um mehr zu machen, musst du die Funktion drawResult ändern.
Zum Beispiel:
void draw_result( String res) {
kb = false;
#ifdef debug
//Ausgabe des Eingabetexts auf den seriellen Monitor
//Umlaute müssen nach UTF8 gewandelt werden
Serial.println(fromKeyboard(res));
#endif
//Ab hier wird der Bildschirm gelöscht und der eingegebene Text angezeigt
//diese Anzeige könnte man auch weglassen.
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE, ILI9341BLUE);
tft.setCursor(3,160);
tft.print(res);
delay(1000); //Eine Sekunde lang den eingegeben Text anzeigen
//Ende der Textanzeige
//Hier könnte man jetzt mit dem eingegeben Text irgend etwas machen
drawScreen(); //damit wird wieder die Tastatur angezeigt
}
Andreas Dürmuth
Hallo,
der SKetch funktioniert bei mir auf Anhieb. Allerdings bleibt nach der Bestätigung des eingegebenen Textes mit Enter immer angezeigt. Wie kann ich diesen löschen und zum Eingebefeld zurückkommen?
Ich nutze einen ESP32 NodeMCU.
Hat jemand einen Tip?
Danke für eine Antwort,
AndreasD
mike gh
Danke für die Anleitung.
Hinweis
Statt:
digitalWrite(TFT_LED, HIGH); // Display Beleuchtung ein
funktioniert bei mir nur
digitalWrite(TFT_LED, LOW); // low = Display Beleuchtung ein
zum Einschalten des displays
Andreas Bausewein
Hallo Herr Lechner,
Vielen Dank für die Rückmeldung.
Könnten Sie bitte einen Hinweis geben, an welcher Stelle für diese Displays mit anders aufgeklebter Widerstandsfolie die Anpassung bei Ihrer SmartHome Zentrale vorzunehmen ist?
Viele Grüße
Andreas
Gerald Lechner
Es gibt eine kleine Serie mit Displays eines anderen Herstellers (erkennbar an der gelben Stiftleiste) bei denen die Widerstandsfolie andersrum aufgeklebt wurde, sodass die x-Achse gespiegelt ist.
Andreas Bausewein
Hallo,
Sketch ArduTouch2 reagiert horizontal gespiegelt auf Tastatureingaben.
Fehler liegt in der Funktion bool Touch_Event(). Die Zuordnungsbeziehung muss lauten:
p.x = map(p.x, TS_MINX, TS_MAXX, 320, 0); // 320 und 0 haben die Position getauscht
p.y = map(p.y, TS_MINY, TS_MAXY, 240, 0);
Dann ordnet das Touch die auf dem TFT angezeigten Zeichen richtig zu.
Viele Grüße
Andreas