Hardware & Peripherals
I2C TwoWire Bus & Sensors
I2C hardware bus master API for discovering devices, reading/writing registers, and interfacing with digital sensors in KryonOS.
I2C Hardware TwoWire Engine
The I2C (or System.i2c) global object provides master-mode I2C communication over hardware TwoWire buses on the ESP32.
Driver implementations and sensor adapters are hosted on the KryonOS GitHub Repository.
Bus Setup & Scanning
I2C.begin(sdaPin, sclPin, frequency)
Initializes the I2C master controller on selected pins.
- Parameters:
sdaPin(Integer, optional): Serial Data pin (defaults to GPIO21).sclPin(Integer, optional): Serial Clock pin (defaults to GPIO22).frequency(Integer, optional): Clock frequency in Hz (default100000for Standard Mode,400000for Fast Mode).
- Returns:
Boolean(trueif bus successfully started).
I2C.scan()
Scans the entire 7-bit address range (0x01 to 0x7F) and returns detected peripheral addresses.
- Parameters: None
- Returns:
Arrayof integer addresses found (e.g.[0x3C, 0x68]).
// Scan for connected sensors
I2C.begin(21, 22, 100000);
var devices = I2C.scan();
System.print("Found " + devices.length + " I2C devices:");
for (var i = 0; i < devices.length; i++) {
System.print(" - 0x" + devices[i].toString(16).toUpperCase());
}
Register Read / Write Operations
I2C.readByte(address, register)
Reads a single 8-bit unsigned byte from a specified sensor register.
- Parameters:
address(Integer): 7-bit device address.register(Integer): Target 8-bit register address.
- Returns:
Integer(0 to 255) or-1on bus error.
I2C.readBytes(address, register, length)
Reads a sequential burst of bytes starting from a sensor register.
- Parameters:
address(Integer)register(Integer)length(Integer): Number of bytes to read.
- Returns:
Arrayof byte integers ornullon failure.
I2C.writeByte(address, register, value)
Writes a single 8-bit byte to a device register.
- Parameters:
address(Integer)register(Integer)value(Integer, 0 to 255)
- Returns:
Boolean
I2C.writeBytes(address, register, dataArray)
Transmits multiple bytes to a device register.
- Parameters:
address(Integer)register(Integer)dataArray(Arrayof integers)
- Returns:
Boolean
Code Example: MPU-6050 Accelerometer Reader
var MPU_ADDR = 0x68;
var PWR_MGMT_1 = 0x6B;
var ACCEL_XOUT_H = 0x3B;
// 1. Initialize bus
I2C.begin(21, 22, 400000);
// 2. Wake MPU-6050 up from sleep mode
I2C.writeByte(MPU_ADDR, PWR_MGMT_1, 0x00);
// 3. Read raw 16-bit accelerometer axes
function readAccelerometer() {
var bytes = I2C.readBytes(MPU_ADDR, ACCEL_XOUT_H, 6);
if (!bytes) return null;
function toInt16(hi, lo) {
var val = (hi << 8) | lo;
return val > 32767 ? val - 65536 : val;
}
var rawX = toInt16(bytes[0], bytes[1]);
var rawY = toInt16(bytes[2], bytes[3]);
var rawZ = toInt16(bytes[4], bytes[5]);
// Scale factor for +/- 2g range (16384 LSB/g)
return {
x: rawX / 16384.0,
y: rawY / 16384.0,
z: rawZ / 16384.0
};
}
var accel = readAccelerometer();
if (accel) {
System.print("Accel G -> X: " + accel.x.toFixed(2) + ", Y: " + accel.y.toFixed(2) + ", Z: " + accel.z.toFixed(2));
}