isTouch()
Retourne true si on a appuyé sur l'écran, et mémorise les coordonnés du point
Exemples d'utilisation
if (isTouch()) point(random(LARGEUR), random(HAUTEUR), RANDOM_COLOR); // Dessine des points tant qu'on appuie sur l'écran while (!isTouch()); // Attend un appui sur l'écran avant de continuer while (isTouch()); // Attend que l'on relâche l'écran avant de continuer
Référence
boolean isTouch(byte nbLectures = 15);
Paramètre passé
nbLectures: Nombre de lectures possibles avant de retourner false; paramètre faccultatif
Valeur retournée
true si on a appuyé sur l'écran, false sinon
Effet de bord:
mémorisation du point de contact, lisible par les fonctions getTouchX() et
getTouchY()
Voir aussi
- getTouchX: Abscisse du stylet
- getTouchY: Ordonné du stylet
- MAX_X, MAX_Y...: Valeurs des coordonnés graphiques
- setGraphMode(); Initialisation de l'écran
- setTextOrient(); Direction d'écriture des textes
Notes
Pour utiliser le touchpad, il faut appeler la fonction isTouch(). Si elle retourne false, il n'y a pas d'appui sur l'écran. Si elle retourne true, un point de contact a été mémorisé, et l'on peut le lire grâce à getTouchX() et getTouchY(). Si on rappelle ces dernières fonctions plusieurs fois, elle retourneront toujours les mêmes valeurs. Pour avoir un nouveau point, il faut rappeler d'abord isTouch().
Il ne faut pas attendre pour une vingtaine d'euros une qualité extraordinaire sur le touchpad aussi. Mais globalement cela fonctionne. Le rapport qualité prix est excellent. Même si le stylet touche l'écran, isTouch() peut retourner false. Dans la plupart des cas, ce n'est pas important. Si on a vraiment besoin d'avoir true à 99% des cas, il faut employer isTouch(50). Mais elle nécessite plus de temps surtout si le stylet n'est pas appuyé.
La fonction setLimites() n'a aucun effet sur la lecture du touchPad. Même si on a limité la zone de dessin, isTouch() retournera vrai si on pointe en dehors des limites.
La fonction isTouch() fait plusieurs lectures consésutives des coordonnées, et retourne true si trois lectures consécutivent donnent les mêmes coordonnées. Si elle n'arrive pas à lire, soit parce que la lecture est mauvaise, soit parce que le stylet n'est pas appuyé, au bout d'un certain nombre de lecures, elle retoure false. Par défaut ce nombre de lecture est fixé à 15. L'augmenter permet de diminuer le nombre de faux non-appuis (isTouch() retourne false mais le stylet est appuyé), mais augmente le temps de la fonction. Le temps est plus long si il n'y a pas appui car on fait toutes les lectures. Une lecture est de l'ordre de 500µs
On peut ajuster ce nombre en faisant un programme qui change la couleur de l'écran si on n'appuie pas dessus. En gardant l'appui, on peut ainsi voir les faux non-appuis. Voir le programme Exemple-501-isTouch.
Exemple
PecheuxGraph_ILI9341_8bits.zip\PecheuxGraph_ILI9341_8bits\examples\Documentation\Exemple-500-isTouch\Exemple-500-isTouch.ino (dans votre fichier téléchargé):
// Le générateur pseudo aléatoire random() va toujours nous donner la même séquence.
// Pour éviter cela, il faut appeler la fonction randomSeed et lui passer un nombre.
// Mais il faut trouver un nombre de départ variable! On utilise souvent à cet effet
// la lecture d'une broche analogique. Cela va nous donner en théorie une séquence
// parmi 256, mais dans la pratique ce sera plutôt une parmi 5. On peut alors
// utiliser un temps de réaction de l'humain. Dans l'exemple qui suit, on demande à
// l'utilisateur de toucher l'écran. Le temps qu'il va mette est variable et on a
// donc une valeur de départ aléatoire.
//
// Avec la ligne while(!isTouch()); désactivée (elle est en commentaire), la
// séquence sera toujours la même 737, 845, 656... en supprimant les // en début de
// ligne, l'affichage commencera aléatoirement.
#
$menu = ":PG";
include <PecheuxGraph_ILI9341_8bits.h>
void setup()
{
setGraphMode(PAYSAGE);
text("Appuyez sur l'écran");
// while(!isTouch()); // Attend que l'on appuie sur l'écran
randomSeed(micros()); // Initialise le générateur aléatoire
setTextSize(5); setTextBold(2); // Ecrit un peu gros
}
void loop()
{
clrscr();
text(String(random(1000))); // Affiche un nombre au hasard
delay(1000); // Toutes les secondes
}
Côté technique
Le touchpad utilise les mêmes broches que l'afficheur. Pour utiliser le touchpad, il faut mettre l'écran hors communication (/CS=1). Dans cette bibliothèque, vu que le touchpad n'est pas l'organe principal, c'est l'écran qui est sélectionné en permanence par défaut. Plutôt que de sélectionner l'écran à chaque écriture, il reste en permanence sélectionné. Lors de l'appel à isTouch(), l'écran est désélectionné, isTouch() fait son travail, puis l'écran est sélectionné de nouveau.
Principe de lecture de l'abscisse du point de contact: pour utiliser le touchpad, on alimente un film résistif recouvrant l'écran, par exemple en mettant son côté droit à la masse et son côté gauche à 5V:

