denko 0.14.0 → 0.15.0
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/.github/workflows/build_atmega_avr.yml +2 -1
- data/.github/workflows/build_atmega_megaavr.yml +2 -1
- data/.github/workflows/build_atsam3x.yml +1 -0
- data/.github/workflows/build_atsamd21.yml +2 -1
- data/.github/workflows/build_esp32.yml +4 -2
- data/.github/workflows/build_esp32c3.yml +4 -3
- data/.github/workflows/build_esp32c6.yml +4 -2
- data/.github/workflows/build_esp32h2.yml +4 -2
- data/.github/workflows/build_esp32s2.yml +4 -2
- data/.github/workflows/build_esp32s3.yml +4 -2
- data/.github/workflows/build_esp8266.yml +2 -1
- data/.github/workflows/build_ra4m1.yml +1 -0
- data/.github/workflows/build_rp2040.yml +4 -3
- data/.github/workflows/ruby.yml +1 -1
- data/CHANGELOG.md +203 -0
- data/DEPS_CLI.md +16 -16
- data/DEPS_IDE.md +31 -30
- data/MICROCONTROLLERS.md +103 -0
- data/PERIPHERALS.md +178 -0
- data/README.md +28 -21
- data/denko.gemspec +6 -1
- data/lib/denko/analog_io/ads1118.rb +5 -5
- data/lib/denko/analog_io/ads111x.rb +23 -19
- data/lib/denko/analog_io/joystick.rb +87 -0
- data/lib/denko/analog_io/potentiometer.rb +1 -5
- data/lib/denko/analog_io.rb +22 -8
- data/lib/denko/behaviors/bus_controller.rb +2 -1
- data/lib/denko/behaviors/bus_peripheral.rb +1 -1
- data/lib/denko/behaviors/callbacks.rb +18 -16
- data/lib/denko/behaviors/component.rb +0 -4
- data/lib/denko/behaviors/lifecycle.rb +1 -1
- data/lib/denko/behaviors/listener.rb +9 -3
- data/lib/denko/behaviors/multi_pin.rb +4 -6
- data/lib/denko/behaviors/poller.rb +11 -2
- data/lib/denko/behaviors/reader.rb +109 -21
- data/lib/denko/behaviors/single_pin.rb +2 -4
- data/lib/denko/behaviors/state.rb +18 -13
- data/lib/denko/behaviors/threaded.rb +19 -8
- data/lib/denko/behaviors.rb +36 -23
- data/lib/denko/board/eeprom.rb +1 -1
- data/lib/denko/board/i2c.rb +1 -1
- data/lib/denko/board/i2c_bit_bang.rb +9 -5
- data/lib/denko/board/map.rb +6 -2
- data/lib/denko/board/one_wire.rb +3 -3
- data/lib/denko/board/spi.rb +30 -30
- data/lib/denko/board/spi_bit_bang.rb +8 -11
- data/lib/denko/board.rb +6 -3
- data/lib/denko/connection/flow_control.rb +1 -1
- data/lib/denko/connection/serial.rb +5 -5
- data/lib/denko/digital_io/output.rb +12 -4
- data/lib/denko/digital_io/pcf8574.rb +114 -0
- data/lib/denko/digital_io/rotary_encoder.rb +10 -6
- data/lib/denko/digital_io.rb +24 -6
- data/lib/denko/display/canvas.rb +350 -157
- data/lib/denko/display/font/bmp_5x7.rb +142 -0
- data/lib/denko/display/font/bmp_6x8.rb +142 -0
- data/lib/denko/display/font/bmp_8x16.rb +141 -0
- data/lib/denko/display/font.rb +22 -0
- data/lib/denko/display/hd44780.rb +24 -20
- data/lib/denko/display/il0373.rb +186 -0
- data/lib/denko/display/mono_oled.rb +193 -0
- data/lib/denko/display/pcd8544.rb +154 -0
- data/lib/denko/display/pixel_common.rb +83 -0
- data/lib/denko/display/sh1106.rb +17 -21
- data/lib/denko/display/sh1107.rb +10 -0
- data/lib/denko/display/spi_common.rb +35 -0
- data/lib/denko/display/spi_epaper_common.rb +30 -0
- data/lib/denko/display/ssd1306.rb +6 -228
- data/lib/denko/display/ssd1680.rb +14 -0
- data/lib/denko/display/ssd1681.rb +8 -0
- data/lib/denko/display/ssd168x.rb +227 -0
- data/lib/denko/display/st7302.rb +207 -0
- data/lib/denko/display/st7565.rb +166 -0
- data/lib/denko/display.rb +40 -4
- data/lib/denko/eeprom/at24c.rb +67 -0
- data/lib/denko/eeprom/board.rb +69 -0
- data/lib/denko/eeprom.rb +15 -1
- data/lib/denko/helpers/engine_check.rb +13 -0
- data/lib/denko/{mutex_stub.rb → helpers/mutex_stub.rb} +6 -0
- data/lib/denko/helpers.rb +6 -0
- data/lib/denko/i2c/bit_bang.rb +1 -0
- data/lib/denko/i2c/bus_common.rb +9 -4
- data/lib/denko/i2c/peripheral.rb +5 -1
- data/lib/denko/i2c.rb +17 -4
- data/lib/denko/led/apa102.rb +1 -3
- data/lib/denko/led/base.rb +5 -0
- data/lib/denko/led/rgb.rb +16 -10
- data/lib/denko/led/seven_segment.rb +1 -1
- data/lib/denko/led.rb +17 -8
- data/lib/denko/motor/{stepper.rb → a3967.rb} +1 -1
- data/lib/denko/motor/servo.rb +16 -6
- data/lib/denko/motor.rb +16 -3
- data/lib/denko/one_wire/bus.rb +20 -16
- data/lib/denko/one_wire/bus_enumerator.rb +25 -14
- data/lib/denko/one_wire/helper.rb +4 -2
- data/lib/denko/one_wire.rb +18 -5
- data/lib/denko/pulse_io/buzzer.rb +2 -6
- data/lib/denko/pulse_io/ir_output.rb +1 -5
- data/lib/denko/pulse_io/pwm_output.rb +56 -31
- data/lib/denko/pulse_io.rb +17 -3
- data/lib/denko/rtc/ds3231.rb +4 -3
- data/lib/denko/rtc.rb +14 -1
- data/lib/denko/sensor/aht.rb +16 -20
- data/lib/denko/sensor/bme280.rb +23 -36
- data/lib/denko/sensor/bmp180.rb +8 -13
- data/lib/denko/sensor/dht.rb +17 -7
- data/lib/denko/sensor/ds18b20.rb +5 -4
- data/lib/denko/sensor/hdc1080.rb +174 -0
- data/lib/denko/sensor/htu21d.rb +17 -6
- data/lib/denko/sensor/htu31d.rb +6 -5
- data/lib/denko/sensor/jsnsr04t.rb +49 -0
- data/lib/denko/sensor/qmp6988.rb +14 -30
- data/lib/denko/sensor/rcwl9620.rb +1 -0
- data/lib/denko/sensor/sht3x.rb +6 -5
- data/lib/denko/sensor/sht4x.rb +125 -0
- data/lib/denko/sensor/vl53l0x.rb +58 -0
- data/lib/denko/sensor.rb +33 -15
- data/lib/denko/spi/base_register.rb +11 -7
- data/lib/denko/spi/bus_common.rb +12 -15
- data/lib/denko/spi/input_register.rb +6 -6
- data/lib/denko/spi/output_register.rb +13 -4
- data/lib/denko/spi/peripheral.rb +82 -84
- data/lib/denko/spi.rb +20 -10
- data/lib/denko/uart/bit_bang.rb +2 -27
- data/lib/denko/uart/common.rb +33 -0
- data/lib/denko/uart/hardware.rb +1 -26
- data/lib/denko/uart.rb +16 -2
- data/lib/denko/version.rb +1 -1
- data/lib/denko.rb +22 -25
- data/lib/denko_cli/targets.rb +7 -7
- data/lib/denko_cli/targets.txt +19 -20
- data/src/lib/Denko.cpp +26 -13
- data/src/lib/Denko.h +4 -4
- data/src/lib/DenkoDefines.h +7 -26
- data/src/lib/DenkoLEDArray.cpp +1 -8
- data/src/lib/DenkoSPI.cpp +31 -29
- data/src/lib/DenkoSPIBB.cpp +12 -14
- data/test/analog_io/input_test.rb +1 -1
- data/test/analog_io/potentiometer_test.rb +2 -2
- data/test/behaviors/bus_peripheral_test.rb +4 -4
- data/test/behaviors/callbacks_test.rb +20 -10
- data/test/behaviors/component_test.rb +18 -8
- data/test/board/board_test.rb +9 -9
- data/test/board/one_wire_test.rb +25 -14
- data/test/board/spi_test.rb +31 -15
- data/test/digital_io/input_test.rb +2 -2
- data/test/display/canvas_test.rb +306 -0
- data/test/display/hd44780_test.rb +34 -7
- data/test/eeprom/board_test.rb +45 -0
- data/test/helpers/mruby_minitest.rb +95 -0
- data/test/helpers/mruby_runner.rb +13 -0
- data/test/i2c/bus_test.rb +93 -30
- data/test/i2c/peripheral_test.rb +2 -2
- data/test/led/apa102_test.rb +24 -0
- data/test/led/rgb_test.rb +4 -4
- data/test/motor/{stepper_test.rb → a3967_test.rb} +2 -2
- data/test/one_wire/bus_enumerator_test.rb +1 -1
- data/test/one_wire/bus_test.rb +42 -35
- data/test/one_wire/peripheral_test.rb +5 -17
- data/test/pulse_io/ir_output_test.rb +5 -0
- data/test/pulse_io/pwm_output_test.rb +10 -10
- data/test/rtc/ds3231_test.rb +3 -2
- data/test/sensor/dht_test.rb +11 -11
- data/test/spi/bitbang_test.rb +27 -0
- data/test/spi/bus_test.rb +19 -29
- data/test/spi/input_register_test.rb +2 -2
- data/test/spi/{peripheral_multi_pin_test.rb → peripheral_test.rb} +25 -5
- data/test/test_helper.rb +44 -124
- data/vendor/board-maps/BoardMap.h +264 -0
- data/vendor/board-maps/yaml/ALFREDO_NOU3.yml +2 -0
- data/vendor/board-maps/yaml/ATD143_S3.yml +1 -0
- data/vendor/board-maps/yaml/BHARATPI_A7672S_4G.yml +14 -0
- data/vendor/board-maps/yaml/BHARATPI_LORA.yml +14 -0
- data/vendor/board-maps/yaml/BHARATPI_NODE_WIFI.yml +14 -0
- data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +0 -1
- data/vendor/board-maps/yaml/CEZERIO_DEV_ESP32C6.yml +14 -0
- data/vendor/board-maps/yaml/CEZERIO_MINI_DEV_ESP32C6.yml +12 -0
- data/vendor/board-maps/yaml/CIRCUITART_ZERO_S3.yml +71 -0
- data/vendor/board-maps/yaml/CODECELLC3.yml +13 -0
- data/vendor/board-maps/yaml/CYOBOT_V2_ESP32S3.yml +7 -0
- data/vendor/board-maps/yaml/EDGES3D.yml +25 -0
- data/vendor/board-maps/yaml/ESP32C6_DEV.yml +3 -4
- data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +0 -1
- data/vendor/board-maps/yaml/ESP32H2_DEV.yml +0 -1
- data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +0 -1
- data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
- data/vendor/board-maps/yaml/ESP32S2_DEV.yml +0 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO.yml +0 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +0 -1
- data/vendor/board-maps/yaml/ESP32_2432S028R.yml +14 -0
- data/vendor/board-maps/yaml/FEATHERS3.yml +1 -1
- data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
- data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +0 -1
- data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -0
- data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E290.yml +41 -0
- data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E_213.yml +41 -0
- data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_T190.yml +41 -0
- data/vendor/board-maps/yaml/HUIDU_HD_WF2.yml +5 -0
- data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_CC1101.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_LR1121.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_SI4432.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_SX1262.yml +6 -0
- data/vendor/board-maps/yaml/LILYGO_LORA_SX1280.yml +6 -0
- data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +0 -1
- data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +1 -2
- data/vendor/board-maps/yaml/LoPy.yml +0 -1
- data/vendor/board-maps/yaml/LoPy4.yml +0 -1
- data/vendor/board-maps/yaml/M5STACK_DINMETER.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -1
- data/vendor/board-maps/yaml/OMGS3.yml +25 -0
- data/vendor/board-maps/yaml/PCBCUPID_GLYPHC3.yml +23 -0
- data/vendor/board-maps/yaml/PCBCUPID_GLYPHC6.yml +32 -0
- data/vendor/board-maps/yaml/PCBCUPID_GLYPHH2.yml +24 -0
- data/vendor/board-maps/yaml/PYCOM_GPY.yml +0 -1
- data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +1 -1
- data/vendor/board-maps/yaml/SPARKFUN_ESP32S3_THING_PLUS.yml +13 -0
- data/vendor/board-maps/yaml/SPARKLEMOTIONMINI_ESP32.yml +12 -0
- data/vendor/board-maps/yaml/SPARKLEMOTIONSTICK_ESP32.yml +11 -0
- data/vendor/board-maps/yaml/SPARKLEMOTION_ESP32.yml +12 -0
- data/vendor/board-maps/yaml/SQUIXL.yml +7 -0
- data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +0 -1
- data/vendor/board-maps/yaml/T_LORA_PAGER.yml +6 -0
- data/vendor/board-maps/yaml/T_WATCH_S3.yml +7 -0
- data/vendor/board-maps/yaml/T_WATCH_S3_ULTRA.yml +6 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_146.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_147.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_169.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_185.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_RELAY_6CH.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_143.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_164.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_18.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_191.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_241.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_146.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_169.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185_BOX.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_21.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_28.yml +41 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_4.yml +36 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43B.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5B.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_7.yml +38 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_ZERO.yml +36 -0
- data/vendor/board-maps/yaml/WIPY3.yml +0 -1
- data/vendor/board-maps/yaml/WS_ESP32_S3_MATRIX.yml +38 -0
- data/vendor/board-maps/yaml/XIAO_ESP32S3_PLUS.yml +46 -0
- data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V2.yml +28 -0
- data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V3.yml +28 -0
- data/vendor/board-maps/yaml/YB_ESP32S3_ETH.yml +40 -0
- data/vendor/board-maps/yaml/mercury.yml +20 -0
- metadata +116 -101
- data/.vscode/settings.json +0 -5
- data/.vscode/tasks.json +0 -20
- data/HARDWARE.md +0 -263
- data/benchmarks/analog_listen.rb +0 -49
- data/benchmarks/digital_write.rb +0 -28
- data/benchmarks/i2c_ssd1306_refresh.rb +0 -91
- data/examples/advanced/m5_env3.rb +0 -46
- data/examples/advanced/rotary_encoder_mac_volume.rb +0 -53
- data/examples/advanced/ssd1306_time_temp_rh.rb +0 -43
- data/examples/analog_io/ads1100.rb +0 -48
- data/examples/analog_io/ads1115.rb +0 -57
- data/examples/analog_io/ads1118.rb +0 -65
- data/examples/analog_io/dac_loopback.rb +0 -34
- data/examples/analog_io/input.rb +0 -56
- data/examples/analog_io/input_smoothing.rb +0 -27
- data/examples/analog_io/potentiometer.rb +0 -31
- data/examples/connection/binary_echo.rb +0 -34
- data/examples/connection/tcp.rb +0 -19
- data/examples/digital_io/button.rb +0 -17
- data/examples/digital_io/relay.rb +0 -17
- data/examples/digital_io/rotary_encoder.rb +0 -36
- data/examples/display/hd44780.png +0 -0
- data/examples/display/hd44780.rb +0 -47
- data/examples/display/ssd1306.rb +0 -43
- data/examples/display/ssd1306_s2_pico.rb +0 -29
- data/examples/eeprom/built_in.rb +0 -32
- data/examples/i2c/search.rb +0 -39
- data/examples/led/apa102_bounce.rb +0 -32
- data/examples/led/apa102_fade.rb +0 -44
- data/examples/led/builtin_blink.rb +0 -14
- data/examples/led/builtin_fade.rb +0 -19
- data/examples/led/rgb_led.rb +0 -31
- data/examples/led/seven_segment_char_echo.rb +0 -17
- data/examples/led/ws2812_bounce.rb +0 -30
- data/examples/led/ws2812_builtin_blink.rb +0 -22
- data/examples/led/ws2812_fade.rb +0 -43
- data/examples/motor/l298.rb +0 -45
- data/examples/motor/servo.rb +0 -17
- data/examples/motor/stepper.png +0 -0
- data/examples/motor/stepper.rb +0 -43
- data/examples/one_wire/search.rb +0 -32
- data/examples/pulse_io/buzzer.rb +0 -35
- data/examples/pulse_io/ir_output.rb +0 -51
- data/examples/pulse_io/pwm_output.rb +0 -30
- data/examples/rtc/ds3231.rb +0 -31
- data/examples/sensor/aht10.rb +0 -17
- data/examples/sensor/aht20.rb +0 -17
- data/examples/sensor/bme280.rb +0 -38
- data/examples/sensor/bmp180.rb +0 -26
- data/examples/sensor/dht.rb +0 -29
- data/examples/sensor/ds18b20.rb +0 -57
- data/examples/sensor/generic_pir.rb +0 -27
- data/examples/sensor/hcsr04.rb +0 -17
- data/examples/sensor/htu21d.rb +0 -43
- data/examples/sensor/htu31d.rb +0 -33
- data/examples/sensor/neat_tph_readings.rb +0 -32
- data/examples/sensor/qmp6988.rb +0 -51
- data/examples/sensor/rcwl9620.rb +0 -15
- data/examples/sensor/sht3x.rb +0 -32
- data/examples/spi/bitbang_loopback.rb +0 -46
- data/examples/spi/input_register.rb +0 -40
- data/examples/spi/output_register.rb +0 -41
- data/examples/spi/ssd_through_registers.rb +0 -28
- data/examples/spi/two_registers.rb +0 -40
- data/examples/uart/bit_bang_demo.rb +0 -25
- data/examples/uart/board_passthrough.rb +0 -40
- data/examples/uart/hardware_loopback.rb +0 -16
- data/lib/denko/eeprom/built_in.rb +0 -72
- data/lib/denko/fonts.rb +0 -106
- data/test/eeprom/built_in_test.rb +0 -61
- data/test/spi/peripheral_single_pin_test.rb +0 -48
- data/tutorial/01-led/led.fzz +0 -0
- data/tutorial/01-led/led.pdf +0 -0
- data/tutorial/01-led/led.rb +0 -73
- data/tutorial/02-button/button.fzz +0 -0
- data/tutorial/02-button/button.pdf +0 -0
- data/tutorial/02-button/button.rb +0 -65
- data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
- data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
- data/tutorial/03-potentiometer/potentiometer.rb +0 -66
- data/tutorial/04-pwm_led/pwm_led.fzz +0 -0
- data/tutorial/04-pwm_led/pwm_led.pdf +0 -0
- data/tutorial/04-pwm_led/pwm_led.rb +0 -64
- data/tutorial/05-rgb_led/rgb_led.fzz +0 -0
- data/tutorial/05-rgb_led/rgb_led.pdf +0 -0
- data/tutorial/05-rgb_led/rgb_led.rb +0 -58
- data/tutorial/05-rgb_led/rgb_mapping.rb +0 -76
data/HARDWARE.md
DELETED
@@ -1,263 +0,0 @@
|
|
1
|
-
# Microcontrollers
|
2
|
-
|
3
|
-
:green_heart: Full support :yellow_heart: Partial support :heart: Planned. No support yet :question: Works in theory. Untested in real hardware.
|
4
|
-
|
5
|
-
### Espressif Chips with Wi-Fi (Except H2)
|
6
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_esp8266.yml)
|
7
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32.yml)
|
8
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32c3.yml)
|
9
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32c6.yml)
|
10
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32h2.yml)
|
11
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32s2.yml)
|
12
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_esp32s3.yml)
|
13
|
-
|
14
|
-
| Chip | Status | Board Tested | Notes |
|
15
|
-
| :-------- | :------: | :--------------- |------ |
|
16
|
-
| ESP8266 | :green_heart: | NodeMCU |
|
17
|
-
| ESP8285 | :question: | DOIT ESP-Mx DevKit | Should be identical to 8266. Not tested in hardware.
|
18
|
-
| ESP32 | :green_heart: | DOIT ESP32 DevKit V1 |
|
19
|
-
| ESP32-S2 | :green_heart: | LOLIN S2 Pico | Native USB-CDC (broken in core 3.0+)
|
20
|
-
| ESP32-S3 | :green_heart: | LOLIN S3 V1.0.0 | Native USB-CDC (broken in core 3.0+)
|
21
|
-
| ESP32-C3 | :green_heart: | LOLIN C3 Mini V2.1.0 | Native USB-CDC (broken in core 3.0+)
|
22
|
-
| ESP32-H2 | :green_heart: | ESP32-H2-MINI-1 | No Wi-Fi. Native USB-CDC (broken in core 3.0+)
|
23
|
-
| ESP32-C6 | :green_heart: | ESP32-C6-WROOM-1 | Native USB-CDC (broken in core 3.0+)
|
24
|
-
|
25
|
-
**Note:** For ESP32 chips using native USB-CDC, 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.
|
26
|
-
|
27
|
-
**Note:** Since Arduino ESP32 Core version 3.0+, USB-CDC is very unreliable when sending lots of data both directions (something denko can do). It's a known issue in the core. Use a regular UART until it's fixed.
|
28
|
-
|
29
|
-
### AVR/MegaAVR Based Arduino Products (and Clones)
|
30
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_atmega_avr.yml)
|
31
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_atmega_megaavr.yml)
|
32
|
-
|
33
|
-
| Chip | Status | Products | Notes |
|
34
|
-
| :-------- | :------: | :--------------- |------ |
|
35
|
-
| ATmega168 | :green_heart: | Duemilanove, Diecimila, Pro | Omits features. `denko targets` for info.
|
36
|
-
| ATmega328 | :green_heart: | Uno R3, Uno WiFi, Nano, Fio, Pro |
|
37
|
-
| ATmega32u4 | :green_heart: | Leonardo, Micro, Leonardo ETH, Esplora, LilyPad USB |
|
38
|
-
| ATmega1280 | :green_heart: | Mega |
|
39
|
-
| ATmega2560 | :green_heart: | Mega2560, Arduino Mega ADK |
|
40
|
-
| ATmega4809 | :green_heart: | Nano Every, Uno WiFi Rev2 |
|
41
|
-
|
42
|
-
**Note:** Only USB boards listed. Any board with a supported chip should work, once you can flash it and connect to serial.
|
43
|
-
|
44
|
-
### ARM Based Arduino Products (and Clones)
|
45
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_atsam3x.yml)
|
46
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_atsamd21.yml)
|
47
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_ra4m1.yml)
|
48
|
-
|
49
|
-
| Chip | Status | Products | Notes |
|
50
|
-
| :-------- | :------: | :--------------- |------ |
|
51
|
-
| ATSAM3X8E | :yellow_heart: | Due | Uses Native USB. Tone and IR Out don't work.
|
52
|
-
| ATSAMD21 | :green_heart: | Zero, M0 Series, Nano 33 IOT, MKR WiFi 1010 | Native USB
|
53
|
-
| RA4M1 | :yellow_heart: | Uno R4 Minima, Uno R4 WiFi | IR and WS2812 libraries don't support this yet
|
54
|
-
|
55
|
-
### Arduino Networking
|
56
|
-
|
57
|
-
| Chip | Status | Products | Notes |
|
58
|
-
| :-------- | :------: | :--------------- |------ |
|
59
|
-
| Wiznet W5100/5500 | :green_heart: | Ethernet Shield | Wired Ethernet for Uno/Mega pin-compatibles
|
60
|
-
| HDG204 + AT32UC3 | :question: | WiFi Shield | Compiles, but no hardware
|
61
|
-
| ATWINC1500 | :green_heart: | MKR1000, WiFi Shield 101 | #define WIFI_101 for shield. Automatic for MKR1000
|
62
|
-
| u-blox NINA-W102 | :question: | Uno WiFi Rev 2, MKR WiFi 1010, Nano 33 IOT | Should work. No hardware
|
63
|
-
|
64
|
-
### AVR Chips from [MightyCore](https://github.com/MCUdude/MightyCore)
|
65
|
-
|
66
|
-
| Chip | Status | Products | Notes |
|
67
|
-
| :-------- | :------: | :--------------- |------ |
|
68
|
-
| ATmega1284 | :heart: | Used in many 8-bit 3D printer boards. |
|
69
|
-
|
70
|
-
### Raspberry Pi Microcontrollers
|
71
|
-
[](https://github.com/denko-rb/denko/actions/workflows/build_rp2040.yml)
|
72
|
-
|
73
|
-
| Chip | Status | Board Tested | Notes |
|
74
|
-
| :-------- | :------: | :--------------- |------ |
|
75
|
-
| RP2040 | :green_heart: | Raspberry Pi Pico (W) |
|
76
|
-
|
77
|
-
# Single Board Computers
|
78
|
-
|
79
|
-
See the [Support](https://github.com/denko-rb/denko-piboard?tab=readme-ov-file#support) section of denko-piboard.
|
80
|
-
|
81
|
-
# Peripherals
|
82
|
-
|
83
|
-
:green_heart: Full support :yellow_heart: Partial support :heart: Planned. No support yet
|
84
|
-
|
85
|
-
### Interfaces
|
86
|
-
|
87
|
-
| Name | Status | HW/SW | Component Class | Notes |
|
88
|
-
| :--------------- | :------: | :--- | :-------------- | :---- |
|
89
|
-
| Digital In | :green_heart: | H | `DigitalIO::Input` | 1ms - 128ms (4ms default) listen, poll, or read
|
90
|
-
| Analog In (ADC) | :green_heart: | H | `AnalogIO::Input` | 1ms - 128ms (16ms default) listen, poll, or read
|
91
|
-
| Digital Out | :green_heart: | H | `DigitalIO::Output` |
|
92
|
-
| Analog Out (DAC) | :green_heart: | H | `AnalogIO::Output` | **Only** SAM3X, SAMD21, RA4M1, ESP32, ESP32-S2
|
93
|
-
| PWM Out | :green_heart: | H | `PulseIO::PWMOutput` |
|
94
|
-
| Servo/ESC Motor Drive | :green_heart: | H | See Motor Driver Table | Depends on PWM
|
95
|
-
| Tone Out (Sq. Wave) | :green_heart: | H | `PulseIO::Buzzer` | Except SAM3X. Uses PWM
|
96
|
-
| I2C | :green_heart: | H | `I2C::Bus` | Predetermined pins per board
|
97
|
-
| I2C Bit-Bang | :green_heart: | S | `I2C::BitBang` | Any pins
|
98
|
-
| SPI | :green_heart: | H | `SPI::Bus` | Predetermined pins per board
|
99
|
-
| SPI Bit-Bang | :green_heart: | S | `SPI::BitBang` | Any pins
|
100
|
-
| UART | :green_heart: | H | `UART::Hardware` | **Except** Atmega328, ATmega168
|
101
|
-
| UART Bit-Bang | :green_heart: | S | `UART::BitBang` | **Only** ATmega328
|
102
|
-
| Maxim OneWire | :green_heart: | S | `OneWire::Bus` | No overdrive
|
103
|
-
| Infrared Output | :green_heart: | S | `PulseIO::IROutput` | **Except** SAM3X, RA4M1
|
104
|
-
| Infrared Input | :heart: | S | `PulseIO::IRInput` | Doable with existing library
|
105
|
-
| WS2812 RGB LEDs | :green_heart: | S | `LED::WS2812` | **Except** RA4M1
|
106
|
-
| ESP32-PCNT | :heart: | H | - | **Only** ESP32. Pulse and encoder counter
|
107
|
-
| ESP32-MCPWM | :heart: | H | - | **Only** ESP32. Motor control PWM
|
108
|
-
|
109
|
-
**Note:** When listening, the board checks the pin's value every **_2^n_** milliseconds (**_n_** from **_0_** to **_7_**), without further commands.
|
110
|
-
Polling and reading follow a call and response pattern.
|
111
|
-
|
112
|
-
### Basic Input/Output
|
113
|
-
|
114
|
-
| Name | Status | Interface | Component Class | Notes |
|
115
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
116
|
-
| Button | :green_heart: | Digital In | `DigitalIO::Button` |
|
117
|
-
| Rotary Encoder | :green_heart: | Digital In | `DigitalIO::RotaryEncoder` | Listens every 1ms
|
118
|
-
| Potentiometer | :green_heart: | Analog In | `AnalogIO::Potentiometer` | Smoothing on by default
|
119
|
-
| Relay | :green_heart: | Digital Out | `DigitalIO::Relay` |
|
120
|
-
|
121
|
-
### LEDs
|
122
|
-
|
123
|
-
| Name | Status | Interface | Component Class | Notes |
|
124
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
125
|
-
| LED | :green_heart: | Digi/Ana Out | `LED::Base` |
|
126
|
-
| RGB LED | :green_heart: | Digi/Ana Out | `LED::RGB` |
|
127
|
-
| 7 Segment Display | :yellow_heart: | Digital Out | `LED::SevenSegment` | No decimal point
|
128
|
-
| 8x8 LED (MAX7219) | :heart: | SPI | `LED::MAX7219` |
|
129
|
-
| TM1637 | :heart: | BitBang SPI | `LED::TM1637` | 4x 7 Segment + Colon
|
130
|
-
| Neopixel / WS2812B | :yellow_heart: | Adafruit Library | `LED::WS2812` | Not working on RP2040
|
131
|
-
| Dotstar / APA102 | :green_heart: | SPI | `LED::APA102` |
|
132
|
-
|
133
|
-
### Displays
|
134
|
-
|
135
|
-
| Name | Status | Interface | Component Class | Notes |
|
136
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
137
|
-
| HD44780 LCD | :green_heart: | Digital Out, Output Register | `Display::HD44780` |
|
138
|
-
| SSD1306 OLED | :yellow_heart: | I2C or SPI | `Display::SSD1306` | 1 font, some graphics
|
139
|
-
| SH1106 OLED | :yellow_heart: | I2C or SPI | `Display::SH1106` | Works same as SSD1306
|
140
|
-
| ST7565R (128x64 Mono) | :heart: | SPI | `Display::ST7565R` |
|
141
|
-
| ST7735S (160x128 RGB) | :heart: | SPI | `Display::ST7735S` |
|
142
|
-
| ILI9341 (240x320 RGB) | :heart: | SPI | `Display::ILI9341` |
|
143
|
-
| GC9107 (128x128 RGB) | :heart: | SPI | `Display::GC9107` |
|
144
|
-
| GC9A01 (240x240 Round) | :heart: | SPI | `Display::GCA9A01` |
|
145
|
-
| IL0373 (212x104 E-Paper) | :heart: | SPI | `Display::IL0373` |
|
146
|
-
|
147
|
-
### Sound
|
148
|
-
|
149
|
-
| Name | Status | Interface | Component Class | Notes |
|
150
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
151
|
-
| Piezo Buzzer | :green_heart: | Tone Out | `PulseIO::Buzzer` | Frequency > 30Hz
|
152
|
-
|
153
|
-
### Motors / Motor Drivers
|
154
|
-
|
155
|
-
| Name | Status | Interface | Component Class | Notes |
|
156
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
157
|
-
| Generic Hobby Servo | :green_heart: | Servo/ESC PWM | `Motor::Servo` | Max depends on PWM channel count
|
158
|
-
| Generic ESC | :yellow_heart: | Servo/ESC PWM | `Motor::Servo` | Works. Needs its own class.
|
159
|
-
| PCA9685 | :heart: | I2C | `PulseIO::PCA9685` | 16-ch, 12-bit PWM for servo or LED
|
160
|
-
| L298N | :green_heart: | Digi + PWM Out | `Motor::L298` | H-Bridge DC motor driver
|
161
|
-
| DRV8833 | :heart: | Digi + PWM Out | `Motor::DRV8833` | H-Bridge DC motor driver
|
162
|
-
| TB6612 | :heart: | Digi + PWM Out | `Motor::TB6612` | H-Bridge DC motor driver
|
163
|
-
| A3967 | :green_heart: | Digital Out | `Motor::Stepper` | 1-ch microstepper (EasyDriver)
|
164
|
-
| A4988 | :yellow_heart: | DigitalOut | `Motor::Stepper` | 1-ch microstepper
|
165
|
-
| TMC2209 | :heart: | - | - | 1-ch silent stepper driver
|
166
|
-
|
167
|
-
### I/O Expansion
|
168
|
-
|
169
|
-
| Name | Status | Interface | Component Class | Notes |
|
170
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
171
|
-
| Input Register | :green_heart: | SPI | `SPI::InputRegister` | Tested on CD4021B
|
172
|
-
| Output Register | :green_heart: | SPI | `SPI::OutputRegister`| Tested on 74HC595
|
173
|
-
| PCF8574 Expander | :heart: | I2C | `DigitalIO::PCF8574` | 8-ch bi-directional digital I/O
|
174
|
-
| ADS1100 ADC | :green_heart: | I2C | `AnalogIO::ADS1100` | 1-ch, 16-bit ADC. No continuous mode.
|
175
|
-
| ADS1115 ADC | :green_heart: | I2C | `AnalogIO::ADS1115` | 4-ch, 16-bit ADC. Comparator not implemented.
|
176
|
-
| ADS1118 ADC | :green_heart: | SPI | `AnalogIO::ADS1118` | 4-ch, 16-bit ADC + temperature
|
177
|
-
| ADS1232 ADC | :heart: | SPI | `AnalogIO::ADS1232` | 2-ch, 24-bit ADC + temperature
|
178
|
-
| PCF8591 ADC/DAC | :heart: | I2C | `AnalogIO::PCF8591` | 4-ch, 8-bit ADC + 1-ch 8-bit DAC
|
179
|
-
| MCP4725 DAC | :heart: | I2C | `AnalogIO::MCP4275` | 1-ch, 12-bit DAC
|
180
|
-
| PCA9548 I2C Mux | :heart: | I2C | `I2C::PCA9548` | 8-way I2C multiplexer
|
181
|
-
|
182
|
-
### Environmental Sensors
|
183
|
-
|
184
|
-
| Name | Status | Interface | Component Class | Type | Notes |
|
185
|
-
| :--------------- | :------: | :-------- | :--------------- |--------------- | ---------------------- |
|
186
|
-
| MAX31850 | :heart: | OneWire | `Sensor::MAX31850` | Thermocouple |
|
187
|
-
| MAX6675 | :heart: | SPI | `Sensor::MAX6675` | Thermocouple |
|
188
|
-
| DS18B20 | :green_heart: | OneWire | `Sensor::DS18B20` | Temp |
|
189
|
-
| DHT11/21/22 | :green_heart: | Digi In/Out | `Sensor::DHT` | Temp / RH |
|
190
|
-
| SHT30/31/35 | :green_heart: | I2C | `Sensor::SHT3X` | Temp / RH | M5Stack ENV III, one-shot only
|
191
|
-
| SHT40/41 | :heart: | I2C | `Sensor::SHT4X` | Temp / RH |
|
192
|
-
| QMP6988 | :green_heart: | I2C | `Sensor::QMP6988` | Temp / Press | M5Stack ENV III
|
193
|
-
| BMP180 | :green_heart: | I2C | `Sensor::BMP180` | Temp / Press |
|
194
|
-
| BMP280 | :green_heart: | I2C | `Sensor::BMP280` | Temp / Press |
|
195
|
-
| BME280 | :green_heart: | I2C | `Sensor::BME280` | Temp / Press / RH |
|
196
|
-
| BME680 | :heart: | I2C | `Sensor::BME680` | Temp / Press / RH / TVOC |
|
197
|
-
| HTU21D | :green_heart: | I2C | `Sensor::HTU21D` | Temp / RH | No user register read
|
198
|
-
| HTU31D | :green_heart: | I2C | `Sensor::HTU31D` | Temp / RH | No diagnostic read
|
199
|
-
| AHT10/15 | :green_heart: | I2C | `Sensor::AHT10` | Temp / RH |
|
200
|
-
| AHT20/21/25 | :green_heart: | I2C | `Sensor::AHT20` | Temp / RH |
|
201
|
-
| ENS160 | :heart: | I2C | `Sensor::ENS160` | eCO2 / TVOC / AQI |
|
202
|
-
| AGS02MA | :heart: | I2C | `Sensor::AGS02MA` | TVOC |
|
203
|
-
| SCD40 | :heart: | I2C | `Sensor::SDC40` | Temp / Press / CO2 |
|
204
|
-
| CCS811 | :heart: | I2C | `Sensor::CCS811` | eCO2 |
|
205
|
-
|
206
|
-
### Light Sensors
|
207
|
-
|
208
|
-
| Name | Status | Interface | Component Class | Notes |
|
209
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
210
|
-
| BH1750 | :heart: | Digital In | `Sensor::BH1750` | Ambient Light
|
211
|
-
| TCS34725 | :heart: | I2C | `Sensor::TCS34725` | RGB
|
212
|
-
| APDS9960 | :heart: | I2C | `Sensor::APDS9960` | Proximity, RGB, Gesture
|
213
|
-
|
214
|
-
### PIR Motion Sensors
|
215
|
-
| Name | Status | Interface | Component Class | Notes |
|
216
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
217
|
-
| HC-SR501 | :green_heart: | Digital In | `Sensor::GenericPIR` |
|
218
|
-
| HC-SR505 | :yellow_heart: | Digital In | `Sensor::GenericPIR` |
|
219
|
-
| AS312 | :green_heart: | Digital In | `Sensor::GenericPIR` |
|
220
|
-
| AM312 | :yellow_heart: | Digital In | `Sensor::GenericPIR` |
|
221
|
-
|
222
|
-
### Distance Sensors
|
223
|
-
|
224
|
-
| Name | Status | Interface | Component Class | Notes |
|
225
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
226
|
-
| HC-SR04 | :green_heart: | Digi In/Out | `Sensor::HCSR04` | Ultrasonic, 20-4000mm
|
227
|
-
| RCWL-9620 | :green_heart: | I2C | `Sensor::RCWL9260` | Ultrasonic, 20-4500mm
|
228
|
-
| VL53L0X | :heart: | I2C | `Sensor::VL53L0X` | Laser, 30 - 1000mm
|
229
|
-
| GP2Y0E03 | :heart: | I2C | `Sensor::GP2Y0E03` | Infrared, 40 - 500mm
|
230
|
-
|
231
|
-
### Inertial Measurement Units
|
232
|
-
|
233
|
-
| Name | Status | Interface | Component Class | Notes |
|
234
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
235
|
-
| ADXL345 | :heart: | I2C | `Sensor::ADXL345` | Accelerometer
|
236
|
-
| IT3205 | :heart: | I2C | `Sensor::IT3205` | Gyroscope
|
237
|
-
| HMC5883L | :heart: | I2C | `Sensor::HMC5883L` | Compass
|
238
|
-
| MPU6050 | :heart: | I2C | `Sensor::MPU6050` | Gyro + Accelerometer
|
239
|
-
| MPU6886 | :heart: | I2C | `Sensor::MPU6886` | Gyro + Accelerometer
|
240
|
-
| BMI160 | :heart: | I2C | `Sensor::BMI160` | Gyro + Accelerometer
|
241
|
-
| LSM6DS3 | :heart: | I2C | `Sensor:LSM6DS3` | Gyro + Accelerometer
|
242
|
-
|
243
|
-
### Real Time Clocks
|
244
|
-
|
245
|
-
| Name | Status | Interface | Component Class | Notes |
|
246
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
247
|
-
| DS1302 | :heart: | I2C | `RTC::DS1302` |
|
248
|
-
| DS1307 | :heart: | I2C | `RTC::DS1307` |
|
249
|
-
| DS3231 | :green_heart: | I2C | `RTC::DS3231` | Alarms not implemented
|
250
|
-
| PCF8563 | :heart: | I2C | `RTC::PCF8563` |
|
251
|
-
|
252
|
-
### GPS
|
253
|
-
|
254
|
-
| Name | Status | Interface | Component Class | Notes |
|
255
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
256
|
-
| GT-U7 | :heart: | UART | - |
|
257
|
-
|
258
|
-
### Miscellaneous
|
259
|
-
|
260
|
-
| Name | Status | Interface | Component Class | Notes |
|
261
|
-
| :--------------- | :------: | :-------- | :--------------- |------ |
|
262
|
-
| Board EEPROM | :green_heart: | Built-In | `EEPROM::BuiltIn` | Arduino ARM boards have no EEPROM
|
263
|
-
| MFRC522 | :heart: | SPI/I2C | `DigitalIO::MFRC522` | RFID tag reader / writer
|
data/benchmarks/analog_listen.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Find how much analog listen throughput is available from a Board.
|
3
|
-
#
|
4
|
-
# To find the limit, add more pins and/or reduce the divider until
|
5
|
-
# the rate per input pin can't meet the target.
|
6
|
-
# Example: Rate per input pin is < 500 Hz when divider is 2 ms.
|
7
|
-
#
|
8
|
-
require 'bundler/setup'
|
9
|
-
require 'denko'
|
10
|
-
|
11
|
-
# In seconds
|
12
|
-
TEST_TIME = 30
|
13
|
-
|
14
|
-
# Millisecond interval for analog listeners
|
15
|
-
# Valid values: 1, 2, 4, 8, 16, 32, 64, 128
|
16
|
-
DIVIDER = 2
|
17
|
-
|
18
|
-
# Input pins to read
|
19
|
-
PINS = [:A0, :A1]
|
20
|
-
|
21
|
-
connection = Denko::Connection::Serial.new
|
22
|
-
board = Denko::Board.new(connection)
|
23
|
-
inputs = PINS.map { |pin| Denko::AnalogIO::Input.new(pin: pin, board: board) }
|
24
|
-
|
25
|
-
# No mutex. Denko::Board callbacks are sequential, regardless of Ruby engine.
|
26
|
-
$readings = 0
|
27
|
-
inputs.each do |input|
|
28
|
-
input.add_callback { $readings += 1 }
|
29
|
-
input.listen(DIVIDER)
|
30
|
-
end
|
31
|
-
|
32
|
-
print "Sampling for #{TEST_TIME} seconds... "
|
33
|
-
|
34
|
-
# Main test
|
35
|
-
start = Time.now
|
36
|
-
$readings = 0
|
37
|
-
sleep TEST_TIME
|
38
|
-
finish = Time.now
|
39
|
-
# Copy immediately to another variable before stopping inputs.
|
40
|
-
readings = $readings
|
41
|
-
inputs.each { |input| input.stop }
|
42
|
-
|
43
|
-
puts "Done."; puts
|
44
|
-
|
45
|
-
rps = (readings / (finish - start))
|
46
|
-
rpspi = rps / inputs.count
|
47
|
-
puts "Total analog readings : #{readings}"
|
48
|
-
puts "Analog readings /s : #{rps.round(3)}"
|
49
|
-
puts "Rate per input pin : #{rpspi.round(3)} Hz"
|
data/benchmarks/digital_write.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Benchmark digital write throughput for a Denko::Board instance.
|
3
|
-
#
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'denko'
|
6
|
-
|
7
|
-
# Pins > 63 will not benefit from the single-byte message optimization.
|
8
|
-
PIN = 4
|
9
|
-
TOTAL_WRITES = 200_000
|
10
|
-
|
11
|
-
connection = Denko::Connection::Serial.new
|
12
|
-
board = Denko::Board.new(connection)
|
13
|
-
output = Denko::DigitalIO::Output.new(board: board, pin: PIN)
|
14
|
-
|
15
|
-
print "Testing #{TOTAL_WRITES} digital writes... "
|
16
|
-
|
17
|
-
start = Time.now
|
18
|
-
(TOTAL_WRITES / 2).times do
|
19
|
-
output.high
|
20
|
-
output.low
|
21
|
-
end
|
22
|
-
board.finish_write
|
23
|
-
finish = Time.now
|
24
|
-
|
25
|
-
puts "Done."; puts
|
26
|
-
|
27
|
-
wps = TOTAL_WRITES / (finish - start)
|
28
|
-
puts "Digital writes per second : #{wps.round(3)}"
|
@@ -1,91 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Repeatedly writes filled and empty frames to the OLED
|
3
|
-
# Calculates frames per second. Higher is better.
|
4
|
-
#
|
5
|
-
# RESULTS:
|
6
|
-
# July 6 2023 | i7 8700k CPU | CRuby 3.2.1 | 100 frames | 1 Mhz I2C frequency | Average of 3 runs
|
7
|
-
#
|
8
|
-
# Arduino Uno R3 : 5.3 fps (ATmega16u2 UART bridge @ 115200, no I2C level shifter)
|
9
|
-
# Arduino Uno R3 : 7.1 fps (ATmega16u2 UART bridge @ 230400, no I2C level shifter)
|
10
|
-
# Arduino Leonardo : 12.9 fps (native USB, no I2C level shifter)
|
11
|
-
# Arduino Due : 43.0 fps (native USB)
|
12
|
-
# Arduino Due : 7.9 fps (programming USB @ 115200)
|
13
|
-
# Arduino Zero : 28.6 fps (native USB)
|
14
|
-
# Arduino Zero : 9.4 fps (programming USB @ 115200)
|
15
|
-
# Arduino Zero : 13.6 fps (programming USB @ 230400)
|
16
|
-
# ESP8266 (Node MCU) : 9.9 fps (Silicon Labs UART bridge @ 115200)
|
17
|
-
# ESP8266 (Node MCU) : 19.7 fps (Silicon Labs UART bridge @ 230400)
|
18
|
-
# ESP32 V1 : 9.8 fps (Silicon Labs UART bridge @ 115200)
|
19
|
-
# ESP32 V1 : 19.4 fps (Silicon Labs UART bridge @ 230400)
|
20
|
-
# ESP32-S3 : 58.8 fps (native USB)
|
21
|
-
# Raspberry Pi Pico W : 36.4 fps (native USB)
|
22
|
-
#
|
23
|
-
# July 15 2023 | i7 8700k CPU | CRuby 3.2.1 | 100 frames | 1 Mhz I2C frequency | Average of 3 runs
|
24
|
-
#
|
25
|
-
# Arduino Uno R4 WiFi : 7.5 fps (USB through ESP32-S3 @ 115200, 32-byte I2C limit, no I2C level shifter)
|
26
|
-
# Arduino Uno R4 WiFi : 7.8 fps (USB through ESP32-S3 @ 230400, 32-byte I2C limit, no I2C level shifter)
|
27
|
-
#
|
28
|
-
# August 13 2023 | i7 8700k CPU | CRuby 3.2.1 | 100 frames | 1 Mhz I2C frequency | Average of 3 runs
|
29
|
-
#
|
30
|
-
# Arduino Nano Every : 9.2 fps (USB through ATSAMD11 @ 115200, 128-byte I2C limit, no I2C level shifter)
|
31
|
-
# Arduino Nano Every : 13.0 fps (USB through ATSAMD11 @ 230400, 128-byte I2C limit, no I2C level shifter)
|
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
|
-
#
|
38
|
-
# July 27 2024 | i7 8700k CPU | CRuby 3.3.1 | 100 frames | Average of 3 runs
|
39
|
-
#
|
40
|
-
# ESP32-H2 : 7.3 fps (WCH UART bridge @ 115200, I2C @ 400kHz)
|
41
|
-
# ESP32-H2 : 10.9 fps (WCH UART bridge @ 230400, I2C @ 400kHz)
|
42
|
-
# ESP32-C6 : 8.0 fps (WCH UART bridge @ 115200, I2C @ 1MHz)
|
43
|
-
# ESP32-C6 : 13.2 fps (WCH UART bridge @ 230400, I2C @ 1MHz)
|
44
|
-
#
|
45
|
-
require 'bundler/setup'
|
46
|
-
require 'denko'
|
47
|
-
|
48
|
-
# Settings
|
49
|
-
# Must match speed in the sketch for UART briges. Doesn't matter for native USB.
|
50
|
-
BAUD_RATE = 115_200
|
51
|
-
FRAME_COUNT = 100
|
52
|
-
# Request 1 Mhz I2C frequency. Wire libraries will fall back to fastest available speed.
|
53
|
-
I2C_FREQUENCY = 1_000_000
|
54
|
-
# Use :SDA0 for RP2040
|
55
|
-
I2C_PIN = :SDA
|
56
|
-
|
57
|
-
# Setup
|
58
|
-
board = Denko::Board.new(Denko::Connection::Serial.new(baud: BAUD_RATE))
|
59
|
-
bus = Denko::I2C::Bus.new(board: board)
|
60
|
-
oled = Denko::Display::SSD1306.new(bus: bus, rotate: true, i2c_frequency: I2C_FREQUENCY)
|
61
|
-
canvas = oled.canvas
|
62
|
-
|
63
|
-
# Intro
|
64
|
-
canvas.print "SSD1306 Benchmark"
|
65
|
-
oled.draw
|
66
|
-
sleep 1
|
67
|
-
|
68
|
-
# Run
|
69
|
-
start = Time.now
|
70
|
-
(FRAME_COUNT / 2).times do
|
71
|
-
canvas.fill
|
72
|
-
oled.draw
|
73
|
-
canvas.clear
|
74
|
-
oled.draw
|
75
|
-
end
|
76
|
-
board.finish_write
|
77
|
-
finish = Time.now
|
78
|
-
|
79
|
-
# Calculate results
|
80
|
-
fps = FRAME_COUNT / (finish - start)
|
81
|
-
|
82
|
-
# Print to terminal
|
83
|
-
puts "SSD1306 benchmark result: #{fps.round(2)} fps"
|
84
|
-
puts
|
85
|
-
|
86
|
-
# Print to screen
|
87
|
-
canvas.clear
|
88
|
-
canvas.text_cursor = [0,0]
|
89
|
-
canvas.print "#{fps.round(2)} fps"
|
90
|
-
oled.draw
|
91
|
-
board.finish_write
|
@@ -1,46 +0,0 @@
|
|
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
|
-
require_relative '../sensor/neat_tph_readings'
|
8
|
-
|
9
|
-
# How many degrees C the two temperature values can differ by before a warning.
|
10
|
-
TOLERANCE = 0.50
|
11
|
-
|
12
|
-
board = Denko::Board.new(Denko::Connection::Serial.new)
|
13
|
-
bus = Denko::I2C::Bus.new(board: board)
|
14
|
-
sht = Denko::Sensor::SHT3X.new(bus: bus) # address: 0x44 default
|
15
|
-
qmp = Denko::Sensor::QMP6988.new(bus: bus) # address: 0x70 default
|
16
|
-
|
17
|
-
# Configure for higher accuracy.
|
18
|
-
sht.repeatability = :high
|
19
|
-
qmp.temperature_samples = 2
|
20
|
-
qmp.pressure_samples = 16
|
21
|
-
qmp.iir_coefficient = 2
|
22
|
-
|
23
|
-
# Buggy on ESP32-S3 in forced mode. Data registers return zeroes on all but first read.
|
24
|
-
# Can't recreate on ESP32 V1, AVR or SAMD21. Put it in contiuous mode just in case.
|
25
|
-
qmp.continuous_mode
|
26
|
-
|
27
|
-
loop do
|
28
|
-
# Read both sensors.
|
29
|
-
qmp_reading = qmp.read
|
30
|
-
sht_reading = sht.read
|
31
|
-
|
32
|
-
# Retry immediately if either failed.
|
33
|
-
next unless (sht_reading && qmp_reading)
|
34
|
-
|
35
|
-
# Warn if large gap between temperature readings.
|
36
|
-
difference = (qmp_reading[:temperature] - sht_reading[:temperature]).abs
|
37
|
-
if (difference > TOLERANCE)
|
38
|
-
puts "WARNING: temperature values differed by more than #{TOLERANCE}\xC2\xB0C (#{difference.round(4)} \xC2\xB0C)"
|
39
|
-
end
|
40
|
-
|
41
|
-
# Combine values from both sensors, averaging their temperatures.
|
42
|
-
average_temperature = (qmp_reading[:temperature] + sht_reading[:temperature]) / 2.0
|
43
|
-
print_tph_reading(temperature: average_temperature, humidity: sht_reading[:humidity], pressure: qmp_reading[:pressure])
|
44
|
-
|
45
|
-
sleep 5
|
46
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Example using a KY-040 (30 detent) rotary encoder as a mac volume control.
|
3
|
-
#
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'denko'
|
6
|
-
|
7
|
-
PIN_A = 4
|
8
|
-
PIN_B = 5
|
9
|
-
|
10
|
-
board = Denko::Board.new(Denko::Connection::Serial.new)
|
11
|
-
encoder = Denko::DigitalIO::RotaryEncoder.new board: board,
|
12
|
-
pins: { a: PIN_A, b: PIN_B }
|
13
|
-
|
14
|
-
# Set up a pseudo terminal with osascript (AppleScript) in interactive mode.
|
15
|
-
# Calling a separate script each update is too slow.
|
16
|
-
class AppleVolumeWrapper
|
17
|
-
require 'pty'
|
18
|
-
require 'expect'
|
19
|
-
|
20
|
-
def initialize
|
21
|
-
@in, @out, pid = PTY.spawn('osascript -i')
|
22
|
-
@in.expect(/>> /) # Terminal ready.
|
23
|
-
end
|
24
|
-
|
25
|
-
def get
|
26
|
-
@out.write("output volume of (get volume settings)\r\n")
|
27
|
-
@in.expect(/=> (\d+)\r\n/)[1].to_i
|
28
|
-
end
|
29
|
-
|
30
|
-
def set(value)
|
31
|
-
@out.write("set volume output volume #{value}\r\n")
|
32
|
-
@in.expect(/>> /)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
volumeWrapper= AppleVolumeWrapper.new
|
37
|
-
# volumeWrapper.get can return imprecise values.
|
38
|
-
# Display those, but keep exact value in this variable.
|
39
|
-
volume = volumeWrapper.get
|
40
|
-
puts "Current volume: #{volume}%"
|
41
|
-
|
42
|
-
encoder.add_callback do |update|
|
43
|
-
# update[:change] is always either +1 or -1.
|
44
|
-
volume = volume += update[:change]
|
45
|
-
volume = 0 if volume < 0
|
46
|
-
volume = 100 if volume > 100
|
47
|
-
|
48
|
-
volumeWrapper.set(volume)
|
49
|
-
current_volume = volumeWrapper.get
|
50
|
-
puts "Current volume: #{current_volume}%"
|
51
|
-
end
|
52
|
-
|
53
|
-
sleep
|
@@ -1,43 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# This example polls an HTU21D (temp/humidity sensor) in the background.
|
3
|
-
# The main thread refreshes an SSD1306 OLED ~20 times per second,
|
4
|
-
# showing the latest temperature and humidity values, and current time.
|
5
|
-
# Both devices are conected to the same I2C bus.
|
6
|
-
#
|
7
|
-
require 'bundler/setup'
|
8
|
-
require 'denko'
|
9
|
-
|
10
|
-
board = Denko::Board.new(Denko::Connection::Serial.new)
|
11
|
-
i2c = Denko::I2C::Bus.new(board: board)
|
12
|
-
|
13
|
-
# Get temperature and humidity every second.
|
14
|
-
htu21d = Denko::Sensor::HTU21D.new(bus: i2c)
|
15
|
-
htu21d.poll(2)
|
16
|
-
|
17
|
-
oled = Denko::Display::SSD1306.new(bus: i2c, rotate: true)
|
18
|
-
canvas = oled.canvas
|
19
|
-
|
20
|
-
last_refresh = Time.now
|
21
|
-
loop do
|
22
|
-
elapsed = Time.now - last_refresh
|
23
|
-
|
24
|
-
# Aim for 20 fps.
|
25
|
-
if elapsed > 0.049
|
26
|
-
canvas.clear
|
27
|
-
|
28
|
-
canvas.text_cursor = [0,0]
|
29
|
-
canvas.print "Time: #{Time.now.strftime("%H:%M:%S.%L")}"
|
30
|
-
|
31
|
-
canvas.text_cursor = [0,8]
|
32
|
-
canvas.print "Temp: " + ('%.3f' % htu21d.temperature).rjust(7, " ") + " C"
|
33
|
-
|
34
|
-
canvas.text_cursor = [0,16]
|
35
|
-
canvas.print "Humidity: " + ('%.3f' % htu21d.humidity).rjust(7, " ") + " %"
|
36
|
-
|
37
|
-
# Only refresh the area in use.
|
38
|
-
oled.draw(0, 127, 0, 24)
|
39
|
-
last_refresh = Time.now
|
40
|
-
else
|
41
|
-
sleep 0.001
|
42
|
-
end
|
43
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Example using an ADS1100 ADC over the I2C bus.
|
3
|
-
#
|
4
|
-
require 'bundler/setup'
|
5
|
-
require 'denko'
|
6
|
-
|
7
|
-
# Helper method so readings look nice.
|
8
|
-
def print_reading(name, raw, voltage)
|
9
|
-
print "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} - "
|
10
|
-
print "#{name.rjust(9, " ")} | "
|
11
|
-
print "Raw: #{raw.to_s.rjust(6, " ")} | "
|
12
|
-
print "Voltage: "
|
13
|
-
print ("%.10f" % voltage).rjust(13, " ")
|
14
|
-
puts " V"
|
15
|
-
end
|
16
|
-
|
17
|
-
board = Denko::Board.new(Denko::Connection::Serial.new)
|
18
|
-
bus = Denko::I2C::Bus.new(board: board)
|
19
|
-
|
20
|
-
# Unlike the ADS1115/1118, full-scale voltage depends on Vdd. Give during setup.
|
21
|
-
# This works for my M5Stack ADC unit (0-12V) when checked against a multimeter.
|
22
|
-
ads = Denko::AnalogIO::ADS1100.new bus: bus,
|
23
|
-
full_scale_voltage: 26.408,
|
24
|
-
sample_rate: 16,
|
25
|
-
gain: 2
|
26
|
-
# address: 0x48 default
|
27
|
-
|
28
|
-
#
|
29
|
-
# Configure gain and sample rate. See datasheet for more info.
|
30
|
-
# Valid values:
|
31
|
-
# Gain: 1 (default), 2, 4, 8
|
32
|
-
# Sample Rate: 8 (default), 16, 32, 128
|
33
|
-
#
|
34
|
-
ads.gain = 1
|
35
|
-
ads.sample_rate = 8
|
36
|
-
|
37
|
-
# Configure smoothing.
|
38
|
-
ads.smoothing = true
|
39
|
-
ads.smoothing_size = 8
|
40
|
-
|
41
|
-
# Poll and print indefinitely.
|
42
|
-
ads.poll(0.25) do |reading|
|
43
|
-
# volts_per_bit calculated from full-scale voltage, gain and sample rate.
|
44
|
-
voltage = reading * ads.volts_per_bit
|
45
|
-
print_reading("ADS1100:", reading, voltage)
|
46
|
-
end
|
47
|
-
|
48
|
-
sleep
|