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
@@ -4,28 +4,26 @@
|
|
4
4
|
#
|
5
5
|
require 'bundler/setup'
|
6
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
|
7
11
|
|
8
12
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
9
|
-
bus
|
10
|
-
sht
|
11
|
-
qmp
|
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
|
12
16
|
|
13
17
|
# Configure for higher accuracy.
|
14
|
-
sht.repeatability
|
18
|
+
sht.repeatability = :high
|
15
19
|
qmp.temperature_samples = 2
|
16
|
-
qmp.pressure_samples
|
17
|
-
qmp.iir_coefficient
|
20
|
+
qmp.pressure_samples = 16
|
21
|
+
qmp.iir_coefficient = 2
|
18
22
|
|
19
23
|
# Buggy on ESP32-S3 in forced mode. Data registers return zeroes on all but first read.
|
20
24
|
# Can't recreate on ESP32 V1, AVR or SAMD21. Put it in contiuous mode just in case.
|
21
25
|
qmp.continuous_mode
|
22
26
|
|
23
|
-
# Get the shared #print_tph_reading method to print readings neatly.
|
24
|
-
require_relative '../sensor/neat_tph_readings'
|
25
|
-
|
26
|
-
# How many degrees C the two temperature values can differ by before a warning.
|
27
|
-
TOLERANCE = 0.50
|
28
|
-
|
29
27
|
loop do
|
30
28
|
# Read both sensors.
|
31
29
|
qmp_reading = qmp.read
|
@@ -33,11 +31,11 @@ loop do
|
|
33
31
|
|
34
32
|
# Retry immediately if either failed.
|
35
33
|
next unless (sht_reading && qmp_reading)
|
36
|
-
|
34
|
+
|
37
35
|
# Warn if large gap between temperature readings.
|
38
36
|
difference = (qmp_reading[:temperature] - sht_reading[:temperature]).abs
|
39
37
|
if (difference > TOLERANCE)
|
40
|
-
puts "WARNING: temperature values differed by more than #{TOLERANCE}\xC2\xB0C (#{difference.round(4)} \xC2\xB0C
|
38
|
+
puts "WARNING: temperature values differed by more than #{TOLERANCE}\xC2\xB0C (#{difference.round(4)} \xC2\xB0C)"
|
41
39
|
end
|
42
40
|
|
43
41
|
# Combine values from both sensors, averaging their temperatures.
|
@@ -1,14 +1,15 @@
|
|
1
1
|
#
|
2
|
-
# Example using a rotary encoder
|
2
|
+
# Example using a KY-040 (30 detent) rotary encoder as a mac volume control.
|
3
3
|
#
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'denko'
|
6
6
|
|
7
|
-
|
7
|
+
PIN_A = 4
|
8
|
+
PIN_B = 5
|
9
|
+
|
10
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
11
|
encoder = Denko::DigitalIO::RotaryEncoder.new board: board,
|
9
|
-
|
10
|
-
divider: 1, # (default) read approx every divider ms
|
11
|
-
steps_per_revolution: 30 # (default)
|
12
|
+
pins: { a: PIN_A, b: PIN_B }
|
12
13
|
|
13
14
|
# Set up a pseudo terminal with osascript (AppleScript) in interactive mode.
|
14
15
|
# Calling a separate script each update is too slow.
|
@@ -32,16 +33,20 @@ class AppleVolumeWrapper
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
35
|
-
|
36
|
-
|
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}%"
|
37
41
|
|
38
42
|
encoder.add_callback do |update|
|
39
|
-
#
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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
|
45
50
|
puts "Current volume: #{current_volume}%"
|
46
51
|
end
|
47
52
|
|
@@ -8,17 +8,16 @@ require 'bundler/setup'
|
|
8
8
|
require 'denko'
|
9
9
|
|
10
10
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
11
|
-
i2c
|
11
|
+
i2c = Denko::I2C::Bus.new(board: board)
|
12
12
|
|
13
13
|
# Get temperature and humidity every second.
|
14
14
|
htu21d = Denko::Sensor::HTU21D.new(bus: i2c)
|
15
|
-
htu21d.
|
16
|
-
htu21d.humidity.poll(1)
|
15
|
+
htu21d.poll(2)
|
17
16
|
|
18
|
-
oled
|
17
|
+
oled = Denko::Display::SSD1306.new(bus: i2c, rotate: true)
|
19
18
|
canvas = oled.canvas
|
20
|
-
last_refresh = Time.now
|
21
19
|
|
20
|
+
last_refresh = Time.now
|
22
21
|
loop do
|
23
22
|
elapsed = Time.now - last_refresh
|
24
23
|
|
@@ -29,15 +28,11 @@ loop do
|
|
29
28
|
canvas.text_cursor = [0,0]
|
30
29
|
canvas.print "Time: #{Time.now.strftime("%H:%M:%S.%L")}"
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
canvas.print "Temp: " + ('%.3f' % htu21d[:temperature]).rjust(7, " ") + " C"
|
35
|
-
end
|
31
|
+
canvas.text_cursor = [0,8]
|
32
|
+
canvas.print "Temp: " + ('%.3f' % htu21d.temperature).rjust(7, " ") + " C"
|
36
33
|
|
37
|
-
|
38
|
-
|
39
|
-
canvas.print "Humidity: " + ('%.3f' % htu21d[:humidity]).rjust(7, " ") + " %"
|
40
|
-
end
|
34
|
+
canvas.text_cursor = [0,16]
|
35
|
+
canvas.print "Humidity: " + ('%.3f' % htu21d.humidity).rjust(7, " ") + " %"
|
41
36
|
|
42
37
|
# Only refresh the area in use.
|
43
38
|
oled.draw(0, 127, 0, 24)
|
@@ -0,0 +1,48 @@
|
|
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
|
@@ -5,8 +5,8 @@ require 'bundler/setup'
|
|
5
5
|
require 'denko'
|
6
6
|
|
7
7
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
-
bus
|
9
|
-
ads
|
8
|
+
bus = Denko::I2C::Bus.new(board: board)
|
9
|
+
ads = Denko::AnalogIO::ADS1115.new(bus: bus)
|
10
10
|
|
11
11
|
# Helper method so readings look nice.
|
12
12
|
def print_reading(name, raw, voltage)
|
@@ -5,16 +5,8 @@ require 'bundler/setup'
|
|
5
5
|
require 'denko'
|
6
6
|
|
7
7
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
-
|
9
|
-
|
10
|
-
bus = Denko::SPI::Bus.new(board: board)
|
11
|
-
|
12
|
-
# Or use a 2-way bit-bang SPI bus on any pins.
|
13
|
-
# SPI_BIT_BANG_PINS = { clock: 13, input: 12, output: 11 }
|
14
|
-
# bus = Denko::SPI::BitBang.new(board: board, pins: SPI_BIT_BANG_PINS)
|
15
|
-
|
16
|
-
# Connect chip select/enable pin of the ADS1118 to pin 9.
|
17
|
-
ads = Denko::AnalogIO::ADS1118.new(bus: bus, pin: 9)
|
8
|
+
bus = Denko::SPI::Bus.new(board: board)
|
9
|
+
ads = Denko::AnalogIO::ADS1118.new(bus: bus, pin: 10)
|
18
10
|
|
19
11
|
# Helper method so readings look nice.
|
20
12
|
def print_reading(name, raw, voltage)
|
@@ -29,7 +21,7 @@ end
|
|
29
21
|
#
|
30
22
|
# Read the ADS1118 internal temperature sensor.
|
31
23
|
# This always uses the 128 SPS mode, and there is no polling method for it.
|
32
|
-
#
|
24
|
+
#
|
33
25
|
temperature = ads.temperature_read
|
34
26
|
puts "ADS1118 Temperature: #{temperature} \xC2\xB0C"
|
35
27
|
puts
|
data/examples/analog_io/input.rb
CHANGED
@@ -1,32 +1,31 @@
|
|
1
1
|
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# or a simple temperature sensor like the TMP36.
|
2
|
+
# Use your board's analog-to-digital-converter(ADC) pins with AnalogIO::Input.
|
3
|
+
# ADC inputs can be connected to sensors that produce variable output voltage,
|
4
|
+
# such as light dependent resistors, or a temperature sensor like the TMP36.
|
6
5
|
#
|
7
6
|
require 'bundler/setup'
|
8
7
|
require 'denko'
|
9
8
|
|
9
|
+
PIN = :A0
|
10
|
+
|
10
11
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
11
|
-
input = Denko::AnalogIO::Input.new(pin:
|
12
|
+
input = Denko::AnalogIO::Input.new(pin: PIN, board: board)
|
12
13
|
|
13
|
-
# Single read
|
14
|
-
# code block runs only once, and then the main thread continues.
|
14
|
+
# Single read. Blocks main thread during read, then runs given block with the value.
|
15
15
|
input.read { |value| puts "#{Time.now} Single read #1: #{value}" }
|
16
16
|
|
17
|
-
#
|
18
|
-
#
|
19
|
-
# Given code block is added as a callback, and runs every time a value is received.
|
17
|
+
# Poll repeatedly does single reads, in a separate thread, with an interval in seconds.
|
18
|
+
# Given block is saved as a callback, and runs each time a value is received.
|
20
19
|
input.poll(0.5) { |value| puts "#{Time.now} Polling: #{value}" }
|
21
|
-
sleep 3
|
22
20
|
|
23
|
-
#
|
21
|
+
# Does not block main thread, so wait for some values.
|
22
|
+
sleep 3
|
23
|
+
# Stop polling, automatically removing callback from #poll.
|
24
24
|
input.stop
|
25
25
|
|
26
|
-
# Listening is
|
27
|
-
#
|
28
|
-
#
|
29
|
-
# Powers of 2 from 1 to 128 are supported for listener intervals.
|
26
|
+
# "Listening" is where the Board keeps time, reading the ADC at a small interval
|
27
|
+
# and continuously sends values, until #stop is called.
|
28
|
+
# Powers of 2 from 1 to 128 (in milliseconds) are supported for listener intervals.
|
30
29
|
input.listen(32) { |value| puts "#{Time.now} Listening: #{value}" }
|
31
30
|
sleep 0.5
|
32
31
|
|
@@ -53,3 +52,5 @@ input.remove_callbacks(:test)
|
|
53
52
|
|
54
53
|
# Remove all callbacks.
|
55
54
|
input.remove_callbacks
|
55
|
+
|
56
|
+
board.finish_write
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# This example shows how to smooth the input of an AnalogIO::Input.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
PIN = :A0
|
8
|
+
|
9
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
10
|
+
input = Denko::AnalogIO::Input.new(pin: PIN, board: board)
|
11
|
+
|
12
|
+
# Enable smoothing on the input using the last 16 values.
|
13
|
+
input.smoothing = true
|
14
|
+
input.smoothing_size = 16
|
15
|
+
|
16
|
+
# Use the slowest listener possible.
|
17
|
+
input.listen(128)
|
18
|
+
|
19
|
+
#
|
20
|
+
# With these settings, the input's state should gradually change (~2 seconds),
|
21
|
+
# if you switch its supply from Vcc to Ground (or vice versa), instead of instantaneously.
|
22
|
+
#
|
23
|
+
# Print the state every 1/4 second. Change the voltage being input to the pin to see results.
|
24
|
+
loop do
|
25
|
+
puts input.state
|
26
|
+
sleep(0.25)
|
27
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#
|
2
|
+
# Example for a potentiometer.
|
3
|
+
#
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'denko'
|
6
|
+
|
7
|
+
PIN = :A0
|
8
|
+
|
9
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
10
|
+
pot = Denko::AnalogIO::Potentiometer.new(pin: PIN, board: board)
|
11
|
+
|
12
|
+
last_percent = nil
|
13
|
+
pot.on_data do |reading|
|
14
|
+
# Map reading to a decimal between 0 and 1.
|
15
|
+
fraction = reading / board.adc_high.to_f
|
16
|
+
|
17
|
+
# Linearization hack for audio taper potentiometers.
|
18
|
+
# Adjust k for different tapers. This was an A500K.
|
19
|
+
k = 5
|
20
|
+
linearized = (fraction * (k + 1)) / ((k * fraction) + 1)
|
21
|
+
# Use this for linear potentiometers instead.
|
22
|
+
# linearized = fraction
|
23
|
+
|
24
|
+
percent = (linearized * 100).round
|
25
|
+
unless percent == last_percent
|
26
|
+
puts "Potentiometer: #{percent.to_s.rjust(3, " ")}%"
|
27
|
+
last_percent = percent
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
sleep
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
# Diagnostic to confirm board is receiving binary data
|
3
|
+
# (in aux message) properly.
|
4
|
+
#
|
5
|
+
require 'bundler/setup'
|
6
|
+
require 'denko'
|
7
|
+
|
8
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
9
|
+
echo = Denko::Connection::BinaryEcho.new(board: board, pin: 253)
|
10
|
+
|
11
|
+
min_byte = 0
|
12
|
+
max_byte = 255
|
13
|
+
|
14
|
+
expected_result = (min_byte..max_byte).to_a.join(',') << ','
|
15
|
+
|
16
|
+
waiting = false
|
17
|
+
wait_mutex = Mutex.new
|
18
|
+
|
19
|
+
echo.on_data do |data|
|
20
|
+
if data == expected_result
|
21
|
+
puts "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} - Echo received"
|
22
|
+
wait_mutex.synchronize { waiting = false }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
loop do
|
27
|
+
wait_mutex.synchronize do
|
28
|
+
unless waiting
|
29
|
+
echo.test_range(min: min_byte, max: max_byte)
|
30
|
+
waiting = true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
sleep 0.001
|
34
|
+
end
|
data/examples/connection/tcp.rb
CHANGED
@@ -1,34 +1,19 @@
|
|
1
|
-
require 'bundler/setup'
|
2
|
-
require 'denko'
|
3
1
|
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# Port number defaults to 3466 (denko), but may be given as a second argument.
|
7
|
-
# It must correspond to the listening port set when the board was flashed.
|
2
|
+
# Connect to a Board via TCP. This works for WiFi and Ethernet sketches.
|
3
|
+
# Default port is 3466, and must match the port the Board was flashed to listen on.
|
8
4
|
#
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
require 'bundler/setup'
|
6
|
+
require 'denko'
|
7
|
+
|
8
|
+
IP_ADDRESS = "192.168.0.52"
|
9
|
+
PORT = 3466
|
10
|
+
PIN = :LED_BUILTIN
|
11
|
+
|
12
|
+
connection = Denko::Connection::TCP.new(IP_ADDRESS, PORT)
|
13
|
+
board = Denko::Board.new(connection)
|
14
|
+
led = Denko::LED.new(board: board, pin: PIN)
|
15
15
|
|
16
16
|
[:on, :off].cycle do |switch|
|
17
17
|
led.send(switch)
|
18
18
|
sleep 0.5
|
19
19
|
end
|
20
|
-
#
|
21
|
-
# ser2net can be used to simulate a TCP interface from a board running denko serial.
|
22
|
-
# It serves the serial interface over a TCP port from the machine running ser2net.
|
23
|
-
#
|
24
|
-
# Example ser2net command for an Arduino UNO connected to a Mac:
|
25
|
-
# ser2net -u -C "3466:raw:0:/dev/cu.usbmodem621:115200"
|
26
|
-
#
|
27
|
-
# Tell denko to connect to the IP address of the Mac, at port 3466.
|
28
|
-
# Note: ser2net should be used in raw TCP mode, not telnet mode (more common).
|
29
|
-
#
|
30
|
-
# Replace /dev/cu.usbmodem621 with your denko serial device.
|
31
|
-
# Arduino UNOs should be something like /dev/ttyACM0 under Linux.
|
32
|
-
#
|
33
|
-
# http://sourceforge.net/projects/ser2net/ for more info on installing and configuring ser2net.
|
34
|
-
#
|
@@ -4,10 +4,14 @@
|
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'denko'
|
6
6
|
|
7
|
+
PIN = 3
|
8
|
+
|
7
9
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
-
button = Denko::DigitalIO::Button.new
|
10
|
+
button = Denko::DigitalIO::Button.new board: board,
|
11
|
+
pin: PIN,
|
12
|
+
mode: :input_pullup
|
9
13
|
|
10
|
-
button.up { puts "Button released
|
11
|
-
button.down { puts "Button pressed
|
14
|
+
button.up { puts "Button released at #{Time.now.strftime '%H:%M:%S'}" }
|
15
|
+
button.down { puts "Button pressed at #{Time.now.strftime '%H:%M:%S'}" }
|
12
16
|
|
13
17
|
sleep
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#
|
2
|
+
# Use Relays to work with higher voltage circuits. This example
|
3
|
+
# closes and opens a relay to send a 500ms pulse on a 12V control circuit.
|
4
|
+
#
|
5
|
+
require 'bundler/setup'
|
6
|
+
require 'denko'
|
7
|
+
|
8
|
+
PIN = 6
|
9
|
+
|
10
|
+
board = Denko::Board.new(Denko::Connection::Serial.new)
|
11
|
+
relay = Denko::DigitalIO::Relay.new(board: board, pin: PIN)
|
12
|
+
|
13
|
+
relay.close
|
14
|
+
sleep(0.500)
|
15
|
+
relay.open
|
16
|
+
|
17
|
+
board.finish_write
|
@@ -1,26 +1,36 @@
|
|
1
1
|
#
|
2
|
-
#
|
2
|
+
# KY-040 (30 detent) rotary encoder on a microcontroller, listener at 1ms.
|
3
3
|
#
|
4
|
-
# WARNING: This method is not precise
|
5
|
-
# that requires all steps to be read for
|
4
|
+
# WARNING: This method is not precise and may miss steps. Don't use for anything
|
5
|
+
# that requires all steps to be read for exact positioning or high speed.
|
6
6
|
#
|
7
7
|
require 'bundler/setup'
|
8
8
|
require 'denko'
|
9
9
|
|
10
|
+
PIN_A = 4
|
11
|
+
PIN_B = 5
|
12
|
+
|
10
13
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
11
|
-
encoder = Denko::DigitalIO::RotaryEncoder.new board: board,
|
12
|
-
pins: { clock: 4, data: 5 },
|
13
|
-
divider: 1, # default, reads each pin every 1ms
|
14
|
-
steps_per_revolution: 30 # default
|
15
14
|
|
16
|
-
#
|
15
|
+
# Other options and their default values:
|
16
|
+
#
|
17
|
+
# divider: 1 # read every divider milliseconds (Board only)
|
18
|
+
# debounce_time: 1 # software debounce in microseconds (PiBoard only)
|
19
|
+
# counts_per_revolution: 60 # for generic 30 detent rotary encoders
|
20
|
+
#
|
21
|
+
encoder = Denko::DigitalIO::RotaryEncoder.new board: board,
|
22
|
+
pins: { a: PIN_A, b: PIN_B }
|
23
|
+
|
24
|
+
# Reverse direction.
|
17
25
|
# encoder.reverse
|
18
26
|
|
19
|
-
# Reset
|
20
|
-
encoder.reset
|
27
|
+
# Reset count and angle to 0.
|
28
|
+
# encoder.reset
|
21
29
|
|
22
30
|
encoder.add_callback do |state|
|
23
|
-
|
31
|
+
change_printable = state[:change].to_s
|
32
|
+
change_printable = "+#{change_printable}" if state[:change] > 0
|
33
|
+
puts "Encoder Change: #{change_printable} | Count: #{state[:count]} | Angle: #{state[:angle]}\xC2\xB0"
|
24
34
|
end
|
25
35
|
|
26
36
|
sleep
|
data/examples/display/hd44780.rb
CHANGED
@@ -4,11 +4,19 @@
|
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'denko'
|
6
6
|
|
7
|
+
# These pins match the SainSmart LCD Keypad Shield for Arduino boards.
|
8
|
+
RS = 8
|
9
|
+
EN = 9
|
10
|
+
D4 = 4
|
11
|
+
D5 = 5
|
12
|
+
D6 = 6
|
13
|
+
D7 = 7
|
14
|
+
|
7
15
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
|
-
lcd
|
9
|
-
|
10
|
-
|
11
|
-
|
16
|
+
lcd = Denko::Display::HD44780.new board: board,
|
17
|
+
pins: { rs: RS, enable: EN, d4: D4, d5: D5, d6: D6, d7: D7 },
|
18
|
+
cols: 16,
|
19
|
+
rows: 2
|
12
20
|
|
13
21
|
# Bitmap for a custom character. 5 bits wide x 8 high.
|
14
22
|
# Useful for generating these: https://omerk.github.io/lcdchargen/
|
@@ -20,7 +28,7 @@ heart = [ 0b00000,
|
|
20
28
|
0b01110,
|
21
29
|
0b00100,
|
22
30
|
0b00000 ]
|
23
|
-
|
31
|
+
|
24
32
|
# Define the character in CGRAM address 2. 0-7 are usable.
|
25
33
|
lcd.create_char(2, heart)
|
26
34
|
|
data/examples/display/ssd1306.rb
CHANGED
@@ -6,26 +6,29 @@ require 'denko'
|
|
6
6
|
|
7
7
|
board = Denko::Board.new(Denko::Connection::Serial.new)
|
8
8
|
|
9
|
+
# The SSD1306 OLED connects to either an I2C or SPI bus, depending on the model you have.
|
10
|
+
# Bus setup exampels in order:
|
11
|
+
# I2C Hardware
|
12
|
+
# I2C Bit-Bang
|
13
|
+
# SPI Hardware
|
14
|
+
# SPI Bit-Bang
|
9
15
|
#
|
10
|
-
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
|
15
|
-
#
|
16
|
-
|
17
|
-
#
|
18
|
-
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
|
25
|
-
oled = Denko::Display::SSD1306.new(bus: bus, rotate: true)
|
26
|
-
canvas = oled.canvas
|
16
|
+
bus = Denko::I2C::Bus.new(board: board)
|
17
|
+
# bus = Denko::I2C::BitBang.new(board: board, pins: {scl: 4, sda: 5})
|
18
|
+
# bus = Denko::SPI::Bus.new(board: board)
|
19
|
+
# bus = Denko::SPI::BitBang.new(board: board, pins: {clock: 13, output: 11})
|
20
|
+
|
21
|
+
# I2C OLED, connected to I2C SDA and SCL.
|
22
|
+
oled = Denko::Display::SSD1306.new(bus: bus, rotate: true) # address: 0x3C is default
|
23
|
+
# oled = Denko::Display::SH1106.new(bus: bus,rotate: true) # address: 0x3C is default
|
24
|
+
|
25
|
+
# SPI OLED, connected to SPI CLK and MOSI pins.
|
26
|
+
# select: and dc: pins must be given. reset is optional (can be pulled high instead).
|
27
|
+
# oled = Denko::Display::SSD1306.new(bus: bus, pins: { select: 10, dc: 7, reset: 8 }, rotate: true)
|
28
|
+
# oled = Denko::Display::SH1106.new(bus: bus, pins: { select: 10, dc: 7, reset: 8}, rotate: true)
|
27
29
|
|
28
30
|
# Draw some text on the OLED's canvas (a Ruby memory buffer).
|
31
|
+
canvas = oled.canvas
|
29
32
|
canvas.text_cursor = [27,60]
|
30
33
|
canvas.print("Hello World!")
|
31
34
|
|
@@ -10,8 +10,8 @@ board = Denko::Board.new(Denko::Connection::Serial.new)
|
|
10
10
|
reset = Denko::DigitalIO::Output.new(board: board, pin: 18)
|
11
11
|
reset.high
|
12
12
|
|
13
|
-
bus
|
14
|
-
oled
|
13
|
+
bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
|
14
|
+
oled = Denko::Display::SSD1306.new(bus: bus, width: 128, height: 32)
|
15
15
|
canvas = oled.canvas
|
16
16
|
|
17
17
|
# Draw some text on the OLED's canvas (a Ruby memory buffer).
|