denko 0.13.4 → 0.13.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e165f677a5af1dc4d7a924e7b2387bafaca1c84c754b72eac8960fcea42117a7
4
- data.tar.gz: f1c795bff6917284d3b31fbff4d1ea44de78f2871492b466f45d9f36abc340af
3
+ metadata.gz: db3ab91a78e9e78ce4f973237f2de09e93561d8dae7cd239708ab9ab85bff3c7
4
+ data.tar.gz: bb904d187be4fbeaa238ee8d259d7f24abecc900b2244c9d01599752141c019f
5
5
  SHA512:
6
- metadata.gz: c897cca6c4a59ce2fbd73e517c380ba272ad0c6a621a9ba7034dffe1f83e151c21cad0671df872443eff8376ff646933a0a68cda07e25860869a06a9306fcfac
7
- data.tar.gz: 6f90da47a6bb960400d9986668b2f9320248616f0a4f0a12a930e9ffda4dad0d75e1c08ecf8aae223f8882b72bd56e73dfe113a79c3973ff91c326c4ed31f941
6
+ metadata.gz: f943f022e9058de0cc22ff88ea35588c78f35ea6282a72f5607e5059f73b5975fbd3c05ca5fa06448aff19e90227e67d9b38e0359a9168a13d08ed70dfa38028
7
+ data.tar.gz: 3fc9bca5801515fc7f1ba01aefd13888b9e9acb84e434335e571c75d383afbcccef066c285b749f12a0a9ab470dfb87b3a39c7aa16193b9e250785e6c55313a0
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
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
+
3
19
  ## 0.13.4
4
20
 
5
21
  ### New Components
@@ -37,7 +53,7 @@
37
53
 
38
54
  ### Bug Fixes
39
55
 
