denko 0.13.3 → 0.13.4
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 +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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e165f677a5af1dc4d7a924e7b2387bafaca1c84c754b72eac8960fcea42117a7
|
4
|
+
data.tar.gz: f1c795bff6917284d3b31fbff4d1ea44de78f2871492b466f45d9f36abc340af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c897cca6c4a59ce2fbd73e517c380ba272ad0c6a621a9ba7034dffe1f83e151c21cad0671df872443eff8376ff646933a0a68cda07e25860869a06a9306fcfac
|
7
|
+
data.tar.gz: 6f90da47a6bb960400d9986668b2f9320248616f0a4f0a12a930e9ffda4dad0d75e1c08ecf8aae223f8882b72bd56e73dfe113a79c3973ff91c326c4ed31f941
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,44 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.13.4
|
4
|
+
|
5
|
+
### New Components
|
6
|
+
|
7
|
+
- Generic PIR sensors:
|
8
|
+
- Class: `Denko::Sensor::GenericPIR`
|
9
|
+
- Based on `Denko::DigitalIO::Input` class.
|
10
|
+
- Tested with AS312 and HC-SR501 sensors. Should work with AM312 and others.
|
11
|
+
|
12
|
+
- Bosch BMP 180 Temperature + Pressure Sensor:
|
13
|
+
- Class: `Denko::Sensor::BMP180`
|
14
|
+
- Connects via I2C bus. Ruby driver.
|
15
|
+
- Similar to BMP280, but fewer features (older version).
|
16
|
+
- Should work for BMP085 sensor as well.
|
17
|
+
|
18
|
+
- SHT30/31/35 Temperature + Humidity Sensor:
|
19
|
+
- Class: `Denko::Sensor::SHTX`
|
20
|
+
- Connects via I2C bus. Ruby driver.
|
21
|
+
- One-shot reading mode only.
|
22
|
+
|
23
|
+
- RCWL-9620 Ultrasonic Distance Sensor:
|
24
|
+
- Class: `Denko::Sensor::RCWL9620`
|
25
|
+
- Connects via I2C bus. Ruby driver.
|
26
|
+
- Very simple interface. `#read` returns a distance in mm.
|
27
|
+
|
28
|
+
### Component Changes
|
29
|
+
|
30
|
+
- HTU21D:
|
31
|
+
- Humidity values outside the 0-100% range will be clipped to those values automatically.
|
32
|
+
|
33
|
+
### Example Changes
|
34
|
+
|
35
|
+
- Added a simple button example, separate from tutorial.
|
36
|
+
- Standardize temp/pressure/humidity sensor examples (except DHT, DS18B20, HTU21D) so readings display the same.
|
37
|
+
|
38
|
+
### Bug Fixes
|
39
|
+
|
40
|
+
- Fixed bug where `BMP280`` sensor class would not autoload.
|
41
|
+
|
3
42
|
## 0.13.3
|
4
43
|
|
5
44
|
### Board Updates / Fixes
|
data/HARDWARE.md
CHANGED
@@ -37,6 +37,12 @@
|
|
37
37
|
| ATWINC1500 | :green_heart: | MKR1000, WiFi Shield 101 | #define WIFI_101 for shield. Automatic for MKR1000
|
38
38
|
| u-blox NINA-W102 | :question: | Uno WiFi Rev 2, MKR WiFi 1010, Nano 33 IOT | Should work. No hardware
|
39
39
|
|
40
|
+
### AVR Chips from [MightyCore](https://github.com/MCUdude/MightyCore)
|
41
|
+
|
42
|
+
| Chip | Status | Products | Notes |
|
43
|
+
| :-------- | :------: | :--------------- |------ |
|
44
|
+
| ATmega1284 | :heart: | Used in many 8-bit 3D printer boards. |
|
45
|
+
|
40
46
|
### Espressif Chips with Built-In Wi-Fi
|
41
47
|
[](https://github.com/denko-rb/denko/actions/workflows/build_esp8266.yml)
|
42
48
|
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32.yml)
|
@@ -119,6 +125,7 @@ Polling and reading follow a call and response pattern.
|
|
119
125
|
| LED | :green_heart: | Digi/Ana Out | `LED::Base` |
|
120
126
|
| RGB LED | :green_heart: | Digi/Ana Out | `LED::RGB` |
|
121
127
|
| 7 Segment Display | :yellow_heart: | Digital Out | `LED::SevenSegment` | No decimal point
|
128
|
+
| 8x8 LED (MAX7219) | :heart: | SPI | `LED::MAX7219` |
|
122
129
|
| TM1637 | :heart: | BitBang SPI | `LED::TM1637` | 4x 7 Segment + Colon
|
123
130
|
| Neopixel / WS2812B | :yellow_heart: | Adafruit Library | `LED::WS2812` | Not working on RP2040
|
124
131
|
| Dotstar / APA102 | :green_heart: | SPI | `LED::APA102` |
|
@@ -129,6 +136,12 @@ Polling and reading follow a call and response pattern.
|
|
129
136
|
| :--------------- | :------: | :-------- | :--------------- |------ |
|
130
137
|
| HD44780 LCD | :green_heart: | Digital Out, Output Register | `Display::HD44780` |
|
131
138
|
| SSD1306 OLED | :yellow_heart: | I2C | `Display::SSD1306` | 1 font, some graphics
|
139
|
+
| ST7565R (128x64 Mono) | :heart: | SPI | `Display::ST7565R` |
|
140
|
+
| ST7735S (160x128 RGB) | :heart: | SPI | `Display::ST7735S` |
|
141
|
+
| ILI9341 (240x320 RGB) | :heart: | SPI | `Display::ILI9341` |
|
142
|
+
| GC9107 (128x128 RGB) | :heart: | SPI | `Display::GC9107` |
|
143
|
+
| GC9A01 (240x240 Round) | :heart: | SPI | `Display::GCA9A01` |
|
144
|
+
| IL0373 (212x104 E-Paper) | :heart: | SPI | `Display::IL0373` |
|
132
145
|
|
133
146
|
### Sound
|
134
147
|
|
@@ -144,7 +157,9 @@ Polling and reading follow a call and response pattern.
|
|
144
157
|
| Generic ESC | :yellow_heart: | Servo/ESC PWM | `Motor::Servo` | Works. Needs its own class.
|
145
158
|
| PCA9685 | :heart: | I2C | `PulseIO::PCA9685` | 16ch 12-bit PWM for servo or LED
|
146
159
|
| L298N | :green_heart: | Digi + PWM Out | `Motor::L298` | H-Bridge DC motor driver
|
160
|
+
| DRV8833 | :heart: | Digi + PWM Out | `Motor::DRV8833` | H-Bridge DC motor driver
|
147
161
|
| A3967 | :green_heart: | Digital Out | `Motor::Stepper` | 1ch microstepper (EasyDriver)
|
162
|
+
| A4988 | :yellow_heart: | DigitalOut | `Motor::Stepper` | 1-ch microstepper
|
148
163
|
| TMC2209 | :heart: | - | - | 1ch silent stepper driver
|
149
164
|
|
150
165
|
### I/O Expansion
|
@@ -162,55 +177,67 @@ Polling and reading follow a call and response pattern.
|
|
162
177
|
|
163
178
|
### Environmental Sensors
|
164
179
|
|
165
|
-
| Name | Status | Interface | Component Class | Notes
|
166
|
-
| :--------------- | :------: | :-------- | :---------------
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
+
| Name | Status | Interface | Component Class | Type | Notes |
|
181
|
+
| :--------------- | :------: | :-------- | :--------------- |--------------- | ---------------------- |
|
182
|
+
| MAX31850 | :heart: | OneWire | `Sensor::MAX31850` | Thermocouple |
|
183
|
+
| MAX6675 | :heart: | SPI | `Sensor::MAX6675` | Thermocouple |
|
184
|
+
| DS18B20 | :green_heart: | OneWire | `Sensor::DS18B20` | Temp |
|
185
|
+
| DHT11/21/22 | :green_heart: | Digi In/Out | `Sensor::DHT` | Temp / RH |
|
186
|
+
| SHT30/31/35 | :green_heart: | I2C | `Sensor::SHT3X` | Temp / RH | M5Stack ENV III, one-shot only
|
187
|
+
| QMP6988 | :green_heart: | I2C | `Sensor::QMP6988` | Temp / Press | M5Stack ENV III
|
188
|
+
| BMP180 | :green_heart: | I2C | `Sensor::BMP180` | Temp / Press |
|
189
|
+
| BMP280 | :green_heart: | I2C | `Sensor::BMP280` | Temp / Press |
|
190
|
+
| BME280 | :green_heart: | I2C | `Sensor::BME280` | Temp / Press / RH |
|
191
|
+
| HTU21D | :green_heart: | I2C | `Sensor::HTU21D` | Temp / RH | No user register read
|
192
|
+
| HTU31D | :green_heart: | I2C | `Sensor::HTU31D` | Temp / RH | No diagnostic read
|
193
|
+
| AHT10/15 | :green_heart: | I2C | `Sensor::AHT10` | Temp / RH |
|
194
|
+
| AHT20/21/25 | :green_heart: | I2C | `Sensor::AHT20` | Temp / RH |
|
195
|
+
| ENS160 | :heart: | I2C | `Sensor::ENS160` | CO2e / TVOC / AQI |
|
196
|
+
| AGS02MA | :heart: | I2C | `Sensor::AGS02MA` | TVOC |
|
197
|
+
| SCD40 | :heart: | I2C | `Sensor::SDC40` | Temp / Press / CO2 |
|
180
198
|
|
181
199
|
### Light Sensors
|
182
200
|
|
183
201
|
| Name | Status | Interface | Component Class | Notes |
|
184
202
|
| :--------------- | :------: | :-------- | :--------------- |------ |
|
185
203
|
| BH1750 | :heart: | Digital In | `Sensor::BH1750` | Ambient Light
|
186
|
-
|
|
187
|
-
| AS312 | :heart: | I2C | `Sensor::AS312` | PIR
|
204
|
+
| TCS34725 | :heart: | I2C | `Sensor::TCS34725` | RGB
|
188
205
|
| APDS9960 | :heart: | I2C | `Sensor::APDS9960` | Proximity, RGB, Gesture
|
189
206
|
|
207
|
+
### PIR Motion Sensors
|
208
|
+
| Name | Status | Interface | Component Class | Notes |
|
209
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
210
|
+
| HC-SR501 | :green_heart: | Digital In | `Sensor::GenericPIR` |
|
211
|
+
| AS312 | :green_heart: | Digital In | `Sensor::GenericPIR` |
|
212
|
+
|
190
213
|
### Distance Sensors
|
191
214
|
|
192
215
|
| Name | Status | Interface | Component Class | Notes |
|
193
216
|
| :--------------- | :------: | :-------- | :--------------- |------ |
|
194
217
|
| HC-SR04 | :heart: | Digi In/Out | `Sensor::HCSR04` | Ultrasonic, 20-4000mm
|
195
|
-
| RCWL-9620 | :
|
218
|
+
| RCWL-9620 | :green_heart: | I2C | `Sensor::RCWL9260` | Ultrasonic, 20-4500mm
|
196
219
|
| VL53L0X | :heart: | I2C | `Sensor::VL53L0X` | Laser, 30 - 1000mm
|
197
220
|
| GP2Y0E03 | :heart: | I2C | `Sensor::GP2Y0E03` | Infrared, 40 - 500mm
|
198
221
|
|
199
|
-
###
|
222
|
+
### Inertial Measurement Units
|
200
223
|
|
201
224
|
| Name | Status | Interface | Component Class | Notes |
|
202
225
|
| :--------------- | :------: | :-------- | :--------------- |------ |
|
203
|
-
| ADXL345 | :heart: | I2C | `Sensor::ADXL345` |
|
204
|
-
| IT3205 | :heart: | I2C | `Sensor::IT3205` |
|
205
|
-
| HMC5883L | :heart: | I2C | `Sensor::HMC5883L` |
|
206
|
-
| MPU6886 | :heart: | I2C | `Sensor::MPU6886` |
|
226
|
+
| ADXL345 | :heart: | I2C | `Sensor::ADXL345` | Accelerometer
|
227
|
+
| IT3205 | :heart: | I2C | `Sensor::IT3205` | Gyroscope
|
228
|
+
| HMC5883L | :heart: | I2C | `Sensor::HMC5883L` | Compass
|
229
|
+
| MPU6886 | :heart: | I2C | `Sensor::MPU6886` | Gyro + Accelerometer
|
230
|
+
| BMI160 | :heart: | I2C | `Sensor::BMI160` | Gyro + Accelerometer
|
231
|
+
| LSM6DS3 | :heart: | I2C | `Sensor:LSM6DS3` | Gyro + Accelerometer
|
207
232
|
|
208
233
|
### Real Time Clocks
|
209
234
|
|
210
235
|
| Name | Status | Interface | Component Class | Notes |
|
211
236
|
| :--------------- | :------: | :-------- | :--------------- |------ |
|
212
237
|
| DS1302 | :heart: | I2C | `RTC::DS1302` |
|
238
|
+
| DS1307 | :heart: | I2C | `RTC::DS1307` |
|
213
239
|
| DS3231 | :green_heart: | I2C | `RTC::DS3231` | Alarms not implemented
|
240
|
+
| PCF8563 | :heart: | I2C | `RTC::PCF8563` |
|
214
241
|
|
215
242
|
### GPS
|
216
243
|
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Denko 0.13.
|
1
|
+
# Denko 0.13.4 [](https://github.com/denko-rb/denko/actions/workflows/ruby.yml)
|
2
2
|
### Ruby Meets Microcontrollers
|
3
3
|
Denko gives you a high-level Ruby interface to low-level hardware, without writing microcontroller code. Use LEDs, buttons, sensors and more, just as easily as any Ruby object:
|
4
4
|
|
@@ -23,10 +23,10 @@ High-level abstraction in Ruby makes hardware classes easy to implement, with in
|
|
23
23
|
Full list of supported mircocontroller platforms, interfaces, and peripherals is located [here](HARDWARE.md).
|
24
24
|
|
25
25
|
##### denko-piboard
|
26
|
-
|
26
|
+
The add-on gem, [denko-piboard](https://github.com/denko-rb/denko-piboard), allows you to use a Raspberry Pi's built in GPIO pins in place of an attached microcontroller. Connect things directly to the Pi, and use the same peripheral classes from this gem.
|
27
27
|
|
28
28
|
##### mruby-denko
|
29
|
-
A solo Raspberry Pi (or other small SBC + microcontroller) is a great standalone setup if your project needs the compute power anyway, but what if you don't? Why not run Ruby on the microcontroller itself?
|
29
|
+
A solo Raspberry Pi (or other small SBC + microcontroller) is a great standalone setup if your project needs the compute power anyway, but what if you don't? Why not run Ruby on the microcontroller itself?
|
30
30
|
|
31
31
|
That's the goal of [mruby-denko](https://github.com/denko-rb/mruby-denko): write mruby on the ESP32, using peripheral classes as close to this gem as possible. Still early in development, so limited features, but already usable.
|
32
32
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#
|
2
|
+
# This example combines the SHTX and QMP6988 examples. The M5Stack ENV III unit
|
3
|
+
# contains both sensors, accessible over a single I2C connection.
|
4
|
+
#
|
5
|
+
require 'bundler/setup'
|
6
|
+
require 'denko'
|
7
|
+
|
8
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
9
|
+
bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
|
10
|
+
sht = Denko::Sensor::SHT3X.new(bus: bus) # address: 0x44 default
|
11
|
+
qmp = Denko::Sensor::QMP6988.new(bus: bus) # address: 0x70 default
|
12
|
+
|
13
|
+
# Configure for higher accuracy.
|
14
|
+
sht.repeatability = :high
|
15
|
+
qmp.temperature_samples = 2
|
16
|
+
qmp.pressure_samples = 16
|
17
|
+
qmp.iir_coefficient = 2
|
18
|
+
|
19
|
+
# Buggy on ESP32-S3 in forced mode. Data registers return zeroes on all but first read.
|
20
|
+
# Can't recreate on ESP32 V1, AVR or SAMD21. Put it in contiuous mode just in case.
|
21
|
+
qmp.continuous_mode
|
22
|
+
|
23
|
+
# Get the shared #print_tph_reading method to print readings neatly.
|
24
|
+
require_relative '../sensor/neat_tph_readings'
|
25
|
+
|
26
|
+
# How many degrees C the two temperature values can differ by before a warning.
|
27
|
+
TOLERANCE = 0.50
|
28
|
+
|
29
|
+
loop do
|
30
|
+
# Read both sensors.
|
31
|
+
qmp_reading = qmp.read
|
32
|
+
sht_reading = sht.read
|
33
|
+
|
34
|
+
# Retry immediately if either failed.
|
35
|
+
next unless (sht_reading && qmp_reading)
|
36
|
+
|
37
|
+
# Warn if large gap between temperature readings.
|
38
|
+
difference = (qmp_reading[:temperature] - sht_reading[:temperature]).abs
|
39
|
+
if (difference > TOLERANCE)
|
40
|
+
puts "WARNING: temperature values differed by more than #{TOLERANCE}\xC2\xB0C (#{difference.round(4)} \xC2\xB0C actual)"
|
41
|
+
end
|
42
|
+
|
43
|
+
# Combine values from both sensors, averaging their temperatures.
|
44
|
+
average_temperature = (qmp_reading[:temperature] + sht_reading[:temperature]) / 2.0
|
45
|
+
print_tph_reading(temperature: average_temperature, humidity: sht_reading[:humidity], pressure: qmp_reading[:pressure])
|
46
|
+
|
47
|
+
sleep 5
|
48
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#
|
2
|
+
# Simple button example.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
+
button = Denko::DigitalIO::Button.new(board: board, pin: 5, pullup: true)
|
9
|
+
|
10
|
+
button.up { puts "Button released!" }
|
11
|
+
button.down { puts "Button pressed!" }
|
12
|
+
|
13
|
+
sleep
|
data/examples/sensor/aht10.rb
CHANGED
@@ -6,10 +6,14 @@ require 'denko'
|
|
6
6
|
|
7
7
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
8
|
bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
|
9
|
-
|
9
|
+
sensor = Denko::Sensor::AHT10.new(bus: bus) # address: 0x38 default
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
# Get the shared #print_tph_reading method to print readings neatly.
|
12
|
+
require_relative 'neat_tph_readings'
|
13
|
+
|
14
|
+
# Poll it and print readings.
|
15
|
+
sensor.poll(5) do |reading|
|
16
|
+
print_tph_reading(reading)
|
13
17
|
end
|
14
18
|
|
15
19
|
sleep
|
data/examples/sensor/aht20.rb
CHANGED
@@ -6,10 +6,14 @@ require 'denko'
|
|
6
6
|
|
7
7
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
8
|
bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
|
9
|
-
|
9
|
+
sensor = Denko::Sensor::AHT20.new(bus: bus) # address: 0x38 default
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
# Get the shared #print_tph_reading method to print readings neatly.
|
12
|
+
require_relative 'neat_tph_readings'
|
13
|
+
|
14
|
+
# Poll it and print readings.
|
15
|
+
sensor.poll(5) do |reading|
|
16
|
+
print_tph_reading(reading)
|
13
17
|
end
|
14
18
|
|
15
19
|
sleep
|
data/examples/sensor/bme280.rb
CHANGED
@@ -5,28 +5,11 @@ require 'bundler/setup'
|
|
5
5
|
require 'denko'
|
6
6
|
|
7
7
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
-
|
9
|
-
#
|
10
|
-
# Default pins for the I2C0 (first) interface on most chips:
|
11
|
-
#
|
12
|
-
# ATmega 328p: SDA = 'A4' SCL = 'A5' - Arduino Uno, Nano
|
13
|
-
# ATmega 32u4: SDA = 2 SCL = 3 - Arduino Leonardo, Pro Micro
|
14
|
-
# ATmega1280 / 2560: SDA = 20 SCL = 21 - Arduino Mega
|
15
|
-
# SAM3X8E: SDA = 20 SCL = 21 - Arduino Due
|
16
|
-
# SAMD21G18: SDA = 20 SCL = 21 - Arduino Zero, M0, M0 Pro
|
17
|
-
# ESP8266: SDA = 4 SCL = 5
|
18
|
-
# ESP32: SDA = 21 SCL = 22
|
19
|
-
# RP2040: SDA = 4 SCL = 5 - Raspberry Pi Pico (W)
|
20
|
-
#
|
21
|
-
# Only give the SDA pin of the I2C bus. SCL (clock) pin must be
|
22
|
-
# connected for it to work, but we don't need to control it.
|
23
|
-
#
|
24
8
|
bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
|
25
9
|
|
26
|
-
sensor = Denko::Sensor::BME280.new(bus: bus
|
27
|
-
|
10
|
+
sensor = Denko::Sensor::BME280.new(bus: bus) # address: 0x76 default
|
28
11
|
# Use A BMP280 with no humidity instead.
|
29
|
-
# sensor = Denko::Sensor::BMP280.new(bus: bus
|
12
|
+
# sensor = Denko::Sensor::BMP280.new(bus: bus) # address: 0x76
|
30
13
|
|
31
14
|
# Default reading mode is oneshot ("forced" in datasheet).
|
32
15
|
# sensor.oneshot_mode
|
@@ -44,32 +27,12 @@ sensor = Denko::Sensor::BME280.new(bus: bus, address: 0x76)
|
|
44
27
|
# Print raw config register bits.
|
45
28
|
# print sensor.config_register_bits
|
46
29
|
|
47
|
-
|
48
|
-
|
49
|
-
print "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} - "
|
50
|
-
|
51
|
-
# Temperature
|
52
|
-
formatted_temp = reading[:temperature].round(2).to_s.ljust(5, '0')
|
53
|
-
print "Temperature: #{formatted_temp} \xC2\xB0C"
|
54
|
-
|
55
|
-
# Pressure
|
56
|
-
if reading[:pressure]
|
57
|
-
formatted_pressure = (reading[:pressure] / 101325).round(5).to_s.ljust(7, '0')
|
58
|
-
print " | Pressure #{formatted_pressure} atm"
|
59
|
-
end
|
60
|
-
|
61
|
-
# Humidity
|
62
|
-
if reading[:humidity]
|
63
|
-
formatted_humidity = reading[:humidity].round(2).to_s.ljust(5, '0')
|
64
|
-
print " | Humidity #{formatted_humidity} %"
|
65
|
-
end
|
66
|
-
|
67
|
-
puts
|
68
|
-
end
|
30
|
+
# Get the shared #print_tph_reading method to print readings neatly.
|
31
|
+
require_relative 'neat_tph_readings'
|
69
32
|
|
70
|
-
# Poll
|
33
|
+
# Poll it and print readings.
|
71
34
|
sensor.poll(5) do |reading|
|
72
|
-
|
35
|
+
print_tph_reading(reading)
|
73
36
|
end
|
74
37
|
|
75
38
|
sleep
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#
|
2
|
+
# Example using a BMP180 sensor over I2C, for temperature and pressure.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
+
bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
|
9
|
+
sensor = Denko::Sensor::BMP180.new(bus: bus) # address: 0x77 default
|
10
|
+
|
11
|
+
# Enable oversampling for the pressure sensor only (1,2,4, 8).
|
12
|
+
# sensor.pressure_samples = 8
|
13
|
+
|
14
|
+
# Get the shared #print_tph_reading method to print readings neatly.
|
15
|
+
require_relative 'neat_tph_readings'
|
16
|
+
|
17
|
+
# Poll it and print readings.
|
18
|
+
sensor.poll(5) do |reading|
|
19
|
+
print_tph_reading(reading)
|
20
|
+
end
|
21
|
+
|
22
|
+
sleep
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#
|
2
|
+
# Example using a PIR motion sensor. Tested with AS312 and HC-SR501 sensors.
|
3
|
+
#
|
4
|
+
# General notes:
|
5
|
+
# - Both sensors have a few seconds "dead time" after "motion stop" (logical 0), where further
|
6
|
+
# motion will not trigger "motion start" (logical 1).
|
7
|
+
#
|
8
|
+
# HC-SR501 notes:
|
9
|
+
# - Needs some time to warm up and start working properly.
|
10
|
+
# - Set the time potentiometer to its lowest value.
|
11
|
+
# - Make sure retriggering is enabled. It might be default, but there's a jumper to solder too.
|
12
|
+
#
|
13
|
+
require 'bundler/setup'
|
14
|
+
require 'denko'
|
15
|
+
|
16
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
17
|
+
sensor = Denko::Sensor::GenericPIR.new(board: board, pin: 8)
|
18
|
+
|
19
|
+
sensor.on_motion_start { print "Motion detected! \r" }
|
20
|
+
sensor.on_motion_stop { print "No motion detected... \r" }
|
21
|
+
|
22
|
+
# Read initial state.
|
23
|
+
sensor.read
|
24
|
+
|
25
|
+
sleep
|
data/examples/sensor/htu21d.rb
CHANGED
@@ -6,7 +6,7 @@ require 'denko'
|
|
6
6
|
|
7
7
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
8
|
bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
|
9
|
-
htu21d = Denko::Sensor::HTU21D.new(bus: bus)
|
9
|
+
htu21d = Denko::Sensor::HTU21D.new(bus: bus) # address: 0x40 default
|
10
10
|
|
11
11
|
# Get and set heater state.
|
12
12
|
htu21d.heater_on
|
data/examples/sensor/htu31d.rb
CHANGED
@@ -6,26 +6,30 @@ require 'denko'
|
|
6
6
|
|
7
7
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
8
|
bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
|
9
|
-
|
9
|
+
sensor = Denko::Sensor::HTU31D.new(bus: bus)
|
10
10
|
|
11
11
|
# Get and set heater state.
|
12
|
-
|
13
|
-
puts "Heater on: #{
|
14
|
-
|
15
|
-
puts "Heater off: #{
|
12
|
+
sensor.heater_on
|
13
|
+
puts "Heater on: #{sensor.heater_on?}"
|
14
|
+
sensor.heater_off
|
15
|
+
puts "Heater off: #{sensor.heater_off?}"
|
16
16
|
|
17
17
|
# Back to default settings, including heater off, unlike HTU21D.
|
18
|
-
|
19
|
-
puts "Resetting HTU31D...
|
18
|
+
sensor.reset
|
19
|
+
puts "Resetting HTU31D..."
|
20
|
+
puts "Heater off: #{sensor.heater_off?}"
|
20
21
|
puts
|
21
22
|
|
22
23
|
# Resolution goes from 0..3 separately for temperature and humidity. See datasheet.
|
23
|
-
|
24
|
-
|
24
|
+
sensor.temperature_resolution = 3
|
25
|
+
sensor.humidity_resolution = 3
|
26
|
+
|
27
|
+
# Get the shared #print_tph_reading method to print readings neatly.
|
28
|
+
require_relative 'neat_tph_readings'
|
25
29
|
|
26
30
|
# Unlike HTU21D, HTU31D works as a regular polled sensor.
|
27
|
-
|
28
|
-
|
31
|
+
sensor.poll(5) do |reading|
|
32
|
+
print_tph_reading(reading)
|
29
33
|
end
|
30
34
|
|
31
35
|
sleep
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# This helper method can be used in temp/pressure/humidity sensor examples.
|
3
|
+
# Give a hash with readings as float values and it prints them neatly.
|
4
|
+
#
|
5
|
+
def print_tph_reading(reading)
|
6
|
+
# Time
|
7
|
+
print "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} - "
|
8
|
+
|
9
|
+
# Temperature
|
10
|
+
formatted_temp = reading[:temperature].to_f.round(2).to_s.ljust(5, '0')
|
11
|
+
print "Temperature: #{formatted_temp} \xC2\xB0C"
|
12
|
+
|
13
|
+
# Pressure
|
14
|
+
if reading[:pressure]
|
15
|
+
formatted_pressure = (reading[:pressure] / 101325).round(5).to_s.ljust(7, '0')
|
16
|
+
print " | Pressure #{formatted_pressure} atm"
|
17
|
+
end
|
18
|
+
|
19
|
+
# Humidity
|
20
|
+
if reading[:humidity]
|
21
|
+
formatted_humidity = reading[:humidity].round(2).to_s.ljust(5, '0')
|
22
|
+
print " | Humidity #{formatted_humidity} %"
|
23
|
+
end
|
24
|
+
|
25
|
+
puts
|
26
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#
|
2
|
+
# Example using QMP6988 sensor over I2C, for air temperature and pressure.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
+
bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
|
9
|
+
sensor = Denko::Sensor::QMP6988.new(bus: bus) # address: 0x70 default
|
10
|
+
|
11
|
+
# Verify chip_id.
|
12
|
+
print "I2C device has chip ID: 0x#{sensor.chip_id.to_s(16).upcase}. "
|
13
|
+
if sensor.chip_id == 0x5C
|
14
|
+
puts "This matches the QMP6988."
|
15
|
+
else
|
16
|
+
puts "This does not match the QMP6988."
|
17
|
+
end
|
18
|
+
puts
|
19
|
+
|
20
|
+
#
|
21
|
+
# Change measurement settings:
|
22
|
+
# temperature_samples can be 1,2,4,8,16,32 or 64 (default: 1)
|
23
|
+
# pressure_samples can be 1,2,4,8,16,32 or 64 (default: 1)
|
24
|
+
# iir_coefficient can be 0,2,4,8,16 or 32 (default: 0)
|
25
|
+
#
|
26
|
+
# High accuracy settings from datasheet, with IIR of 2.
|
27
|
+
sensor.temperature_samples = 2
|
28
|
+
sensor.pressure_samples = 16
|
29
|
+
sensor.iir_coefficient = 2
|
30
|
+
|
31
|
+
#
|
32
|
+
# Change mode (default: forced_mode)
|
33
|
+
#
|
34
|
+
# Buggy on ESP32S3 in forced mode. Data registers return zeroes on all but first read.
|
35
|
+
# Can't recreate on ESP32 V1, AVR or SAMD21. Put it in contiuous mode just in case.
|
36
|
+
sensor.continuous_mode
|
37
|
+
# sensor.forced_mode
|
38
|
+
|
39
|
+
#
|
40
|
+
# Set standby time (between measurements) for continuous mode only:
|
41
|
+
# standby_time (given in ms) can be 1,5,20,250,500,1000,2000 or 4000 (default: 1)
|
42
|
+
#
|
43
|
+
# sensor.standby_time = 500
|
44
|
+
|
45
|
+
# Get the shared #print_tph_reading method to print readings neatly.
|
46
|
+
require_relative 'neat_tph_readings'
|
47
|
+
|
48
|
+
# Poll it and print readings.
|
49
|
+
sensor.poll(5) do |reading|
|
50
|
+
print_tph_reading(reading)
|
51
|
+
end
|
52
|
+
|
53
|
+
sleep
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#
|
2
|
+
# Example using an RCWL-9620 sensor over I2C to measure distance.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
+
bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
|
9
|
+
sensor = Denko::Sensor::RCWL9620.new(bus: bus) # address: 0x57 default
|
10
|
+
|
11
|
+
sensor.poll(1) do |distance|
|
12
|
+
puts "Distance is #{distance} mm"
|
13
|
+
end
|
14
|
+
|
15
|
+
sleep
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
# Example using SHT30/31/35 sensor over I2C, for temperature and humidity.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
+
bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
|
9
|
+
sensor = Denko::Sensor::SHT3X.new(bus: bus) # address: 0x44 default
|
10
|
+
|
11
|
+
# Heater control
|
12
|
+
sensor.heater_on
|
13
|
+
puts "Heater on: #{sensor.heater_on?}"
|
14
|
+
sensor.heater_off
|
15
|
+
puts "Heater off: #{sensor.heater_off?}"
|
16
|
+
|
17
|
+
# Reset (turns heater off)
|
18
|
+
sensor.reset
|
19
|
+
puts "Resetting..."
|
20
|
+
puts "Heater off: #{sensor.heater_off?}"
|
21
|
+
puts
|
22
|
+
|
23
|
+
# Set repeatability= :low, :medium or :high (default). See datasheet for details.
|
24
|
+
sensor.repeatability = :high
|
25
|
+
|
26
|
+
# Get the shared #print_tph_reading method to print readings neatly.
|
27
|
+
require_relative 'neat_tph_readings'
|
28
|
+
|
29
|
+
# Poll it and print readings.
|
30
|
+
sensor.poll(5) do |reading|
|
31
|
+
print_tph_reading(reading)
|
32
|
+
end
|
33
|
+
|
34
|
+
sleep
|
data/lib/denko/sensor/bme280.rb
CHANGED
@@ -28,7 +28,7 @@ module Denko
|
|
28
28
|
# be skipped, since the other 2 calculations depend on it.
|
29
29
|
#
|
30
30
|
# General formula:
|
31
|
-
# 2
|
31
|
+
# 2 ** (n-1), where n is the decimal value of the bits, up to 16x max oversampling.
|
32
32
|
#
|
33
33
|
OVERSAMPLE_FACTORS = {
|
34
34
|
0 => 0b000, # Sensor skipped. Value will be 0x800000.
|