ads1115
Version:
A Node.js library for an ads1115 analog to digital converter
77 lines (67 loc) • 2.56 kB
JavaScript
const _debug = require('debug')
const hex = (v) => v.toString(16).padStart(2, '0')
const bin = (v) => v.toString(2).padStart(16, '0')
_debug.formatters.h = (v) => v.length ? Array.prototype.map.call(v, b => hex(b)).join(' ') : hex(v)
_debug.formatters.b = bin
const debug = _debug('ADS1115')
const sleep = (t) => new Promise((resolve) => setTimeout(resolve, t))
const START_CONVERSION = 0b1000000000000000
const MUX = {
'0+1': 0b0000000000000000,
'0+3': 0b0001000000000000,
'1+3': 0b0010000000000000,
'2+3': 0b0011000000000000,
'0+GND': 0b0100000000000000,
'1+GND': 0b0101000000000000,
'2+GND': 0b0110000000000000,
'3+GND': 0b0111000000000000
}
const gains = {
'2/3': 0b0000000000000000, // +/- 6.144V
'1': 0b0000001000000000, // +/- 4.096V
'2': 0b0000010000000000, // +/- 2.048V
'4': 0b0000011000000000, // +/- 1.024V
'8': 0b0000100000000000, // +/- 0.512V
'16': 0b0000101000000000, // +/- 0.256V
}
module.exports = (bus, addr = 0x48, delay = 10, shift = 0) => {
let gain = gains['2/3']
const writeReg16 = (register, value) => {
const buff = Buffer.from([register & 3, value >> 8, value & 0xFF])
debug('write to 0x%h [%h]', addr, buff)
return bus.i2cWrite(addr, 3, buff)
}
const readReg16 = async (register) => {
await bus.i2cWrite(addr, 1, Buffer.alloc(1, register))
const buff = (await bus.i2cRead(addr, 2, Buffer.allocUnsafe(2))).buffer
debug('read from register 0x%h [%h]', register, buff)
return (buff[0] << 8) | buff[1]
}
const readResults = async (value) => (await readReg16(0x00)) >> shift
const writeConfig = (value) => {
debug('writeConfig 0b%b', value)
return writeReg16(0b01, value)
}
return {
get gain() { return gain },
set gain(level) {
if (level === (2/3)) level = '2/3'
gain = gains[level] || gain
},
_delay: delay,
_shift: shift,
writeLowThreshold: (threshold) => writeReg16(addr, 0b10, threshold << shift),
writeHiThreshold: (threshold) => writeReg16(addr, 0b11, threshold << shift),
measure: async (mux) => {
mux = MUX[mux]
if (typeof mux === 'undefined') throw new Error('Invalid mux')
const config = 0x0183 // No comparator | 1600 samples per second | single-shot mode
await writeConfig(config | gain | mux | START_CONVERSION)
await sleep(delay)
return readResults()
}
}
}
module.exports.open = (busNum, addr = 0x48, provider = 'i2c-bus') => {
return require(provider).openPromisified(busNum).then((bus) => module.exports(bus, addr))
}