40
- - Fixed bug where `BMP280`` sensor class would not autoload.
56
+ - Fixed bug where `BMP280` sensor class would not autoload.
41
57
 
42
58
  ## 0.13.3
43
59
 
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 | Features omitted to save memory. `denko targets` for more info.
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 port. Tone, and IR Out don't work.
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
 
@@ -55,6 +55,8 @@
55
55
  | ESP32-S2 | :green_heart: | LOLIN S2 Pico | Native USB
56
56
  | ESP32-S3 | :green_heart: | LOLIN S3 V1.0.0 | Native USB
57
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
58
60
 
59
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.
60
62
 
@@ -155,12 +157,13 @@ Polling and reading follow a call and response pattern.
155
157
  | :--------------- | :------: | :-------- | :--------------- |------ |
156
158
  | Generic Hobby Servo | :green_heart: | Servo/ESC PWM | `Motor::Servo` | Max depends on PWM channel count
157
159
  | Generic ESC | :yellow_heart: | Servo/ESC PWM | `Motor::Servo` | Works. Needs its own class.
158
- | PCA9685 | :heart: | I2C | `PulseIO::PCA9685` | 16ch 12-bit PWM for servo or LED
160
+ | PCA9685 | :heart: | I2C | `PulseIO::PCA9685` | 16-ch, 12-bit PWM for servo or LED
159
161
  | L298N | :green_heart: | Digi + PWM Out | `Motor::L298` | H-Bridge DC motor driver
160
162
  | DRV8833 | :heart: | Digi + PWM Out | `Motor::DRV8833` | H-Bridge DC motor driver
161
- | A3967 | :green_heart: | Digital Out | `Motor::Stepper` | 1ch microstepper (EasyDriver)
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)
162
165
  | A4988 | :yellow_heart: | DigitalOut | `Motor::Stepper` | 1-ch microstepper
163
- | TMC2209 | :heart: | - | - | 1ch silent stepper driver
166
+ | TMC2209 | :heart: | - | - | 1-ch silent stepper driver
164
167
 
165
168
  ### I/O Expansion
166
169
 
@@ -168,33 +171,38 @@ Polling and reading follow a call and response pattern.
168
171
  | :--------------- | :------: | :-------- | :--------------- |------ |
169
172
  | Input Register | :green_heart: | SPI | `SPI::InputRegister` | Tested on CD4021B
170
173
  | Output Register | :green_heart: | SPI | `SPI::OutputRegister`| Tested on 74HC595
171
- | PCF8574 Expander | :heart: | I2C | `DigitalIO::PCF8574` | 8ch bi-directional digital I/O
172
- | ADS1100 ADC | :heart: | I2C | `AnalogIO::ADS1100` | 15-bit +/- 1ch ADC
173
- | ADS1115 ADC | :green_heart: | I2C | `AnalogIO::ADS1115` | 15-bit +/- 4ch ADC. Comparator not implemented.
174
- | ADS1118 ADC | :green_heart: | SPI | `AnalogIO::ADS1118` | 15-bit +/- 4ch ADC + temperature
175
- | PCF8591 ADC/DAC | :heart: | I2C | `AnalogIO::PCF8591` | 4ch ADC + 1ch DAC, 8-bit resolution
176
- | MCP4725 DAC | :heart: | I2C | `AnalogIO::MCP4275` | 1ch 12-bit DAC
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
177
182
 
178
183
  ### Environmental Sensors
179
184
 
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 |
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 |
198
206
 
199
207
  ### Light Sensors
200
208
 
@@ -208,13 +216,15 @@ Polling and reading follow a call and response pattern.
208
216
  | Name | Status | Interface | Component Class | Notes |
209
217
  | :--------------- | :------: | :-------- | :--------------- |------ |
210
218
  | HC-SR501 | :green_heart: | Digital In | `Sensor::GenericPIR` |
219
+ | HC-SR505 | :yellow_heart: | Digital In | `Sensor::GenericPIR` |
211
220
  | AS312 | :green_heart: | Digital In | `Sensor::GenericPIR` |
221
+ | AM312 | :yellow_heart: | Digital In | `Sensor::GenericPIR` |
212
222
 
213
223
  ### Distance Sensors
214
224
 
215
225
  | Name | Status | Interface | Component Class | Notes |
216
226
  | :--------------- | :------: | :-------- | :--------------- |------ |
217
- | HC-SR04 | :heart: | Digi In/Out | `Sensor::HCSR04` | Ultrasonic, 20-4000mm
227
+ | HC-SR04 | :green_heart: | Digi In/Out | `Sensor::HCSR04` | Ultrasonic, 20-4000mm
218
228
  | RCWL-9620 | :green_heart: | I2C | `Sensor::RCWL9260` | Ultrasonic, 20-4500mm
219
229
  | VL53L0X | :heart: | I2C | `Sensor::VL53L0X` | Laser, 30 - 1000mm
220
230
  | GP2Y0E03 | :heart: | I2C | `Sensor::GP2Y0E03` | Infrared, 40 - 500mm
@@ -226,6 +236,7 @@ Polling and reading follow a call and response pattern.
226
236
  | ADXL345 | :heart: | I2C | `Sensor::ADXL345` | Accelerometer
227
237
  | IT3205 | :heart: | I2C | `Sensor::IT3205` | Gyroscope
228
238
  | HMC5883L | :heart: | I2C | `Sensor::HMC5883L` | Compass
239
+ | MPU6050 | :heart: | I2C | `Sensor::MPU6050` | Gyro + Accelerometer
229
240
  | MPU6886 | :heart: | I2C | `Sensor::MPU6886` | Gyro + Accelerometer
230
241
  | BMI160 | :heart: | I2C | `Sensor::BMI160` | Gyro + Accelerometer
231
242
  | LSM6DS3 | :heart: | I2C | `Sensor:LSM6DS3` | Gyro + Accelerometer
data/README.md CHANGED
@@ -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
- 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.
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 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 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
- if RUBY_PLATFORM.match(/mswin|mingw/i)
22
- submodule_path = `cygpath -m #{submodule_path}`.strip
23
- end
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, ""
@@ -23,6 +23,8 @@ unless board.map
23
23
 
24
24
  # Else get defaults from map.
25
25
  else
26
+ puts "Detected board: #{board.name}"
27
+
26
28
  sda = board.map[:SDA] || board.map[:SDA0]
27
29
  scl = board.map[:SCL] || board.map[:SCL0]
28
30
 
@@ -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
@@ -22,5 +22,9 @@ module Denko
22
22
  value: settings,
23
23
  aux_message: aux
24
24
  end
25
+
26
+ def hcsr04_read(echo_pin, trigger_pin)
27
+ write Message.encode(command: 20, pin: echo_pin, value: trigger_pin)
28
+ end
25
29
  end
26
30
  end
data/lib/denko/board.rb CHANGED
@@ -110,6 +110,7 @@ module Denko
110
110
  # Component generating convenience methods. TODO: add more!
111
111
  #
112
112
  def eeprom
113
+ raise StandardError, 'board has no built-in EEPROM, or EEPROM disabled in sketch' if @eeprom_length == 0
113
114
  @eeprom ||= EEPROM::BuiltIn.new(board: self)
