VPayEZ
VPayEZ was a cashless payment system for coin-operated equipment that I took from concept through production deployment. The system was deployed on more than 500 machines across 32 sites in 5 states.

I designed and developed the cloud services, the embedded-device, firmware, Android and iOS applications, administration tools, website, and supporting infrastructure. Technologies included Java, Spring Boot, Spring Security, C++, Flutter, Dart, PHP, MySQL, AWS, WebSockets, RFID, NFC, HCE, Square, KiCAD, Eagle, and Onshape.
To use a coin-operated machine, a customer used the mobile app to scan an RFID/NFC tag on it. The app then sent the tag identifier to the server, which verified the customer's account balance and the machine's status. If all was in good standing, it told the embedded controller to trigger the machine's coin mechanism.
Cloud Server
The cloud server handled customer accounts, transactions, payments, embedded-device communication, configuration, tracking, and monitoring.
I developed the server using Java and Spring Boot. Payment processing was integrated with Square. The mobile applications communicated with it through REST APIs, while embedded controllers maintained persistent WebSocket connections for real-time communications.
Authentication and authorization were implemented using Spring Security and revocable bearer tokens.
Embedded Device
Each machine contained a custom embedded controller, which was based on an ESP32 mounted on a custom PCB I designed. Production boards were manufactured with the surface-mount components already populated, leaving only the power and 20-pin Molex connector to be added during final assembly.
The firmware was written in C++ and used WebSockets to maintain real time communication with the server. An LM339 comparator was used to monitor coin-input signals, and let the server know when coins were inserted. The controller could also trigger the coin mechanism based on input received from the server.
I also implemented over-the-air firmware updates, with certificate verification. New firmware could be remotely deployed, and rolled back if an update failed. I also utilized a watchdog timer to reset the controller if the device became unresponsive.
The original PCB was designed using Autodesk Eagle and was later migrated to KiCAD. I designed the enclosure in Onshape for 3D printing.
Mobile User Applications
I developed separate customer applications for Android and iOS.
The Android application was written in Java, while the iOS application was written in Swift. I initially evaluated Xamarin as a cross-platform option, but the applications relied heavily on native mobile APIs, and maintaining native implementations proved simpler.
The applications used RFID/NFC functionality to identify machines. After scanning the tag attached to a machine, the application communicated with the server to request authorization and trigger the coin mechanism.
Customers could also use the application to manage their account, add funds, and view information about the machine.
For both app stores, I produced demonstration videos showing how the application, cloud service, and physical equipment worked together and how customer funds were used within the system.
Administration Application
I later developed a separate administration application using Flutter and Dart to run on mobile and desktop devices. It was well suited for site operators and support personnel.
The admin app could scan a machine's RFID tag and display information such as device status, transaction activity, and usage statistics. This let site operators know what to expect when reconciling a machine.
Website
I developed the project's public website and content-management system using PHP. The site used Markdown for articles and provided a news feed consumed by the mobile applications, allowing announcements and other information to be published once and displayed within the apps.
The content system supported multiple languages, although only English was used in production.