I2C serial bus access with Node.js
npm install i2c-bus




I2C serial bus access with Node.js on Linux boards like the Raspberry Pi
or BeagleBone. The i2c-bus API supports promises and async/await, asynchronous
callbacks and synchronous execution.
i2c-bus supports Node.js versions 10, 12, 14, 16, 18 and 20.
* Installation
* Usage
* API
* TypeScript Type Definitions
```
npm install i2c-bus
The way in which I2C is configured varies from board to board. Sometimes no
configuraton is required, but sometimes it is:
* Configuring I2C on the Raspberry Pi
* Configuring Software I2C on the Raspberry Pi
* Consider software I2C when there are issues communicating with a device on a Raspberry Pi
The example programs below show how to use a
MCP9808 I2C temperature sensor
to determine the temperature.
MCP9808 I2C temperature sensor connected to a Raspberry Pi

Determine the temperature with a MCP9808 I2C temperature sensor using
promises.
`js
const i2c = require('i2c-bus');
const MCP9808_ADDR = 0x18;
const TEMP_REG = 0x05;
const toCelsius = rawData => {
rawData = (rawData >> 8) + ((rawData & 0xff) << 8);
let celsius = (rawData & 0x0fff) / 16;
if (rawData & 0x1000) {
celsius -= 256;
}
return celsius;
};
i2c.openPromisified(1).
then(i2c1 => i2c1.readWord(MCP9808_ADDR, TEMP_REG).
then(rawData => console.log(toCelsius(rawData))).
then(_ => i2c1.close())
).catch(console.log);
`
Determine the temperature with a MCP9808 I2C temperature sensor using
promises, plain I2C and Buffer objects.
`js
const i2c = require('i2c-bus');
const MCP9808_ADDR = 0x18;
const TEMP_REG = 0x05;
const toCelsius = rawData => {
let celsius = (rawData & 0x0fff) / 16;
if (rawData & 0x1000) {
celsius -= 256;
}
return celsius;
};
const wbuf = Buffer.from([TEMP_REG]);
const rbuf = Buffer.alloc(2);
i2c.openPromisified(1).
then(i2c1 => i2c1.i2cWrite(MCP9808_ADDR, wbuf.length, wbuf).
then(_ => i2c1.i2cRead(MCP9808_ADDR, rbuf.length, rbuf)).
then(data => console.log(toCelsius(data.buffer.readUInt16BE()))).
then(_ => i2c1.close())
).catch(console.log);
`
Determine the temperature with a MCP9808 I2C temperature sensor using
asynchronous callbacks.
`js
const i2c = require('i2c-bus');
const MCP9808_ADDR = 0x18;
const TEMP_REG = 0x05;
const toCelsius = rawData => {
rawData = (rawData >> 8) + ((rawData & 0xff) << 8);
let celsius = (rawData & 0x0fff) / 16;
if (rawData & 0x1000) {
celsius -= 256;
}
return celsius;
};
const i2c1 = i2c.open(1, err => {
if (err) throw err;
i2c1.readWord(MCP9808_ADDR, TEMP_REG, (err, rawData) => {
if (err) throw err;
console.log(toCelsius(rawData));
i2c1.close(err => {
if (err) throw err;
});
});
});
`
Determine the temperature with a MCP9808 I2C temperature sensor using
synchronous methods.
`js
const i2c = require('i2c-bus');
const MCP9808_ADDR = 0x18;
const TEMP_REG = 0x05;
const toCelsius = rawData => {
rawData = (rawData >> 8) + ((rawData & 0xff) << 8);
let celsius = (rawData & 0x0fff) / 16;
if (rawData & 0x1000) {
celsius -= 256;
}
return celsius;
};
const i2c1 = i2c.openSync(1);
const rawData = i2c1.readWordSync(MCP9808_ADDR, TEMP_REG);
console.log(toCelsius(rawData));
i2c1.closeSync();
`
* Functions
* Class Bus
* Class PromisifiedBus
* Class I2cFuncs
- [open(busNumber [, options], cb)](#openbusnumber--options-cb)
- [openSync(busNumber [, options])](#opensyncbusnumber--options)
- [openPromisified(busNumber [, options])](#openpromisifiedbusnumber--options)
All methods in class Bus have asynchronous callback and synchronous forms. For
promise support see class PromisifiedBus.
The asynchronous callback form always take a completion callback as its last
argument. The arguments passed to the completion callback depend on the
method, but the first argument is always reserved for an exception. If the
operation was completed successfully, then the first argument will be null or
undefined.
When using the synchronous form any exceptions are immediately thrown. You can
use try/catch to handle exceptions or allow them to bubble up.
- Free resources
- bus.close(cb)
- bus.closeSync()
- Information
- bus.i2cFuncs(cb)
- bus.i2cFuncsSync()
- [bus.scan([startAddr,] [endAddr,] cb)](#busscanstartaddr-endaddr-cb)
- [bus.scanSync([startAddr,] [endAddr])](#busscansyncstartaddr-endaddr)
- bus.deviceId(addr, cb)
- bus.deviceIdSync(addr)
- Plain I2C
- bus.i2cRead(addr, length, buffer, cb)
- bus.i2cReadSync(addr, length, buffer)
- bus.i2cWrite(addr, length, buffer, cb)
- bus.i2cWriteSync(addr, length, buffer)
- SMBus
- bus.readByte(addr, cmd, cb)
- bus.readByteSync(addr, cmd)
- bus.readWord(addr, cmd, cb)
- bus.readWordSync(addr, cmd)
- bus.readI2cBlock(addr, cmd, length, buffer, cb)
- bus.readI2cBlockSync(addr, cmd, length, buffer)
- bus.receiveByte(addr, cb)
- bus.receiveByteSync(addr)
- bus.sendByte(addr, byte, cb)
- bus.sendByteSync(addr, byte)
- bus.writeByte(addr, cmd, byte, cb)
- bus.writeByteSync(addr, cmd, byte)
- bus.writeWord(addr, cmd, word, cb)
- bus.writeWordSync(addr, cmd, word)
- bus.writeQuick(addr, bit, cb)
- bus.writeQuickSync(addr, bit)
- bus.writeI2cBlock(addr, cmd, length, buffer, cb)
- bus.writeI2cBlockSync(addr, cmd, length, buffer)
- Promises
- bus.promisifiedBus()
All methods in class PromisifiedBus have the asynchronous promise form. For
asynchronous callback and synchronous forms see class Bus.
- Free resources
- promisifiedBus.close()
- Information
- promisifiedBus.i2cFuncs()
- [promisifiedBus.scan([startAddr,] [endAddr])](#promisifiedbusscanstartaddr-endaddr)
- promisifiedBus.deviceId(addr)
- Plain I2C
- promisifiedBus.i2cRead(addr, length, buffer)
- promisifiedBus.i2cWrite(addr, length, buffer)
- SMBus
- promisifiedBus.readByte(addr, cmd)
- promisifiedBus.readWord(addr, cmd)
- promisifiedBus.readI2cBlock(addr, cmd, length, buffer)
- promisifiedBus.receiveByte(addr)
- promisifiedBus.sendByte(addr, byte)
- promisifiedBus.writeByte(addr, cmd, byte)
- promisifiedBus.writeWord(addr, cmd, word)
- promisifiedBus.writeQuick(addr, bit)
- promisifiedBus.writeI2cBlock(addr, cmd, length, buffer)
- Asynchronous callbacks and synchronous execution
- promisifiedBus.bus()
- funcs.i2c
- funcs.tenBitAddr
- funcs.protocolMangling
- funcs.smbusPec
- funcs.smbusBlockProcCall
- funcs.smbusQuick
- funcs.smbusReceiveByte
- funcs.smbusSendByte
- funcs.smbusReadByte
- funcs.smbusWriteByte
- funcs.smbusReadWord
- funcs.smbusWriteWord
- funcs.smbusProcCall
- funcs.smbusReadBlock
- funcs.smbusWriteBlock
- funcs.smbusReadI2cBlock
- funcs.smbusWriteI2cBlock
Asynchronous open. Returns a new Bus object. The callback gets one argument (err).
The following options are supported:
- forceAccess - A boolean value specifying whether access to devices on the
I2C bus should be allowed even if they are already in use by a kernel
driver/module. Corresponds to I2C_SLAVE_FORCE on Linux. The valid values for
forceAccess are true and false. Optional, the default value is false.
Synchronous open. Returns a new Bus object.
The following options are supported:
- forceAccess - A boolean value specifying whether access to devices on the
I2C bus should be allowed even if they are already in use by a kernel
driver/module. Corresponds to I2C_SLAVE_FORCE on Linux. The valid values for
forceAccess are true and false. Optional, the default value is false.
Asynchronous open. Returns a Promise that, when resolved, yields a PromisifiedBus object.
The following options are supported:
- forceAccess - A boolean value specifying whether access to devices on the
I2C bus should be allowed even if they are already in use by a kernel
driver/module. Corresponds to I2C_SLAVE_FORCE on Linux. The valid values for
forceAccess are true and false. Optional, the default value is false.
Asynchronous close. Frees system resources used by this instance. The callback
gets one argument (err).
Synchronous close. Frees system resources used by this instance.
Determine functionality of the bus/adapter asynchronously. The callback gets
two argument (err, funcs). funcs is a frozen
I2cFuncs
object describing the functionality available.
See also I2C functionality.
Determine functionality of the bus/adapter Synchronously. Returns a frozen
I2cFuncs
object describing the functionality available.
See also I2C functionality.
bus.scan(cb) - scan for I2C devices in address range 0x03 through 0x77
bus.scan(addr, cb) - scan for an I2C device at address addr
bus.scan(startAddr, endAddr, cb) - scan for I2C devices in address range startAddr through endAddr
Scans the I2C bus asynchronously for devices. The default address range 0x03
through 0x77 is the same as the default address range used by the i2cdetect
command line tool. The callback gets two arguments (err, devices). devices is
an array of numbers where each number represents the I2C address of a device
which was detected.
bus.scan() - scan for I2C devices in address range 0x03 through 0x77
bus.scan(addr) - scan for an I2C device at address addr
bus.scan(startAddr, endAddr) - scan for I2C devices in address range startAddr through endAddr
Scans the I2C bus synchronously for devices. The default address range 0x03
through 0x77 is the same as the default address range used by the i2cdetect
command line tool. Returns an array of numbers where each number represents
the I2C address of a device which was detected.
Asynchronous I2C device Id. The callback gets two arguments (err, id). id is
an object with the properties manufacturer, product and if known a humanname
readable for the associated manufacturer. manufacturer and productname
are numbers, is a string.
Synchronous I2C device Id. Returns an object with the properties
manufacturer, product and if known a human readable name for themanufacturer
associated manufacturer. and product are numbers, name is a
string.
Asynchronous plain I2C read. The callback gets three argument (err, bytesRead, buffer).
bytesRead is the number of bytes read.
Synchronous plain I2C read. Returns the number of bytes read.
Asynchronous plain I2C write. The callback gets three argument (err, bytesWritten, buffer).
bytesWritten is the number of bytes written.
Synchronous plain I2C write. Returns the number of bytes written.
Asynchronous SMBus read byte. The callback gets two arguments (err, byte).
byte is an unsigned integer in the range 0 to 255.
Synchronous SMBus read byte. Returns the byte read. byte is an unsigned
integer in the range 0 to 255.
Asynchronous SMBus read word. The callback gets two arguments (err, word).
word is an unsigned integer in the range 0 to 65535.
Synchronous SMBus read word. Returns the word read. word is an unsigned
integer in the range 0 to 65535.
Asynchronous I2C block read (not defined by the SMBus specification). Reads a
block of bytes from a device, from a designated register that is specified by
cmd. The callback gets three arguments (err, bytesRead, buffer). bytesRead is
the number of bytes read.
Synchronous I2C block read (not defined by the SMBus specification). Reads a
block of bytes from a device, from a designated register that is specified by
cmd. Returns the number of bytes read.
Asynchronous SMBus receive byte. The callback gets two arguments (err, byte).
byte is an unsigned integer in the range 0 to 255.
Synchronous SMBus receive byte. Returns the byte received. byte is an unsigned
integer in the range 0 to 255.
Asynchronous SMBus send byte. The callback gets one argument (err).
Synchronous SMBus send byte.
Asynchronous SMBus write byte. The callback gets one argument (err).
Synchronous SMBus write byte.
Asynchronous SMBus write word. The callback gets one argument (err).
Synchronous SMBus write word.
Asynchronous SMBus quick command. Writes a single bit to the device.
The callback gets one argument (err).
Synchronous SMBus quick command. Writes a single bit to the device.
Asynchronous I2C block write (not defined by the SMBus specification). Writes a
block of bytes to a device, to a designated register that is specified by cmd.
The callback gets three argument (err, bytesWritten, buffer). bytesWritten is
the number of bytes written.
Synchronous I2C block write (not defined by the SMBus specification). Writes a
block of bytes to a device, to a designated register that is specified by cmd.
Asynchronous close. Returns a Promise that will be resolved with no arguments
once the underlying resources have been released, or will be rejected if an
error occurs while closing.
Determine functionality of the bus/adapter asynchronously. Returns a Promise
that on success will be resolved with a frozen I2cFuncs
object describing the functionality available. The returned Promise will be
rejected if an error occurs.
See also I2C functionality.
bus.scan() - scan for I2C devices in address range 0x03 through 0x77
bus.scan(addr) - scan for an I2C device at address addr
bus.scan(startAddr, endAddr) - scan for I2C devices in address range startAddr through endAddr
Scans the I2C bus asynchronously for devices. The default address range 0x03
through 0x77 is the same as the default address range used by the i2cdetect
command line tool. Returns a Promise that on success will be resolved with an
array of numbers where each number represents the I2C address of a device
which was detected. The returned Promise will be rejected if an error occurs.
Asynchronous I2C device Id. Returns a Promise that will be resolved with an id
object on success, or will be rejected if an error occurs. id is an object
with the properties manufacturer, product and if known a human readablename for the associated manufacturer. manufacturer and product arename` is a string.
numbers,
Asynchronous plain I2C read. Returns a Promise that on success will be
resolved with an object with a bytesRead property identifying the number of
bytes read, and a buffer property that is a reference to the passed in buffer
argument. The returned Promise will be rejected if an error occurs.
Asynchronous plain I2C write. Returns a Promise that on success will be
resolved with an object with a bytesWritten property identifying the number of
bytes written, and a buffer property that is a reference to the passed in
buffer argument. The returned promise will be rejected if an error occurs.
Asynchronous SMBus read byte. Returns a Promise that will be resolved with a
number representing the byte read on success, or will be rejected if an error
occurs. byte is an unsigned integer in the range 0 to 255.
Asynchronous SMBus read word. Returns a Promise that will be resolved with a
number representing the word read on success, or will be rejected if an error
occurs. word is an unsigned integer in the range 0 to 65535.
Asynchronous I2C block read (not defined by the SMBus specification). Reads a
block of bytes from a device, from a designated register that is specified by
cmd. Returns a Promise that on success will be resolved with an object with a
bytesRead property identifying the number of bytes read, and a buffer property
that is a reference to the passed in buffer argument. The returned Promise
will be rejected if an error occurs.
Asynchronous SMBus receive byte. Returns a Promise that will be resolved with
a number representing the byte received on success, or will be rejected if an
error occurs. byte is an unsigned integer in the range 0 to 255.
Asynchronous SMBus send byte. Returns a Promise that will be resolved with no
arguments on success, or will be rejected if an error occurs.
Asynchronous SMBus write byte. Returns a Promise that will be resolved with no
arguments on success, or will be rejected if an error occurs.
Asynchronous SMBus write word. Returns a Promise that will be resolved with no
arguments on success, or will be rejected if an error occurs.
Asynchronous SMBus quick command. Writes a single bit to the device. Returns a
Promise that will be resolved with no arguments on success, or will be
rejected if an error occurs.
Asynchronous I2C block write (not defined by the SMBus specification). Writes a
block of bytes to a device, to a designated register that is specified by cmd.
Returns a Promise that on success will be resolved with an object with a
bytesWritten property identifying the number of bytes written, and a buffer
property that is a reference to the passed in buffer argument. The returned
promise will be rejected if an error occurs.
TypeScript type definitions for i2c-bus can be found in the Definitely Typed
repository at
https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/i2c-bus.