Community project

Joystick LCD Counter

Arduino
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

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
analogV010kΩ 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
digitalP2LCD 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