denko 0.13.3 → 0.13.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +55 -0
- data/DEPS_IDE.md +3 -2
- data/HARDWARE.md +73 -35
- data/README.md +3 -3
- data/benchmarks/i2c_ssd1306_refresh.rb +5 -0
- data/denko.gemspec +4 -4
- data/examples/advanced/m5_env.rb +48 -0
- data/examples/digital_io/button.rb +13 -0
- data/examples/i2c/search.rb +2 -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/hcsr04.rb +14 -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/board/pulse.rb +4 -0
- data/lib/denko/board.rb +1 -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/hcsr04.rb +33 -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 +7 -0
- data/lib/denko/version.rb +1 -1
- data/src/denko_wifi.ino +39 -14
- data/src/lib/Denko.cpp +6 -2
- data/src/lib/Denko.h +4 -2
- data/src/lib/DenkoDefines.h +16 -1
- data/src/lib/DenkoLEDArray.cpp +1 -1
- data/src/lib/DenkoPulseInput.cpp +32 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db3ab91a78e9e78ce4f973237f2de09e93561d8dae7cd239708ab9ab85bff3c7
|
4
|
+
data.tar.gz: bb904d187be4fbeaa238ee8d259d7f24abecc900b2244c9d01599752141c019f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f943f022e9058de0cc22ff88ea35588c78f35ea6282a72f5607e5059f73b5975fbd3c05ca5fa06448aff19e90227e67d9b38e0359a9168a13d08ed70dfa38028
|
7
|
+
data.tar.gz: 3fc9bca5801515fc7f1ba01aefd13888b9e9acb84e434335e571c75d383afbcccef066c285b749f12a0a9ab470dfb87b3a39c7aa16193b9e250785e6c55313a0
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,60 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.13.5
|
4
|
+
|
5
|
+
### New Components
|
6
|
+
|
7
|
+
- HC-SR04 Ultrasonic Distance Sensor:
|
8
|
+
- Class: `Denko::Sensor::HCSRO4`
|
9
|
+
- Custom function on the board to handle ping and response.
|
10
|
+
- Simple interface. `#read` returns a distance in mm.
|
11
|
+
|
12
|
+
### Bug Fixes
|
13
|
+
|
14
|
+
- OTA updating now works on ESP32.
|
15
|
+
- Adjust ESP32 expected serial buffer sizes and acknowledge intervals to to be more reliable.
|
16
|
+
- Fixed a bug on Windows where submodules weren't being included in load path.
|
17
|
+
- Fixed a bug where the board could incorrectly report EEPROM_LENGTH as 0.
|
18
|
+
|
19
|
+
## 0.13.4
|
20
|
+
|
21
|
+
### New Components
|
22
|
+
|
23
|
+
- Generic PIR sensors:
|
24
|
+
- Class: `Denko::Sensor::GenericPIR`
|
25
|
+
- Based on `Denko::DigitalIO::Input` class.
|
26
|
+
- Tested with AS312 and HC-SR501 sensors. Should work with AM312 and others.
|
27
|
+
|
28
|
+
- Bosch BMP 180 Temperature + Pressure Sensor:
|
29
|
+
- Class: `Denko::Sensor::BMP180`
|
30
|
+
- Connects via I2C bus. Ruby driver.
|
31
|
+
- Similar to BMP280, but fewer features (older version).
|
32
|
+
- Should work for BMP085 sensor as well.
|
33
|
+
|
34
|
+
- SHT30/31/35 Temperature + Humidity Sensor:
|
35
|
+
- Class: `Denko::Sensor::SHTX`
|
36
|
+
- Connects via I2C bus. Ruby driver.
|
37
|
+
- One-shot reading mode only.
|
38
|
+
|
39
|
+
- RCWL-9620 Ultrasonic Distance Sensor:
|
40
|
+
- Class: `Denko::Sensor::RCWL9620`
|
41
|
+
- Connects via I2C bus. Ruby driver.
|
42
|
+
- Very simple interface. `#read` returns a distance in mm.
|
43
|
+
|
44
|
+
### Component Changes
|
45
|
+
|
46
|
+
- HTU21D:
|
47
|
+
- Humidity values outside the 0-100% range will be clipped to those values automatically.
|
48
|
+
|
49
|
+
### Example Changes
|
50
|
+
|
51
|
+
- Added a simple button example, separate from tutorial.
|
52
|
+
- Standardize temp/pressure/humidity sensor examples (except DHT, DS18B20, HTU21D) so readings display the same.
|
53
|
+
|
54
|
+
### Bug Fixes
|
55
|
+
|
56
|
+
- Fixed bug where `BMP280` sensor class would not autoload.
|
57
|
+
|
3
58
|
## 0.13.3
|
4
59
|
|
5
60
|
### Board Updates / Fixes
|
data/DEPS_IDE.md
CHANGED
@@ -33,7 +33,8 @@ All platforms will require libraries to be installed. To install a library do th
|
|
33
33
|
Arduino SAMD Boards (32-bits ARM Cortex-M0+)
|
34
34
|
Arduino UNO R4 Boards
|
35
35
|
ESP8266 Boards
|
36
|
-
ESP32 Boards
|
36
|
+
ESP32 Boards
|
37
|
+
Raspberry Pi Pico/RP2040
|
37
38
|
````
|
38
39
|
* Libraries:
|
39
40
|
````
|
@@ -119,7 +120,7 @@ All platforms will require libraries to be installed. To install a library do th
|
|
119
120
|
````
|
120
121
|
* Boards:
|
121
122
|
````
|
122
|
-
Raspberry Pi Pico/RP2040
|
123
|
+
Raspberry Pi Pico/RP2040
|
123
124
|
````
|
124
125
|
* Libraries:
|
125
126
|
````
|
data/HARDWARE.md
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
| Chip | Status | Products | Notes |
|
10
10
|
| :-------- | :------: | :--------------- |------ |
|
11
|
-
| ATmega168 | :green_heart: | Duemilanove, Diecimila, Pro |
|
11
|
+
| ATmega168 | :green_heart: | Duemilanove, Diecimila, Pro | Omits features. `denko targets` for info.
|
12
12
|
| ATmega328 | :green_heart: | Uno R3, Uno WiFi, Nano, Fio, Pro |
|
13
13
|
| ATmega32u4 | :green_heart: | Leonardo, Micro, Leonardo ETH, Esplora, LilyPad USB |
|
14
14
|
| ATmega1280 | :green_heart: | Mega |
|
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
| Chip | Status | Products | Notes |
|
26
26
|
| :-------- | :------: | :--------------- |------ |
|
27
|
-
| ATSAM3X8E | :yellow_heart: | Due | Native USB
|
27
|
+
| ATSAM3X8E | :yellow_heart: | Due | Uses Native USB. Tone and IR Out don't work.
|
28
28
|
| ATSAMD21 | :green_heart: | Zero, M0 Series, Nano 33 IOT, MKR WiFi 1010 | Native USB
|
29
29
|
| RA4M1 | :yellow_heart: | Uno R4 Minima, Uno R4 WiFi | IR and WS2812 libraries don't support this yet
|
30
30
|
|
@@ -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
|
[![ESP8266 Build Status](https://github.com/denko-rb/denko/actions/workflows/build_esp8266.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_esp8266.yml)
|
42
48
|
[![ESP32 Build Status](https://github.com/denko-rb/denko/actions/workflows/build_esp32.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_esp32.yml)
|
@@ -49,6 +55,8 @@
|
|
49
55
|
| ESP32-S2 | :green_heart: | LOLIN S2 Pico | Native USB
|
50
56
|
| ESP32-S3 | :green_heart: | LOLIN S3 V1.0.0 | Native USB
|
51
57
|
| ESP32-C3 | :green_heart: | LOLIN C3 Mini V2.1.0 | Native USB
|
58
|
+
| ESP32-H2 | :heart: | - | Support in Arduino ESP32 core beta
|
59
|
+
| ESP32-C6 | :heart: | - | Support in Arduino ESP32 core beta
|
52
60
|
|
53
61
|
**Note:** For ESP32 chips using native USB, make sure `USB CDC On Boot` is `Enabled` in the IDE's `Tools` menu. Flashing from the CLI doesn't automatically enable this, so the IDE is recommended for now.
|
54
62
|
|
@@ -119,6 +127,7 @@ Polling and reading follow a call and response pattern.
|
|
119
127
|
| LED | :green_heart: | Digi/Ana Out | `LED::Base` |
|
120
128
|
| RGB LED | :green_heart: | Digi/Ana Out | `LED::RGB` |
|
121
129
|
| 7 Segment Display | :yellow_heart: | Digital Out | `LED::SevenSegment` | No decimal point
|
130
|
+
| 8x8 LED (MAX7219) | :heart: | SPI | `LED::MAX7219` |
|
122
131
|
| TM1637 | :heart: | BitBang SPI | `LED::TM1637` | 4x 7 Segment + Colon
|
123
132
|
| Neopixel / WS2812B | :yellow_heart: | Adafruit Library | `LED::WS2812` | Not working on RP2040
|
124
133
|
| Dotstar / APA102 | :green_heart: | SPI | `LED::APA102` |
|
@@ -129,6 +138,12 @@ Polling and reading follow a call and response pattern.
|
|
129
138
|
| :--------------- | :------: | :-------- | :--------------- |------ |
|
130
139
|
| HD44780 LCD | :green_heart: | Digital Out, Output Register | `Display::HD44780` |
|
131
140
|
| SSD1306 OLED | :yellow_heart: | I2C | `Display::SSD1306` | 1 font, some graphics
|
141
|
+
| ST7565R (128x64 Mono) | :heart: | SPI | `Display::ST7565R` |
|
142
|
+
| ST7735S (160x128 RGB) | :heart: | SPI | `Display::ST7735S` |
|
143
|
+
| ILI9341 (240x320 RGB) | :heart: | SPI | `Display::ILI9341` |
|
144
|
+
| GC9107 (128x128 RGB) | :heart: | SPI | `Display::GC9107` |
|
145
|
+
| GC9A01 (240x240 Round) | :heart: | SPI | `Display::GCA9A01` |
|
146
|
+
| IL0373 (212x104 E-Paper) | :heart: | SPI | `Display::IL0373` |
|
132
147
|
|
133
148
|
### Sound
|
134
149
|
|
@@ -142,10 +157,13 @@ Polling and reading follow a call and response pattern.
|
|
142
157
|
| :--------------- | :------: | :-------- | :--------------- |------ |
|
143
158
|
| Generic Hobby Servo | :green_heart: | Servo/ESC PWM | `Motor::Servo` | Max depends on PWM channel count
|
144
159
|
| Generic ESC | :yellow_heart: | Servo/ESC PWM | `Motor::Servo` | Works. Needs its own class.
|
145
|
-
| PCA9685 | :heart: | I2C | `PulseIO::PCA9685` |
|
160
|
+
| PCA9685 | :heart: | I2C | `PulseIO::PCA9685` | 16-ch, 12-bit PWM for servo or LED
|
146
161
|
| L298N | :green_heart: | Digi + PWM Out | `Motor::L298` | H-Bridge DC motor driver
|
147
|
-
|
|
148
|
-
|
|
162
|
+
| DRV8833 | :heart: | Digi + PWM Out | `Motor::DRV8833` | H-Bridge DC motor driver
|
163
|
+
| TB6612 | :heart: | Digi + PWM Out | `Motor::TB6612` | H-Bridge DC motor driver
|
164
|
+
| A3967 | :green_heart: | Digital Out | `Motor::Stepper` | 1-ch microstepper (EasyDriver)
|
165
|
+
| A4988 | :yellow_heart: | DigitalOut | `Motor::Stepper` | 1-ch microstepper
|
166
|
+
| TMC2209 | :heart: | - | - | 1-ch silent stepper driver
|
149
167
|
|
150
168
|
### I/O Expansion
|
151
169
|
|
@@ -153,64 +171,84 @@ Polling and reading follow a call and response pattern.
|
|
153
171
|
| :--------------- | :------: | :-------- | :--------------- |------ |
|
154
172
|
| Input Register | :green_heart: | SPI | `SPI::InputRegister` | Tested on CD4021B
|
155
173
|
| Output Register | :green_heart: | SPI | `SPI::OutputRegister`| Tested on 74HC595
|
156
|
-
| PCF8574 Expander | :heart: | I2C | `DigitalIO::PCF8574` |
|
157
|
-
| ADS1100 ADC | :heart: | I2C | `AnalogIO::ADS1100` |
|
158
|
-
| ADS1115 ADC | :green_heart: | I2C | `AnalogIO::ADS1115` |
|
159
|
-
| ADS1118 ADC | :green_heart: | SPI | `AnalogIO::ADS1118` |
|
160
|
-
|
|
161
|
-
|
|
174
|
+
| PCF8574 Expander | :heart: | I2C | `DigitalIO::PCF8574` | 8-ch bi-directional digital I/O
|
175
|
+
| ADS1100 ADC | :heart: | I2C | `AnalogIO::ADS1100` | 1-ch, 16-bit ADC
|
176
|
+
| ADS1115 ADC | :green_heart: | I2C | `AnalogIO::ADS1115` | 4-ch, 16-bit ADC. Comparator not implemented.
|
177
|
+
| ADS1118 ADC | :green_heart: | SPI | `AnalogIO::ADS1118` | 4-ch, 16-bit ADC + temperature
|
178
|
+
| ADS1232 ADC | :heart: | SPI | `AnalogIO::ADS1232` | 2-ch, 24-bit ADC + temperature
|
179
|
+
| PCF8591 ADC/DAC | :heart: | I2C | `AnalogIO::PCF8591` | 4-ch, 8-bit ADC + 1-chm 8-bit DAC
|
180
|
+
| MCP4725 DAC | :heart: | I2C | `AnalogIO::MCP4275` | 1-ch, 12-bit DAC
|
181
|
+
| PCA9548 I2C Mux | :heart: | I2C | `I2C::PCA9548` | 8-way I2C multiplexer
|
162
182
|
|
163
183
|
### Environmental Sensors
|
164
184
|
|
165
|
-
| Name | Status | Interface | Component Class | Notes
|
166
|
-
| :--------------- | :------: | :-------- | :---------------
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
185
|
+
| Name | Status | Interface | Component Class | Type | Notes |
|
186
|
+
| :--------------- | :------: | :-------- | :--------------- |--------------- | ---------------------- |
|
187
|
+
| MAX31850 | :heart: | OneWire | `Sensor::MAX31850` | Thermocouple |
|
188
|
+
| MAX6675 | :heart: | SPI | `Sensor::MAX6675` | Thermocouple |
|
189
|
+
| DS18B20 | :green_heart: | OneWire | `Sensor::DS18B20` | Temp |
|
190
|
+
| DHT11/21/22 | :green_heart: | Digi In/Out | `Sensor::DHT` | Temp / RH |
|
191
|
+
| SHT30/31/35 | :green_heart: | I2C | `Sensor::SHT3X` | Temp / RH | M5Stack ENV III, one-shot only
|
192
|
+
| SHT40/41 | :heart: | I2C | `Sensor::SHT4X` | Temp / RH |
|
193
|
+
| QMP6988 | :green_heart: | I2C | `Sensor::QMP6988` | Temp / Press | M5Stack ENV III
|
194
|
+
| BMP180 | :green_heart: | I2C | `Sensor::BMP180` | Temp / Press |
|
195
|
+
| BMP280 | :green_heart: | I2C | `Sensor::BMP280` | Temp / Press |
|
196
|
+
| BME280 | :green_heart: | I2C | `Sensor::BME280` | Temp / Press / RH |
|
197
|
+
| BME680 | :heart: | I2C | `Sensor::BME680` | Temp / Press / RH / TVOC |
|
198
|
+
| HTU21D | :green_heart: | I2C | `Sensor::HTU21D` | Temp / RH | No user register read
|
199
|
+
| HTU31D | :green_heart: | I2C | `Sensor::HTU31D` | Temp / RH | No diagnostic read
|
200
|
+
| AHT10/15 | :green_heart: | I2C | `Sensor::AHT10` | Temp / RH |
|
201
|
+
| AHT20/21/25 | :green_heart: | I2C | `Sensor::AHT20` | Temp / RH |
|
202
|
+
| ENS160 | :heart: | I2C | `Sensor::ENS160` | eCO2 / TVOC / AQI |
|
203
|
+
| AGS02MA | :heart: | I2C | `Sensor::AGS02MA` | TVOC |
|
204
|
+
| SCD40 | :heart: | I2C | `Sensor::SDC40` | Temp / Press / CO2 |
|
205
|
+
| CCS811 | :heart: | I2C | `Sensor::CCS811` | eCO2 |
|
180
206
|
|
181
207
|
### Light Sensors
|
182
208
|
|
183
209
|
| Name | Status | Interface | Component Class | Notes |
|
184
210
|
| :--------------- | :------: | :-------- | :--------------- |------ |
|
185
211
|
| BH1750 | :heart: | Digital In | `Sensor::BH1750` | Ambient Light
|
186
|
-
|
|
187
|
-
| AS312 | :heart: | I2C | `Sensor::AS312` | PIR
|
212
|
+
| TCS34725 | :heart: | I2C | `Sensor::TCS34725` | RGB
|
188
213
|
| APDS9960 | :heart: | I2C | `Sensor::APDS9960` | Proximity, RGB, Gesture
|
189
214
|
|
215
|
+
### PIR Motion Sensors
|
216
|
+
| Name | Status | Interface | Component Class | Notes |
|
217
|
+
| :--------------- | :------: | :-------- | :--------------- |------ |
|
218
|
+
| HC-SR501 | :green_heart: | Digital In | `Sensor::GenericPIR` |
|
219
|
+
| HC-SR505 | :yellow_heart: | Digital In | `Sensor::GenericPIR` |
|
220
|
+
| AS312 | :green_heart: | Digital In | `Sensor::GenericPIR` |
|
221
|
+
| AM312 | :yellow_heart: | Digital In | `Sensor::GenericPIR` |
|
222
|
+
|
190
223
|
### Distance Sensors
|
191
224
|
|
192
225
|
| Name | Status | Interface | Component Class | Notes |
|
193
226
|
| :--------------- | :------: | :-------- | :--------------- |------ |
|
194
|
-
| HC-SR04 | :
|
195
|
-
| RCWL-9620 | :
|
227
|
+
| HC-SR04 | :green_heart: | Digi In/Out | `Sensor::HCSR04` | Ultrasonic, 20-4000mm
|
228
|
+
| RCWL-9620 | :green_heart: | I2C | `Sensor::RCWL9260` | Ultrasonic, 20-4500mm
|
196
229
|
| VL53L0X | :heart: | I2C | `Sensor::VL53L0X` | Laser, 30 - 1000mm
|
197
230
|
| GP2Y0E03 | :heart: | I2C | `Sensor::GP2Y0E03` | Infrared, 40 - 500mm
|
198
231
|
|
199
|
-
###
|
232
|
+
### Inertial Measurement Units
|
200
233
|
|
201
234
|
| Name | Status | Interface | Component Class | Notes |
|
202
235
|
| :--------------- | :------: | :-------- | :--------------- |------ |
|
203
|
-
| ADXL345 | :heart: | I2C | `Sensor::ADXL345` |
|
204
|
-
| IT3205 | :heart: | I2C | `Sensor::IT3205` |
|
205
|
-
| HMC5883L | :heart: | I2C | `Sensor::HMC5883L` |
|
206
|
-
|
|
236
|
+
| ADXL345 | :heart: | I2C | `Sensor::ADXL345` | Accelerometer
|
237
|
+
| IT3205 | :heart: | I2C | `Sensor::IT3205` | Gyroscope
|
238
|
+
| HMC5883L | :heart: | I2C | `Sensor::HMC5883L` | Compass
|
239
|
+
| MPU6050 | :heart: | I2C | `Sensor::MPU6050` | Gyro + Accelerometer
|
240
|
+
| MPU6886 | :heart: | I2C | `Sensor::MPU6886` | Gyro + Accelerometer
|
241
|
+
| BMI160 | :heart: | I2C | `Sensor::BMI160` | Gyro + Accelerometer
|
242
|
+
| LSM6DS3 | :heart: | I2C | `Sensor:LSM6DS3` | Gyro + Accelerometer
|
207
243
|
|
208
244
|
### Real Time Clocks
|
209
245
|
|
210
246
|
| Name | Status | Interface | Component Class | Notes |
|
211
247
|
| :--------------- | :------: | :-------- | :--------------- |------ |
|
212
248
|
| DS1302 | :heart: | I2C | `RTC::DS1302` |
|
249
|
+
| DS1307 | :heart: | I2C | `RTC::DS1307` |
|
213
250
|
| DS3231 | :green_heart: | I2C | `RTC::DS3231` | Alarms not implemented
|
251
|
+
| PCF8563 | :heart: | I2C | `RTC::PCF8563` |
|
214
252
|
|
215
253
|
### GPS
|
216
254
|
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Denko 0.13.
|
1
|
+
# Denko 0.13.4 [![Test Status](https://github.com/denko-rb/denko/actions/workflows/ruby.yml/badge.svg)](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 [denko-piboard](https://github.com/denko-rb/denko-piboard) add-on gem, uses a Raspberry Pi's built in GPIO header instead of an attached microcontroller. Connect things directly to the Pi, and use the peripheral classes from this gem.
|
27
27
|
|
28
28
|
##### mruby-denko
|
29
|
-
A solo Raspberry Pi (or other
|
29
|
+
A solo Raspberry Pi (or other SBC + microcontroller) is great if you need 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
|
|
@@ -30,6 +30,11 @@
|
|
30
30
|
# Arduino Nano Every : 9.2 fps (USB through ATSAMD11 @ 115200, 128-byte I2C limit, no I2C level shifter)
|
31
31
|
# Arduino Nano Every : 13.0 fps (USB through ATSAMD11 @ 230400, 128-byte I2C limit, no I2C level shifter)
|
32
32
|
#
|
33
|
+
# February 25 2024 | i7 8700k CPU | CRuby 3.2.1 | 100 frames | 1 Mhz I2C frequency | Average of 3 runs
|
34
|
+
#
|
35
|
+
# ESP32-S3 : 51.8 fps (native USB) - Changed from 64 to 128 serial ACK interval
|
36
|
+
# ESP32-C3 : 51.7 fps (native USB) - Changed from 64 to 128 serial ACK interval
|
37
|
+
#
|
33
38
|
require 'bundler/setup'
|
34
39
|
require 'denko'
|
35
40
|
|
data/denko.gemspec
CHANGED
@@ -17,10 +17,10 @@ Gem::Specification.new do |gem|
|
|
17
17
|
# get an array of submodule dirs by executing 'pwd' inside each submodule
|
18
18
|
gem_dir = File.expand_path(File.dirname(__FILE__)) + "/"
|
19
19
|
`git submodule --quiet foreach pwd`.split($\).each do |submodule_path|
|
20
|
-
# Fix submodule paths on Windows.
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
# Fix submodule paths on Windows, by removing prepended / and drive letter.
|
21
|
+
if RUBY_PLATFORM.match(/mswin|mingw/i)
|
22
|
+
submodule_path = submodule_path[2..-1]
|
23
|
+
end
|
24
24
|
|
25
25
|
Dir.chdir(submodule_path) do
|
26
26
|
submodule_relative_path = submodule_path.sub gem_dir, ""
|
@@ -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/i2c/search.rb
CHANGED
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
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#
|
2
|
+
# Example of reading an HC-SR04 ultrasonic sensor.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
+
hcsr04 = Denko::Sensor::HCSR04.new(board: board, pins: {trigger: 6, echo: 7})
|
9
|
+
|
10
|
+
hcsr04.poll(0.05) do |distance|
|
11
|
+
puts "Distance: #{distance} mm"
|
12
|
+
end
|
13
|
+
|
14
|
+
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
|