Community project

Joystick LCD Counter

Photo of Joystick LCD Counter
Generated with AI

Mohamed Mediouni

Published September 21, 2026

This project builds a simple counter display using an Arduino Uno, a 16×2 LCD screen, and a joystick module. Move the joystick up or down to increment the counter, and press the joystick button to reset it to zero. The counter value updates in real-time on the LCD display.

The guide provides a complete wiring diagram showing how to connect the HD44780-compatible LCD, KY-023 joystick module, and supporting components to the Arduino. Assembly steps cover powering up the display, adjusting contrast with a potentiometer, connecting all data lines, and verifying connections before final power-on. Firmware code and a parts list are included.

Wiring diagram

Wiring diagram for Joystick LCD Counter
Loading diagram…

Gather all the parts

QtyComponent
1

LCD 16×2 compatible HD44780

16×2

Un écran à deux lignes qui affiche le compteur.

1

KY-023 Dual Axis Joystick Module

KY-023

Dual-axis analog joystick breakout (PSP/PS2-style thumbstick) with two perpendicular 10 kOhm potentiometers and an integrated push-button. Outputs analog voltages on VRx and VRy proportional to stick position, plus an active-low digital switch (SW) that is pulled LOW when the stick is pressed. Operates 3.3 V to 5 V; on 5 V boards the VRx/VRy swing matches the wider ADC range. SW should be read with INPUT_PULLUP.

1

10kΩ Potentiometer

10 kΩ

A 3-terminal passive resistive voltage divider with a total resistance of 10kΩ. One end connects to 5V, the other to GND, and the wiper outputs a variable voltage between 0V and 5V.

1

Resistor

220 Ω

Through-hole resistor (current-limiting in series with an LED)

Assemble it in 6 steps

1. Placez les pièces sans alimentation

Posez l’Arduino Uno, l’écran LCD 16×2, le module joystick KY-023, le potentiomètre de 10 kΩ et la résistance de 220 Ω sur la plaque d’essai. Gardez le câble USB débranché pendant tous les branchements.

  • Repérez le repère « 1 » ou la première broche de l’écran : elle est habituellement du côté gauche quand vous regardez les caractères.
  • L’écran et le joystick doivent partager les mêmes lignes 5V et GND de la plaque d’essai.
  • Ne branchez pas l’USB pendant le câblage : un fil placé au mauvais endroit peut créer un court-circuit.

2. Alimentez l’écran et réglez son contraste

Reliez VSS de l’écran à GND et VDD à 5V (alimentation). Reliez RW à GND pour que l’écran reçoive uniquement des écritures. Sur le potentiomètre 10 kΩ, reliez une patte extérieure à 5V, l’autre patte extérieure à GND et la patte centrale à V0 de l’écran (réglage du contraste).

  • Si aucun caractère n’est visible après la mise sous tension, tournez doucement la molette du potentiomètre : elle règle le contraste.
  • Les deux pattes extérieures du potentiomètre peuvent être inversées ; cela change seulement le sens de rotation.
  • Ne reliez pas VDD à GND : l’alimentation inversée peut endommager l’écran.

3. Branchez les fils de données de l’écran

Reliez RS de l’écran à D12 (commande), EN à D11 (validation), D4 à D5 (données), D5 à D4 (données), D6 à D3 (données) et D7 à D2 (données). Les broches D0 à D3 de l’écran ne sont pas utilisées dans ce montage à quatre fils de données.

  • Les noms D4 à D7 près de l’écran ne correspondent pas aux numéros des broches Arduino : suivez chaque paire écrite dans cette étape.
  • Utilisez des fils de couleurs différentes pour les six fils de commande et de données afin de pouvoir les vérifier facilement.
  • Un seul fil de données décalé d’une broche peut faire apparaître des caractères illisibles, sans forcément abîmer l’écran.

4. Allumez le rétroéclairage de l’écran

Reliez 5V à une patte de la résistance 220 Ω, puis l’autre patte de la résistance à LED+ de l’écran (protection du rétroéclairage). Reliez LED− de l’écran à GND (retour).

  • La résistance n’a pas de sens : ses deux pattes sont interchangeables.
  • La résistance doit être en série entre 5V et LED+ ; ne reliez pas LED+ directement au 5V.
  • Sans la résistance de 220 Ω, le rétroéclairage peut recevoir trop de courant et être endommagé.

5. Branchez le joystick

