denko 0.13.4 → 0.13.5

Sign up to get free protection for your applications and to get access to all the features.
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