denko 0.13.6 → 0.14.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_avr.yml → build_atmega_avr.yml} +18 -18
- data/.github/workflows/{build_megaavr.yml → build_atmega_megaavr.yml} +18 -18
- data/.github/workflows/{build_sam3x.yml → build_atsam3x.yml} +17 -17
- data/.github/workflows/{build_samd.yml → build_atsamd21.yml} +18 -18
- data/.github/workflows/build_esp32.yml +17 -18
- data/.github/workflows/build_esp32c3.yml +57 -0
- data/.github/workflows/build_esp32c6.yml +57 -0
- data/.github/workflows/build_esp32h2.yml +56 -0
- data/.github/workflows/build_esp32s2.yml +57 -0
- data/.github/workflows/build_esp32s3.yml +57 -0
- data/.github/workflows/build_esp8266.yml +15 -15
- data/.github/workflows/build_ra4m1.yml +16 -16
- data/.github/workflows/build_rp2040.yml +17 -16
- data/.github/workflows/ruby.yml +20 -20
- data/CHANGELOG.md +195 -11
- data/DEPS_CLI.md +9 -9
- data/DEPS_IDE.md +17 -18
- data/HARDWARE.md +50 -51
- data/README.md +61 -53
- data/Rakefile +1 -1
- data/benchmarks/analog_listen.rb +49 -0
- data/benchmarks/digital_write.rb +28 -0
- data/benchmarks/i2c_ssd1306_refresh.rb +13 -6
- data/build +1 -1
- data/denko.gemspec +5 -2
- data/examples/advanced/{m5_env.rb → m5_env3.rb} +12 -14
- data/examples/advanced/rotary_encoder_mac_volume.rb +18 -13
- data/examples/advanced/ssd1306_time_temp_rh.rb +8 -13
- data/examples/analog_io/ads1100.rb +48 -0
- data/examples/analog_io/ads1115.rb +2 -2
- data/examples/analog_io/ads1118.rb +3 -11
- data/examples/analog_io/input.rb +17 -16
- data/examples/analog_io/input_smoothing.rb +27 -0
- data/examples/analog_io/potentiometer.rb +31 -0
- data/examples/connection/binary_echo.rb +34 -0
- data/examples/connection/tcp.rb +12 -27
- data/examples/digital_io/button.rb +7 -3
- data/examples/digital_io/relay.rb +17 -0
- data/examples/digital_io/rotary_encoder.rb +21 -11
- data/examples/display/hd44780.rb +13 -5
- data/examples/display/ssd1306.rb +20 -17
- data/examples/display/ssd1306_s2_pico.rb +2 -2
- data/examples/i2c/search.rb +10 -26
- data/examples/led/apa102_bounce.rb +3 -4
- data/examples/led/apa102_fade.rb +44 -0
- data/examples/led/builtin_blink.rb +3 -1
- data/examples/led/builtin_fade.rb +19 -0
- data/examples/led/rgb_led.rb +31 -0
- data/examples/led/seven_segment_char_echo.rb +4 -2
- data/examples/led/ws2812_bounce.rb +5 -7
- data/examples/led/ws2812_builtin_blink.rb +3 -2
- data/examples/led/ws2812_fade.rb +43 -0
- data/examples/motor/l298.rb +10 -8
- data/examples/motor/servo.rb +4 -3
- data/examples/motor/stepper.rb +13 -13
- data/examples/one_wire/search.rb +32 -0
- data/examples/pulse_io/buzzer.rb +8 -3
- data/examples/pulse_io/ir_output.rb +51 -0
- data/examples/pulse_io/pwm_output.rb +30 -0
- data/examples/rtc/ds3231.rb +18 -35
- data/examples/sensor/aht10.rb +4 -6
- data/examples/sensor/aht20.rb +4 -6
- data/examples/sensor/bme280.rb +4 -4
- data/examples/sensor/bmp180.rb +9 -5
- data/examples/sensor/dht.rb +20 -15
- data/examples/sensor/ds18b20.rb +20 -21
- data/examples/sensor/generic_pir.rb +4 -2
- data/examples/sensor/hcsr04.rb +5 -2
- data/examples/sensor/htu21d.rb +9 -20
- data/examples/sensor/htu31d.rb +7 -9
- data/examples/sensor/neat_tph_readings.rb +15 -9
- data/examples/sensor/qmp6988.rb +5 -7
- data/examples/sensor/rcwl9620.rb +3 -3
- data/examples/sensor/sht3x.rb +4 -6
- data/examples/spi/bitbang_loopback.rb +46 -0
- data/examples/spi/input_register.rb +9 -19
- data/examples/spi/output_register.rb +9 -17
- data/examples/spi/ssd_through_registers.rb +28 -0
- data/examples/spi/two_registers.rb +18 -24
- data/examples/uart/bit_bang_demo.rb +25 -0
- data/examples/uart/board_passthrough.rb +19 -13
- data/examples/uart/hardware_loopback.rb +1 -1
- data/lib/denko/analog_io/ads1100.rb +127 -0
- data/lib/denko/analog_io/ads1115.rb +8 -25
- data/lib/denko/analog_io/ads1118.rb +10 -25
- data/lib/denko/analog_io/ads111x.rb +25 -11
- data/lib/denko/analog_io/input.rb +29 -55
- data/lib/denko/analog_io/input_helper.rb +42 -0
- data/lib/denko/analog_io/output.rb +5 -5
- data/lib/denko/analog_io/potentiometer.rb +6 -8
- data/lib/denko/analog_io.rb +2 -1
- data/lib/denko/behaviors/board_proxy.rb +13 -1
- data/lib/denko/behaviors/bus_controller.rb +1 -0
- data/lib/denko/behaviors/bus_controller_addressed.rb +1 -0
- data/lib/denko/behaviors/bus_peripheral.rb +3 -4
- data/lib/denko/behaviors/bus_peripheral_addressed.rb +8 -6
- data/lib/denko/behaviors/callbacks.rb +9 -7
- data/lib/denko/behaviors/component.rb +16 -14
- data/lib/denko/behaviors/input_pin.rb +14 -15
- data/lib/denko/behaviors/lifecycle.rb +51 -0
- data/lib/denko/behaviors/multi_pin.rb +22 -18
- data/lib/denko/behaviors/output_pin.rb +9 -4
- data/lib/denko/behaviors/single_pin.rb +1 -0
- data/lib/denko/behaviors/state.rb +15 -9
- data/lib/denko/behaviors/subcomponents.rb +72 -12
- data/lib/denko/behaviors.rb +2 -1
- data/lib/denko/board/core.rb +36 -18
- data/lib/denko/board/i2c.rb +14 -14
- data/lib/denko/board/i2c_bit_bang.rb +49 -0
- data/lib/denko/board/infrared.rb +6 -6
- data/lib/denko/board/led_array.rb +6 -5
- data/lib/denko/board/spi.rb +15 -10
- data/lib/denko/board/spi_bit_bang.rb +9 -7
- data/lib/denko/board.rb +35 -33
- data/lib/denko/connection/binary_echo.rb +17 -0
- data/lib/denko/connection/flow_control.rb +11 -15
- data/lib/denko/connection/handshake.rb +2 -0
- data/lib/denko/digital_io/button.rb +4 -0
- data/lib/denko/digital_io/c_bit_bang.rb +15 -0
- data/lib/denko/digital_io/input.rb +4 -5
- data/lib/denko/digital_io/output.rb +7 -6
- data/lib/denko/digital_io/relay.rb +2 -0
- data/lib/denko/digital_io/rotary_encoder.rb +78 -60
- data/lib/denko/digital_io.rb +1 -0
- data/lib/denko/display/hd44780.rb +136 -93
- data/lib/denko/display/sh1106.rb +42 -0
- data/lib/denko/display/ssd1306.rb +105 -45
- data/lib/denko/display.rb +1 -0
- data/lib/denko/eeprom/built_in.rb +19 -16
- data/lib/denko/i2c/bit_bang.rb +31 -0
- data/lib/denko/i2c/bus.rb +8 -36
- data/lib/denko/i2c/bus_common.rb +45 -0
- data/lib/denko/i2c/peripheral.rb +28 -19
- data/lib/denko/i2c.rb +2 -0
- data/lib/denko/led/apa102.rb +43 -29
- data/lib/denko/led/base.rb +8 -2
- data/lib/denko/led/rgb.rb +5 -7
- data/lib/denko/led/seven_segment.rb +24 -9
- data/lib/denko/led/ws2812.rb +10 -7
- data/lib/denko/message.rb +5 -0
- data/lib/denko/motor/l298.rb +11 -10
- data/lib/denko/motor/servo.rb +22 -10
- data/lib/denko/motor/stepper.rb +11 -14
- data/lib/denko/mutex_stub.rb +7 -0
- data/lib/denko/one_wire/bus.rb +9 -5
- data/lib/denko/one_wire/peripheral.rb +0 -3
- data/lib/denko/pulse_io/buzzer.rb +9 -3
- data/lib/denko/pulse_io/{ir_transmitter.rb → ir_output.rb} +9 -4
- data/lib/denko/pulse_io/pwm_output.rb +69 -15
- data/lib/denko/pulse_io.rb +3 -3
- data/lib/denko/rtc/ds3231.rb +11 -13
- data/lib/denko/sensor/aht.rb +22 -21
- data/lib/denko/sensor/bme280.rb +60 -63
- data/lib/denko/sensor/bmp180.rb +41 -38
- data/lib/denko/sensor/dht.rb +22 -5
- data/lib/denko/sensor/ds18b20.rb +40 -34
- data/lib/denko/sensor/hcsr04.rb +7 -5
- data/lib/denko/sensor/helper.rb +37 -0
- data/lib/denko/sensor/htu21d.rb +44 -55
- data/lib/denko/sensor/htu31d.rb +32 -33
- data/lib/denko/sensor/qmp6988.rb +25 -23
- data/lib/denko/sensor/rcwl9620.rb +2 -5
- data/lib/denko/sensor/sht3x.rb +23 -21
- data/lib/denko/sensor.rb +1 -2
- data/lib/denko/spi/base_register.rb +22 -22
- data/lib/denko/spi/bit_bang.rb +17 -51
- data/lib/denko/spi/bus.rb +15 -29
- data/lib/denko/spi/bus_common.rb +36 -0
- data/lib/denko/spi/input_register.rb +36 -30
- data/lib/denko/spi/output_register.rb +25 -40
- data/lib/denko/spi/peripheral.rb +93 -24
- data/lib/denko/spi.rb +6 -1
- data/lib/denko/uart/bit_bang.rb +5 -3
- data/lib/denko/uart/hardware.rb +9 -8
- data/lib/denko/version.rb +1 -1
- data/lib/denko.rb +10 -0
- data/lib/denko_cli/generator.rb +2 -2
- data/lib/denko_cli/packages.rb +8 -10
- data/lib/denko_cli/targets.rb +8 -8
- data/lib/denko_cli/targets.txt +4 -4
- data/lib/denko_cli/usage.txt +1 -1
- data/src/denko_ethernet.ino +0 -14
- data/src/denko_serial.ino +0 -14
- data/src/denko_wifi.ino +6 -15
- data/src/lib/Denko.cpp +39 -3
- data/src/lib/Denko.h +42 -26
- data/src/lib/DenkoCoreIO.cpp +57 -102
- data/src/lib/DenkoDefines.h +36 -31
- data/src/lib/DenkoI2C.cpp +54 -45
- data/src/lib/DenkoI2CBB.cpp +238 -0
- data/src/lib/DenkoIROut.cpp +12 -7
- data/src/lib/DenkoLEDArray.cpp +36 -13
- data/src/lib/DenkoSPI.cpp +6 -5
- data/src/lib/DenkoSPIBB.cpp +7 -6
- data/target.yml +37 -2
- data/test/analog_io/potentiometer_test.rb +10 -10
- data/test/behaviors/board_proxy_test.rb +1 -1
- data/test/behaviors/callbacks_test.rb +11 -3
- data/test/behaviors/component_test.rb +17 -9
- data/test/behaviors/input_pin_test.rb +14 -9
- data/test/behaviors/multi_pin_test.rb +14 -4
- data/test/behaviors/output_pin_test.rb +11 -8
- data/test/behaviors/poller_test.rb +1 -0
- data/test/behaviors/reader_test.rb +3 -2
- data/test/behaviors/subcomponents_test.rb +22 -2
- data/test/board/core_test.rb +15 -11
- data/test/board/i2c_test.rb +39 -33
- data/test/board/infrared_test.rb +1 -1
- data/test/board/message_test.rb +17 -11
- data/test/board/spi_test.rb +21 -21
- data/test/digital_io/button_test.rb +15 -0
- data/test/digital_io/relay_test.rb +18 -0
- data/test/digital_io/rotary_encoder_test.rb +80 -60
- data/test/eeprom/built_in_test.rb +9 -9
- data/test/i2c/bus_test.rb +30 -14
- data/test/i2c/peripheral_test.rb +36 -17
- data/test/led/base_test.rb +2 -1
- data/test/led/rgb_test.rb +6 -6
- data/test/led/seven_segment_test.rb +7 -7
- data/test/motor/servo_test.rb +1 -1
- data/test/motor/stepper_test.rb +2 -2
- data/test/one_wire/bus_test.rb +1 -0
- data/test/pulse_io/buzzer_test.rb +7 -4
- data/test/pulse_io/{ir_transmitter_test.rb → ir_output_test.rb} +10 -10
- data/test/pulse_io/pwm_output_test.rb +74 -18
- data/test/rtc/ds3231_test.rb +11 -13
- data/test/sensor/dht_test.rb +1 -1
- data/test/sensor/ds18b20_test.rb +4 -8
- data/test/spi/bus_test.rb +7 -7
- data/test/spi/input_register_test.rb +15 -15
- data/test/spi/output_register_test.rb +10 -28
- data/test/spi/peripheral_multi_pin_test.rb +53 -0
- data/test/spi/peripheral_single_pin_test.rb +48 -0
- data/test/test_helper.rb +36 -33
- data/tutorial/02-button/button.rb +5 -4
- data/tutorial/03-potentiometer/potentiometer.rb +9 -5
- data/tutorial/04-pwm_led/pwm_led.rb +14 -16
- data/tutorial/05-rgb_led/rgb_led.rb +6 -6
- data/tutorial/05-rgb_led/rgb_mapping.rb +11 -11
- data/vendor/board-maps/BoardMap.h +416 -56
- data/vendor/board-maps/lib/header_parser.rb +12 -2
- data/vendor/board-maps/yaml/ADAFRUIT_CAMERA_ESP32S3.yml +2 -2
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32C6.yml +15 -0
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +1 -1
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_ADALOGGER.yml +44 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32C3.yml +1 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S2.yml +1 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_N4R2.yml +1 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_NOPSRAM.yml +1 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +1 -0
- data/vendor/board-maps/yaml/AMKEN_BB.yml +48 -0
- data/vendor/board-maps/yaml/AMKEN_ES.yml +48 -0
- data/vendor/board-maps/yaml/AMKEN_REVELOP.yml +48 -0
- data/vendor/board-maps/yaml/AMKEN_REVELOP_PLUS.yml +48 -0
- data/vendor/board-maps/yaml/ASL_CAN_X2.yml +41 -0
- data/vendor/board-maps/yaml/BLING.yml +25 -0
- data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +1 -0
- data/vendor/board-maps/yaml/BRIDGETEK_IDM2040_7A.yml +48 -0
- data/vendor/board-maps/yaml/Bee_Motion_Mini.yml +13 -1
- data/vendor/board-maps/yaml/Breadstick_Raspberry.yml +31 -0
- data/vendor/board-maps/yaml/DFROBOT_BEETLE_ESP32C6.yml +8 -0
- data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32C6.yml +20 -0
- data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_ESP32.yml +46 -0
- data/vendor/board-maps/yaml/DPTECHNICS_WALTER.yml +39 -0
- data/vendor/board-maps/yaml/ELECROW_CROWPANEL_7.yml +8 -0
- data/vendor/board-maps/yaml/ESP32C2_DEV.yml +12 -0
- data/vendor/board-maps/yaml/ESP32C3_DEVKIT_LIPO.yml +14 -0
- data/vendor/board-maps/yaml/ESP32C6_DEV.yml +15 -0
- data/vendor/board-maps/yaml/ESP32C6_EVB.yml +15 -0
- data/vendor/board-maps/yaml/ESP32C6_QWIIC_POCKET.yml +15 -0
- data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +15 -0
- data/vendor/board-maps/yaml/ESP32H2_DEV.yml +13 -0
- data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +13 -0
- data/vendor/board-maps/yaml/ESP32S2_DEV.yml +1 -0
- data/vendor/board-maps/yaml/{RMP.yml → ESP32S2_DEVKIT_LIPO.yml} +2 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +44 -0
- data/vendor/board-maps/yaml/ESP32S3_DEVKIT_LIPO.yml +42 -0
- data/vendor/board-maps/yaml/ESP32S3_POWERFEATHER.yml +22 -0
- data/vendor/board-maps/yaml/ESP32_SBC_FABGL.yml +35 -0
- data/vendor/board-maps/yaml/EVN_ALPHA.yml +48 -0
- data/vendor/board-maps/yaml/FEATHERS3NEO.yml +32 -0
- data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +14 -0
- data/vendor/board-maps/yaml/HELTEC_CAPSULE_SENSOR_V3.yml +43 -0
- data/vendor/board-maps/yaml/HELTEC_WIFI_LORA_32_V3.yml +42 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_BRIDGE.yml +8 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_MINI_SHELL.yml +13 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_PAPER.yml +42 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_SHELL_V3.yml +42 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_STICK_LITE_V3.yml +30 -0
- data/vendor/board-maps/yaml/HELTEC_WIRELESS_TRACKER.yml +41 -0
- data/vendor/board-maps/yaml/HT_DE01.yml +42 -0
- data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +1 -1
- data/vendor/board-maps/yaml/LILYGO_T3S3_LR1121.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1262.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1276.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1278.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280.yml +9 -0
- data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280PA.yml +8 -0
- data/vendor/board-maps/yaml/LILYGO_T_ETH_LITE.yml +21 -0
- data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +14 -0
- data/vendor/board-maps/yaml/LOLIN_S3.yml +1 -0
- data/vendor/board-maps/yaml/LOLIN_S3_MINI_PRO.yml +40 -0
- data/vendor/board-maps/yaml/Lion_Bit_Dev_Board.yml +0 -2
- data/vendor/board-maps/yaml/LoPy.yml +1 -0
- data/vendor/board-maps/yaml/LoPy4.yml +1 -0
- data/vendor/board-maps/yaml/M5STACK_CAPSULE.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_CARDPUTER.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_DIAL.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_FIRE.yml +0 -1
- data/vendor/board-maps/yaml/M5STACK_NANOC6.yml +17 -0
- data/vendor/board-maps/yaml/M5STACK_PAPER.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_POE_CAM.yml +5 -0
- data/vendor/board-maps/yaml/M5STACK_STAMP_C3.yml +13 -0
- data/vendor/board-maps/yaml/M5STACK_STAMP_S3.yml +4 -0
- data/vendor/board-maps/yaml/{M5Stick_C.yml → M5STACK_STICKC.yml} +0 -1
- data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS2.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_TOUGH.yml +9 -0
- data/vendor/board-maps/yaml/M5STACK_UNIT_CAM.yml +10 -0
- data/vendor/board-maps/yaml/M5STACK_UNIT_CAMS3.yml +4 -0
- data/vendor/board-maps/yaml/M5Stack_ATOM.yml +0 -1
- data/vendor/board-maps/yaml/MAKERGO_C3_SUPERMINI.yml +14 -0
- data/vendor/board-maps/yaml/MARBLE_PICO.yml +48 -0
- data/vendor/board-maps/yaml/METEHOCA_AKANA_R1.yml +46 -0
- data/vendor/board-maps/yaml/NAMINO_BIANCO.yml +13 -0
- data/vendor/board-maps/yaml/NEBULAS3.yml +0 -1
- data/vendor/board-maps/yaml/NEWSAN_ARCHI.yml +48 -0
- data/vendor/board-maps/yaml/NOLOGO_ESP32C3_SUPER_MINI.yml +14 -0
- data/vendor/board-maps/yaml/NOLOGO_ESP32S3_PICO.yml +12 -0
- data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_16MB.yml +48 -0
- data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_2MB.yml +48 -0
- data/vendor/board-maps/yaml/OPTA_ANALOG.yml +7 -0
- data/vendor/board-maps/yaml/OPTA_DIGITAL.yml +5 -0
- data/vendor/board-maps/yaml/PINTRONIX_PINMAX.yml +42 -0
- data/vendor/board-maps/yaml/PYCOM_GPY.yml +1 -0
- data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +0 -1
- data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +12 -0
- data/vendor/board-maps/yaml/SPARKFUN_MICROMOD_RP2040.yml +48 -0
- data/vendor/board-maps/yaml/SPARKFUN_PRO_MICRO_ESP32C3.yml +24 -0
- data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER.yml +31 -0
- data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +15 -0
- data/vendor/board-maps/yaml/TINYC6.yml +25 -0
- data/vendor/board-maps/yaml/UPESY_EDU_ESP32.yml +28 -0
- data/vendor/board-maps/yaml/UPESY_ESP32C3_BASIC.yml +13 -0
- data/vendor/board-maps/yaml/UPESY_ESP32C3_MINI.yml +12 -0
- data/vendor/board-maps/yaml/UPESY_ESP32S3_BASIC.yml +42 -0
- data/vendor/board-maps/yaml/VIRALINK_GATE32_01.yml +6 -0
- data/vendor/board-maps/yaml/VIRALINK_GATE32_11.yml +7 -0
- data/vendor/board-maps/yaml/WAVESHARE_ESP32S3_TOUCH_LCD_128.yml +8 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_MATRIX.yml +48 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_ONE.yml +1 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_PIZERO.yml +47 -0
- data/vendor/board-maps/yaml/WAVESHARE_RP2040_ZERO.yml +1 -0
- data/vendor/board-maps/yaml/WEACT_STUDIO_ESP32C3.yml +14 -0
- data/vendor/board-maps/yaml/WIPY3.yml +1 -0
- data/vendor/board-maps/yaml/WT32_SC01_PLUS.yml +7 -0
- data/vendor/board-maps/yaml/WiFiduinoV2.yml +1 -0
- data/vendor/board-maps/yaml/XIAO_ESP32C3.yml +0 -1
- data/vendor/board-maps/yaml/XIAO_ESP32C6.yml +22 -0
- data/vendor/board-maps/yaml/unphone9.yml +8 -0
- metadata +169 -30
- data/examples/led/apa102_breathe.rb +0 -45
- data/examples/pulse_io/ir_transmitter.rb +0 -55
- data/examples/spi/ssd_through_register.rb +0 -40
- data/examples/uart/bit_bang_read.rb +0 -16
- data/examples/uart/bit_bang_write.rb +0 -16
- data/lib/denko/analog_io/sensor.rb +0 -6
- data/lib/denko/sensor/virtual.rb +0 -42
- data/src/lib/DenkoIROutESP.cpp +0 -26
- data/vendor/board-maps/yaml/STAMP_S3.yml +0 -8
- /data/vendor/board-maps/yaml/{BRIDGETEK_IDM2040-7A.yml → BRIDGETEK_IDM2040_43A.yml} +0 -0
- /data/vendor/board-maps/yaml/{heltec_wifi_32_lora_V3.yml → HELTEC_WIRELESS_STICK_V3.yml} +0 -0
- /data/vendor/board-maps/yaml/{M5Stack_Core_ESP32.yml → M5STACK_CORE.yml} +0 -0
- /data/vendor/board-maps/yaml/{M5Stamp_Pico.yml → M5STACK_STAMP_PICO.yml} +0 -0
- /data/vendor/board-maps/yaml/{M5Stack-Timer-CAM.yml → M5STACK_TIMER_CAM.yml} +0 -0
data/examples/i2c/search.rb
CHANGED
@@ -5,40 +5,24 @@
|
|
5
5
|
require 'bundler/setup'
|
6
6
|
require 'denko'
|
7
7
|
|
8
|
-
# Method to let the user set I2C pins.
|
9
|
-
def enter_pins
|
10
|
-
puts "Please manually specify I2C pins..."
|
11
|
-
print "I2C SDA pin: "; sda = gets
|
12
|
-
print "I2C SCL pin: "; scl = gets
|
13
|
-
puts
|
14
|
-
[sda.to_i, scl.to_i]
|
15
|
-
end
|
16
|
-
|
17
8
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
18
9
|
|
19
|
-
# If
|
20
|
-
|
21
|
-
puts "Error: Pin map not available for this board"
|
22
|
-
sda, scl = enter_pins
|
23
|
-
|
24
|
-
# Else get defaults from map.
|
25
|
-
else
|
10
|
+
# If board has a map, show the pins to the user.
|
11
|
+
if board.map
|
26
12
|
puts "Detected board: #{board.name}"
|
27
|
-
|
28
13
|
sda = board.map[:SDA] || board.map[:SDA0]
|
29
14
|
scl = board.map[:SCL] || board.map[:SCL0]
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
puts "Error: I2C pins not found in this board's pin map"
|
34
|
-
sda, scl = enter_pins
|
35
|
-
end
|
15
|
+
puts "Using default I2C interface on pins #{sda} (SDA) and #{scl} (SCL)"
|
16
|
+
else
|
17
|
+
puts "Pin map not available for this board. Using default interface, but SCL and SDA pins unknown"
|
36
18
|
end
|
37
|
-
|
38
|
-
puts "Using I2C interface on pins #{sda} (SDA) and #{scl} (SCL)"
|
39
19
|
puts
|
40
20
|
|
41
|
-
|
21
|
+
# Board's hardware I2C interface on predetermined pins.
|
22
|
+
bus = Denko::I2C::Bus.new(board: board)
|
23
|
+
# Bit-banged I2C on any pins.
|
24
|
+
# bus = Denko::I2C::BitBang.new(board: board, pins: {scl: 8, sda: 9})
|
25
|
+
|
42
26
|
bus.search
|
43
27
|
|
44
28
|
if bus.found_devices.empty?
|
@@ -15,10 +15,9 @@ PIXELS = 8
|
|
15
15
|
# Move along the strip and back, one pixel at a time.
|
16
16
|
positions = (0..PIXELS-1).to_a + (1..PIXELS-2).to_a.reverse
|
17
17
|
|
18
|
-
board = Denko::Board.new(Denko::Connection::Serial.new)
|
19
|
-
|
20
18
|
# Use the default hardware SPI bus.
|
21
|
-
|
19
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
20
|
+
bus = Denko::SPI::Bus.new(board: board)
|
22
21
|
strip = Denko::LED::APA102.new(bus: bus, length: PIXELS)
|
23
22
|
|
24
23
|
loop do
|
@@ -27,7 +26,7 @@ loop do
|
|
27
26
|
strip.clear
|
28
27
|
strip[index] = color
|
29
28
|
strip.show
|
30
|
-
sleep 0.
|
29
|
+
sleep 0.025
|
31
30
|
end
|
32
31
|
end
|
33
32
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#
|
2
|
+
# Fade test for APA102 LED strip.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
RED = [255, 0, 0]
|
8
|
+
GREEN = [0, 255, 0]
|
9
|
+
BLUE = [0, 0, 255]
|
10
|
+
WHITE = [255, 255, 255]
|
11
|
+
COLORS = [RED, GREEN, BLUE, WHITE]
|
12
|
+
PIXELS = 4
|
13
|
+
|
14
|
+
# Get all the brightness values as an array.
|
15
|
+
brightness_steps = (0..31).to_a + (1..30).to_a.reverse
|
16
|
+
|
17
|
+
# Use the default hardware SPI bus.
|
18
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
19
|
+
bus = Denko::SPI::Bus.new(board: board)
|
20
|
+
strip = Denko::LED::APA102.new(bus: bus, length: PIXELS)
|
21
|
+
|
22
|
+
strip[0] = RED
|
23
|
+
strip[1] = GREEN
|
24
|
+
strip[2] = BLUE
|
25
|
+
strip[3] = WHITE
|
26
|
+
|
27
|
+
# Fade all 4 in sync using global brightness control.
|
28
|
+
brightness_steps.each do |value|
|
29
|
+
strip.brightness = value
|
30
|
+
strip.show
|
31
|
+
sleep 0.05
|
32
|
+
end
|
33
|
+
|
34
|
+
# Set 4th pixel back to full brightness white.
|
35
|
+
strip[3] = WHITE + [31]
|
36
|
+
|
37
|
+
# Fade per-pixel, in different directions.
|
38
|
+
brightness_steps.cycle do |value|
|
39
|
+
strip[0] = RED + [value]
|
40
|
+
strip[1] = GREEN + [31 - value]
|
41
|
+
strip[2] = BLUE + [value]
|
42
|
+
strip.show
|
43
|
+
sleep 0.025
|
44
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Blink example for standard built-in LEDs named :LED_BUILTIN
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
PIN = :LED_BUILTIN
|
8
|
+
|
9
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
10
|
+
led = Denko::LED.new(board: board, pin: PIN)
|
11
|
+
|
12
|
+
min = 0
|
13
|
+
max = 100
|
14
|
+
values = (min..max).to_a + (min..max-1).to_a.reverse
|
15
|
+
|
16
|
+
values.cycle do |value|
|
17
|
+
led.duty = value
|
18
|
+
sleep 0.005
|
19
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#
|
2
|
+
# A standard 3 pin RGB LED (not single pin addressable), on 3 PWM pins.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
RED_PIN = 11
|
8
|
+
GREEN_PIN = 10
|
9
|
+
BLUE_PIN = 9
|
10
|
+
|
11
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
12
|
+
rgb_led = Denko::LED::RGB.new board: board,
|
13
|
+
pins: {red: RED_PIN, green: GREEN_PIN, blue: BLUE_PIN}
|
14
|
+
|
15
|
+
# Set these predefined colors with symbols.
|
16
|
+
[:red, :green, :blue, :cyan, :yellow, :magenta, :white, :off].each do |color|
|
17
|
+
rgb_led.color = color
|
18
|
+
sleep 0.5
|
19
|
+
end
|
20
|
+
|
21
|
+
# Set duty cycle for each "sub LED".
|
22
|
+
loop do
|
23
|
+
rgb_led.red.duty = 100
|
24
|
+
rgb_led.green.duty = 50
|
25
|
+
rgb_led.blue.duty = 0
|
26
|
+
sleep 0.5
|
27
|
+
rgb_led.red.duty = 100
|
28
|
+
rgb_led.green.duty = 0
|
29
|
+
rgb_led.blue.duty = 50
|
30
|
+
sleep 0.5
|
31
|
+
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
#
|
2
|
-
#
|
2
|
+
# Echo pressed keys to a seven segment LED.
|
3
3
|
#
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'denko'
|
6
6
|
|
7
|
+
PINS = { cathode: 10, a: 3, b: 4, c: 5, d: 6, e: 7, f: 8, g: 9 }
|
8
|
+
|
7
9
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
10
|
ssd = Denko::LED::SevenSegment.new board: board,
|
9
|
-
|
11
|
+
pins: PINS
|
10
12
|
|
11
13
|
# Turn off the ssd on exit
|
12
14
|
trap("SIGINT") { exit !ssd.off }
|
@@ -1,24 +1,22 @@
|
|
1
1
|
#
|
2
|
-
# Walk a
|
3
|
-
# changing color each time it returns to position 0.
|
2
|
+
# Walk a pixel along a WS2812 strip and back, changing color each loop.
|
4
3
|
#
|
5
4
|
require 'bundler/setup'
|
6
5
|
require 'denko'
|
7
6
|
|
7
|
+
PIN = 4
|
8
|
+
PIXELS = 8
|
9
|
+
|
8
10
|
RED = [255, 0, 0]
|
9
11
|
GREEN = [0, 255, 0]
|
10
12
|
BLUE = [0, 0, 255]
|
11
13
|
WHITE = [255, 255, 255]
|
12
14
|
COLORS = [RED, GREEN, BLUE, WHITE]
|
13
15
|
|
14
|
-
WS2812_PIN = 4
|
15
|
-
PIXELS = 8
|
16
|
-
|
17
|
-
# Move along the strip and back, one pixel at a time.
|
18
16
|
positions = (0..PIXELS-1).to_a + (1..PIXELS-2).to_a.reverse
|
19
17
|
|
20
18
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
21
|
-
strip = Denko::LED::WS2812.new(board: board, pin:
|
19
|
+
strip = Denko::LED::WS2812.new(board: board, pin: PIN, length: PIXELS)
|
22
20
|
|
23
21
|
loop do
|
24
22
|
COLORS.each do |color|
|
@@ -5,11 +5,12 @@
|
|
5
5
|
require 'bundler/setup'
|
6
6
|
require 'denko'
|
7
7
|
|
8
|
+
PIN = :LED_BUILTIN
|
8
9
|
WHITE = [255, 255, 255]
|
9
|
-
OFF
|
10
|
+
OFF = [0, 0, 0]
|
10
11
|
|
11
12
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
12
|
-
strip = Denko::LED::WS2812.new(board: board, pin:
|
13
|
+
strip = Denko::LED::WS2812.new(board: board, pin: PIN, length: 1)
|
13
14
|
|
14
15
|
loop do
|
15
16
|
strip[0] = WHITE
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#
|
2
|
+
# Fade colors along a WS2812, and over time.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
PIN = 4
|
8
|
+
PIXELS = 8
|
9
|
+
|
10
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
11
|
+
strip = Denko::LED::WS2812.new(board: board, pin: PIN, length: PIXELS)
|
12
|
+
|
13
|
+
min = 0
|
14
|
+
max = 255
|
15
|
+
gap = 5
|
16
|
+
values = (min..max).step(gap).to_a + (min..max-gap).step(gap).to_a.reverse
|
17
|
+
|
18
|
+
color_values= []
|
19
|
+
# Red
|
20
|
+
values.each { |v| color_values << [v, 0, 0] }
|
21
|
+
# Green
|
22
|
+
values.each { |v| color_values << [0, v, 0] }
|
23
|
+
# Blue
|
24
|
+
values.each { |v| color_values << [0, 0, v] }
|
25
|
+
# White
|
26
|
+
values.each { |v| color_values << [v, v, v] }
|
27
|
+
|
28
|
+
loop do
|
29
|
+
start = 0
|
30
|
+
finish = PIXELS - 1
|
31
|
+
while (finish < color_values.length)
|
32
|
+
slice = color_values[start..finish]
|
33
|
+
|
34
|
+
slice.each_with_index do |value, i|
|
35
|
+
strip[i] = value
|
36
|
+
end
|
37
|
+
strip.show
|
38
|
+
sleep 0.025
|
39
|
+
|
40
|
+
start += 1
|
41
|
+
finish += 1
|
42
|
+
end
|
43
|
+
end
|
data/examples/motor/l298.rb
CHANGED
@@ -1,27 +1,29 @@
|
|
1
1
|
#
|
2
|
-
#
|
2
|
+
# Drive a DC motor with the L298 H-Bridge driver.
|
3
3
|
#
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'denko'
|
6
6
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
7
7
|
|
8
|
+
PINS = { direction1: 8, direction2: 9, enable: 10 }
|
9
|
+
|
8
10
|
# This is only 1 channel of the driver. Make a new object for each channel.
|
9
|
-
motor = Denko::Motor::L298.new
|
11
|
+
motor = Denko::Motor::L298.new(board: board, pins: PINS)
|
10
12
|
|
11
13
|
# Off without braking (initial state).
|
12
14
|
# motor.off
|
13
15
|
# motor.idle
|
14
16
|
|
15
17
|
# Go forward at half speed for a while.
|
16
|
-
motor.forward
|
18
|
+
motor.forward(50)
|
17
19
|
sleep 2
|
18
20
|
|
19
21
|
# Change direction.
|
20
|
-
motor.reverse
|
22
|
+
motor.reverse(50)
|
21
23
|
sleep 2
|
22
24
|
|
23
25
|
# Speed up without changing direction.
|
24
|
-
motor.speed =
|
26
|
+
motor.speed = 100
|
25
27
|
sleep 2
|
26
28
|
|
27
29
|
# Brake to stop quickly.
|
@@ -29,13 +31,13 @@ motor.brake
|
|
29
31
|
sleep 1
|
30
32
|
|
31
33
|
# Change from brake to forward, but 0 speed.
|
32
|
-
motor.forward
|
34
|
+
motor.forward(0)
|
33
35
|
sleep 1
|
34
36
|
|
35
|
-
#
|
37
|
+
# Speed up in 5% increments.
|
36
38
|
(1..20).each do |step|
|
37
39
|
sleep 0.5
|
38
|
-
motor.speed =
|
40
|
+
motor.speed = step * 5
|
39
41
|
end
|
40
42
|
|
41
43
|
# Turn it off.
|
data/examples/motor/servo.rb
CHANGED
@@ -4,13 +4,14 @@
|
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'denko'
|
6
6
|
|
7
|
+
PIN = 9
|
8
|
+
|
7
9
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
-
servo = Denko::Motor::Servo.new(
|
10
|
+
servo = Denko::Motor::Servo.new(board: board, pin: PIN)
|
9
11
|
|
10
12
|
# Add different angles (in degrees) to the array below to try out your servo.
|
11
13
|
# Note: Some servos may not have a full 180 degree sweep.
|
12
|
-
|
13
|
-
[0, 90].cycle do |angle|
|
14
|
+
[0, 90, 180, 90].cycle do |angle|
|
14
15
|
servo.position = angle
|
15
16
|
sleep 0.5
|
16
17
|
end
|
data/examples/motor/stepper.rb
CHANGED
@@ -1,34 +1,34 @@
|
|
1
1
|
#
|
2
|
-
#
|
2
|
+
# Use a stepper motor with the EasyDriver board: https://www.sparkfun.com/products/12779
|
3
3
|
#
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'denko'
|
6
6
|
|
7
|
+
PINS = { slp: 6, enable: 7, direction: 8, step: 10, ms1: 11, ms2: 12 }
|
8
|
+
|
7
9
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
-
stepper = Denko::Motor::Stepper.new
|
9
|
-
|
10
|
-
|
11
|
-
# Default is 8 microsteps. Set to 2 so we can move faster.
|
10
|
+
stepper = Denko::Motor::Stepper.new(board: board, pins: PINS)
|
11
|
+
|
12
|
+
# Default is 8 microsteps. Use 2 to move faster.
|
12
13
|
stepper.microsteps = 2
|
13
14
|
|
14
15
|
# 400 steps is now 1 revolution for a 200 step motor.
|
15
16
|
400.times do
|
16
|
-
stepper.
|
17
|
+
stepper.step_ccw
|
17
18
|
sleep 0.002
|
18
19
|
end
|
19
20
|
|
20
|
-
# Sleep the driver
|
21
|
+
# Sleep the driver and wait a while.
|
21
22
|
stepper.sleep
|
22
23
|
sleep 1
|
23
24
|
|
24
|
-
# Wake it up and set to full steps.
|
25
|
+
# Wake it up and set to full steps.
|
25
26
|
stepper.wake
|
26
27
|
stepper.microsteps = 1
|
27
28
|
|
28
29
|
#
|
29
|
-
# Now 200 steps the other way will
|
30
|
-
#
|
31
|
-
# Adjust both sleep vales to suit your motor.
|
30
|
+
# Now 200 steps the other way will return to the start.
|
31
|
+
# Longer sleep times to match bigger steps. Adjust for your motor.
|
32
32
|
#
|
33
33
|
200.times do
|
34
34
|
stepper.step_cw
|
@@ -38,6 +38,6 @@ end
|
|
38
38
|
# Sleep the driver once we're done.
|
39
39
|
stepper.sleep
|
40
40
|
|
41
|
-
#
|
42
|
-
# Make sure
|
41
|
+
# Writing to the board is done asynchronously.
|
42
|
+
# Make sure all commands are written before exit.
|
43
43
|
board.finish_write
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#
|
2
|
+
# Search a 1-Wire bus.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
PIN = 4
|
8
|
+
|
9
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
10
|
+
bus = Denko::OneWire::Bus.new(board: board, pin: PIN)
|
11
|
+
|
12
|
+
# Call #device_present to reset the bus and return presence pulse as a boolean.
|
13
|
+
if bus.device_present?
|
14
|
+
puts "Devices present on bus..."; puts
|
15
|
+
else
|
16
|
+
puts "No devices present on bus... Quitting..."
|
17
|
+
return
|
18
|
+
end
|
19
|
+
|
20
|
+
# The bus detects parasite power automatically when initialized.
|
21
|
+
# It can tell that parasite power is in use, but not by WHICH devices.
|
22
|
+
if bus.parasite_power
|
23
|
+
puts "Parasite power detected..."; puts
|
24
|
+
end
|
25
|
+
|
26
|
+
# Calling #search finds connected devices and stores them in #found_devices.
|
27
|
+
# Each hash contains a device's ROM address and matching Ruby class if one exists.
|
28
|
+
bus.search
|
29
|
+
count = bus.found_devices.count
|
30
|
+
puts "Found #{count} device#{'s' if count > 1} on the bus:"
|
31
|
+
|
32
|
+
puts bus.found_devices.inspect
|
data/examples/pulse_io/buzzer.rb
CHANGED
@@ -4,8 +4,10 @@
|
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'denko'
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
PIN = 9
|
8
|
+
|
9
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
10
|
+
buzzer = Denko::PulseIO::Buzzer.new(board: board, pin: PIN)
|
9
11
|
|
10
12
|
C4 = 262
|
11
13
|
D4 = 294
|
@@ -17,13 +19,16 @@ notes = [
|
|
17
19
|
[E4, 1], [D4, 1], [C4, 1], [D4, 1], [E4, 1], [E4, 1], [E4, 1], [E4, 1],
|
18
20
|
[D4, 1], [D4, 1], [E4, 1], [D4, 1], [C4, 4],
|
19
21
|
]
|
20
|
-
|
22
|
+
|
21
23
|
bpm = 240
|
22
24
|
beat_time = 60.to_f / bpm
|
23
25
|
|
24
26
|
notes.each do |note|
|
25
27
|
buzzer.tone(note[0])
|
26
28
|
sleep note[1] * beat_time
|
29
|
+
|
30
|
+
# Stop for a bit so notes are properly defined.
|
31
|
+
buzzer.stop; sleep 0.010
|
27
32
|
end
|
28
33
|
|
29
34
|
buzzer.stop
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#
|
2
|
+
# Test of the IROutput (infrared transmitter) class.
|
3
|
+
# The specific NEC code is one taken from the Arduino example:
|
4
|
+
# https://github.com/Arduino-IRremote/Arduino-IRremote/tree/master/examples/SendDemo
|
5
|
+
#
|
6
|
+
# To test your emitter works, flash the recieve sketch on a second board:
|
7
|
+
# https://github.com/Arduino-IRremote/Arduino-IRremote/tree/master/examples/ReceiveDemo
|
8
|
+
# Attach an IR receiver to the receive pin (2 for Atmel AVR) and observe its serial output.
|
9
|
+
#
|
10
|
+
# If you don't have 2 boards, use that sketch to capture a code from a remote.
|
11
|
+
# Copy the raw code (list of numbers in curly braces) and modify into a Ruby array.
|
12
|
+
# Put denko firmare back on your board, then test if the IR code operates your device.
|
13
|
+
#
|
14
|
+
# IR codes are also available from sites like:
|
15
|
+
# https://github.com/zmoteio/irdb.tk
|
16
|
+
# If formatted numbers with + and - prepended, you need to convert into a Ruby array first.
|
17
|
+
#
|
18
|
+
require 'bundler/setup'
|
19
|
+
require 'denko'
|
20
|
+
|
21
|
+
PIN = 4
|
22
|
+
|
23
|
+
# Note: If testing with 2 boards on one computer, be explicit about which serial device
|
24
|
+
# runs denko. Use the second Serial.new call below and modify device: as needed.
|
25
|
+
# Monitor the receiver board in the Arduino (or some other) serial monitor.
|
26
|
+
#
|
27
|
+
connection = Denko::Connection::Serial.new
|
28
|
+
# connection = Denko::Connection::Serial.new(device: "/dev/ttyACM0")
|
29
|
+
board = Denko::Board.new(connection)
|
30
|
+
|
31
|
+
#
|
32
|
+
# Infrared can be used on most pins for most boards, but there might be conflicts
|
33
|
+
# with other hardware or libraries. Try different pins. For more info:
|
34
|
+
# https://github.com/Arduino-IRremote/Arduino-IRremote?#timer-and-pin-usage
|
35
|
+
#
|
36
|
+
ir = Denko::PulseIO::IROutput.new(board: board, pin: PIN)
|
37
|
+
|
38
|
+
# NEC Raw-Data=0xF708FB04. LSBFIRST, so the binary for each hex digit below is backward.
|
39
|
+
code = [ 9000, 4500, # Start bit
|
40
|
+
560, 560, 560, 560, 560, 1690, 560, 560, # 0010 0x4 command
|
41
|
+
560, 560, 560, 560, 560, 560, 560, 560, # 0000 0x0 command
|
42
|
+
560, 1690, 560, 1690, 560,560, 560, 1690, # 1101 0xB command inverted
|
43
|
+
560, 1690, 560, 1690, 560, 1690, 560, 1690, # 1111 0xF command inverted
|
44
|
+
560, 560, 560, 560, 560, 560, 560, 1690, # 0001 0x8 address
|
45
|
+
560, 560, 560, 560, 560, 560, 560, 560, # 0000 0x0 address
|
46
|
+
560, 1690, 560, 1690, 560, 1690, 560, 560, # 1110 0x7 address inverted
|
47
|
+
560, 1690, 560, 1690, 560, 1690, 560, 1690, # 1111 0xF address inverted
|
48
|
+
560] # Stop bit
|
49
|
+
|
50
|
+
ir.write(code)
|
51
|
+
board.finish_write
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#
|
2
|
+
# PWM (pulse width modulation) output demo.
|
3
|
+
# Frequency and resolution are configurable (only on ESP32 and PiBoard/Linux for now).
|
4
|
+
# Capture output with logic analyzer or oscilloscope to verify accuracy.
|
5
|
+
#
|
6
|
+
require 'bundler/setup'
|
7
|
+
require 'denko'
|
8
|
+
|
9
|
+
PIN = 2
|
10
|
+
|
11
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
12
|
+
pwm = Denko::PulseIO::PWMOutput.new(board: board, pin: PIN)
|
13
|
+
|
14
|
+
# Resolution test: ~1% duty at 1 kHz / 10-bit.
|
15
|
+
# On and off approx. 10us and 990us respectively.
|
16
|
+
pwm.pwm_enable(frequency: 1_000, resolution: 10)
|
17
|
+
pwm.write 10 # of 1023
|
18
|
+
sleep 0.5
|
19
|
+
pwm.digital_write 0
|
20
|
+
|
21
|
+
sleep 0.5
|
22
|
+
|
23
|
+
# Frequency test: ~50% duty at 10 kHz / 8-bit.
|
24
|
+
# On and off both approx. 50us.
|
25
|
+
pwm.pwm_enable(frequency: 10_000, resolution: 8)
|
26
|
+
pwm.write 127 # of 255
|
27
|
+
sleep 0.5
|
28
|
+
pwm.digital_write 0
|
29
|
+
|
30
|
+
board.finish_write
|
data/examples/rtc/ds3231.rb
CHANGED
@@ -1,48 +1,31 @@
|
|
1
1
|
#
|
2
|
-
#
|
3
|
-
# back every 5 seconds.
|
2
|
+
# D3231 real-time-clock over I2C. Set time and read back every 5 seconds.
|
4
3
|
#
|
5
4
|
require 'bundler/setup'
|
6
5
|
require 'denko'
|
7
6
|
|
8
7
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
9
|
-
|
10
|
-
#
|
11
|
-
# Default pins for the I2C0 (first) interface on most chips:
|
12
|
-
#
|
13
|
-
# ATmega 328p: SDA = 'A4' SCL = 'A5' - Arduino Uno, Nano
|
14
|
-
# ATmega 32u4: SDA = 2 SCL = 3 - Arduino Leonardo, Pro Micro
|
15
|
-
# ATmega1280 / 2560: SDA = 20 SCL = 21 - Arduino Mega
|
16
|
-
# SAM3X8E: SDA = 20 SCL = 21 - Arduino Due
|
17
|
-
# SAMD21G18: SDA = 20 SCL = 21 - Arduino Zero, M0, M0 Pro
|
18
|
-
# ESP8266: SDA = 4 SCL = 5
|
19
|
-
# ESP32: SDA = 21 SCL = 22
|
20
|
-
# RP2040: SDA = 4 SCL = 5 - Raspberry Pi Pico (W)
|
21
|
-
#
|
22
|
-
# Only give the SDA pin of the I2C bus. SCL (clock) pin must be
|
23
|
-
# connected for it to work, but we don't need to control it.
|
24
|
-
#
|
25
|
-
bus = Denko::I2C::Bus.new(board: board, pin: 'A4')
|
8
|
+
i2c = Denko::I2C::Bus.new(board: board) # address: 0x68 default
|
26
9
|
|
27
10
|
# Tell the bus to search for devices.
|
28
|
-
|
11
|
+
i2c.search
|
12
|
+
|
13
|
+
if i2c.found_devices.empty?
|
14
|
+
puts "No I2C devices connected!"
|
15
|
+
return
|
16
|
+
end
|
29
17
|
|
30
|
-
#
|
31
|
-
|
32
|
-
|
33
|
-
|
18
|
+
# 0x68 is the I2C address for most real time clocks.
|
19
|
+
unless (i2c.found_devices.include? 0x68)
|
20
|
+
puts "DS3231 real time clock not found!"
|
21
|
+
return
|
34
22
|
end
|
35
23
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
else
|
40
|
-
puts; puts "Using real time clock at address 0x68"; puts
|
41
|
-
rtc = Denko::RTC::DS3231.new(bus: bus, address: 0x68)
|
42
|
-
rtc.time = Time.now
|
24
|
+
puts "Using DS3231 RTC at address 0x68"; puts
|
25
|
+
rtc = Denko::RTC::DS3231.new(bus: i2c, address: 0x68)
|
26
|
+
rtc.time = Time.now
|
43
27
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
28
|
+
5.times do
|
29
|
+
puts rtc.time
|
30
|
+
sleep 5
|
48
31
|
end
|
data/examples/sensor/aht10.rb
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
#
|
2
|
-
#
|
2
|
+
# AHT10 sensor over I2C, for temperature and humidity.
|
3
3
|
#
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'denko'
|
6
|
+
require_relative 'neat_tph_readings'
|
6
7
|
|
7
|
-
board
|
8
|
-
bus
|
8
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
9
|
+
bus = Denko::I2C::Bus.new(board: board)
|
9
10
|
sensor = Denko::Sensor::AHT10.new(bus: bus) # address: 0x38 default
|
10
11
|
|
11
|
-
# Get the shared #print_tph_reading method to print readings neatly.
|
12
|
-
require_relative 'neat_tph_readings'
|
13
|
-
|
14
12
|
# Poll it and print readings.
|
15
13
|
sensor.poll(5) do |reading|
|
16
14
|
print_tph_reading(reading)
|
data/examples/sensor/aht20.rb
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
#
|
2
|
-
#
|
2
|
+
# AHT21 sensor over I2C, for temperature and humidity.
|
3
3
|
#
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'denko'
|
6
|
+
require_relative 'neat_tph_readings'
|
6
7
|
|
7
|
-
board
|
8
|
-
bus
|
8
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
9
|
+
bus = Denko::I2C::Bus.new(board: board)
|
9
10
|
sensor = Denko::Sensor::AHT20.new(bus: bus) # address: 0x38 default
|
10
11
|
|
11
|
-
# Get the shared #print_tph_reading method to print readings neatly.
|
12
|
-
require_relative 'neat_tph_readings'
|
13
|
-
|
14
12
|
# Poll it and print readings.
|
15
13
|
sensor.poll(5) do |reading|
|
16
14
|
print_tph_reading(reading)
|