114
115
  end
115
116
  end
@@ -0,0 +1,33 @@
1
+ module Denko
2
+ module Sensor
3
+ class HCSR04
4
+ # Speed of sound in meters per second.
5
+ SPEED_OF_SOUND = 343.0
6
+
7
+ include Behaviors::MultiPin
8
+ include Behaviors::Poller
9
+
10
+ def initialize_pins(options={})
11
+ proxy_pin :trigger, DigitalIO::Output
12
+ proxy_pin :echo, DigitalIO::Input
13
+ end
14
+
15
+ def after_initialize(options={})
16
+ super(options)
17
+
18
+ # Receive values from echo pin.
19
+ echo.add_callback { |data| self.update(data) }
20
+ end
21
+
22
+ def _read
23
+ board.hcsr04_read(echo.pin, trigger.pin)
24
+ end
25
+
26
+ def pre_callback_filter(us)
27
+ # Data is microseconds roundtrip time. Convert to mm.
28
+ um = (us/2) * SPEED_OF_SOUND
29
+ mm = um / 1000.0
30
+ end
31
+ end
32
+ end
33
+ end
data/lib/denko/sensor.rb CHANGED
@@ -14,6 +14,7 @@ module Denko
14
14
  autoload :SHT3X, "#{__dir__}/sensor/sht3x"
15
15
  autoload :QMP6988, "#{__dir__}/sensor/qmp6988"
16
16
  autoload :RCWL9620, "#{__dir__}/sensor/rcwl9620"
17
+ autoload :HCSR04, "#{__dir__}/sensor/hcsr04"
17
18
  autoload :GenericPIR, "#{__dir__}/sensor/generic_pir"
18
19
  end
19
20
  end
data/lib/denko/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Denko
2
- VERSION = "0.13.4"
2
+ VERSION = "0.13.5"
3
3
  end
data/src/denko_wifi.ino CHANGED
@@ -30,8 +30,8 @@
30
30
  #elif defined(ESP32)
31
31
  #include <WiFi.h>
32
32
  #include <ESPmDNS.h>
33
- // #include <WiFiUdp.h>
34
- // #include <ArduinoOTA.h>
33
+ #include <WiFiUdp.h>
34
+ #include <ArduinoOTA.h>
35
35
  #define WIFI_STATUS_LED 2
36
36
  #else
37
37
  #define WIFI_STATUS_LED 13
@@ -48,13 +48,13 @@
48
48
  #endif
49
49
 
50
50
  // Configure your WiFi options here. IP address is not configurable. Uses DHCP.
51
- int port = 3466;
52
- char* ssid = "yourNetwork";
53
- char* pass = "yourPassword";
51
+ #define DENKO_TCP_PORT 3466
52
+ #define WIFI_SSID "yourNetwork"
53
+ #define WIFI_PASSWORD "yourPassword"
54
54
  boolean connected = false;
55
55
 
56
56
  Denko denko;
57
- WiFiServer server(port);
57
+ WiFiServer server(DENKO_TCP_PORT);
58
58
  WiFiClient client;
59
59
 
60
60
  // Use the built in LED to indicate WiFi status.
@@ -82,7 +82,7 @@ void printWifiStatus() {
82
82
  DENKO_SERIAL_IF.println(WiFi.localIP());
83
83
  #endif
84
84
  DENKO_SERIAL_IF.print("Denko TCP Port: ");
85
- DENKO_SERIAL_IF.println(port);
85
+ DENKO_SERIAL_IF.println(DENKO_TCP_PORT);
86
86
  indicateWiFi(true);
87
87
  }
88
88
 
