You are browsing as a guest. Sign up (or log in) to start making projects!

kdenis

@kdenis

Joined August 4th, 2026

  • 9Devlogs
  • 1Projects
  • 1Ships
  • 18Votes
Ship

What did you make?

I built a DIY mini handheld console powered by an Arduino Nano! My main goal was to dive into embedded systems development and get hands-on experience with hardware and C++. Because of this, I focused on core functionality rather than super complex games.

When you turn it on, you’re greeted with a scrolling “mini console” text, followed by a game selection menu. During gameplay, pressing the designated pause button opens a pause menu where you can either resume (saving your current progress) or exit to the main menu. I included two games: Snake and Flappy Bird.

What was challenging?

Generating non-blocking audio feedback was definitely the hardest part. I implemented button click sounds using PWM to control the volume, which took a lot of time to tune since working with audio signals is trickier than controlling a motor. It required pseudo-multitasking using millis() to keep the gameplay smooth while playing sounds.

Also, in Snake, I initially didn’t use a grid-based movement system and implemented pixel-by-pixel movement instead. Because of this, collision detection with food can occasionally miss.

What are you proud of?

I’m really proud of the software architecture and code structure in several parts of the project. I focused on clean OOP principles, solid encapsulation, and clear code organization (though a few spots are still a bit messy!). I’m also proud that i didn’t use delay funtion and of my Settings.h file

What should people know so they can test your project?

To test or build it, you just need to know how to connect the display and buttons to an Arduino Nano. Inside the Settings.h file, you can easily customize pin configurations, volume, colors, display sizes, and game speeds. I also added comments throughout the codebase to make it easy to follow along!

  • 9 devlogs
  • 28h
Try project → See source code →
Open comments for this post

2h 53m 42s logged

DevLog №9

###What’s New

  • Walls & Pipes Mechanics: Added moving wall obstacles.
  • Score Counter: Integrated a score tracking system.

###How It Works

  • Score Logic: To keep things simple and efficient, the score increases automatically whenever a wall reaches the left edge of the screen.
  • Illusion of Movement: The bird stays in place while the walls continuously cycle and reset from the right edge back to the left. This creates a smooth side-scrolling illusion!

It was a fairly straightforward feature to implement, but it instantly made the project feel much more like a complete game!

0
0
2
Open comments for this post

2h 54m 12s logged

Devlog №8

Bird Physics & Rendering

  • Flicker-Free Rendering

    To prevent screen flickering caused by redrawing the entire screen, I optimized the loop by clearing only the bird’s exact position before rendering its new frame.

  • Physics Implementation

    Movement relies on both velocity and acceleration:

    • Acceleration continuously increases the downward velocity (gravity).
    • Jump mechanic resets the downward velocity to initial on every input.

Next Steps: Wall Generation

  • Obstacle Setup

    I need to create an array of one dynamic wall.

  • Recycling Logic

    • As soon as a wall reaches the left edge of the screen, it will wrap around to the right.
    • The height/position will randomize each time it reappears to form a continuous level.
2
0
21
Open comments for this post

42m 6s logged

Devlog №6

Today I quickly set up the startup text so it scrolls smoothly, and that’s pretty much it. Nothing complicated, really—took me literally half an hour.
Next up: finish tuning the PWM to quiet down the audio, and then I’ll probably work on making a more interesting splash screen.

0
0
13
Open comments for this post

8h 38m 11s logged

Devlog №5

I added sound effects for every button press on my mini-console! Sounds like a super quick and easy task, right? Well, it should have been. But a few architectural bumps in the road ended up eating way more time than expected.


What went wrong (and how I fixed it)

  1. Hardware Pin Conflict:

    My buzzer was originally soldered to a pin used by SPI. As soon as the display initialized, things went sideways.

  2. Game Loop vs. Main Loop Architecture:

    My game logic was running inside an infinite loop within a standalone function, while the sound playback logic lived in the main loop calling that function.

Solution: soldered the buzzer to another pin and quick architecture refactor solved both problems pretty easily — I spent about an hour on each issue.


The Biggest Problem: A very loud buzzer remains the biggest and unsolved issue.

I tried to tame it in software using PWM (Pulse Width Modulation) to decrease the volume. But PWM control is tricky on its own, and since the buzzer relies on a fixed frequency to generate tone, layering custom PWM over it completely broke the audio pitch.


Next Up:

  • Implement smooth scrolling text for the console startup screen.
  • Conquer this cursed PWM/volume issue once and for all.
  • Start writing a Flappy Bird clone
0
0
8
Open comments for this post

3h 54m 33s logged

DevLog №4

 
What’s New
Pause Menu Implemented: Players can now pause the game at any time with two options:
-> Continue: Return to the game with all current progress intact.
-> Exit to Menu: Quit to the main menu (resets all game progress).
 
Technical Challenges
The main challenge was handling this within my current architecture, which relies on a main loop with a nested switch statement for state management. I needed a reliable way for these states to communicate and handle game object lifecycles properly:
-> Persisting Objects: Retaining game objects in memory when resuming from pause.
-> Cleaning Up: Safely destroying objects and resetting state when returning to the main menu (either voluntarily or on Game Over).
 
Next Goals
-> Add sound effects using the built-in piezo buzzer.
-> Implement a new mini-game: Flappy Bird.

0
0
21
Open comments for this post

3h 27m 20s logged

DevLog №3 :
What I worked on: Started implementing the Pause state during gameplay. To make this work properly, the game needs to preserve the current state of both the Snake and Food objects when transitioning into pause and back. Slightly refactored the main loop architecture and updated the SnakeGameHandle function.

The Struggle: decided to write a helper function to update values inside my StateMachine (handling states like Game, Menu, Pause, Snake, FlappyBird).Blaming it on late-night fatigue, I wrote the function in the most overcomplicated way possible… and called it even worse.

The result? Every time I exited the Snake game, I was greeted by a blank black screen because the Menu state was never getting assigned correctly.
I spent over an hour staring at the code, completely stumped as to why it was breaking.

I think it happened because of self-assignment

The Fix: Decided to get some sleep. Woke up the next morning with a fresh head and fixed the black screen issue in 20 minutes.

Next Goal: Finish up the Pause feature completely

0
0
131
Open comments for this post

1h 27m 17s logged

devlog #2:
added StateHandle file to handle all the actions(menu, games) in my main loop in main.cpp. Now my main loop is shorter and more understandable

0
0
19
Open comments for this post

3h 10m 33s logged

Devlog #1:
I uploaded all the files I had written before I found out about Hack Club. After that, I spent most of my time figuring out how to detect collisions between the snake and the food. Since I originally built everything pixel-by-pixel instead of using a grid system, comparing screen positions directly required too many pixel checks. To optimize this and avoid checking every single pixel pair, I had to tweak the logic. Even though it was tricky to adjust without a strict grid, the collision detection is working now and the game is totally playable

0
0
36

Followers

Loading…