-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscd4x-sensor.js
104 lines (83 loc) · 2.52 KB
/
scd4x-sensor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
'use strict';
const i2c = require('i2c-bus');
const { setTimeout } = require('timers/promises');
class SCD4X {
static #ADDRESS = 0x62;
// コマンド定義
static #START_PERIODIC_MEASUREMENT_COMMAND = 0x21b1;
static #READ_MEASUREMENT_COMMAND = 0xec05;
static #STOP_PERIODIC_MEASUREMENT_COMMAND = 0x3f86;
static #GET_SERIAL_NUMBER_COMMAND = 0x3682;
static #COMMAND_LENGTH = 2;
#bus;
#serialNumber;
constructor() {
this.#bus = null;
this.#serialNumber = null;
}
get serialNumber() { return this.#serialNumber; }
initialize() {
return i2c.openPromisified(1)
.then(bus => {
this.#bus = bus;
return this.#stopPeriodicMeasurement();
})
.then(() => {
return this.#getSerialNumber();
})
.then(() => {
return this.#startPeriodicMeasurement();
})
}
readSensorData() {
return this.#readMeasurement()
}
static #toBuffer(command) {
return Buffer.from([command >> 8, command & 0xff])
}
#sendCommand(command) {
return this.#bus.i2cWrite(SCD4X.#ADDRESS, SCD4X.#COMMAND_LENGTH, SCD4X.#toBuffer(command));
}
#read(command, bufferLength) {
const buf = Buffer.alloc(bufferLength);
return this.#bus.i2cWrite(SCD4X.#ADDRESS, SCD4X.#COMMAND_LENGTH, SCD4X.#toBuffer(command))
.then(() => {
return this.#bus.i2cRead(SCD4X.#ADDRESS, buf.length, buf)
})
}
#getSerialNumber() {
return this.#read(SCD4X.#GET_SERIAL_NUMBER_COMMAND, 9)
.then(res => {
this.#serialNumber = '';
const buf = res.buffer;
const values = [buf.readUInt16BE(0), buf.readUInt16BE(3), buf.readUInt16BE(6)];
values.forEach(value => {
this.#serialNumber += value.toString(16);
})
return setTimeout(10);
})
}
#startPeriodicMeasurement() {
return this.#sendCommand(SCD4X.#START_PERIODIC_MEASUREMENT_COMMAND);
}
#readMeasurement() {
const toCO2 = (value => value);
const toTemperature = (value => -45 + 175 * value / 65536)
const toHumidity = (value => 100 * value / 65536)
return this.#read(SCD4X.#READ_MEASUREMENT_COMMAND, 9)
.then(res => {
return {
co2: toCO2(res.buffer.readUInt16BE(0)),
temperature: toTemperature(res.buffer.readUInt16BE(3)),
humidity: toHumidity(res.buffer.readUInt16BE(6)),
}
})
}
#stopPeriodicMeasurement() {
return this.#sendCommand(SCD4X.#STOP_PERIODIC_MEASUREMENT_COMMAND)
.then(() => {
return setTimeout(1000);
})
}
}
module.exports = SCD4X;