ArduiTouch 2 - Touchscreen als Eingabetastatur - AZ-Delivery

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.

DisplaysEsp-32Projekte für anfängerSmart home

8 commentaires

Rüdiger Schwarz

Rüdiger Schwarz

Hallo
habe den Touchscreen jetzt als eigeständige Tastaur geändert
Info: RSW 01_2022

/ COM 9600

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_LIGHT
GRAY);
tft.setCursor(3, 28);
delay (500);
#endif
*****************************************************************
zum testen geht auch der USB am ESP32 und er Software Arduino

Siggi

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

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, ILI9341
BLUE);
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

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

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

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

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

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

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Articles de blog recommandés

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery