Example Code for Arduino-UART Mode (Modbus Library)
Last revision 2025/12/18
This code tests the range finder function of the URM13 ultrasonic sensor
Hardware Preparation
- Name: Arduino Leonardo, Model/SKU: , Quantity: 1, Purchase Link: https://www.dfrobot.com/product-832.html (Since printing information needs a serial port, it is recommended to use device with two(or above) serial ports. Because Arduino Modbust takes up a lot of memory, it is suggested to use Arduino Mega2560 controller. )
- Name: USB Data Cable, Model/SKU: , Quantity: 1, Purchase Link:
Software Preparation
- Development tools: Arduino IDE
- Libraries: Open Library Manager(Ctrl+Shift+I) in Arduino IDE, find and install ArduinoModbus and ArduinoRS485 Libraries.
Wiring Diagram

Other Preparation Work
Install ArduinoModbus and ArduinoRS485 Libraries via Arduino IDE Library Manager.
Sample Code
/**************************************************************************************************************
This code tests the range finder function of the URM13 ultrasonic sensor
@ author : [email protected]
@ data : 21.08.2020
@ version: 1.0
**************************************************************************************************************/
#include <ArduinoModbus.h>
#include <ArduinoRS485.h>
#define SLAVE_ADDR ((uint16_t)0x0D)
#define TEMP_CPT_SEL_BIT ((uint16_t)0x01 << 0)
#define TEMP_CPT_ENABLE_BIT ((uint16_t)0x01 << 1)
#define MEASURE_MODE_BIT ((uint16_t)0x01 << 2)
#define MEASURE_TRIG_BIT ((uint16_t)0x01 << 3)
#define MEASURE_RANGE_BIT ((uint16_t)0x01 << 4)
typedef enum {
ePid,
eVid,
eAddr,
eComBaudrate,
eComParityStop,
eDistance,
eInternalTempreture,
eExternTempreture,
eControl,
eNoise,
eSensitivity
} eRegIndex_t; //Sensor register index
/*
*@brief Read data from holding register of client
*
*@param addr : Address of Client
*@param reg: Reg index
*@return data if execute successfully, false oxffff.
*/
uint16_t readData(uint16_t addr, eRegIndex_t reg)
{
uint16_t data;
if (!ModbusRTUClient.requestFrom(addr, HOLDING_REGISTERS, reg, 1)){
Serial.print("failed to read registers! ");
Serial.println(ModbusRTUClient.lastError());
data = 0xffff;
}else{
data = ModbusRTUClient.read();
}
return data;
}
/*
*@brief write data to holding register of client
*
*@param addr : Address of Client
*@param reg: Reg index
*@param data: The data to be written
*@return 1 if execute successfully, false 0.
*/
uint16_t writeData(uint16_t addr, eRegIndex_t reg, uint16_t data)
{
if (!ModbusRTUClient.holdingRegisterWrite(addr, reg, data)){
Serial.print("Failed to write coil! ");
Serial.println(ModbusRTUClient.lastError());
return 0;
}else
return 1;
}
int16_t dist;float temp;
volatile uint16_t cr = 0;
void setup() {
ModbusRTUClient.begin(19200);
Serial.begin(9600);
cr &= ~TEMP_CPT_SEL_BIT;//clear bit0, select internal temperature compensation
//cr |= TEMP_CPT_SEL_BIT;//set bit0,select external temperature compensation
cr &= ~TEMP_CPT_ENABLE_BIT;//clear bit1,enable temperature compensation
//cr |= TEMP_CPT_ENABLE_BIT; //set bit1,disable temperature compensation
cr |= MEASURE_MODE_BIT;//set bit2 , set to trigger mode
//cr &= ~MEASURE_MODE_BIT;//clear bit2 , set to Automatic ranging mode
cr &= ~MEASURE_RANGE_BIT;//clear bit4,long-range ranging mode
//cr |= MEASURE_RANGE_BIT; //set bit4,short-range ranging mode
writeData(SLAVE_ADDR, eControl, cr); //Writes the setting value to the control register
delay(100);
}
void loop() {
cr |= MEASURE_TRIG_BIT;//Set trig bit
writeData(SLAVE_ADDR, eControl, cr); //Write the value to the control register and trigger a ranging
delay(300);//Delay of 300ms(minimum delay should be greater than 100ms) is to wait for the completion of ranging
dist = readData(SLAVE_ADDR, eDistance);//Read distance register, one LSB is 1cm
delay(10);
temp = (float)readData(SLAVE_ADDR, eInternalTempreture) / 10.0;//Read tempreture register, one LSB is 0.1 ℃
Serial.print("dist = ");
Serial.print(dist);
Serial.print("cm---");
Serial.print("temp = ");
Serial.print(temp);
Serial.println(" ℃");
}
Result

Additional Information
It is recommended to use Arduino Mega2560 controller if Arduino Modbus takes up a lot of memory.
Was this article helpful?
