
An open source handheld device
Adafruit electronics combined with software to allow for a highly customizable device to tinker with.
Hardware used:

Hosted on:

Language used:

2.0″ 320 x 240px
Color LCD
8MB Flash + 2MB PSRAM
Onboard Storage and RAM
Dual Core, 240hz
ESP32 V2 Processor
WiFi + BLE
Connectivity
Project Overview:
This is my page for Hardware One. Its a concept that I have shaped overtime into something that I am finally satisfied with enough to show off.
Hardware One is a device built around the QT Py microcontroller. It combines a compact, battery-powered processor with accessible GPIO pins, with an integrated LCD display, and basic input controls (joystick + buttons). When assembled, a device which features an easily editable ‘OS’ becomes available.
The open source project provides foundational code for various hardware configurations that makers can use to build their own portable applications and devices.
This project is programmed with Arduino.
With the onboard GPIO you can use:
- I2C
- SPI
- UART
- PWM
- and more!
If necessary, GPIO Expanders can be used to increase the amount of devices that you can connect, but they’re not necessary for most.
The Hardware:
Required Modules:
There is a minimum set of required parts to run the system as intended.
Required Hardware:
Other Supported Modules:
Additional modules/parts can be added for increased functionality.
Options include:
- Adafruit QT Py Modules:
- Adafruit StemmaQT modules:
Customize your device:
With pre-planning, the hardware can be swapped to accommodate different use cases while on the go.
- After initial setup, where the code is uploaded to the Qt Py:
- Turn the device off
- Swap the old module(s) out / new module(s) in
- Turn the device back on
- Reconfigure without recompiling
- It will be ready to use
A stretch goal for the project is to make a way to update the firmware on the qt py without a PC, so this would enable the device to be even more flexible.
Personalize your device:
Aside from being able to print your enclosure with whatever color you’d like, you can also accent your device with Joystick Covers and (wip) Buttons to add another splash of color.

On-The-Go Hardware Swapping.
1) Swap in the new modules

2) Turn the device on by sliding the Power Switch up.

3) The device will take a few seconds to power on.

4) Select your attached modules, then select “Start”.

5) System ‘boots’, only allowing module compatible programs.

6) Use device.
The Software:
PCM
Persistent – Control – Menu
PCM is the ideology with which controls are going to be handled on this device. Since the physical buttons are unlabeled and all the same color, the user will need some form of guidance to know what options to select and which to not. This will be accomplished through the use of color / themes, consistent button utilization, and a visual element that will remain on the screen at all times. It will be located in the Status Bar at the top of the display.
image of pcm goes here
Ideals and Concepts
Overview
An interactive GUI, which boots into a prompt to have the user to select which modules to enable. From there, it will selectively display the available programs relative to the connected hardware.
For those that dont want to include any unnecessary code, or need to make space for additional custom code, you can navigate to the FOLDER NAME folder and remove the (this is a wip), then recompile the program and flash it to the QT Py.
GitHub
(may be private for now)
The Github features several things:
- An instructional startup guide
- Two ‘master programs’
- One for a system with no modules
- One for a system that is ‘fully loaded’
- Documentation on the modules
- Overview + Code snippets
- Documentation of the Libraries
Note: Without visuals, currently, this is all output to the Serial Console.
Commands for the required modules:
These are several sets of commands that enable the user to configure the devices basic settings. They are as follows:
- QT Py – 8Mb Flash 2Mb PSRAM
- Wifi Related Commands/Functions
- wifion – Toggle Wifi On
- wifioff – Toggle Wifi Off
- autoconnect – Toggle Wifi AutoConnect
- wificonnect – Connect to Wifi Network
- wifidisconnect – Disconnect from Wifi Network
- setssid <ssid> – Save SSID
- setpass <pass> – Save Password
- scanap – Scan for Nearby Access Points
- clearwifi – Clear Saved Wifi Credentials
- I2C Related Commands/Functions
- i2cspeed – Modify I2C Bus Speed
- i2creset – Reset I2C Bus
- i2cscan – Scan I2C Bus
- i2ccheck – Confirm health of select modules
- Time Related Commands/Functions
- synctime – Sync Time from an NTP server
- time – Display Time
- Wifi Related Commands/Functions
Commands for the optional modules:
These are commands that interact with the optional modules that can be connected.
- Gyro + Accelerometer –
- ‘gyro’ – Toggles Gyro output
- ‘accel’ – Toggles Accel. output
- Time of Flight Sensor –
- ‘distance’ – Toggles ToF output
- Gesture Sensor –
- ‘gesture’ – Toggles gesture output
- User Controls –
- With the lack of visuals, this is fairly useless in the serial console. As such, these are separate commands. Once it becomes integral I will switch it over to the ‘base software’ list and look at ways to improve it.
- ‘gamepad’ – Toggles gamepad output
- ‘joy’ – Toggles joystick output
Software to-do list:
I want to implement:
- Bluetooth keyboard connectivity
- GUI / Visuals
- Status Bar – PCM/Time/Bat Level/etc
- Settings Menu
- Splash Screen
- Application List Screen
- Configuration Screen
- Apps
- Games? You got games on your custom doodad?
- Battery Level
- Charge Percentage
- Charging Status
- USB Connection Status(?)
- Control Context Menu
- This will be dependant on the app / scene / menu
- Will feed into the PCM Display
- Battery Commands/Functions
- Gesture Sensor Input Aid
- Module/Setup Specific Help Commands
- There is no logic to spit out only commands that are relevant to the hardware configuration. I would like to implement this eventually, once I refactor the code to not be one giant program.
‘Stretch Goals’
These are things that I have no idea if I can implement, but think it would be cool if I did.
- 3D Graphics / Graphics Engine
- I have no plans to develop this myself. I would like to implement some sort of ‘demo environment’ to display the capabilities of the Adafruit QT PY. It wont be fast. It wont be snazzy. But it’ll be something to inspire future development.
- OTA Updates
- This should be possible, but it will be difficult to implement effectively as there is no way to only adjust one part of the code. I guess the best way to solve this would be to have a base ‘image’ (program) which features all the libraries and code necessary to run the basic system, and then feature some sort of system to download new programs to replace the existing program on the flash memory storage. The new programs would be specific to sets of hardware, instead of trying to create a separate program for each individual hardware combination.
Programs
These small programs utilize the onboard sensors as well as the various modules that can be connected. All code will be hosted on my GitHub at the link below.