A handheld guessing game built on an Arduino Uno. Pick a difficulty, punch in a guess on the keypad, and chase the hidden number while the 16×2 LCD teases you with “Too High” and “Too Low.” Dial in the screen with a potentiometer, and flip pages with the IR remote’s up & down buttons.
Everything runs off a single Arduino Uno. Here’s what’s on the board and which pins it talks to.
The HD44780 display driven by LiquidCrystal. Shows prompts, your guess, and feedback.
Twists the LCD contrast pin so the characters stay crisp under any lighting.
Scanned manually as a matrix — digits to guess, * to clear, # to submit.
Reads NEC codes from the remote. Only ▲ / ▼ are used — to page the display.
Beeps for wrong guesses and plays a little victory jingle when you nail it.
The brain. Holds the game logic, the keypad scanner and the IR decoder all at once.
A floating analog pin feeds noise into randomSeed() so every game differs.
A Game page and an Info page. The remote flips between them — no extra wiring.
The full breadboard layout from our build. Click the image to open it full-size.
⤢ click to zoom
Powered over USB · the controller
8 lines into D13–D8 & D7/D6/A1/A0
RS 12 · E 11 · D4–D7 → 5/4/3/2
Wiper → LCD V0 contrast pin
Signal on A2 · sound feedback
Signal on A3 · ▲▼ navigation
Four quick beats from boot to bragging rights.
Press A, B, C or D to set the range. The LCD confirms it.
Use the keypad digits. Hit * to clear a mistake before you commit.
The board says Too High, Too Low, or Correct! — and buzzes to match.
Press the remote’s ▼ to see the current max, ▲ to jump back to the game.
Every new round rolls the dice. Rarely, the machine drags you somewhere far worse.
An ominous three-note sting plays, the screen flashes a warning, and the range explodes to one hundred thousand.
A long, dread-soaked drone announces it. Ten million possibilities. Good luck finding the way out.
Written for the Arduino IDE. Manual keypad scanning and a modern IRremote.hpp decoder keep it stable in simulation and on real hardware.
⤢ scroll to read · click to enlarge
The sketch is split into small, single-purpose functions. Here’s the tour.
Scans the 4×4 keypad by hand — driving each row low and reading the columns with internal pull-ups. Replaces Keypad.h entirely to avoid library crashes in simulation. Returns the pressed key, or 0.
Decodes NEC remote signals and maps each command to a key. The up arrow becomes 'U' and the down arrow 'X' — the only two buttons the game actually listens to.
Redraws the LCD for whatever page you’re on — the difficulty menu, the live guessing screen with your input buffer, or the Info page showing the current max.
A blocking loop at boot that waits for A/B/C/D, sets the number range, and flashes a quick “Range Set” confirmation before the first round begins.
Rolls for the secret modes, sets the active maximum, picks a fresh random target, clears your input and resets to the game page.
The heartbeat: read a key (keypad first, then IR), handle page navigation, append digits, clear on *, and judge the guess on # with the right sound and message.
A bright ascending arpeggio on the piezo buzzer — the reward for a correct guess before the next round spins up.
The dramatic stingers that announce the Impossible and Backrooms modes — short tone sequences paired with a flashing on-screen warning.
Three people, one breadboard, far too many “Too High” beeps.