diff options
Diffstat (limited to 'scd4x.lua')
-rw-r--r-- | scd4x.lua | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/scd4x.lua b/scd4x.lua new file mode 100644 index 0000000..47495e2 --- /dev/null +++ b/scd4x.lua @@ -0,0 +1,45 @@ +local scd4x = {} +local device_address = 0x62 + +scd4x.bus_id = 0 + +function scd4x.start() + i2c.start(scd4x.bus_id) + if not i2c.address(scd4x.bus_id, device_address, i2c.TRANSMITTER) then + return false + end + i2c.write(scd4x.bus_id, {0x21, 0xb1}) + i2c.stop(scd4x.bus_id) + return true +end + +function scd4x.stop() + i2c.start(scd4x.bus_id) + if not i2c.address(scd4x.bus_id, device_address, i2c.TRANSMITTER) then + return false + end + i2c.write(scd4x.bus_id, {0x3f, 0x86}) + i2c.stop(scd4x.bus_id) + return true +end + +function scd4x.read() + i2c.start(scd4x.bus_id) + if not i2c.address(scd4x.bus_id, device_address, i2c.TRANSMITTER) then + return nil + end + i2c.write(scd4x.bus_id, {0xec, 0x05}) + i2c.stop(scd4x.bus_id) + i2c.start(scd4x.bus_id) + if not i2c.address(scd4x.bus_id, device_address, i2c.RECEIVER) then + return nil + end + local data = i2c.read(scd4x.bus_id, 9) + i2c.stop(scd4x.bus_id) + local co2 = string.byte(data, 1) * 256 + string.byte(data, 2) + local temp_raw = 175 * (string.byte(data, 4) * 256 + string.byte(data, 5)) + local humi_raw = 100 * (string.byte(data, 7) * 256 + string.byte(data, 8)) + return co2, temp_raw, humi_raw +end + +return scd4x |