@@ -94,7 +94,7 @@ void connect(){
94
94
 
95
95
  // Try to connect.
96
96
  DENKO_SERIAL_IF.print("Connecting to WiFi ");
97
- WiFi.begin(ssid, pass);
97
+ WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
98
98
 
99
99
  // Delay until connected.
100
100
  while (WiFi.status() != WL_CONNECTED) {
@@ -117,14 +117,39 @@ void setup() {
117
117
  DENKO_SERIAL_IF.begin(115200);
118
118
  while(!DENKO_SERIAL_IF);
119
119
 
120
- // Enable over the air updates on the ESP8266.
121
- #if defined(ESP8266)
120
+ // Attempt initial WiFi connection.
121
+ connect();
122
+
123
+ // Enable over the air updates on the ESP8266 and ESP32.
124
+ // Taken from standard ESP8266/ESP32 OTA examples.
125
+ #if defined(ESP8266) || (ESP32)
126
+ ArduinoOTA.onStart([]() {
127
+ String type;
128
+ if (ArduinoOTA.getCommand() == U_FLASH) {
129
+ type = "sketch";
130
+ } else { // U_FS (ESP8266) or U_SPIFFS (ESP32)
131
+ type = "filesystem";
132
+ }
133
+ // NOTE: if updating FS or SPIFFS, this would be the place to unmount using FS.end() or SPIFFS.end()
134
+ Serial.println("Arduino OTA: Start updating " + type);
135
+ });
136
+ ArduinoOTA.onEnd([]() {
137
+ Serial.println("\nArduino OTA: End\n");
138
+ });
139
+ ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
140
+ Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
141
+ });
142
+ ArduinoOTA.onError([](ota_error_t error) {
143
+ Serial.printf("Error[%u]: ", error);
144
+ if (error == OTA_AUTH_ERROR) Serial.println("Arduino OTA: Auth Failed");
145
+ else if (error == OTA_BEGIN_ERROR) Serial.println("Arduino OTA: Begin Failed");
146
+ else if (error == OTA_CONNECT_ERROR) Serial.println("Arduino OTA: Connect Failed");
147
+ else if (error == OTA_RECEIVE_ERROR) Serial.println("Arduino OTA: Receive Failed");
148
+ else if (error == OTA_END_ERROR) Serial.println("Arduino OTA: End Failed");
149
+ });
122
150
  ArduinoOTA.begin();
123
151
  #endif
124
152
 
125
- // Attempt initial WiFi connection.
126
- connect();
127
-
128
153
  // Start the denko TCP server.
129
154
  server.begin();
130
155
 
@@ -141,7 +166,7 @@ void loop() {
141
166
  maintainWiFi();
142
167
 
143
168
  // Handle OTA updates.
144
- #if defined(ESP8266)
169
+ #if defined(ESP8266) || (ESP32)
145
170
  ArduinoOTA.handle();
146
171
  #endif
147
172
 
data/src/lib/Denko.cpp CHANGED
@@ -3,6 +3,9 @@
3
3
  */
4
4
  #include "Denko.h"
5
5
  #include "BoardMap.h"
6
+ #ifdef DENKO_EEPROM
7
+ #include "EEPROM.h"
8
+ #endif
6
9
 
7
10
  Denko::Denko(){
8
11
  messageFragments[0] = cmdStr;
@@ -119,7 +122,8 @@ void Denko::process() {
119
122
  #endif
120
123
 
121
124
  // Implemented in DenkoPulseInput.cpp
122
- case 9: pulseRead (); break;
125
+ case 9: pulseRead (); break;
126
+ case 20: hcsr04Read (); break;
123
127
 
124
128
  // Implemented in DenkoServo.cpp
125
129
  #ifdef DENKO_SERVO
@@ -275,7 +279,7 @@ void Denko::handshake() {
275
279
  stream->print(',');
276
280
  #if defined(EEPROM_EMULATED)
277
281
  stream->print(EMULATED_EEPROM_LENGTH);
278
- #elif defined(EEPROM_PRESENT)
282
+ #elif defined(DENKO_EEPROM)
279
283
  stream->print(EEPROM.length());
280
284
  #endif
281
285
 
data/src/lib/Denko.h CHANGED
@@ -95,11 +95,13 @@ class Denko {
95
95
  void eepromRead (); //cmd = 7
96
96
  void eepromWrite (); //cmd = 8
97
97
 
98
- // Included Libraries
98
+ // Pulse inputs (DHT and HC-SR04)
99
99
  void pulseRead (); //cmd = 9
100
+ void hcsr04Read (); //cmd = 20
101
+
102
+ // Servos
100
103
  void servoToggle (); //cmd = 10
101
104
  void servoWrite (); //cmd = 11
102
- void handleSerial (); //cmd = 12
103
105
 
104
106
  // Single Bit Bang UART
105
107
  #ifdef DENKO_UART_BB
@@ -134,9 +134,24 @@
134
134
  // Best performance acknowledging at 64 bytes, or 32 if buffer is only 64.
135
135
  //
136
136
  // These are 256/64 regardless of whether native USB CDC or UART bridge.
137
- #if defined(ARDUINO_ARCH_RP2040) || defined(ESP32) || defined(ESP8266) || defined(__SAM3X8E__)
137
+ #if defined(ARDUINO_ARCH_RP2040) || defined(ESP8266) || defined(__SAM3X8E__)
138
138
  #define DENKO_SERIAL_BUFFER_SIZE 256
139
139
  #define DENKO_RX_ACK_INTERVAL 64
140
+ // ESP32 defaults to 256 buffer. Stay one under.
141
+ #elif defined(ESP32)
142
+ #define DENKO_SERIAL_BUFFER_SIZE 255
143
+ #ifdef ARDUINO_USB_CDC_ON_BOOT
144
+ // S2 unreliable with acknowledgement before buffer is full.
145
+ #ifdef CONFIG_IDF_TARGET_ESP32S2
146
+ #define DENKO_RX_ACK_INTERVAL 255
147
+ // S3 and C3 are fine acknowledging at half buffer filled.
148
+ #else
149
+ #define DENKO_RX_ACK_INTERVAL 128
150
+ #endif
151
+ // Default to 64 if using a UART bridge.
152
+ #else
153
+ #define DENKO_RX_ACK_INTERVAL 64
154
+ #endif
140
155
  // RA4M1 has a 512 Serial buffer.
141
156
  #elif defined(_RENESAS_RA_)
142
157
  #define DENKO_SERIAL_BUFFER_SIZE 512
@@ -31,7 +31,7 @@ void Denko::showLEDArray() {
31
31
 
32
32
  // ATmega4809 still needs this delay to avoid corrupt data. Not sure why.
33
33
  #if defined(__AVR_ATmega4809__)
34
- delayMicroseconds(64);
34
+ microDelay(64);
35
35
  #endif
36
36
 
37
37
  // Write the pixel buffer to the array.
@@ -27,7 +27,7 @@ void Denko::pulseRead(){
27
27
  uint16_t resetTime = (auxMsg[1] << 8) | auxMsg[0];
28
28
  pinMode(pin, OUTPUT);
29
29
  digitalWrite(pin, bitRead(val, 1));
30
- delayMicroseconds(resetTime);
30
+ microDelay(resetTime);
31
31
  }
32
32
  pinMode(pin, INPUT);
33
33
  byte state = digitalRead(pin);
@@ -55,3 +55,34 @@ void Denko::pulseRead(){
55
55
  }
56
56
  if (pulseCount == 0) stream->print('\n');
57
57
  }
58
+
59
+ // CMD = 20
60
+ //
61
+ // pin : echo pin
62
+ // val (lower 8 bits) : trigger pin
63
+ //
64
+ void Denko::hcsr04Read(){
65
+ // Store number of microseconds to return.
66
+ uint32_t us;
67
+
68
+ // Ensure pins are correct direction.
69
+ // This is handled by modeling the sensor as a multipin component instead.
70
+ // pinMode(pin, INPUT);
71
+ // pinMode(val, OUTPUT);
72
+
73
+ // Initial pulse on the triger pin.
74
+ digitalWrite(val, LOW);
75
+ microDelay(2);
76
+ digitalWrite(val,HIGH);
77
+ microDelay(10);
78
+ digitalWrite(val,LOW);
79
+
80
+ // Wait for the echo, up to 25,000 microseconds.
81
+ us = pulseIn(pin, HIGH, 25000);
82
+
83
+ // Send value.
84
+ stream->print(pin);
85
+ stream->print(':');
86
+ stream->print(us);
87
+ stream->print('\n');
88
+ }
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
4
+ version: 0.13.5
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-10-20 00:00:00.000000000 Z
11
+ date: 2024-02-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyserial
@@ -149,6 +149,7 @@ files:
149
149
  - examples/sensor/dht.rb
150
150
  - examples/sensor/ds18b20.rb
151
151
  - examples/sensor/generic_pir.rb
152
+ - examples/sensor/hcsr04.rb
152
153
  - examples/sensor/htu21d.rb
153
154
  - examples/sensor/htu31d.rb
154
155
  - examples/sensor/neat_tph_readings.rb
@@ -259,6 +260,7 @@ files:
259
260
  - lib/denko/sensor/dht.rb
260
261
  - lib/denko/sensor/ds18b20.rb
261
262
  - lib/denko/sensor/generic_pir.rb
263
+ - lib/denko/sensor/hcsr04.rb
262
264
  - lib/denko/sensor/htu21d.rb
263
265
  - lib/denko/sensor/htu31d.rb
264
266
  - lib/denko/sensor/qmp6988.rb