denko 0.13.3 → 0.13.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +39 -0
- data/HARDWARE.md +50 -23
- data/README.md +3 -3
- data/examples/advanced/m5_env.rb +48 -0
- data/examples/digital_io/button.rb +13 -0
- data/examples/sensor/aht10.rb +7 -3
- data/examples/sensor/aht20.rb +7 -3
- data/examples/sensor/bme280.rb +6 -43
- data/examples/sensor/bmp180.rb +22 -0
- data/examples/sensor/generic_pir.rb +25 -0
- data/examples/sensor/htu21d.rb +1 -1
- data/examples/sensor/htu31d.rb +15 -11
- data/examples/sensor/neat_tph_readings.rb +26 -0
- data/examples/sensor/qmp6988.rb +53 -0
- data/examples/sensor/rcwl9620.rb +15 -0
- data/examples/sensor/sht3x.rb +34 -0
- data/lib/denko/sensor/bme280.rb +1 -1
- data/lib/denko/sensor/bmp180.rb +223 -0
- data/lib/denko/sensor/generic_pir.rb +8 -0
- data/lib/denko/sensor/htu21d.rb +6 -2
- data/lib/denko/sensor/qmp6988.rb +308 -0
- data/lib/denko/sensor/rcwl9620.rb +34 -0
- data/lib/denko/sensor/sht3x.rb +128 -0
- data/lib/denko/sensor.rb +6 -0
- data/lib/denko/version.rb +1 -1
- metadata +15 -2
@@ -0,0 +1,128 @@
|
|
1
|
+
module Denko
|
2
|
+
module Sensor
|
3
|
+
class SHT3X
|
4
|
+
include I2C::Peripheral
|
5
|
+
include Behaviors::Poller
|
6
|
+
|
7
|
+
RESET = 0x30A2
|
8
|
+
RESET_TIME = 0.002
|
9
|
+
HEATER_OFF = 0x3066
|
10
|
+
HEATER_ON = 0x306D
|
11
|
+
FETCH_DATA = 0xE000
|
12
|
+
REPEATABILITY = {
|
13
|
+
high: { lsb: 0x00, measurement_time: 0.016 },
|
14
|
+
medium: { lsb: 0x0B, measurement_time: 0.007 },
|
15
|
+
low: { lsb: 0x16, measurement_time: 0.005 },
|
16
|
+
}
|
17
|
+
|
18
|
+
# Unused
|
19
|
+
READ_STATUS_REGISTER = 0xF32D
|
20
|
+
CLEAR_STATUS_REGISTER = 0x3041
|
21
|
+
BREAK = 0x3093
|
22
|
+
ART = 0x2B32
|
23
|
+
|
24
|
+
def before_initialize(options={})
|
25
|
+
@i2c_address = 0x44
|
26
|
+
super(options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def after_initialize(options={})
|
30
|
+
super(options)
|
31
|
+
|
32
|
+
# Avoid repeated memory allocation for callback data and state.
|
33
|
+
@reading = { temperature: nil, humidity: nil }
|
34
|
+
self.state = { temperature: nil, humidity: nil }
|
35
|
+
|
36
|
+
reset
|
37
|
+
self.repeatability = :high
|
38
|
+
end
|
39
|
+
|
40
|
+
def repeatability=(key)
|
41
|
+
raise ArgumentError, "invalid repeatability setting: #{key}" unless REPEATABILITY.keys.include? key
|
42
|
+
@measurement_lsb = REPEATABILITY[key][:lsb]
|
43
|
+
@measurement_time = REPEATABILITY[key][:measurement_time]
|
44
|
+
end
|
45
|
+
|
46
|
+
def _read
|
47
|
+
i2c_write [0x24, @measurement_lsb]
|
48
|
+
sleep(@measurement_time)
|
49
|
+
i2c_read(FETCH_DATA, 6)
|
50
|
+
end
|
51
|
+
|
52
|
+
def pre_callback_filter(bytes)
|
53
|
+
# Temperature is bytes 0 to 2: MSB, LSB, CRC
|
54
|
+
if calculate_crc(bytes[0..2]) == bytes[2]
|
55
|
+
t_raw = (bytes[0] << 8) | bytes[1]
|
56
|
+
@reading[:temperature] = (175 * t_raw / 65535.0) - 45
|
57
|
+
else
|
58
|
+
@reading[:temperature] = nil
|
59
|
+
end
|
60
|
+
|
61
|
+
# Humidity is bytes 3 to 5: MSB, LSB, CRC
|
62
|
+
if calculate_crc(bytes[3..5]) == bytes[5]
|
63
|
+
h_raw = (bytes[3] << 8) | bytes[4]
|
64
|
+
@reading[:humidity] = 100 * h_raw / 65535.0
|
65
|
+
else
|
66
|
+
@reading[:humidity] = nil
|
67
|
+
end
|
68
|
+
|
69
|
+
@reading
|
70
|
+
end
|
71
|
+
|
72
|
+
def update_state(reading)
|
73
|
+
@state_mutex.synchronize do
|
74
|
+
@state[:temperature] = reading[:temperature]
|
75
|
+
@state[:humidity] = reading[:humidity]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def reset
|
80
|
+
i2c_write [RESET]
|
81
|
+
sleep RESET_TIME
|
82
|
+
@heater_on = false
|
83
|
+
end
|
84
|
+
|
85
|
+
def heater_on?
|
86
|
+
@heater_on
|
87
|
+
end
|
88
|
+
|
89
|
+
def heater_off?
|
90
|
+
!@heater_on
|
91
|
+
end
|
92
|
+
|
93
|
+
def heater_on
|
94
|
+
i2c_write [HEATER_ON]
|
95
|
+
@heater_on = true
|
96
|
+
end
|
97
|
+
|
98
|
+
def heater_off
|
99
|
+
i2c_write [HEATER_OFF]
|
100
|
+
@heater_on = false
|
101
|
+
end
|
102
|
+
|
103
|
+
# CRC is same as AHT20 sensor. Copied from that file.
|
104
|
+
CRC_INITIAL_VALUE = 0xFF
|
105
|
+
CRC_POLYNOMIAL = 0x31
|
106
|
+
MSBIT_MASK = 0x80
|
107
|
+
|
108
|
+
def calculate_crc(bytes)
|
109
|
+
crc = CRC_INITIAL_VALUE
|
110
|
+
|
111
|
+
# Ignore last byte. That's the CRC value to compare with.
|
112
|
+
bytes.take(bytes.length - 1).each do |byte|
|
113
|
+
crc = crc ^ byte
|
114
|
+
8.times do
|
115
|
+
if (crc & MSBIT_MASK) > 0
|
116
|
+
crc = (crc << 1) ^ CRC_POLYNOMIAL
|
117
|
+
else
|
118
|
+
crc = crc << 1
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# Limit CRC size to 8 bits.
|
124
|
+
crc = crc & 0xFF
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
data/lib/denko/sensor.rb
CHANGED
@@ -4,10 +4,16 @@ module Denko
|
|
4
4
|
autoload :Humidity, "#{__dir__}/sensor/virtual"
|
5
5
|
autoload :DHT, "#{__dir__}/sensor/dht"
|
6
6
|
autoload :DS18B20, "#{__dir__}/sensor/ds18b20"
|
7
|
+
autoload :BMP180, "#{__dir__}/sensor/bmp180"
|
7
8
|
autoload :BME280, "#{__dir__}/sensor/bme280"
|
9
|
+
autoload :BMP280, "#{__dir__}/sensor/bme280"
|
8
10
|
autoload :HTU21D, "#{__dir__}/sensor/htu21d"
|
9
11
|
autoload :HTU31D, "#{__dir__}/sensor/htu31d"
|
10
12
|
autoload :AHT10, "#{__dir__}/sensor/aht"
|
11
13
|
autoload :AHT20, "#{__dir__}/sensor/aht"
|
14
|
+
autoload :SHT3X, "#{__dir__}/sensor/sht3x"
|
15
|
+
autoload :QMP6988, "#{__dir__}/sensor/qmp6988"
|
16
|
+
autoload :RCWL9620, "#{__dir__}/sensor/rcwl9620"
|
17
|
+
autoload :GenericPIR, "#{__dir__}/sensor/generic_pir"
|
12
18
|
end
|
13
19
|
end
|
data/lib/denko/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: denko
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.13.
|
4
|
+
version: 0.13.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- vickash, Austinbv
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-10-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyserial
|
@@ -113,6 +113,7 @@ files:
|
|
113
113
|
- bin/denko
|
114
114
|
- build
|
115
115
|
- denko.gemspec
|
116
|
+
- examples/advanced/m5_env.rb
|
116
117
|
- examples/advanced/rotary_encoder_mac_volume.rb
|
117
118
|
- examples/advanced/ssd1306_time_temp_rh.rb
|
118
119
|
- examples/analog_io/ads1115.rb
|
@@ -120,6 +121,7 @@ files:
|
|
120
121
|
- examples/analog_io/dac_loopback.rb
|
121
122
|
- examples/analog_io/input.rb
|
122
123
|
- examples/connection/tcp.rb
|
124
|
+
- examples/digital_io/button.rb
|
123
125
|
- examples/digital_io/rotary_encoder.rb
|
124
126
|
- examples/display/hd44780.png
|
125
127
|
- examples/display/hd44780.rb
|
@@ -143,10 +145,16 @@ files:
|
|
143
145
|
- examples/sensor/aht10.rb
|
144
146
|
- examples/sensor/aht20.rb
|
145
147
|
- examples/sensor/bme280.rb
|
148
|
+
- examples/sensor/bmp180.rb
|
146
149
|
- examples/sensor/dht.rb
|
147
150
|
- examples/sensor/ds18b20.rb
|
151
|
+
- examples/sensor/generic_pir.rb
|
148
152
|
- examples/sensor/htu21d.rb
|
149
153
|
- examples/sensor/htu31d.rb
|
154
|
+
- examples/sensor/neat_tph_readings.rb
|
155
|
+
- examples/sensor/qmp6988.rb
|
156
|
+
- examples/sensor/rcwl9620.rb
|
157
|
+
- examples/sensor/sht3x.rb
|
150
158
|
- examples/spi/input_register.rb
|
151
159
|
- examples/spi/output_register.rb
|
152
160
|
- examples/spi/ssd_through_register.rb
|
@@ -247,10 +255,15 @@ files:
|
|
247
255
|
- lib/denko/sensor.rb
|
248
256
|
- lib/denko/sensor/aht.rb
|
249
257
|
- lib/denko/sensor/bme280.rb
|
258
|
+
- lib/denko/sensor/bmp180.rb
|
250
259
|
- lib/denko/sensor/dht.rb
|
251
260
|
- lib/denko/sensor/ds18b20.rb
|
261
|
+
- lib/denko/sensor/generic_pir.rb
|
252
262
|
- lib/denko/sensor/htu21d.rb
|
253
263
|
- lib/denko/sensor/htu31d.rb
|
264
|
+
- lib/denko/sensor/qmp6988.rb
|
265
|
+
- lib/denko/sensor/rcwl9620.rb
|
266
|
+
- lib/denko/sensor/sht3x.rb
|
254
267
|
- lib/denko/sensor/virtual.rb
|
255
268
|
- lib/denko/spi.rb
|
256
269
|
- lib/denko/spi/base_register.rb
|