ArduinoHMI is an open-source project that transforms your Raspberry Pi into a dynamic Human-Machine Interface (HMI) for your Arduino. It establishes a bidirectional communication bridge, allowing the Arduino to define and control a graphical user interface (GUI) on the Raspberry Pi, and receive real-time callbacks from user interactions.
This project enables you to build complex, interactive interfaces on a powerful platform (Raspberry Pi) while keeping the control logic simple and encapsulated on your microcontroller (Arduino).
✨ Features Dynamic UI Rendering: The Arduino sends a JSON-based UI definition to the Raspberry Pi, which dynamically creates the corresponding Tkinter widgets.
Bidirectional Communication: Supports sending data from the Arduino to the Pi (UI definitions, updates) and receiving user-interaction callbacks from the Pi.
Configurable Connection: A modern startup menu allows users to easily configure serial port settings (port, baud rate, data bits, parity, stop bits) without touching the code.
Interactive Components: Includes support for dynamic labels, buttons, and textboxes.
Inactivity Screensaver: A built-in screensaver with a bouncing logo helps to conserve power and adds a polished touch to the application.
🚀 Installation Follow these steps to set up the ArduinoHMI software on your Raspberry Pi.
Step 1: Install Python Libraries Make sure your Raspberry Pi has Python installed (it's usually pre-installed). You'll need the pyserial and ArduinoJson libraries.
Bash
sudo apt-get update sudo apt-get install python3 python3-pip pip3 install pyserial Step 2: Set up the Arduino Library Download the ArduinoHMI library for your Arduino IDE.
Open your Arduino IDE.
Go to Sketch > Include Library > Manage Libraries....
Search for ArduinoJson and install the latest version.
Copy the ArduinoHMI.h and ArduinoHMI.cpp files from this repository's ArduinoHMI/ directory into a new folder named ArduinoHMI in your Arduino libraries folder. This is typically located at ~/Documents/Arduino/libraries/.
Step 3: Copy the Python Code Copy the entire ArduinoHMI.py file to your Raspberry Pi. You can do this using scp, a USB drive, or by simply creating a new file on the Pi and pasting the code.
- Arduino Sketch The Arduino is the "brain" of your HMI. Use the ArduinoHMI library to define and send the user interface.
#include "ArduinoHMI.h"
// Create an instance of the library
ArduinoHMI ui;
// Callback function for a button click
void onButtonClick(int id, const char* value) {
// A simple print statement
Serial.println("Button clicked!");
// Update a label
ui.updateLabel(1, "Button clicked!");
}
// Callback function for textbox changes
void onTextBoxChange(int id, const char* value) {
// Read the value from the textbox
Serial.print("Textbox content: ");
Serial.println(value);
}
void setup() {
// Initialize the communication
ui.begin(9600);
// Define the UI layout with specific positions
ui.addLabel(1, "Enter a command:", 20, 20);
ui.addTextBox(2, "Default Text", onTextBoxChange, 180, 20, 150, 30);
ui.addButton(3, "Submit", onButtonClick, 180, 70, 100, 30);
// Send the UI definition to the Raspberry Pi
ui.sendUI();
}
void loop() {
// Process incoming callbacks from the Raspberry Pi
ui.handleSerial();
}
Upload this sketch to your Arduino.
- Raspberry Pi Software On your Raspberry Pi, you need a simple script to run the HMI application. Create a file named main.py in the same directory as arduinoui.py.
Python
from arduinoui import ArduinoUI
# Set a default serial port for your Raspberry Pi
# Linux/macOS: '/dev/ttyACM0' or '/dev/ttyUSB0'
# Windows: 'COM3'
DEFAULT_PORT = '/dev/ttyACM0'
# Create an instance of the HMI application
ui_app = ArduinoUI(default_port=DEFAULT_PORT)
# Start the application. The configuration menu will appear first.
ui_app.start()Run the application with:
python3 main.pyA window will pop up, allowing you to select your serial port and connect to the Arduino.
