A minimalist, efficient Arduino library for ultrasonic distance sensors with comprehensive unit support.
- 🎯 Multiple Units - Measure in cm, meters, mm, inches, yards, and miles
- ⚡ Resource Efficient - Only 8 bytes per sensor instance, ~940 bytes flash
- 🔧 Flexible Configuration - Support for both 3-pin and 4-pin sensors
- ⏱️ Configurable Timeout - Control maximum detection range
- 📦 Multiple Sensors - Use multiple sensors simultaneously without conflicts
- 📝 Comprehensive Documentation - Full VitePress documentation site with guides and examples
- 🔄 Backward Compatible - Seamless migration from v1.x
- 🎨 Modern C++ - Clean API with type-safe enums and const correctness
Quick links:
Run examples on Wokwi Arduino Simulator (free, browser-based):
HC-SR04 Arduino
-------------------------
VCC -> 5V
Trig -> Pin 12
Echo -> Pin 13
GND -> GNDSensor Arduino
-------------------------
VCC -> 5V
SIG -> Pin 13
GND -> GND- Open Arduino IDE
- Go to
Sketch > Include Library > Manage Libraries... - Search for:
MinimalUltrasonic - Find
Minimal Ultrasonic by fermeridamagni - Click
Install
- Download the latest release
- In Arduino IDE:
Sketch > Include Library > Add .ZIP Library... - Select the downloaded file
#include <MinimalUltrasonic.h>
// For HC-SR04 (4-pin): specify trigger and echo pins
MinimalUltrasonic sensor(12, 13);
// For Ping))) or Seeed (3-pin): specify only signal pin
// MinimalUltrasonic sensor(13);
void setup() {
Serial.begin(9600);
}
void loop() {
float distance = sensor.read(); // Returns distance in cm (default)
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
delay(1000);
}// Specify unit directly in read() call
float cm = sensor.read(MinimalUltrasonic::CM); // Centimeters (default)
float meters = sensor.read(MinimalUltrasonic::METERS); // Meters
float mm = sensor.read(MinimalUltrasonic::MM); // Millimeters
float inches = sensor.read(MinimalUltrasonic::INCHES); // Inches
float yards = sensor.read(MinimalUltrasonic::YARDS); // Yards
float miles = sensor.read(MinimalUltrasonic::MILES); // Miles
// Or set default unit
sensor.setUnit(MinimalUltrasonic::METERS);
float distance = sensor.read(); // Now returns meters// Configure timeout (max range)
sensor.setTimeout(40000UL); // Timeout in microseconds (~6.8m max)
sensor.setMaxDistance(680); // Or set by distance in cm
// Query current settings
unsigned long timeout = sensor.getTimeout();
MinimalUltrasonic::Unit unit = sensor.getUnit();// 3-pin sensor (Ping, Seeed)
MinimalUltrasonic(uint8_t sigPin, unsigned long timeOut = 20000UL)
// 4-pin sensor (HC-SR04)
MinimalUltrasonic(uint8_t trigPin, uint8_t echoPin, unsigned long timeOut = 20000UL)| Method | Description | Return Type |
|---|---|---|
read(Unit unit) |
Read distance in specified unit | float |
setTimeout(unsigned long) |
Set timeout in microseconds | void |
setMaxDistance(unsigned int) |
Set max distance in cm | void |
getTimeout() |
Get current timeout | unsigned long |
setUnit(Unit) |
Set default unit | void |
getUnit() |
Get current unit | Unit |
| Unit Enum | Description | Typical Use |
|---|---|---|
MinimalUltrasonic::CM |
Centimeters | General purpose (default) |
MinimalUltrasonic::METERS |
Meters | Long distances |
MinimalUltrasonic::MM |
Millimeters | High precision |
MinimalUltrasonic::INCHES |
Inches | Imperial system |
MinimalUltrasonic::YARDS |
Yards | Imperial system |
MinimalUltrasonic::MILES |
Miles | Very long distances |
The library includes comprehensive examples:
- UltrasonicSimple - Basic distance measurement
- Timeout - Configuring timeout for different ranges
- MultipleUltrasonicSensors - Using multiple sensors simultaneously
- AllUnits - Demonstrating all 6 measurement units
Access in Arduino IDE: File > Examples > MinimalUltrasonic
- Getting Started - First-time setup
- Basic Usage - Essential patterns
- Multiple Units - Working with different measurements
- Timeout Configuration - Adjusting range
- Multiple Sensors - Managing sensor arrays
- Error Handling - Robust error management
- Best Practices - Tips and techniques
- Optimization - Performance tuning
- Troubleshooting - Common issues and solutions
- Architecture - Library design and implementation
- Physics Background - How ultrasonic sensing works
- Unit Conversions - Conversion mathematics
- Performance - Benchmarks and optimization
- Compatibility - Board and sensor compatibility
- Memory: 8 bytes RAM per sensor instance
- Flash: ~940 bytes
- Speed: 6.1ms measurement @ 100cm
- Max Rate: 16 Hz safe (mixed range), up to 164 Hz @ 100cm
- Accuracy: ±3mm (sensor dependent)
- Range: 2cm to 400cm (HC-SR04)
- Power: <15mA peak, ~2mA idle
| Board | Status | Notes |
|---|---|---|
| Arduino Uno | ✅ Tested | Fully compatible |
| Arduino Nano | ✅ Tested | Fully compatible |
| Arduino Mega | ✅ Tested | Fully compatible |
| Arduino Leonardo | ✅ Compatible | Works perfectly |
| ESP32 | 3.3V logic | |
| ESP8266 | 3.3V logic | |
| Arduino Due | 3.3V logic |
See full compatibility guide →
| Sensor | Pins | Voltage | Range | Status |
|---|---|---|---|---|
| HC-SR04 | 4-pin | 5V | 2-400cm | ✅ Tested |
| Ping))) | 3-pin | 5V | 3-300cm | ✅ Tested |
| Seeed SEN136B5B | 3-pin | 3.3-5V | 3-400cm | ✅ Compatible |
| HY-SRF05 | 4-pin | 5V | 2-450cm | ✅ Compatible |
| US-100 | 4-pin | 5V | 2-450cm | ✅ Compatible |
Causes:
- Incorrect wiring
- Insufficient power supply
- No object in range
- Timeout too short
Solutions:
// Increase timeout
sensor.setTimeout(40000UL);
// Or set max distance
sensor.setMaxDistance(680); // 6.8 meters
// Check wiring and power supplyCauses:
- Electrical interference
- Unstable power
- Object too close/far or angled
Solutions:
// Add delay between readings
delay(30); // Minimum 30ms recommended
// Use filtering
float filtered = (lastReading * 0.7) + (newReading * 0.3);
// Check sensor mounting and object positionSolutions:
- Verify library is installed:
Sketch > Include Library > Manage Libraries - Check for typos in unit enum:
MinimalUltrasonic::CM(not justCM) - Ensure
#include <MinimalUltrasonic.h>is at top of sketch
- ✨ 6 measurement units (cm, m, mm, in, yd, mi)
- 🎯 Type-safe
Unitenum - 📝 Comprehensive VitePress documentation site
- 🔧
setUnit()andgetUnit()methods - 📊
setMaxDistance()for easier range configuration - 💡 Advanced examples with filtering and statistics
- ⚡ Optimized memory layout (12 → 8 bytes per instance)
- 🔄 Improved timeout handling
- 📖 Enhanced inline documentation with Doxygen
- 🎨 Modern C++ patterns (const correctness, delegation)
Most code works without changes! Key differences:
// v1.x - still works
float distance = sensor.read();
// v2.0 - new features
float meters = sensor.read(MinimalUltrasonic::METERS);
sensor.setUnit(MinimalUltrasonic::INCHES);MIT License - Copyright © 2025 fermeridamagni (Magni Development)
Based on the work of Erick Simões.
See LICENSE for full details.
Contributions are welcome! Please see CONTRIBUTING.md for:
- Code of Conduct
- Development setup
- Coding standards
- Pull request process
- 📖 Documentation: fermeridamagni.github.io/arduino-minimal-ultrasonic
- 🐛 Issues: GitHub Issues
- 💬 Discussions: GitHub Discussions
- 📧 Email: hello@magni.dev
If you find this library useful, please:
- ⭐ Star this repository
- 🐛 Report bugs and suggest features
- 📢 Share with the Arduino community
- 💝 Consider sponsoring
Made with ❤️ by Magni Development
Building better tools for the maker community.
