Created
August 13, 2025 18:20
-
-
Save ypelletier/e3446b8b47d7b094486ee6a6a7e61c13 to your computer and use it in GitHub Desktop.
Contrôle du rapport cyclique PWM au moyen d'un bouton coulissant affiché sur écran tactile.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /**************************************************************************** | |
| Contrôle du rapport cyclique PWM au moyen d'un bouton coulissant affiché sur TFT | |
| (Arduino Uno et shield TFT/LCD 320 X 240) | |
| Tous les détails sur mon blog: | |
| https://electroniqueamateur.blogspot.com/2025/08/shield-tft-ecran-tactile-acceder-malgre.html | |
| ******************************************************************************/ | |
| //bibliothèques pour l'écran tactile | |
| #include <Adafruit_GFX.h> | |
| #include <Adafruit_ILI9341.h> | |
| #include <Adafruit_TSC2007.h> | |
| // données pour la calibration du capteur tactile | |
| // varie légèrement d'un écran à l'autre | |
| #define TS_MINX 270 | |
| #define TS_MINY 270 | |
| #define TS_MAXX 3740 | |
| #define TS_MAXY 3600 | |
| #define TS_MIN_PRESSURE 200 | |
| #define TFT_CS 10 | |
| #define TFT_DC 9 | |
| Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); | |
| Adafruit_TSC2007 ts; | |
| #define sortiePWM 6 // nous utiliserons la broche numéro 6 | |
| // caractéristiques du bouton coulissant | |
| #define VALEUR_MAX 100 // valeur affichée quand le bouton est poussé à l'extrême droite | |
| #define LARGEUR 20 // largeur du bouton | |
| #define HAUTEUR 40 // hauteur du bouton | |
| #define POSY 150 // position verticale du bouton coulissant | |
| #define LIMITE_GAUCHE 30 // extrémité gauche au 20e pixel | |
| #define LIMITE_DROITE 290 // extrémité droite au 100e pixel | |
| uint16_t x_precedent = 160 ; // position horizontale précédente | |
| // routine qui calcule la valeur numérique qui correspond à la position du bouton coulissant: | |
| uint16_t calcule_valeur (uint16_t valeur_brute) { | |
| return round(1.0 * (valeur_brute - LIMITE_GAUCHE) / ( LIMITE_DROITE - LIMITE_GAUCHE) * VALEUR_MAX); | |
| } | |
| // routine qui redessine le contenu de l'écran | |
| void dessineContenu(uint16_t posx) { | |
| // on efface le bouton, là où il se trouvait précédemment | |
| tft.fillRect(x_precedent - LARGEUR / 2, POSY - HAUTEUR / 2 - 2 , LARGEUR, HAUTEUR + 4, ILI9341_BLACK); | |
| // on dessine la ligne horizontale | |
| tft.drawLine(LIMITE_GAUCHE, POSY, LIMITE_DROITE, POSY, ILI9341_WHITE); | |
| // on dessine le bouton à sa nouvelle position | |
| tft.fillRect(posx - LARGEUR / 2, POSY - HAUTEUR / 2, LARGEUR, HAUTEUR, ILI9341_YELLOW); | |
| // on efface l'ancienne valeur numérique | |
| tft.setTextColor(ILI9341_BLACK); | |
| tft.setCursor(110, 50); | |
| tft.setTextSize(5); | |
| tft.print(calcule_valeur(x_precedent)); | |
| tft.print(" %"); | |
| // on écrit la nouvelle valeur numérique | |
| tft.setTextColor(ILI9341_GREEN); | |
| tft.setCursor(110, 50); | |
| tft.setTextSize(5); | |
| tft.print(calcule_valeur(posx)); | |
| tft.print(" %"); | |
| x_precedent = posx; | |
| } | |
| void setup() { | |
| tft.begin(); // démarrage de l'affichage à l'écran. | |
| if (!ts.begin()) { // démarrage du capteur tactile | |
| Serial.println("Probleme de demarrage du touch screen controller"); | |
| while (1); | |
| } | |
| tft.fillScreen(ILI9341_BLACK); // on remplit tout l'écran d'un fond noir | |
| tft.setRotation(1); //mode paysage | |
| dessineContenu(x_precedent); | |
| analogWrite(sortiePWM, 127); // pwm de départ à 50% | |
| } | |
| void loop() { | |
| uint16_t x, y, z1, z2; | |
| // captage de la position touchée sur l'écran: | |
| if (ts.read_touch(&x, &y, &z1, &z2) && (z1 > TS_MIN_PRESSURE)) { | |
| if (y < TS_MINY) { | |
| y = TS_MINY; | |
| } | |
| if (y > TS_MAXY) { | |
| y = TS_MAXY; | |
| } | |
| // x = map(x, TS_MINX, TS_MAXX, 0, tft.height()); | |
| x = map(y, TS_MINY, TS_MAXY, 0, tft.width()); | |
| // on ne permet pas que le bouton dépasse les limites de la glissière | |
| if (x < LIMITE_GAUCHE) { | |
| x = LIMITE_GAUCHE; | |
| } | |
| if (x > LIMITE_DROITE) { | |
| x = LIMITE_DROITE; | |
| } | |
| if (abs(x - x_precedent) > 2) { // pour que le bouton ne soit pas trop nerveux | |
| dessineContenu(x); | |
| // réglage du rapport cyclique de la broche 6 (0 - 255): | |
| analogWrite(sortiePWM, round(2.55 * (x - LIMITE_GAUCHE) / ( LIMITE_DROITE - LIMITE_GAUCHE) * VALEUR_MAX)); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment