KRYONOS
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 GPIO 21).
    • sclPin (Integer, optional): Serial Clock pin (defaults to GPIO 22).
    • frequency (Integer, optional): Clock frequency in Hz (default 100000 for Standard Mode, 400000 for Fast Mode).
  • Returns: Boolean (true if bus successfully started).

I2C.scan()

Scans the entire 7-bit address range (0x01 to 0x7F) and returns detected peripheral addresses.

  • Parameters: None
  • Returns: Array of 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 -1 on 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: Array of byte integers or null on 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 (Array of 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));
}

On this page