En appuyant avec le stylet, cela fait un contact avec un deuxième film résistif qui va donc être porté à une tension qui va dépendre du point d'appui. Pour un appui du côté droit, on aura des valeurs proches de 0V et pour un appui du côté gauche, on aura des valeurs avoisinant les 5V. Au milieu, ce sera des valeurs voisines de 2,5V. Ce deuxième film est relié à une entrée analogique et la valeur échantillonnée sera dépendante de l'abscisse. La valeur lue est comprise entre 100 et 900 environ.
Pour savoir si il y a contact ou pas, on peut alimenter un des côté du premier film en 0V et un des côté du deuxième en 5V:

Si il n'y a pas de contact, les deux autres côtés des films seront respectivement à 0V et 5V. La différence est de 5V (1024 après échantillonnage. Si il y a contact parfait, les tensions sur les deux films au point seront égales, et la lecture des tensions sur les deux côtés non alimentés seront les mêmes (faible valeur après échantillonnage). Moins les contacts sont parfait, plus la différence de tension augmente, ce qui fait dire à certains que l'on peut avoir la valeur de la pression. Les essais que j'ai fait montent que cela dépend plus de la taille de la zone de contact que de la pression. Il y en a qui vont utiliser l'afficheur pour en faire une balance...
On pourrait se contenter d'utiliser la dernière méthode pour retourner true ou false pour isTouch(). Mais si la lecture de l'abscisse intervient trop tard, on risque de ne plus pouvoir lire une valeur correcte. On a un point de contact, mais on ne sait pas où! Pour éviter cela, je lis l'abscisse, si il y a contact, et l'ordonnée. Si il y a contact et si j'arrive à lire correctement les coordonnées trois fois de suite la même valeur, alors isTouch() retournera true, et les coordonnées seront prêtes. Mais suivant les écrans, il est possible qu'en faisant 15 boucles, je n'arrive pas à lire la bonne valeur. Si c'est utile, il suffit d'augmenter le nombre de boucles.
Le programme suivant va changer la couleur de l'écran quand il n'est pas appuyé (ou que l'on n'arrive pas à avoir une bonne lecture. Il y est écrit ici 50 boucles. On peut changer cette valeur. Si elle est trop faible, l'écran va changer sans arrêt de couleur. Dans certains programmes on se moque de ce "rebond", On peut decendre cette valeur. Dans d'autres ce peut être génant (par exemple si on utilise des boutons Check (bistables) qui à chaque appui vont s'activer et se désactiver plusieurs fois). Il faut alors prendre une valeur suffisante.
PecheuxGraph_ILI9341_8bits.zip\PecheuxGraph_ILI9341_8bits\examples\Documentation\Exemple-501-isTouch.ino (dans votre fichier téléchargé):
// Ce programme fait clignotter l'écran tant qu'on n'appuie pas dessus
#
$menu = ":PG";
include <PecheuxGraph_ILI9341_8bits.h>
void setup()
{
setGraphMode(PAYSAGE);
text(F("Appuyez sur l'écran pour arrêter le clignotement"));
setLimites(0,32,MAX_X,MAX_Y); // Limite l'effacement de l'écran en dessous du texte
}
void loop()
{
while (isTouch(50)); // Boucle tant qu'on appuie
// si on passe ici, c'est que l'on n'appuie plus
clrscr(getDrawColor()); // Change la couleur du bas de l'écran
}