Reliez VCC du joystick à 5V (alimentation), GND à GND (ground), VRy à A1 (signal haut/bas), VRx à A0 (signal horizontal non utilisé par le programme) et SW à D8 (bouton de remise à zéro).

  • Le programme utilise seulement le mouvement haut/bas ; le fil VRx vers A0 est présent pour raccorder complètement le module mais ne modifie pas le compteur.
  • Le bouton intégré au joystick fonctionne quand vous appuyez verticalement sur le manche.
  • Assurez-vous que VCC et GND ne sont pas inversés : une alimentation inversée peut endommager le module.

6. Vérifiez puis alimentez le montage

Vérifiez une dernière fois les lignes 5V et GND, puis branchez l’Arduino Uno à l’ordinateur avec son câble USB. L’écran doit afficher « Compteur: » puis « Valeur: 0 ». Poussez le joystick vers le haut ou le bas, ramenez-le au centre entre deux mouvements, et appuyez dessus pour revenir à zéro.

  • Si l’écran est éclairé mais vide, réglez d’abord la molette de contraste.
  • Le programme est déjà associé au montage : utilisez le bouton Deploy de Schematik pour le compiler et le téléverser.
  • Si l’écran chauffe, débranchez immédiatement l’USB et vérifiez surtout VDD, VSS, LED+ et LED−.

Review all connections

1. Connections between "lcd_16x2" and "Arduino"

Functionlcd_16x2Arduino
groundVSSGND
powerVDD5V
analogV0 → 10kΩ Potentiometer Wiper (middle)EXT
digitalRSGPIO 12
groundRWGND
digitalENGPIO 11
digitalD4GPIO 5
digitalD5GPIO 4
digitalD6GPIO 3
digitalD7GPIO 2
groundLED-GND

2. Connections between "joystick" and "Arduino"

FunctionjoystickArduino
powerVCC5V
groundGNDGND
adcVRxGPIO 14
adcVRyGPIO 15
digitalSWGPIO 8

3. Connections between "contrast_pot" and "Arduino"

Functioncontrast_potArduino
powerEnd1 (VCC side)5V
groundEnd2 (GND side)GND

4. Connections between "backlight_resistor" and "Arduino"

Functionbacklight_resistorArduino
powerP15V
digitalP2 → LCD 16×2 compatible HD44780 LED+EXT

Deploy the firmware

#include <Arduino.h>
#include <LiquidCrystal.h>

// LCD: RS, EN, D4, D5, D6, D7

// Forward declarations
void afficherCompteur();

const uint8_t LCD_RS = 12;
const uint8_t LCD_EN = 11;
const uint8_t LCD_D4 = 5;
const uint8_t LCD_D5 = 4;
const uint8_t LCD_D6 = 3;
const uint8_t LCD_D7 = 2;
LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7);

const uint8_t JOYSTICK_Y_PIN = A1;
const uint8_t JOYSTICK_SW_PIN = 8;

const int SEUIL_HAUT = 300;
const int SEUIL_BAS = 700;

int compteur = 0;
bool joystickHorsCentre = false;
bool boutonEtaitAppuye = false;
int derniereValeurAffichee = 32767;

void afficherCompteur() {
  if (compteur == derniereValeurAffichee) {
    return;
  }

  lcd.setCursor(0, 1);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("Valeur: ");
  lcd.print(compteur);
  derniereValeurAffichee = compteur;
}

void setup() {
  lcd.begin(16, 2);
  pinMode(JOYSTICK_SW_PIN, INPUT_PULLUP);

  lcd.setCursor(0, 0);
  lcd.print("Compteur:");
  afficherCompteur();
}

void loop() {
  const int yVal = analogRead(JOYSTICK_Y_PIN);
  const bool boutonAppuye = digitalRead(JOYSTICK_SW_PIN) == LOW;

  // A press resets once; holding the stick down does not repeatedly reset it.
  if (boutonAppuye && !boutonEtaitAppuye) {
    compteur = 0;
    afficherCompteur();
  }
  boutonEtaitAppuye = boutonAppuye;

  // Count once when the stick first leaves its central zone.
  if (!joystickHorsCentre) {
    if (yVal < SEUIL_HAUT) {
      compteur++;
      joystickHorsCentre = true;
      afficherCompteur();
    } else if (yVal > SEUIL_BAS) {
      compteur--;
      joystickHorsCentre = true;
      afficherCompteur();
    }
  } else if (yVal >= SEUIL_HAUT && yVal <= SEUIL_BAS) {
    joystickHorsCentre = false;
  }

  delay(50);
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace, diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik