denko 0.13.6 → 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_avr.yml → build_atmega_avr.yml} +19 -18
- data/.github/workflows/{build_megaavr.yml → build_atmega_megaavr.yml} +19 -18
- data/.github/workflows/{build_sam3x.yml → build_atsam3x.yml} +18 -17
- data/.github/workflows/{build_samd.yml → build_atsamd21.yml} +19 -18
- data/.github/workflows/build_esp32.yml +19 -18
- data/.github/workflows/build_esp32c3.yml +58 -0
- data/.github/workflows/build_esp32c6.yml +59 -0
- data/.github/workflows/build_esp32h2.yml +58 -0
- data/.github/workflows/build_esp32s2.yml +59 -0
- data/.github/workflows/build_esp32s3.yml +59 -0
- data/.github/workflows/build_esp8266.yml +16 -15
- data/.github/workflows/build_ra4m1.yml +17 -16
- data/.github/workflows/build_rp2040.yml +19 -17
- data/.github/workflows/ruby.yml +20 -20
- data/CHANGELOG.md +398 -11
- data/DEPS_CLI.md +16 -16
- data/DEPS_IDE.md +39 -39
- data/MICROCONTROLLERS.md +103 -0
- data/PERIPHERALS.md +178 -0
- data/README.md +73 -58
- data/Rakefile +1 -1
- data/build +1 -1
- data/denko.gemspec +11 -3
- 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 +12 -27
- data/lib/denko/analog_io/ads111x.rb +39 -21
- data/lib/denko/analog_io/input.rb +29 -55
- data/lib/denko/analog_io/input_helper.rb +42 -0
- data/lib/denko/analog_io/joystick.rb +87 -0
- data/lib/denko/analog_io/output.rb +5 -5
- data/lib/denko/analog_io/potentiometer.rb +3 -9
- data/lib/denko/analog_io.rb +22 -7
- data/lib/denko/behaviors/board_proxy.rb +13 -1
- data/lib/denko/behaviors/bus_controller.rb +3 -1
- 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 +18 -14
- data/lib/denko/behaviors/component.rb +12 -14
- data/lib/denko/behaviors/input_pin.rb +14 -15
- data/lib/denko/behaviors/lifecycle.rb +51 -0
- data/lib/denko/behaviors/listener.rb +9 -3
- data/lib/denko/behaviors/multi_pin.rb +22 -20
- data/lib/denko/behaviors/output_pin.rb +9 -4
- data/lib/denko/behaviors/poller.rb +11 -2
- data/lib/denko/behaviors/reader.rb +109 -21
- data/lib/denko/behaviors/single_pin.rb +3 -4
- data/lib/denko/behaviors/state.rb +24 -13
- data/lib/denko/behaviors/subcomponents.rb +72 -12
- data/lib/denko/behaviors/threaded.rb +19 -8
- data/lib/denko/behaviors.rb +36 -22
- data/lib/denko/board/core.rb +36 -18
- data/lib/denko/board/eeprom.rb +1 -1
- data/lib/denko/board/i2c.rb +15 -15
- data/lib/denko/board/i2c_bit_bang.rb +53 -0
- data/lib/denko/board/infrared.rb +6 -6
- data/lib/denko/board/led_array.rb +6 -5
- data/lib/denko/board/map.rb +6 -2
- data/lib/denko/board/one_wire.rb +3 -3
- data/lib/denko/board/spi.rb +35 -30
- data/lib/denko/board/spi_bit_bang.rb +14 -15
- data/lib/denko/board.rb +41 -36
- data/lib/denko/connection/binary_echo.rb +17 -0
- data/lib/denko/connection/flow_control.rb +12 -16
- data/lib/denko/connection/handshake.rb +2 -0
- data/lib/denko/connection/serial.rb +5 -5
- 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 +19 -10
- data/lib/denko/digital_io/pcf8574.rb +114 -0
- data/lib/denko/digital_io/relay.rb +2 -0
- data/lib/denko/digital_io/rotary_encoder.rb +83 -61
- data/lib/denko/digital_io.rb +24 -5
- 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 +152 -105
- 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 +38 -0
- 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 -168
- 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 -3
- 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/helpers/mutex_stub.rb +13 -0
- data/lib/denko/helpers.rb +6 -0
- data/lib/denko/i2c/bit_bang.rb +32 -0
- data/lib/denko/i2c/bus.rb +8 -36
- data/lib/denko/i2c/bus_common.rb +50 -0
- data/lib/denko/i2c/peripheral.rb +32 -19
- data/lib/denko/i2c.rb +17 -2
- data/lib/denko/led/apa102.rb +42 -30
- data/lib/denko/led/base.rb +13 -2
- data/lib/denko/led/rgb.rb +18 -14
- data/lib/denko/led/seven_segment.rb +24 -9
- data/lib/denko/led/ws2812.rb +10 -7
- data/lib/denko/led.rb +17 -8
- data/lib/denko/message.rb +5 -0
- data/lib/denko/motor/{stepper.rb → a3967.rb} +12 -15
- data/lib/denko/motor/l298.rb +11 -10
- data/lib/denko/motor/servo.rb +37 -15
- data/lib/denko/motor.rb +16 -3
- data/lib/denko/one_wire/bus.rb +31 -23
- data/lib/denko/one_wire/bus_enumerator.rb +25 -14
- data/lib/denko/one_wire/helper.rb +4 -2
- data/lib/denko/one_wire/peripheral.rb +0 -3
- data/lib/denko/one_wire.rb +18 -5
- data/lib/denko/pulse_io/buzzer.rb +11 -9
- data/lib/denko/pulse_io/{ir_transmitter.rb → ir_output.rb} +6 -5
- data/lib/denko/pulse_io/pwm_output.rb +94 -15
- data/lib/denko/pulse_io.rb +17 -3
- data/lib/denko/rtc/ds3231.rb +13 -14
- data/lib/denko/rtc.rb +14 -1
- data/lib/denko/sensor/aht.rb +35 -38
- data/lib/denko/sensor/bme280.rb +76 -92
- data/lib/denko/sensor/bmp180.rb +46 -48
- data/lib/denko/sensor/dht.rb +34 -7
- data/lib/denko/sensor/ds18b20.rb +41 -34
- data/lib/denko/sensor/hcsr04.rb +7 -5
- data/lib/denko/sensor/hdc1080.rb +174 -0
- data/lib/denko/sensor/helper.rb +37 -0
- data/lib/denko/sensor/htu21d.rb +57 -57
- data/lib/denko/sensor/htu31d.rb +36 -36
- data/lib/denko/sensor/jsnsr04t.rb +49 -0
- data/lib/denko/sensor/qmp6988.rb +34 -48
- data/lib/denko/sensor/rcwl9620.rb +3 -5
- data/lib/denko/sensor/sht3x.rb +27 -24
- data/lib/denko/sensor/sht4x.rb +125 -0
- data/lib/denko/sensor/vl53l0x.rb +58 -0
- data/lib/denko/sensor.rb +33 -16
- data/lib/denko/spi/base_register.rb +25 -21
- data/lib/denko/spi/bit_bang.rb +17 -51
- data/lib/denko/spi/bus.rb +15 -29
- data/lib/denko/spi/bus_common.rb +33 -0
- data/lib/denko/spi/input_register.rb +37 -31
- data/lib/denko/spi/output_register.rb +33 -39
- data/lib/denko/spi/peripheral.rb +81 -14
- data/lib/denko/spi.rb +21 -6
- data/lib/denko/uart/bit_bang.rb +7 -30
- data/lib/denko/uart/common.rb +33 -0
- data/lib/denko/uart/hardware.rb +10 -34
- data/lib/denko/uart.rb +16 -2
- data/lib/denko/version.rb +1 -1
- data/lib/denko.rb +23 -16
- data/lib/denko_cli/generator.rb +2 -2
- data/lib/denko_cli/packages.rb +8 -10
- data/lib/denko_cli/targets.rb +13 -13
- data/lib/denko_cli/targets.txt +23 -24
- 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 +65 -16
- data/src/lib/Denko.h +46 -30
- data/src/lib/DenkoCoreIO.cpp +57 -102
- data/src/lib/DenkoDefines.h +32 -46
- 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 +29 -13
- data/src/lib/DenkoSPI.cpp +36 -33
- data/src/lib/DenkoSPIBB.cpp +19 -20
- data/target.yml +37 -2
- data/test/analog_io/input_test.rb +1 -1
- data/test/analog_io/potentiometer_test.rb +12 -12
- data/test/behaviors/board_proxy_test.rb +1 -1
- data/test/behaviors/bus_peripheral_test.rb +4 -4
- data/test/behaviors/callbacks_test.rb +28 -10
- data/test/behaviors/component_test.rb +32 -14
- 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/board_test.rb +9 -9
- 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/one_wire_test.rb +25 -14
- data/test/board/spi_test.rb +45 -29
- data/test/digital_io/button_test.rb +15 -0
- data/test/digital_io/input_test.rb +2 -2
- data/test/digital_io/relay_test.rb +18 -0
- data/test/digital_io/rotary_encoder_test.rb +80 -60
- 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 +108 -29
- data/test/i2c/peripheral_test.rb +38 -19
- data/test/led/apa102_test.rb +24 -0
- data/test/led/base_test.rb +2 -1
- data/test/led/rgb_test.rb +9 -9
- data/test/led/seven_segment_test.rb +7 -7
- data/test/motor/{stepper_test.rb → a3967_test.rb} +4 -4
- data/test/motor/servo_test.rb +1 -1
- data/test/one_wire/bus_enumerator_test.rb +1 -1
- data/test/one_wire/bus_test.rb +43 -35
- data/test/one_wire/peripheral_test.rb +5 -17
- data/test/pulse_io/buzzer_test.rb +7 -4
- data/test/pulse_io/{ir_transmitter_test.rb → ir_output_test.rb} +15 -10
- data/test/pulse_io/pwm_output_test.rb +74 -18
- data/test/rtc/ds3231_test.rb +13 -14
- data/test/sensor/dht_test.rb +12 -12
- data/test/sensor/ds18b20_test.rb +4 -8
- data/test/spi/bitbang_test.rb +27 -0
- data/test/spi/bus_test.rb +24 -34
- data/test/spi/input_register_test.rb +17 -17
- data/test/spi/output_register_test.rb +10 -28
- data/test/spi/peripheral_test.rb +73 -0
- data/test/test_helper.rb +44 -121
- data/vendor/board-maps/BoardMap.h +678 -54
- 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/ALFREDO_NOU3.yml +2 -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/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/BLING.yml +25 -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/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/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/EDGES3D.yml +25 -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 +14 -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 +14 -0
- data/vendor/board-maps/yaml/ESP32H2_DEV.yml +12 -0
- data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +12 -0
- data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
- data/vendor/board-maps/yaml/{RMP.yml → ESP32S2_DEVKIT_LIPO.yml} +1 -1
- data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +43 -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_2432S028R.yml +14 -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/FEATHERS3.yml +1 -1
- data/vendor/board-maps/yaml/FEATHERS3NEO.yml +32 -0
- data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
- data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +13 -0
- data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -0
- data/vendor/board-maps/yaml/HELTEC_CAPSULE_SENSOR_V3.yml +43 -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/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/HUIDU_HD_WF2.yml +5 -0
- data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
- data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +1 -1
- 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/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_MINI.yml +0 -1
- data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +13 -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/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_DINMETER.yml +8 -0
- data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -2
- 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/OMGS3.yml +25 -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/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/PINTRONIX_PINMAX.yml +42 -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_ESP32S3_THING_PLUS.yml +13 -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/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.yml +31 -0
- data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +14 -0
- data/vendor/board-maps/yaml/TINYC6.yml +25 -0
- 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/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_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/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/WS_ESP32_S3_MATRIX.yml +38 -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/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
- data/vendor/board-maps/yaml/unphone9.yml +8 -0
- metadata +259 -105
- data/.vscode/settings.json +0 -5
- data/.vscode/tasks.json +0 -20
- data/HARDWARE.md +0 -264
- data/benchmarks/i2c_ssd1306_refresh.rb +0 -84
- data/examples/advanced/m5_env.rb +0 -48
- data/examples/advanced/rotary_encoder_mac_volume.rb +0 -48
- data/examples/advanced/ssd1306_time_temp_rh.rb +0 -48
- data/examples/analog_io/ads1115.rb +0 -57
- data/examples/analog_io/ads1118.rb +0 -73
- data/examples/analog_io/dac_loopback.rb +0 -34
- data/examples/analog_io/input.rb +0 -55
- data/examples/connection/tcp.rb +0 -34
- data/examples/digital_io/button.rb +0 -13
- data/examples/digital_io/rotary_encoder.rb +0 -26
- data/examples/display/hd44780.png +0 -0
- data/examples/display/hd44780.rb +0 -39
- data/examples/display/ssd1306.rb +0 -40
- data/examples/display/ssd1306_s2_pico.rb +0 -29
- data/examples/eeprom/built_in.rb +0 -32
- data/examples/i2c/search.rb +0 -55
- data/examples/led/apa102_bounce.rb +0 -33
- data/examples/led/apa102_breathe.rb +0 -45
- data/examples/led/builtin_blink.rb +0 -12
- data/examples/led/seven_segment_char_echo.rb +0 -15
- data/examples/led/ws2812_bounce.rb +0 -32
- data/examples/led/ws2812_builtin_blink.rb +0 -21
- data/examples/motor/l298.rb +0 -43
- data/examples/motor/servo.rb +0 -16
- data/examples/motor/stepper.png +0 -0
- data/examples/motor/stepper.rb +0 -43
- data/examples/pulse_io/buzzer.rb +0 -30
- data/examples/pulse_io/ir_transmitter.rb +0 -55
- data/examples/rtc/ds3231.rb +0 -48
- data/examples/sensor/aht10.rb +0 -19
- data/examples/sensor/aht20.rb +0 -19
- data/examples/sensor/bme280.rb +0 -38
- data/examples/sensor/bmp180.rb +0 -22
- data/examples/sensor/dht.rb +0 -24
- data/examples/sensor/ds18b20.rb +0 -58
- data/examples/sensor/generic_pir.rb +0 -25
- data/examples/sensor/hcsr04.rb +0 -14
- data/examples/sensor/htu21d.rb +0 -54
- data/examples/sensor/htu31d.rb +0 -35
- data/examples/sensor/neat_tph_readings.rb +0 -26
- data/examples/sensor/qmp6988.rb +0 -53
- data/examples/sensor/rcwl9620.rb +0 -15
- data/examples/sensor/sht3x.rb +0 -34
- data/examples/spi/input_register.rb +0 -50
- data/examples/spi/output_register.rb +0 -49
- data/examples/spi/ssd_through_register.rb +0 -40
- data/examples/spi/two_registers.rb +0 -46
- data/examples/uart/bit_bang_read.rb +0 -16
- data/examples/uart/bit_bang_write.rb +0 -16
- data/examples/uart/board_passthrough.rb +0 -34
- data/examples/uart/hardware_loopback.rb +0 -16
- data/lib/denko/analog_io/sensor.rb +0 -6
- data/lib/denko/eeprom/built_in.rb +0 -69
- data/lib/denko/fonts.rb +0 -106
- data/lib/denko/sensor/virtual.rb +0 -42
- data/src/lib/DenkoIROutESP.cpp +0 -26
- data/test/eeprom/built_in_test.rb +0 -61
- 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 -64
- data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
- data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
- data/tutorial/03-potentiometer/potentiometer.rb +0 -62
- 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 -66
- 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/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/lib/denko/sensor/qmp6988.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
module Denko
|
2
2
|
module Sensor
|
3
3
|
class QMP6988
|
4
|
+
include Behaviors::Lifecycle
|
4
5
|
include I2C::Peripheral
|
5
6
|
include Behaviors::Poller
|
7
|
+
include TemperatureHelper
|
8
|
+
include PressureHelper
|
9
|
+
|
10
|
+
I2C_ADDRESS = 0x70
|
6
11
|
|
7
12
|
UPDATE_TIME = 0.020
|
8
13
|
RESET_REGISTER = 0xE0
|
@@ -64,20 +69,9 @@ module Denko
|
|
64
69
|
32 => 0b101, # 0b110 and 0b111 are also valid for 16.
|
65
70
|
}
|
66
71
|
|
67
|
-
|
68
|
-
@i2c_address = 0x70
|
69
|
-
super(options)
|
70
|
-
end
|
71
|
-
|
72
|
-
def after_initialize(options={})
|
73
|
-
super(options)
|
74
|
-
|
75
|
-
# Avoid repeated memory allocation for callback data and state.
|
76
|
-
@reading = { temperature: nil, pressure: nil }
|
77
|
-
self.state = { temperature: nil, pressure: nil }
|
78
|
-
|
72
|
+
after_initialize do
|
79
73
|
reset
|
80
|
-
|
74
|
+
|
81
75
|
# Get 5 config registers. Copy 0xF4 to modify it for control.
|
82
76
|
get_config_registers
|
83
77
|
@ctrl_meas_register = @registers[:f4].dup
|
@@ -95,6 +89,14 @@ module Denko
|
|
95
89
|
get_calibration_data
|
96
90
|
end
|
97
91
|
|
92
|
+
def state
|
93
|
+
@state ||= { temperature: nil, pressure: nil }
|
94
|
+
end
|
95
|
+
|
96
|
+
def reading
|
97
|
+
@reading ||= { temperature: nil, pressure: nil }
|
98
|
+
end
|
99
|
+
|
98
100
|
#
|
99
101
|
# Configuration Methods
|
100
102
|
#
|
@@ -128,7 +130,7 @@ module Denko
|
|
128
130
|
sleep UPDATE_TIME
|
129
131
|
end
|
130
132
|
attr_reader :temperature_samples
|
131
|
-
|
133
|
+
|
132
134
|
def pressure_samples=(factor)
|
133
135
|
raise ArgumentError, "invalid oversampling factor: #{factor}" unless OVERSAMPLE_FACTORS.keys.include? factor
|
134
136
|
@ctrl_meas_register = (@ctrl_meas_register & 0b11100011) | (OVERSAMPLE_FACTORS[factor] << 2)
|
@@ -162,8 +164,8 @@ module Denko
|
|
162
164
|
|
163
165
|
def chip_id
|
164
166
|
return @chip_id if @chip_id
|
165
|
-
|
166
|
-
|
167
|
+
bytes = i2c_read_raw(1, register: CHIP_ID_REGISTER)
|
168
|
+
@chip_id = bytes[0] if bytes
|
167
169
|
@chip_id
|
168
170
|
end
|
169
171
|
|
@@ -176,25 +178,14 @@ module Denko
|
|
176
178
|
i2c_write [CTRL_MEAS_REGISTER, @ctrl_meas_register]
|
177
179
|
sleep @measurement_time
|
178
180
|
end
|
179
|
-
|
181
|
+
|
180
182
|
# Read the data bytes.
|
181
|
-
i2c_read(
|
183
|
+
i2c_read(DATA_LENGTH, register: DATA_REGISTER)
|
182
184
|
end
|
183
185
|
|
184
186
|
def pre_callback_filter(bytes)
|
185
|
-
|
186
|
-
return process_reading(bytes)
|
187
|
-
elsif bytes.length == CONFIG_LENGTH
|
188
|
-
process_config(bytes)
|
189
|
-
elsif bytes.length == CALIBRATION_LENGTH
|
190
|
-
process_calibration(bytes)
|
191
|
-
elsif bytes.length == CHIP_ID_LENGTH
|
192
|
-
@chip_id = bytes[0]
|
193
|
-
end
|
194
|
-
return nil
|
195
|
-
end
|
187
|
+
return nil unless bytes.length == DATA_LENGTH
|
196
188
|
|
197
|
-
def process_reading(bytes)
|
198
189
|
# Temperature and pressure are 24-bits long each, and need 2^23 subtracted.
|
199
190
|
dt = ((bytes[3] << 16) + (bytes[4] << 8) + bytes[5]) - (0b1 << 23)
|
200
191
|
dp = ((bytes[0] << 16) + (bytes[1] << 8) + bytes[2]) - (0b1 << 23)
|
@@ -203,10 +194,10 @@ module Denko
|
|
203
194
|
tr = @calibration[:a0] +
|
204
195
|
@calibration[:a1] * dt +
|
205
196
|
@calibration[:a2] * (dt ** 2)
|
206
|
-
|
197
|
+
reading[:temperature] = tr / 256.0
|
207
198
|
|
208
199
|
# Compensated pressure calculated in Pascals.
|
209
|
-
|
200
|
+
reading[:pressure] = @calibration[:b00] +
|
210
201
|
@calibration[:bt1] * tr +
|
211
202
|
@calibration[:bp1] * dp +
|
212
203
|
@calibration[:b11] * (tr * dp) +
|
@@ -217,25 +208,22 @@ module Denko
|
|
217
208
|
@calibration[:bp3] * (dp ** 3)
|
218
209
|
|
219
210
|
# Return reading for callbacks.
|
220
|
-
|
211
|
+
reading
|
221
212
|
end
|
222
213
|
|
223
214
|
def update_state(reading)
|
224
|
-
@state_mutex.
|
225
|
-
|
226
|
-
|
227
|
-
|
215
|
+
@state_mutex.lock
|
216
|
+
@state[:temperature] = reading[:temperature]
|
217
|
+
@state[:pressure] = reading[:pressure]
|
218
|
+
@state_mutex.unlock
|
219
|
+
@state
|
228
220
|
end
|
229
221
|
|
230
222
|
def get_config_registers
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
end
|
236
|
-
|
237
|
-
def process_config(bytes)
|
238
|
-
@registers = { f1: bytes[0], f2: bytes[1], f3: bytes[2], f4: bytes[3], f5: bytes[4] }
|
223
|
+
bytes = i2c_read_raw(CONFIG_LENGTH, register: IIR_REGISTER)
|
224
|
+
if bytes
|
225
|
+
@registers = { f1: bytes[0], f2: bytes[1], f3: bytes[2], f4: bytes[3], f5: bytes[4] }
|
226
|
+
end
|
239
227
|
end
|
240
228
|
attr_reader :registers
|
241
229
|
|
@@ -260,10 +248,8 @@ module Denko
|
|
260
248
|
}
|
261
249
|
|
262
250
|
def get_calibration_data
|
263
|
-
|
264
|
-
end
|
251
|
+
bytes = i2c_read_raw(CALIBRATION_LENGTH, register: CALIBRATION_REGISTER)
|
265
252
|
|
266
|
-
def process_calibration(bytes)
|
267
253
|
if bytes
|
268
254
|
# These 2 values are 20-bit instead of 16-bit, so can't combine them with #pack.
|
269
255
|
a0_unsigned = (bytes[18] << 12) + (bytes[19] << 4) + (bytes[24] & 0b00001111)
|
@@ -4,15 +4,13 @@ module Denko
|
|
4
4
|
include I2C::Peripheral
|
5
5
|
include Behaviors::Poller
|
6
6
|
|
7
|
-
|
8
|
-
@i2c_address = 0x57
|
9
|
-
super(options)
|
10
|
-
end
|
7
|
+
I2C_ADDRESS = 0x57
|
11
8
|
|
12
9
|
def _read
|
10
|
+
i2c_write(0x01)
|
13
11
|
i2c_write(0x01)
|
14
12
|
sleep(0.120)
|
15
|
-
i2c_read(
|
13
|
+
i2c_read(3)
|
16
14
|
end
|
17
15
|
|
18
16
|
def pre_callback_filter(bytes)
|
data/lib/denko/sensor/sht3x.rb
CHANGED
@@ -3,6 +3,11 @@ module Denko
|
|
3
3
|
class SHT3X
|
4
4
|
include I2C::Peripheral
|
5
5
|
include Behaviors::Poller
|
6
|
+
include Behaviors::Lifecycle
|
7
|
+
include TemperatureHelper
|
8
|
+
include HumidityHelper
|
9
|
+
|
10
|
+
I2C_ADDRESS = 0x44
|
6
11
|
|
7
12
|
RESET = 0x30A2
|
8
13
|
RESET_TIME = 0.002
|
@@ -14,27 +19,24 @@ module Denko
|
|
14
19
|
medium: { lsb: 0x0B, measurement_time: 0.007 },
|
15
20
|
low: { lsb: 0x16, measurement_time: 0.005 },
|
16
21
|
}
|
17
|
-
|
22
|
+
|
18
23
|
# Unused
|
19
24
|
READ_STATUS_REGISTER = 0xF32D
|
20
25
|
CLEAR_STATUS_REGISTER = 0x3041
|
21
26
|
BREAK = 0x3093
|
22
27
|
ART = 0x2B32
|
23
28
|
|
24
|
-
|
25
|
-
|
26
|
-
|
29
|
+
after_initialize do
|
30
|
+
reset
|
31
|
+
self.repeatability = :high
|
27
32
|
end
|
28
33
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
# Avoid repeated memory allocation for callback data and state.
|
33
|
-
@reading = { temperature: nil, humidity: nil }
|
34
|
-
self.state = { temperature: nil, humidity: nil }
|
34
|
+
def state
|
35
|
+
@state ||= { temperature: nil, humidity: nil }
|
36
|
+
end
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
+
def reading
|
39
|
+
@reading ||= { temperature: nil, humidity: nil }
|
38
40
|
end
|
39
41
|
|
40
42
|
def repeatability=(key)
|
@@ -46,34 +48,35 @@ module Denko
|
|
46
48
|
def _read
|
47
49
|
i2c_write [0x24, @measurement_lsb]
|
48
50
|
sleep(@measurement_time)
|
49
|
-
i2c_read(
|
51
|
+
i2c_read(6, register: FETCH_DATA)
|
50
52
|
end
|
51
53
|
|
52
54
|
def pre_callback_filter(bytes)
|
53
55
|
# Temperature is bytes 0 to 2: MSB, LSB, CRC
|
54
56
|
if calculate_crc(bytes[0..2]) == bytes[2]
|
55
57
|
t_raw = (bytes[0] << 8) | bytes[1]
|
56
|
-
|
58
|
+
reading[:temperature] = (175 * t_raw / 65535.0) - 45
|
57
59
|
else
|
58
|
-
|
60
|
+
reading[:temperature] = nil
|
59
61
|
end
|
60
62
|
|
61
63
|
# Humidity is bytes 3 to 5: MSB, LSB, CRC
|
62
64
|
if calculate_crc(bytes[3..5]) == bytes[5]
|
63
65
|
h_raw = (bytes[3] << 8) | bytes[4]
|
64
|
-
|
66
|
+
reading[:humidity] = 100 * h_raw / 65535.0
|
65
67
|
else
|
66
|
-
|
68
|
+
reading[:humidity] = nil
|
67
69
|
end
|
68
70
|
|
69
|
-
|
71
|
+
reading
|
70
72
|
end
|
71
73
|
|
72
74
|
def update_state(reading)
|
73
|
-
@state_mutex.
|
74
|
-
|
75
|
-
|
76
|
-
|
75
|
+
@state_mutex.lock
|
76
|
+
@state[:temperature] = reading[:temperature]
|
77
|
+
@state[:humidity] = reading[:humidity]
|
78
|
+
@state_mutex.unlock
|
79
|
+
@state
|
77
80
|
end
|
78
81
|
|
79
82
|
def reset
|
@@ -89,7 +92,7 @@ module Denko
|
|
89
92
|
def heater_off?
|
90
93
|
!@heater_on
|
91
94
|
end
|
92
|
-
|
95
|
+
|
93
96
|
def heater_on
|
94
97
|
i2c_write [HEATER_ON]
|
95
98
|
@heater_on = true
|
@@ -119,7 +122,7 @@ module Denko
|
|
119
122
|
end
|
120
123
|
end
|
121
124
|
end
|
122
|
-
|
125
|
+
|
123
126
|
# Limit CRC size to 8 bits.
|
124
127
|
crc = crc & 0xFF
|
125
128
|
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
module Denko
|
2
|
+
module Sensor
|
3
|
+
class SHT4X
|
4
|
+
include I2C::Peripheral
|
5
|
+
include Behaviors::Poller
|
6
|
+
include Behaviors::Lifecycle
|
7
|
+
include TemperatureHelper
|
8
|
+
include HumidityHelper
|
9
|
+
|
10
|
+
I2C_ADDRESS = 0x44
|
11
|
+
|
12
|
+
RESET = 0x94
|
13
|
+
RESET_TIME = 0.001
|
14
|
+
READ_SERIAL_NUMBER = 0x89
|
15
|
+
|
16
|
+
REPEATABILITIES = {
|
17
|
+
high: {command: 0xFD, time: 0.010},
|
18
|
+
medium: {command: 0xF6, time: 0.005},
|
19
|
+
low: {command: 0xE0, time: 0.003},
|
20
|
+
}
|
21
|
+
|
22
|
+
after_initialize do
|
23
|
+
reset
|
24
|
+
self.repeatability = :high
|
25
|
+
end
|
26
|
+
|
27
|
+
def state
|
28
|
+
@state ||= { temperature: nil, humidity: nil }
|
29
|
+
end
|
30
|
+
|
31
|
+
def reading
|
32
|
+
@reading ||= { temperature: nil, humidity: nil }
|
33
|
+
end
|
34
|
+
|
35
|
+
def repeatability=(key)
|
36
|
+
raise ArgumentError, "invalid repeatability setting: #{key}" unless REPEATABILITIES.keys.include? key
|
37
|
+
@measurement_command = REPEATABILITIES[key][:command]
|
38
|
+
@measurement_time = REPEATABILITIES[key][:time]
|
39
|
+
end
|
40
|
+
|
41
|
+
def _read
|
42
|
+
i2c_write [@measurement_command]
|
43
|
+
sleep(@measurement_time)
|
44
|
+
i2c_read(6)
|
45
|
+
end
|
46
|
+
|
47
|
+
def pre_callback_filter(bytes)
|
48
|
+
# Temperature is bytes 0 to 2: MSB, LSB, CRC
|
49
|
+
if calculate_crc(bytes[0..2]) == bytes[2]
|
50
|
+
t_raw = (bytes[0] << 8) | bytes[1]
|
51
|
+
reading[:temperature] = (175 * t_raw / 65535.0) - 45
|
52
|
+
else
|
53
|
+
reading[:temperature] = nil
|
54
|
+
end
|
55
|
+
|
56
|
+
# Humidity is bytes 3 to 5: MSB, LSB, CRC
|
57
|
+
if calculate_crc(bytes[3..5]) == bytes[5]
|
58
|
+
h_raw = (bytes[3] << 8) | bytes[4]
|
59
|
+
reading[:humidity] = 100 * h_raw / 65535.0
|
60
|
+
else
|
61
|
+
reading[:humidity] = nil
|
62
|
+
end
|
63
|
+
|
64
|
+
reading
|
65
|
+
end
|
66
|
+
|
67
|
+
def update_state(reading)
|
68
|
+
@state_mutex.lock
|
69
|
+
@state[:temperature] = reading[:temperature]
|
70
|
+
@state[:humidity] = reading[:humidity]
|
71
|
+
@state_mutex.unlock
|
72
|
+
@state
|
73
|
+
end
|
74
|
+
|
75
|
+
def reset
|
76
|
+
i2c_write [RESET]
|
77
|
+
sleep RESET_TIME
|
78
|
+
end
|
79
|
+
|
80
|
+
def serial
|
81
|
+
@serial ||= read_serial
|
82
|
+
end
|
83
|
+
|
84
|
+
def read_serial
|
85
|
+
i2c_write [READ_SERIAL_NUMBER]
|
86
|
+
sleep RESET_TIME
|
87
|
+
bytes = i2c_read_raw(6)
|
88
|
+
parse_serial(bytes)
|
89
|
+
end
|
90
|
+
|
91
|
+
def parse_serial(bytes)
|
92
|
+
# Serial bytes are laid out as [b0, b1, crc0+1, b2, b3, crc2+3]
|
93
|
+
if calculate_crc(bytes[0..2]) == bytes[2] && calculate_crc(bytes[3..5]) == bytes[5]
|
94
|
+
@serial = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[3] << 8) | bytes[4]
|
95
|
+
else
|
96
|
+
@serial = nil
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# CRC is same as AHT20 sensor. Copied from that file.
|
101
|
+
CRC_INITIAL_VALUE = 0xFF
|
102
|
+
CRC_POLYNOMIAL = 0x31
|
103
|
+
MSBIT_MASK = 0x80
|
104
|
+
|
105
|
+
def calculate_crc(bytes)
|
106
|
+
crc = CRC_INITIAL_VALUE
|
107
|
+
|
108
|
+
# Ignore last byte. That's the CRC value to compare with.
|
109
|
+
bytes.take(bytes.length - 1).each do |byte|
|
110
|
+
crc = crc ^ byte
|
111
|
+
8.times do
|
112
|
+
if (crc & MSBIT_MASK) > 0
|
113
|
+
crc = (crc << 1) ^ CRC_POLYNOMIAL
|
114
|
+
else
|
115
|
+
crc = crc << 1
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# Limit CRC size to 8 bits.
|
121
|
+
crc = crc & 0xFF
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Denko
|
2
|
+
module Sensor
|
3
|
+
class VL53L0X
|
4
|
+
include I2C::Peripheral
|
5
|
+
include Behaviors::Poller
|
6
|
+
include Behaviors::Lifecycle
|
7
|
+
include Denko::AnalogIO::InputHelper
|
8
|
+
|
9
|
+
I2C_ADDRESS = 0x29
|
10
|
+
|
11
|
+
REFERENCE_REGISTER_START = 0xC0
|
12
|
+
REFERENCE_VALUES = [0xEE, 0xAA, 0x10]
|
13
|
+
|
14
|
+
SYSRANGE_START = 0x00
|
15
|
+
POWER_MANAGEMENT_GO1_POWER_FORCE = 0x80
|
16
|
+
INTERNAL_TUNING_1 = 0x91
|
17
|
+
INTERNAL_TUNING_2 = 0xFF
|
18
|
+
RESULT_RANGE_STATUS = 0x14
|
19
|
+
|
20
|
+
attr_reader :stop_variable
|
21
|
+
attr_accessor :correction_offset
|
22
|
+
|
23
|
+
after_initialize do
|
24
|
+
# Verify reference registerrs
|
25
|
+
reference_regs = i2c_read_raw(REFERENCE_VALUES.length, register: REFERENCE_REGISTER_START)
|
26
|
+
raise "reference registers do not match. May not be VL53L0X" unless reference_regs == REFERENCE_VALUES
|
27
|
+
|
28
|
+
# Initialization sequence
|
29
|
+
@stop_variable = i2c_read_raw(1, register: INTERNAL_TUNING_1)[0]
|
30
|
+
i2c_write [POWER_MANAGEMENT_GO1_POWER_FORCE, 0x01]
|
31
|
+
i2c_write [INTERNAL_TUNING_2, 0x01]
|
32
|
+
i2c_write [SYSRANGE_START, 0x00]
|
33
|
+
i2c_write [INTERNAL_TUNING_1, stop_variable]
|
34
|
+
i2c_write [SYSRANGE_START, 0x01]
|
35
|
+
i2c_write [INTERNAL_TUNING_2, 0x00]
|
36
|
+
i2c_write [POWER_MANAGEMENT_GO1_POWER_FORCE, 0x00]
|
37
|
+
|
38
|
+
# Wait for initialization to complete.
|
39
|
+
sleep 0.010 while (i2c_read_raw(1, register: SYSRANGE_START)[0] & 0b01 > 0)
|
40
|
+
|
41
|
+
# Go into continuous mode.
|
42
|
+
i2c_write [SYSRANGE_START, 0x02]
|
43
|
+
end
|
44
|
+
|
45
|
+
def _read
|
46
|
+
i2c_read(2, register: RESULT_RANGE_STATUS + 10)
|
47
|
+
end
|
48
|
+
|
49
|
+
def pre_callback_filter(bytes)
|
50
|
+
# Distance is 2 bytes, big-endian.
|
51
|
+
mm = (bytes[0] << 8) | bytes[1]
|
52
|
+
mm = mm + correction_offset if correction_offset
|
53
|
+
# super handles smoothing if enabled.
|
54
|
+
return (mm > 0) ? super(mm) : nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/denko/sensor.rb
CHANGED
@@ -1,20 +1,37 @@
|
|
1
|
+
# Represent files to be autoloaded in CRuby as an Array.
|
2
|
+
# This allows Mruby::Build to parse and preload them instead.
|
3
|
+
SENSOR_FILES = [
|
4
|
+
[nil, "helper"],
|
5
|
+
[:DHT, "dht"],
|
6
|
+
[:DS18B20, "ds18b20"],
|
7
|
+
[:BMP180, "bmp180"],
|
8
|
+
[:BME280, "bme280"],
|
9
|
+
[:BMP280, "bme280"],
|
10
|
+
[:HDC1080, "hdc1080"],
|
11
|
+
[:HTU21D, "htu21d"],
|
12
|
+
[:HTU31D, "htu31d"],
|
13
|
+
[:AHT1X, "aht"],
|
14
|
+
[:AHT2X, "aht"],
|
15
|
+
[:AHT3X, "aht"],
|
16
|
+
[:SHT3X, "sht3x"],
|
17
|
+
[:SHT4X, "sht4x"],
|
18
|
+
[:QMP6988, "qmp6988"],
|
19
|
+
[:RCWL9620, "rcwl9620"],
|
20
|
+
[:HCSR04, "hcsr04"],
|
21
|
+
[:JSNSR04T, "jsnsr04t"],
|
22
|
+
[:GenericPIR, "generic_pir"],
|
23
|
+
[:VL53L0X, "vl53l0x"],
|
24
|
+
]
|
25
|
+
|
1
26
|
module Denko
|
2
27
|
module Sensor
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
autoload :HTU31D, "#{__dir__}/sensor/htu31d"
|
12
|
-
autoload :AHT10, "#{__dir__}/sensor/aht"
|
13
|
-
autoload :AHT20, "#{__dir__}/sensor/aht"
|
14
|
-
autoload :SHT3X, "#{__dir__}/sensor/sht3x"
|
15
|
-
autoload :QMP6988, "#{__dir__}/sensor/qmp6988"
|
16
|
-
autoload :RCWL9620, "#{__dir__}/sensor/rcwl9620"
|
17
|
-
autoload :HCSR04, "#{__dir__}/sensor/hcsr04"
|
18
|
-
autoload :GenericPIR, "#{__dir__}/sensor/generic_pir"
|
28
|
+
SENSOR_FILES.each do |file|
|
29
|
+
file_path = "#{__dir__}/sensor/#{file[1]}"
|
30
|
+
if file[0]
|
31
|
+
autoload file[0], file_path
|
32
|
+
else
|
33
|
+
require file_path
|
34
|
+
end
|
35
|
+
end
|
19
36
|
end
|
20
37
|
end
|
@@ -1,37 +1,41 @@
|
|
1
1
|
module Denko
|
2
2
|
module SPI
|
3
3
|
class BaseRegister
|
4
|
-
include Peripheral
|
4
|
+
include SPI::Peripheral
|
5
|
+
include Behaviors::Lifecycle
|
5
6
|
#
|
6
|
-
# Registers
|
7
|
-
#
|
8
|
-
# new component, and pin numbers that map onto the registers parallel output pins.
|
7
|
+
# Registers can be a BoardProxy for components needing digital pins.
|
8
|
+
# Give the Register as board: and pin: is the Register's parallel pin number.
|
9
9
|
#
|
10
10
|
include Behaviors::BoardProxy
|
11
11
|
|
12
|
-
|
12
|
+
def platform
|
13
|
+
:spi_register
|
14
|
+
end
|
13
15
|
|
14
|
-
def
|
15
|
-
|
16
|
-
#
|
17
|
-
# To use the register as a board proxy, we need to know how many
|
18
|
-
# bytes there are and map each bit to a virtual pin.
|
19
|
-
# Defaults to 1 byte. Ignore if writing to the register directly.
|
20
|
-
#
|
21
|
-
@bytes = options[:bytes] || 1
|
22
|
-
#
|
23
|
-
# When used as a board proxy, store the state of each register
|
24
|
-
# pin as a 0 or 1 in an array that is (@bytes * 8) long. Zero out to start.
|
25
|
-
#
|
26
|
-
@state = Array.new(@bytes*8) { 0 }
|
16
|
+
def is_a_register?
|
17
|
+
true
|
27
18
|
end
|
28
19
|
|
29
|
-
|
30
|
-
|
20
|
+
# Default registers to 1 byte, or 8 pins when used as Board Proxy.
|
21
|
+
# Can be ignored if reading / writing the register directly.
|
22
|
+
def bytes
|
23
|
+
@bytes = params[:bytes] || 1
|
24
|
+
end
|
25
|
+
attr_writer :bytes
|
31
26
|
|
32
|
-
|
27
|
+
# Select pin is active-low. Disable.
|
28
|
+
after_initialize do
|
33
29
|
self.high
|
34
30
|
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# When used as BoardProxy, store the state of each register
|
34
|
+
# pin as a 0 or 1 in an array that is (@bytes * 8) long.
|
35
|
+
#
|
36
|
+
def state
|
37
|
+
@state ||= Array.new(bytes*8) { 0 }
|
38
|
+
end
|
35
39
|
end
|
36
40
|
end
|
37
41
|
end
|
data/lib/denko/spi/bit_bang.rb
CHANGED
@@ -2,28 +2,28 @@ module Denko
|
|
2
2
|
module SPI
|
3
3
|
class BitBang
|
4
4
|
include Behaviors::MultiPin
|
5
|
-
include Behaviors::
|
6
|
-
include
|
5
|
+
include Behaviors::Lifecycle
|
6
|
+
include BusCommon
|
7
7
|
|
8
|
-
|
8
|
+
before_initialize do
|
9
|
+
param_pins = params[:pins]
|
9
10
|
# Allow pin aliases.
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
# Clean up the pins hash.
|
15
|
-
[:poci, :miso, :pico, :mosi, :sck, :clk].each { |key| pins.delete(key) }
|
11
|
+
param_pins[:input] = param_pins[:input] || param_pins[:poci] || param_pins[:miso]
|
12
|
+
param_pins[:output] = param_pins[:output] || param_pins[:pico] || param_pins[:mosi]
|
13
|
+
param_pins[:clock] = param_pins[:clock] || param_pins[:sck] || param_pins[:clk]
|
16
14
|
|
17
|
-
#
|
18
|
-
|
19
|
-
raise ArgumentError, "no input or output pin given. Require either or both"
|
20
|
-
end
|
15
|
+
# Clean up the params hash.
|
16
|
+
[:poci, :miso, :pico, :mosi, :sck, :clk].each { |key| param_pins.delete(key) }
|
21
17
|
|
22
|
-
#
|
23
|
-
|
24
|
-
|
18
|
+
# Validate param_pins.
|
19
|
+
raise ArgumentError, "either output or input pin required" unless param_pins[:input] || param_pins[:output]
|
20
|
+
raise ArgumentError, "clock pin required" unless param_pins[:clock]
|
21
|
+
end
|
25
22
|
|
26
|
-
|
23
|
+
def initialize_pins(options={})
|
24
|
+
proxy_pin :clock, DigitalIO::CBitBang
|
25
|
+
proxy_pin :output, DigitalIO::CBitBang if pins[:output]
|
26
|
+
proxy_pin :input, DigitalIO::CBitBang if pins[:input]
|
27
27
|
end
|
28
28
|
|
29
29
|
def transfer(select_pin, write: [], read: 0, frequency: nil, mode: 0, bit_order: :msbfirst)
|
@@ -35,40 +35,6 @@ module Denko
|
|
35
35
|
board.spi_bb_listen select_pin, clock: pins[:clock], input: pins[:input],
|
36
36
|
read: read, mode: mode, bit_order: bit_order
|
37
37
|
end
|
38
|
-
|
39
|
-
# Uses regular Board#spi_stop since listeners are shared.
|
40
|
-
def stop(pin)
|
41
|
-
board.spi_stop(pin)
|
42
|
-
end
|
43
|
-
|
44
|
-
# Delegate this to board so peripherals can initialize their select pins.
|
45
|
-
def set_pin_mode(*args)
|
46
|
-
board.set_pin_mode(*args)
|
47
|
-
end
|
48
|
-
|
49
|
-
def convert_pin(pin)
|
50
|
-
board.convert_pin(pin)
|
51
|
-
end
|
52
|
-
|
53
|
-
# Add peripheral to self and the board. It gets callbacks directly from the board.
|
54
|
-
def add_component(component)
|
55
|
-
# Treat pin 255 as the component having no select pin. Mostly for APA102.
|
56
|
-
return if component.pin == 255
|
57
|
-
|
58
|
-
pins = components.map { |c| c.pin }
|
59
|
-
if pins.include? component.pin
|
60
|
-
raise ArgumentError, "duplicate select pin for #{component}"
|
61
|
-
end
|
62
|
-
|
63
|
-
components << component
|
64
|
-
board.add_component(component)
|
65
|
-
end
|
66
|
-
|
67
|
-
# Remove peripheral from self and the board.
|
68
|
-
def remove_component(component)
|
69
|
-
components.delete(component)
|
70
|
-
board.remove_component(component)
|
71
|
-
end
|
72
38
|
end
|
73
39
|
end
|
74
40
|
end
|