i2c-bme280 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d3fb7e76d1c6b27b73396ecafeda512b56569dae
4
+ data.tar.gz: e2ddc8957153a4f4418efc6b17ca11486534db0e
5
+ SHA512:
6
+ metadata.gz: e8aaccf55f6cfadccc7ca0b232c1211381a1176c43cb7ab3f8b8a33ea85d984852823a35a381abf45553246b3bf9a1ed9982d950caf3d7b67f8412a66f872ab8
7
+ data.tar.gz: e8408ef0905e4b2acd0c80b478dd9df0359d476f4b28b29e0a4720fb683f0c46388b65703be6686eb4a55999533ec3379ab5cf05d1b8a72fdbd7d9efc5a920cf
data/lib/i2c/bme280.rb ADDED
@@ -0,0 +1,173 @@
1
+ require 'i2c'
2
+
3
+ module I2C
4
+ module Driver
5
+ class BME280
6
+ I2C_ADDRESS = 0x76 # I2C Bus address
7
+
8
+ # @param [Integer|String|I2C::Dev] device The I2C device id of i2c-dev, a string that points to the i2c-dev device file or an already initialized I2C::Dev instance
9
+ # @param [Fixnum] i2c_address The i2c address of the BME280. Factory default is 0x76.
10
+ def initialize(device:, i2c_address: I2C_ADDRESS)
11
+ device = "/dev/i2c-#{device}" if device.is_a?(Integer)
12
+
13
+ if device.is_a?(String)
14
+ raise ArgumentError, "I2C device #{device} not found. Is the I2C kernel module enabled?" unless File.exists?(device)
15
+ device = I2C.create(device)
16
+ end
17
+
18
+ raise ArgumentError unless device.is_a?(I2C::Dev)
19
+
20
+ @device = device
21
+ @i2c_address = i2c_address
22
+ end
23
+
24
+ # returns all sensor values in a hash
25
+ # t: temperature
26
+ # p: pressure
27
+ # h: humidity
28
+ # @return [Hash] All sensor values
29
+ def all
30
+ data
31
+ end
32
+
33
+ # @return [Float] The temperature in Celsius
34
+ def temperature
35
+ data[:t]
36
+ end
37
+
38
+ # @return [Float] The pressure in hectoPascal
39
+ def pressure
40
+ data[:p]
41
+ end
42
+
43
+ # @return [Float] The humidity in percent (0.0-100.0)
44
+ def humidity
45
+ data[:h]
46
+ end
47
+
48
+ private
49
+
50
+ # tells the chip to update its data registers
51
+ def update(
52
+ s_t: 1, # Temperature oversampling = x1
53
+ s_h: 1, # Humidity oversampling = x1
54
+ s_p: 1, # Pressure oversampling = x1
55
+ mode: 1, # Normal mode
56
+ t_s: 5, # Standby time = 1000ms
57
+ filter: 0, # Disable filter
58
+ spi: 0 # Disable SPI
59
+ )
60
+
61
+ tp_reg = 0xF4 # Register address for temperature/pressure settings
62
+ h_reg = 0xF2 # Register address for humidity settings
63
+ config_reg = 0xF5 # Register address for config settings
64
+
65
+ tp_val = (s_t << 5) | (s_p << 2) | mode
66
+ h_val = s_h
67
+ config_val = (t_s << 5) | (filter << 2) | spi
68
+
69
+ write(tp_reg, tp_val)
70
+ write(h_reg, h_val)
71
+ write(config_reg, config_val)
72
+ end
73
+
74
+ # Read calibration parameters of the BME280
75
+ # https://cdn-shop.adafruit.com/datasheets/BST-BME280_DS001-10.pdf Page 22
76
+ def calib_params
77
+ # data addresses
78
+ dig_t_reg = 0x88
79
+ dig_p_reg = 0x8E
80
+ dig_h_reg1 = 0xA1
81
+ dig_h_reg2 = 0xE1
82
+
83
+ # read calibration bytes
84
+ dig_t = read(dig_t_reg, 6).unpack("S1s2")
85
+ dig_p = read(dig_p_reg, 18).unpack("S1s8")
86
+ dig_h = (read(dig_h_reg1, 1) + read(dig_h_reg2, 7)).unpack("C1s1C1C3c1")
87
+
88
+ # H4,H5 are saved in an inconvenient format
89
+ dig_h4 = (dig_h[3] << 4) + (dig_h[4] & 0x0f)
90
+ dig_h5 = (dig_h[4] >> 4) + (dig_h[5] << 4)
91
+
92
+ # reassemble dig_h
93
+ dig_h = dig_h[0..2] + [ dig_h4, dig_h5 ] + dig_h[6..6]
94
+
95
+ {
96
+ t: dig_t,
97
+ p: dig_p,
98
+ h: dig_h
99
+ }
100
+ end
101
+
102
+ # return all compensated values
103
+ # ported from bme280_sample.py
104
+ def data
105
+ # tell the chip to update its data
106
+ update
107
+
108
+ # read calibration data
109
+ calib = calib_params
110
+
111
+ # read raw data
112
+ data_reg = 0xF7
113
+ data = read(data_reg, 8).unpack("C8")
114
+ raw_t = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
115
+ raw_p = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
116
+ raw_h = (data[6] << 8) | data[7]
117
+
118
+ # commonly used for compensation
119
+ v1 = (raw_t / 16384.0 - calib[:t][0] / 1024.0) * calib[:t][1]
120
+ v2 = (raw_t / 131072.0 - calib[:t][0] / 8192.0) * (raw_t / 131072.0 - calib[:t][0] / 8192.0) * calib[:t][2]
121
+ t_fine = v1 + v2
122
+
123
+ # compensate temperature
124
+ t = t_fine / 5120.0
125
+
126
+ # compensate pressure
127
+ v1 = (t_fine / 2.0) - 64000.0
128
+ v2 = (((v1 / 4.0) * (v1 / 4.0)) / 2048) * calib[:p][5]
129
+ v2 = v2 + ((v1 * calib[:p][4]) * 2.0)
130
+ v2 = (v2 / 4.0) + (calib[:p][3] * 65536.0)
131
+ v1 = (((calib[:p][2] * (((v1 / 4.0) * (v1 / 4.0)) / 8192)) / 8) + ((calib[:p][1] * v1) / 2.0)) / 262144
132
+ v1 = ((32768 + v1) * calib[:p][0]) / 32768
133
+
134
+ if v1 == 0
135
+ p = 0.0
136
+ else
137
+ p = ((1048576 - raw_p) - (v2 / 4096)) * 3125
138
+ p = p < 0x80000000 ? (p * 2.0) / v1 : (p / v1) * 2.0
139
+ v1 = (calib[:p][8] * (((p / 8.0) * (p / 8.0)) / 8192.0)) / 4096
140
+ v2 = ((p / 4.0) * calib[:p][7]) / 8192.0
141
+ p = p + ((v1 + v2 + calib[:p][6]) / 16.0)
142
+ p = p / 100.0
143
+ end
144
+
145
+ # compensate humidity
146
+ h = t_fine - 76800.0
147
+ if h != 0
148
+ h = (raw_h - (calib[:h][3] * 64.0 + calib[:h][4]/16384.0 * h)) * (calib[:h][1] / 65536.0 * (1.0 + calib[:h][5] / 67108864.0 * h * (1.0 + calib[:h][2] / 67108864.0 * h)))
149
+ h = h * (1.0 - calib[:h][0] * h / 524288.0)
150
+ h = 100.0 if h > 100.0
151
+ h = 0.0 if h < 0.0
152
+ end
153
+
154
+ # return as hash
155
+ {
156
+ t: t,
157
+ p: p,
158
+ h: h
159
+ }
160
+ end
161
+
162
+ # write to device
163
+ def write(reg_address, data)
164
+ @device.write(@i2c_address, reg_address, data)
165
+ end
166
+
167
+ # read from device
168
+ def read(reg_address, size = 1)
169
+ @device.read(@i2c_address, size, reg_address)
170
+ end
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,5 @@
1
+ module I2C
2
+ module BME280
3
+ VERSION = "0.1.2"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: i2c-bme280
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Lukas Prasuhn
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-07-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: i2c
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.4'
27
+ description:
28
+ email:
29
+ - lukas@cvguy.de
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/i2c/bme280.rb
35
+ - lib/i2c/bme280/version.rb
36
+ homepage: https://github.com/lukasjapan/i2c-bme280
37
+ licenses:
38
+ - MIT
39
+ metadata: {}
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubyforge_project:
56
+ rubygems_version: 2.6.11
57
+ signing_key:
58
+ specification_version: 4
59
+ summary: Ruby driver for the Bosch BME280 sensor.
60
+ test_files: []