Example Code for Arduino-I2C Mode
Last revision 2025/12/18
This example is the ultrasonic passive measurement distance and the temperature of the module.
Hardware Preparation
- Name: Arduino Leonardo, Model/SKU: , Quantity: 1, Purchase Link: https://www.dfrobot.com/product-832.html
- Name: USB Data Cable, Model/SKU: , Quantity: 1, Purchase Link:
Software Preparation
- Development tools: Arduino IDE
Wiring Diagram

Other Preparation Work
Switch the sensor to I2C mode by short-circuiting pin TRIG and ECHO before powering on.
Sample Code
/*!
Download this demo to test config to URM13, connect sensor through IIC interface
Data will print on your serial monitor
This example is the ultrasonic passive measurement distance and the temperature of the module.
Copyright [DFRobot](http://www.dfrobot.com), 2018
Copyright GNU Lesser General Public License
version V1.0
date 21/08/2020
*/
#include <Wire.h>
typedef enum {
eAddr = 0,
ePid,
eVid,
eDistanceH ,
eDistanceL,
eInternalTempretureH,
eInternalTempretureL,
eExternalTempretureH,
eExternalTempretureL,
eConfig,
eCmd,
eNoise,
eSensitivity,
eRegNum
} regindexTypedef;
#define MEASURE_RANGE_BIT ((uint8_t)0x01 << 4)
#define MEASURE_MODE_BIT ((uint8_t)0x01 << 2)
#define TEMP_CPT_ENABLE_BIT ((uint8_t)0x01 << 1)
#define TEMP_CPT_SEL_BIT ((uint8_t)0x01 << 0)
#define IIC_SLAVE_ADDR ((uint8_t)0x12)
#define isSensorBusy() (digitalRead(busyPin))
int16_t busyPin = 4;
/*
@brief Write data to register of client
@param addr : Address of Client
@param regIndex: Reg index
@param pDataBuf: point to data buffer
@param dataLen: data length
*/
void i2cWriteBytes(uint8_t addr, regindexTypedef regIndex , uint8_t *pDataBuf, uint8_t dataLen )
{
Wire.beginTransmission(addr); // transmit to device
Wire.write(regIndex); // sends one byte
for (uint8_t i = 0; i < dataLen; i++) {
Wire.write(*pDataBuf);
pDataBuf++;
}
Wire.endTransmission(); // stop transmitting
}
/*
@brief Read data from register of client
@param addr : Address of Client
@param regIndex: Reg index
@param pDataBuf: point to data buffer
@param dataLen: data length
*/
void i2cReadBytes(uint8_t addr, regindexTypedef regIndex , uint8_t *pDataBuf, uint8_t dataLen )
{
unsigned char i = 0;
Wire.beginTransmission(addr); // transmit to device #8
Wire.write(regIndex); // sends one byte
Wire.endTransmission(); // stop transmitting
Wire.requestFrom(addr, dataLen);
while (Wire.available()) { // slave may send less than requested
pDataBuf[i] = Wire.read();
i++;
}
}
uint8_t cfg = 0, cmd = 0;
uint8_t rxBuf[100] = {0};
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // join i2c bus (address optional for master)
pinMode(busyPin, INPUT);
cfg &= ~MEASURE_RANGE_BIT;//clear bit4,long-range ranging mode
//cfg |= MEASURE_RANGE_BIT;//set bit4,short-range ranging mode
cfg |= MEASURE_MODE_BIT;//Set bit2,i2c passive mode
//cfg &= ~MEASURE_MODE_BIT;//clear bit2 , set to Automatic ranging mode
cfg &= ~TEMP_CPT_ENABLE_BIT;//clear bit1,enable temperature compensation
//cfg |= TEMP_CPT_ENABLE_BIT;//set bit1,disable temperature compensation
cfg &= ~TEMP_CPT_SEL_BIT;//clear bit0,select internal temperature compensation
//cfg |= TEMP_CPT_SEL_BIT;//set bit0,select external temperature compensation
i2cWriteBytes(IIC_SLAVE_ADDR, eConfig , &cfg, 1 );
delay(100);
}
void loop() {
int16_t dist, temp;
cmd |= 0x01;//Set trig bit
i2cWriteBytes(IIC_SLAVE_ADDR, eCmd , &cmd, 1 );//Write command register
//You can replace the delay with these two lines of code
//while(isSensorBusy()== HIGH); //Wait for the sensor to start ranging
//while(isSensorBusy()== LOW); //Wait for sensor ranging to complete
delay(100);//delay 100ms
i2cReadBytes(IIC_SLAVE_ADDR, eDistanceH, rxBuf, 2 ); //Read distance register
dist = ((uint16_t)rxBuf[0] << 8) + rxBuf[1];
delay(10);
i2cReadBytes(IIC_SLAVE_ADDR, eInternalTempretureH, rxBuf, 2 ); //Read the onboard temperature register
temp = ((uint16_t)rxBuf[0] << 8) + rxBuf[1];
Serial.print(dist, DEC);
Serial.print("cm");
Serial.print("------");
Serial.print((float)temp / 10, 1);
Serial.println("℃");
}
Result

Was this article helpful?
