Skip to content

Instantly share code, notes, and snippets.

@ypelletier
Created August 13, 2025 18:20
Show Gist options
  • Select an option

  • Save ypelletier/e3446b8b47d7b094486ee6a6a7e61c13 to your computer and use it in GitHub Desktop.

Select an option

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.
/****************************************************************************
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