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/lib/denko/sensor/bme280.rb
CHANGED
@@ -3,7 +3,13 @@ module Denko
|
|
3
3
|
class BME280
|
4
4
|
include I2C::Peripheral
|
5
5
|
include Behaviors::Poller
|
6
|
-
|
6
|
+
include Behaviors::Lifecycle
|
7
|
+
include TemperatureHelper
|
8
|
+
include PressureHelper
|
9
|
+
include HumidityHelper
|
10
|
+
|
11
|
+
I2C_ADDRESS = 0x76
|
12
|
+
|
7
13
|
# Reading Mode Settings
|
8
14
|
SLEEP_MODE = 0b00
|
9
15
|
ONESHOT_MODE = 0b01 # 0b10 is also valid. Called "forced mode" in datasheet.
|
@@ -38,8 +44,8 @@ module Denko
|
|
38
44
|
8 => 0b100,
|
39
45
|
16 => 0b101, # 0b110 and 0b111 are also valid for 16x.
|
40
46
|
}
|
41
|
-
|
42
|
-
# IIR Filter Coefficients
|
47
|
+
|
48
|
+
# IIR Filter Coefficients
|
43
49
|
IIR_COEFFICIENTS = {
|
44
50
|
0 => 0b000,
|
45
51
|
2 => 0b001,
|
@@ -47,19 +53,8 @@ module Denko
|
|
47
53
|
8 => 0b011,
|
48
54
|
16 => 0b100, # 0b101, 0b110 and 0b111 are also valid for 16.
|
49
55
|
}
|
50
|
-
|
51
|
-
def before_initialize(options={})
|
52
|
-
@i2c_address = 0x76
|
53
|
-
super(options)
|
54
|
-
end
|
55
|
-
|
56
|
-
def after_initialize(options={})
|
57
|
-
super(options)
|
58
|
-
|
59
|
-
# Avoid repeated memory allocation for callback data and state.
|
60
|
-
@reading = { temperature: nil, humidity: nil, pressure: nil }
|
61
|
-
self.state = { temperature: nil, humidity: nil, pressure: nil }
|
62
56
|
|
57
|
+
after_initialize do
|
63
58
|
#
|
64
59
|
# Setup defaults for the config registers:
|
65
60
|
# Oneshot reading mode
|
@@ -72,7 +67,7 @@ module Denko
|
|
72
67
|
# Bits 2..4 control the pressure oversampling factor
|
73
68
|
# Bits 5..7 control the temperature oversampling factor.
|
74
69
|
f4: 0b00100110,
|
75
|
-
|
70
|
+
|
76
71
|
# Bits 0..1 should always be 0.
|
77
72
|
# Bits 2..4 control the IIR filter coefficient.
|
78
73
|
# Bits 5..7 control the standby time when in continuous reading mode.
|
@@ -81,10 +76,18 @@ module Denko
|
|
81
76
|
# Bits 0..2 control the humidity oversampling factor, on BME280 only.
|
82
77
|
# Bits 3+ are unused.
|
83
78
|
@registers.merge!(f2: 0b00000001) if humidity_available?
|
84
|
-
|
79
|
+
|
85
80
|
@calibration_data_loaded = false
|
86
81
|
end
|
87
82
|
|
83
|
+
def state
|
84
|
+
state_mutex.synchronize { @state = { temperature: nil, humidity: nil, pressure: nil } }
|
85
|
+
end
|
86
|
+
|
87
|
+
def reading
|
88
|
+
@reading ||= { temperature: nil, humidity: nil, pressure: nil }
|
89
|
+
end
|
90
|
+
|
88
91
|
#
|
89
92
|
# Configuration Methods
|
90
93
|
#
|
@@ -94,7 +97,7 @@ module Denko
|
|
94
97
|
end
|
95
98
|
|
96
99
|
attr_reader :measurement_time
|
97
|
-
|
100
|
+
|
98
101
|
def update_measurement_time
|
99
102
|
t_oversampling = 2 ** (((@registers[:f4] & 0b11100000) >> 5) - 1)
|
100
103
|
p_oversampling = 2 ** (((@registers[:f4] & 0b00011100) >> 2) - 1)
|
@@ -110,57 +113,57 @@ module Denko
|
|
110
113
|
# Milliseconds to seconds
|
111
114
|
@measurement_time = @measurement_time / 1000
|
112
115
|
end
|
113
|
-
|
116
|
+
|
114
117
|
def continuous_mode
|
115
118
|
@registers[:f4] = (@registers[:f4] & 0b11111100) | CONTINUOUS_MODE
|
116
|
-
write_settings
|
119
|
+
write_settings
|
117
120
|
end
|
118
|
-
|
121
|
+
|
119
122
|
def standby_time=(ms)
|
120
123
|
raise ArgumentError, "invalid standby time: #{ms}" unless self.class::STANDBY_TIMES.keys.include? ms
|
121
124
|
|
122
125
|
@registers[:f5] = (@registers[:f5] & 0b00011111) | (self.class::STANDBY_TIMES[ms] << 5)
|
123
126
|
write_settings
|
124
127
|
end
|
125
|
-
|
128
|
+
|
126
129
|
def temperature_samples=(factor)
|
127
130
|
raise ArgumentError, "invalid oversampling factor: #{factor}" unless OVERSAMPLE_FACTORS.keys.include? factor
|
128
131
|
raise ArgumentError, "temperature must be read. Invalid oversampling factor: #{factor}" if factor == 0
|
129
|
-
|
132
|
+
|
130
133
|
@registers[:f4] = (@registers[:f4] & 0b00011111) | (OVERSAMPLE_FACTORS[factor] << 5)
|
131
134
|
write_settings
|
132
135
|
end
|
133
|
-
|
136
|
+
|
134
137
|
def pressure_samples=(factor)
|
135
138
|
raise ArgumentError, "invalid oversampling factor: #{factor}" unless OVERSAMPLE_FACTORS.keys.include? factor
|
136
|
-
|
139
|
+
|
137
140
|
@registers[:f4] = (@registers[:f4] & 0b11100011) | (OVERSAMPLE_FACTORS[factor] << 2)
|
138
141
|
write_settings
|
139
142
|
end
|
140
|
-
|
143
|
+
|
141
144
|
def humidity_samples=(factor)
|
142
145
|
raise ArgumentError, "invalid oversampling factor: #{factor}" unless OVERSAMPLE_FACTORS.keys.include? factor
|
143
|
-
|
146
|
+
|
144
147
|
@registers[:f2] = (@registers[:f2] & 0b11111000) | OVERSAMPLE_FACTORS[factor]
|
145
148
|
write_settings
|
146
149
|
end
|
147
|
-
|
150
|
+
|
148
151
|
def iir_coefficient=(coeff)
|
149
152
|
raise ArgumentError, "invalid IIR coefficient: #{coeff}" unless IIR_COEFFICIENTS.keys.include? coeff
|
150
|
-
|
153
|
+
|
151
154
|
@registers[:f5] = (@registers[:f5] & 0b11100011) | (IIR_COEFFICIENTS[coeff] << 2)
|
152
155
|
write_settings
|
153
156
|
end
|
154
|
-
|
157
|
+
|
155
158
|
def write_settings
|
156
159
|
if humidity_available?
|
157
|
-
i2c_write [0xF2, @registers[:f2], 0xF4, @registers[:f4], 0xF5, @registers[:f5]]
|
160
|
+
i2c_write [0xF2, @registers[:f2], 0xF4, @registers[:f4], 0xF5, @registers[:f5]]
|
158
161
|
else
|
159
162
|
i2c_write [0xF4, @registers[:f4], 0xF5, @registers[:f5]]
|
160
163
|
end
|
161
164
|
update_measurement_time
|
162
165
|
end
|
163
|
-
|
166
|
+
|
164
167
|
def config_register_bits
|
165
168
|
str = ""
|
166
169
|
@registers.each_key do |key|
|
@@ -171,13 +174,13 @@ module Denko
|
|
171
174
|
|
172
175
|
#
|
173
176
|
# Reading Methods
|
174
|
-
#
|
177
|
+
#
|
175
178
|
def _read
|
176
179
|
get_calibration_data unless calibration_data_loaded
|
177
180
|
write_settings
|
178
|
-
i2c_read
|
181
|
+
i2c_read 8, register: 0xF7
|
179
182
|
end
|
180
|
-
|
183
|
+
|
181
184
|
def pre_callback_filter(data)
|
182
185
|
if data.length == 8
|
183
186
|
return decode_reading(data)
|
@@ -192,11 +195,11 @@ module Denko
|
|
192
195
|
return nil
|
193
196
|
end
|
194
197
|
end
|
195
|
-
|
198
|
+
|
196
199
|
def update_state(reading)
|
197
200
|
# Checking for Hash ignores calibration data and nil.
|
198
201
|
if reading.class == Hash
|
199
|
-
|
202
|
+
state_mutex.synchronize do
|
200
203
|
@state[:temperature] = reading[:temperature]
|
201
204
|
@state[:pressure] = reading[:pressure]
|
202
205
|
@state[:humidity] = reading[:humidity]
|
@@ -204,31 +207,25 @@ module Denko
|
|
204
207
|
end
|
205
208
|
end
|
206
209
|
|
207
|
-
def [](key)
|
208
|
-
@state_mutex.synchronize do
|
209
|
-
return @state[key]
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
210
|
#
|
214
211
|
# Decoding Methods
|
215
212
|
#
|
216
213
|
def decode_reading(bytes)
|
217
214
|
# Always read temperature since t_fine is needed to calibrate other values.
|
218
215
|
temperature, t_fine = decode_temperature(bytes)
|
219
|
-
|
220
|
-
|
216
|
+
reading[:temperature] = temperature
|
217
|
+
|
221
218
|
# Pressure and humidity are optional. Humidity is not available on the BMP280.
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
219
|
+
reading[:pressure] = decode_pressure(bytes, t_fine) if reading_pressure?
|
220
|
+
reading[:humidity] = decode_humidity(bytes, t_fine) if reading_humidity?
|
221
|
+
|
222
|
+
reading
|
226
223
|
end
|
227
|
-
|
224
|
+
|
228
225
|
def decode_temperature(bytes)
|
229
226
|
# Reformat raw temeprature bytes (20-bits in 24) to uint32.
|
230
227
|
adc_t = ((bytes[3] << 16) | (bytes[4] << 8) | (bytes[5])) >> 4
|
231
|
-
|
228
|
+
|
232
229
|
# Floating point temperature calculation from datasheet. Result in degrees Celsius.
|
233
230
|
var1 = (adc_t / 16384.0 - @calibration[:t1] / 1024.0) * @calibration[:t2]
|
234
231
|
var2 = (adc_t / 131072.0 - @calibration[:t1] / 8192.0) ** 2 * @calibration[:t3]
|
@@ -236,11 +233,11 @@ module Denko
|
|
236
233
|
temperature = (var1 + var2) / 5120.0
|
237
234
|
[temperature, t_fine]
|
238
235
|
end
|
239
|
-
|
236
|
+
|
240
237
|
def decode_pressure(bytes, t_fine)
|
241
238
|
# Reformat raw pressure bytes (20-bits in 24) to uint32.
|
242
239
|
adc_p = ((bytes[0] << 16) | (bytes[1] << 8) | (bytes[2])) >> 4
|
243
|
-
|
240
|
+
|
244
241
|
# Floating point pressure calculation from datasheet. Result in Pascals.
|
245
242
|
var1 = (t_fine / 2.0) - 64000.0
|
246
243
|
var2 = var1 * var1 * @calibration[:p6] / 32768.0
|
@@ -259,11 +256,11 @@ module Denko
|
|
259
256
|
end
|
260
257
|
pressure
|
261
258
|
end
|
262
|
-
|
259
|
+
|
263
260
|
def decode_humidity(bytes, t_fine)
|
264
261
|
# Raw data for humidity is big-endian uint16.
|
265
262
|
adc_h = (bytes[6] << 8) | bytes[7]
|
266
|
-
|
263
|
+
|
267
264
|
# Floating point humidity calculation from datasheet. Result in % RH.
|
268
265
|
humidity = t_fine - 76800.0
|
269
266
|
humidity = (adc_h - (@calibration[:h4] * 64.0 + @calibration[:h5] / 16384.0 * humidity)) *
|
@@ -278,30 +275,30 @@ module Denko
|
|
278
275
|
# Bits 2..4 of 0xF4 register must not be 0.
|
279
276
|
(@registers[:f4] >> 2 & 0b111) != OVERSAMPLE_FACTORS[0]
|
280
277
|
end
|
281
|
-
|
278
|
+
|
282
279
|
def reading_humidity?
|
283
280
|
return false unless humidity_available?
|
284
281
|
# Lowest 3 bits of 0xF2 register must not be 0.
|
285
282
|
(@registers[:f2] & 0b111) != OVERSAMPLE_FACTORS[0]
|
286
283
|
end
|
287
|
-
|
284
|
+
|
288
285
|
# No humidity on the BMP280.
|
289
286
|
def humidity_available?
|
290
287
|
!self.class.to_s.match(/bmp/i)
|
291
288
|
end
|
292
|
-
|
289
|
+
|
293
290
|
#
|
294
291
|
# Calibration Methods
|
295
292
|
#
|
296
293
|
attr_reader :calibration_data_loaded
|
297
|
-
|
298
|
-
def get_calibration_data
|
294
|
+
|
295
|
+
def get_calibration_data
|
299
296
|
# First group of calibration bytes, sent to #process_calibration_a.
|
300
|
-
read_using -> { i2c_read(
|
297
|
+
read_using -> { i2c_read(26, register: 0x88) }
|
301
298
|
|
302
299
|
# Second group of calibration bytes, only on BME280, sent to #process_calibration_b.
|
303
300
|
if humidity_available?
|
304
|
-
read_using -> { i2c_read 0xE1
|
301
|
+
read_using -> { i2c_read(7, register: 0xE1) }
|
305
302
|
end
|
306
303
|
|
307
304
|
if (@calibration[:cal_a] && @calibration[:cal_b]) || (@calibration[:cal_a] && !humidity_available?)
|
@@ -345,7 +342,7 @@ module Denko
|
|
345
342
|
end
|
346
343
|
end
|
347
344
|
end
|
348
|
-
|
345
|
+
|
349
346
|
#
|
350
347
|
# BMP280 is mostly compatible with BME280, except for a few changes.
|
351
348
|
#
|
data/lib/denko/sensor/bmp180.rb
CHANGED
@@ -3,7 +3,12 @@ module Denko
|
|
3
3
|
class BMP180
|
4
4
|
include I2C::Peripheral
|
5
5
|
include Behaviors::Poller
|
6
|
-
|
6
|
+
include Behaviors::Lifecycle
|
7
|
+
include TemperatureHelper
|
8
|
+
include PressureHelper
|
9
|
+
|
10
|
+
I2C_ADDRESS = 0x77
|
11
|
+
|
7
12
|
# Write this to register 0xE0 for soft reset
|
8
13
|
SOFT_RESET = 0xB6
|
9
14
|
|
@@ -20,18 +25,7 @@ module Denko
|
|
20
25
|
8 => 0b11,
|
21
26
|
}
|
22
27
|
|
23
|
-
|
24
|
-
@i2c_address = 0x77
|
25
|
-
super(options)
|
26
|
-
end
|
27
|
-
|
28
|
-
def after_initialize(options={})
|
29
|
-
super(options)
|
30
|
-
|
31
|
-
# Avoid repeated memory allocation for callback data and state.
|
32
|
-
@reading = { temperature: nil, pressure: nil }
|
33
|
-
self.state = { temperature: nil, pressure: nil }
|
34
|
-
|
28
|
+
after_initialize do
|
35
29
|
# Default to start conversion off, reading temperature, no pressure oversampling.
|
36
30
|
@register = 0b00001110
|
37
31
|
@calibration_data_loaded = false
|
@@ -43,6 +37,14 @@ module Denko
|
|
43
37
|
soft_reset
|
44
38
|
end
|
45
39
|
|
40
|
+
def state
|
41
|
+
state_mutex.synchronize { @state ||= { temperature: nil, pressure: nil } }
|
42
|
+
end
|
43
|
+
|
44
|
+
def reading
|
45
|
+
@reading ||= { temperature: nil, pressure: nil }
|
46
|
+
end
|
47
|
+
|
46
48
|
#
|
47
49
|
# Configuration Methods
|
48
50
|
#
|
@@ -51,7 +53,7 @@ module Denko
|
|
51
53
|
end
|
52
54
|
|
53
55
|
attr_reader :measurement_time
|
54
|
-
|
56
|
+
|
55
57
|
def update_measurement_time
|
56
58
|
# Get oversample bits from current register setting.
|
57
59
|
oversample_exponent = (@register & 0b11000000) >> 6
|
@@ -69,7 +71,7 @@ module Denko
|
|
69
71
|
raise ArgumentError, "invalid oversampling factor: #{factor}" unless OVERSAMPLE_FACTORS.keys.include? factor
|
70
72
|
@oss = OVERSAMPLE_FACTORS[factor]
|
71
73
|
end
|
72
|
-
|
74
|
+
|
73
75
|
def write_settings
|
74
76
|
update_measurement_time
|
75
77
|
i2c_write [0xF4, @register]
|
@@ -78,26 +80,33 @@ module Denko
|
|
78
80
|
#
|
79
81
|
# Reading Methods
|
80
82
|
#
|
81
|
-
def
|
83
|
+
def _read_temperature
|
82
84
|
@register = 0x2E
|
83
85
|
write_settings
|
86
|
+
sleep(@measurement_time)
|
87
|
+
i2c_read(2, register: 0xF6)
|
84
88
|
end
|
85
89
|
|
86
|
-
def
|
90
|
+
def _read_pressure
|
87
91
|
@register = 0x34 | (@oss << 6)
|
88
92
|
write_settings
|
93
|
+
sleep(@measurement_time)
|
94
|
+
i2c_read(3, register: 0xF6)
|
89
95
|
end
|
90
96
|
|
91
|
-
|
97
|
+
# Workaround for :read callbacks getting automatically removed on first reading.
|
98
|
+
def read(*args, **kwargs, &block)
|
92
99
|
get_calibration_data unless calibration_data_loaded
|
93
100
|
|
94
|
-
|
95
|
-
|
96
|
-
|
101
|
+
read_using(self.method(:_read_temperature), *args, **kwargs)
|
102
|
+
read_using(self.method(:_read_pressure), *args, **kwargs, &block)
|
103
|
+
end
|
97
104
|
|
98
|
-
|
99
|
-
|
100
|
-
|
105
|
+
def _read
|
106
|
+
get_calibration_data unless calibration_data_loaded
|
107
|
+
|
108
|
+
_read_temperature
|
109
|
+
_read_pressure
|
101
110
|
end
|
102
111
|
|
103
112
|
def pre_callback_filter(data)
|
@@ -123,27 +132,21 @@ module Denko
|
|
123
132
|
def update_state(reading)
|
124
133
|
# Checking for Hash ignores calibration data and nil.
|
125
134
|
if reading.class == Hash
|
126
|
-
|
135
|
+
state_mutex.synchronize do
|
127
136
|
@state[:temperature] = reading[:temperature]
|
128
137
|
@state[:pressure] = reading[:pressure]
|
129
138
|
end
|
130
139
|
end
|
131
140
|
end
|
132
141
|
|
133
|
-
def [](key)
|
134
|
-
@state_mutex.synchronize do
|
135
|
-
return @state[key]
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
142
|
#
|
140
143
|
# Decoding Methods
|
141
144
|
#
|
142
145
|
def decode_reading(bytes)
|
143
146
|
temperature, b5 = decode_temperature(bytes)
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
+
reading[:temperature] = temperature
|
148
|
+
reading[:pressure] = decode_pressure(bytes, b5)
|
149
|
+
reading
|
147
150
|
end
|
148
151
|
|
149
152
|
def decode_temperature(bytes)
|
@@ -162,7 +165,7 @@ module Denko
|
|
162
165
|
# Return temperature and b5 for pressure calculation.
|
163
166
|
[temperature, b5]
|
164
167
|
end
|
165
|
-
|
168
|
+
|
166
169
|
def decode_pressure(bytes, b5)
|
167
170
|
# Pressure is bytes [2..3], MSB first.
|
168
171
|
up = ((bytes[2] << 16) | (bytes[3] << 8) | (bytes[4])) >> (8 - @oss)
|
@@ -194,10 +197,10 @@ module Denko
|
|
194
197
|
# Calibration Methods
|
195
198
|
#
|
196
199
|
attr_reader :calibration_data_loaded
|
197
|
-
|
198
|
-
def get_calibration_data
|
200
|
+
|
201
|
+
def get_calibration_data
|
199
202
|
# Calibration data is 22 bytes starting at address 0xAA.
|
200
|
-
read_using -> { i2c_read(
|
203
|
+
read_using -> { i2c_read(22, register: 0xAA) }
|
201
204
|
end
|
202
205
|
|
203
206
|
def process_calibration(bytes)
|
data/lib/denko/sensor/dht.rb
CHANGED
@@ -1,8 +1,19 @@
|
|
1
1
|
module Denko
|
2
2
|
module Sensor
|
3
3
|
class DHT
|
4
|
-
include Behaviors::
|
4
|
+
include Behaviors::InputPin
|
5
5
|
include Behaviors::Poller
|
6
|
+
include Behaviors::Lifecycle
|
7
|
+
include TemperatureHelper
|
8
|
+
include HumidityHelper
|
9
|
+
|
10
|
+
def state
|
11
|
+
state_mutex.synchronize { @state ||= { temperature: nil, humidity: nil } }
|
12
|
+
end
|
13
|
+
|
14
|
+
def reading
|
15
|
+
@reading ||= { temperature: nil, humidity: nil }
|
16
|
+
end
|
6
17
|
|
7
18
|
def _read
|
8
19
|
board.pulse_read(pin, reset: board.low, reset_time: 20000, pulse_limit: 84, timeout: 100)
|
@@ -28,11 +39,17 @@ module Denko
|
|
28
39
|
end
|
29
40
|
return { error: 'CRC failure' } unless crc(bytes)
|
30
41
|
|
31
|
-
|
32
|
-
humidity
|
33
|
-
fahrenheit = (celsius * 1.8 + 32).round(1)
|
42
|
+
reading[:temperature] = ((bytes[2] << 8) | bytes[3]).to_f / 10
|
43
|
+
reading[:humidity] = ((bytes[0] << 8) | bytes[1]).to_f / 10
|
34
44
|
|
35
|
-
|
45
|
+
reading
|
46
|
+
end
|
47
|
+
|
48
|
+
def update_state(reading)
|
49
|
+
state_mutex.synchronize do
|
50
|
+
@state[:temperature] = reading[:temperature]
|
51
|
+
@state[:humidity] = reading[:humidity]
|
52
|
+
end
|
36
53
|
end
|
37
54
|
|
38
55
|
def crc(bytes)
|
data/lib/denko/sensor/ds18b20.rb
CHANGED
@@ -1,36 +1,24 @@
|
|
1
1
|
module Denko
|
2
2
|
module Sensor
|
3
3
|
class DS18B20 < OneWire::Peripheral
|
4
|
+
include Behaviors::Lifecycle
|
5
|
+
include TemperatureHelper
|
4
6
|
FAMILY_CODE = 0x28
|
5
7
|
|
6
|
-
def
|
7
|
-
|
8
|
+
def state
|
9
|
+
state_mutex.synchronize { @state ||= { temperature: nil } }
|
8
10
|
end
|
9
11
|
|
10
|
-
def
|
11
|
-
@
|
12
|
+
def reading
|
13
|
+
@reading ||= { temperature: nil }
|
12
14
|
end
|
13
15
|
|
14
|
-
def
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
return bits if decode_resolution(scratch) == bits
|
20
|
-
|
21
|
-
eeprom = scratch[2..4]
|
22
|
-
eeprom[2] = 0b00011111 | ((bits - 9) << 5)
|
23
|
-
write_scratch(eeprom)
|
24
|
-
copy_scratch
|
25
|
-
@resolution = bits
|
26
|
-
end
|
27
|
-
|
28
|
-
def set_convert_time
|
29
|
-
@convert_time = 0.75 / (2 ** (12 - @resolution))
|
16
|
+
def _read
|
17
|
+
convert
|
18
|
+
read_scratch(9) { |data| self.update(data) }
|
30
19
|
end
|
31
20
|
|
32
21
|
def convert
|
33
|
-
@resolution ||= 12
|
34
22
|
set_convert_time
|
35
23
|
|
36
24
|
atomically do
|
@@ -41,16 +29,29 @@ module Denko
|
|
41
29
|
sleep @convert_time unless bus.parasite_power
|
42
30
|
end
|
43
31
|
|
44
|
-
def
|
45
|
-
|
46
|
-
read_scratch(9) { |data| self.update(data) }
|
32
|
+
def set_convert_time
|
33
|
+
@convert_time = 0.75 / (2 ** (12 - (@resolution || 12)))
|
47
34
|
end
|
48
35
|
|
49
36
|
def pre_callback_filter(bytes)
|
50
37
|
return { crc_error: true } unless OneWire::Helper.crc(bytes)
|
51
|
-
@resolution = decode_resolution(bytes)
|
52
38
|
|
53
|
-
|
39
|
+
@resolution ||= decode_resolution(bytes)
|
40
|
+
reading[:temperature] = decode_temperature(bytes)
|
41
|
+
|
42
|
+
reading
|
43
|
+
end
|
44
|
+
|
45
|
+
def update_state(reading)
|
46
|
+
state_mutex.synchronize do
|
47
|
+
@state[:temperature] = reading[:temperature]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def decode_resolution(bytes)
|
52
|
+
config_byte = bytes[4]
|
53
|
+
offset = config_byte >> 5
|
54
|
+
offset + 9
|
54
55
|
end
|
55
56
|
|
56
57
|
#
|
@@ -58,16 +59,21 @@ module Denko
|
|
58
59
|
# It's a signed, 2's complement, little-endian decimal. LSB = 2 ^ -4.
|
59
60
|
#
|
60
61
|
def decode_temperature(bytes)
|
61
|
-
|
62
|
-
fahrenheit = (celsius * 1.8 + 32).round(4)
|
63
|
-
|
64
|
-
{celsius: celsius, fahrenheit: fahrenheit}
|
62
|
+
bytes[0..1].pack('C*').unpack('s<')[0] * (2.0 ** -4)
|
65
63
|
end
|
66
64
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
65
|
+
attr_reader :resolution
|
66
|
+
|
67
|
+
def resolution=(bits)
|
68
|
+
unless (9..12).include?(bits)
|
69
|
+
raise ArgumentError, 'Invalid DS18B20 resolution, expected 9 to 12'
|
70
|
+
end
|
71
|
+
|
72
|
+
eeprom = read_scratch(9)[2..4]
|
73
|
+
eeprom[2] = 0b00011111 | ((bits - 9) << 5)
|
74
|
+
write_scratch(eeprom)
|
75
|
+
copy_scratch
|
76
|
+
@resolution = bits
|
71
77
|
end
|
72
78
|
end
|
73
79
|
end
|
data/lib/denko/sensor/hcsr04.rb
CHANGED
@@ -1,19 +1,21 @@
|
|
1
1
|
module Denko
|
2
2
|
module Sensor
|
3
3
|
class HCSR04
|
4
|
-
|
5
|
-
SPEED_OF_SOUND = 343.0
|
6
|
-
|
4
|
+
include Behaviors::Lifecycle
|
7
5
|
include Behaviors::MultiPin
|
8
6
|
include Behaviors::Poller
|
9
7
|
|
8
|
+
# Speed of sound in meters per second.
|
9
|
+
SPEED_OF_SOUND = 343.0
|
10
|
+
|
10
11
|
def initialize_pins(options={})
|
11
12
|
proxy_pin :trigger, DigitalIO::Output
|
12
13
|
proxy_pin :echo, DigitalIO::Input
|
13
14
|
end
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
after_initialize do
|
17
|
+
# Avoid generating extraneous alerts when used with Denko::PiBoard.
|
18
|
+
echo.stop
|
17
19
|
|
18
20
|
# Receive values from echo pin.
|
19
21
|
echo.add_callback { |data| self.update(data) }
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Denko
|
2
|
+
module Sensor
|
3
|
+
module TemperatureHelper
|
4
|
+
def temperature
|
5
|
+
state[:temperature]
|
6
|
+
end
|
7
|
+
|
8
|
+
def temperature_f
|
9
|
+
(temperature * 1.8 + 32).round(4)
|
10
|
+
end
|
11
|
+
|
12
|
+
def temperature_k
|
13
|
+
temperature + 273.15
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module PressureHelper
|
18
|
+
def pressure
|
19
|
+
state[:pressure]
|
20
|
+
end
|
21
|
+
|
22
|
+
def pressure_atm
|
23
|
+
pressure / 101325.0
|
24
|
+
end
|
25
|
+
|
26
|
+
def pressure_bar
|
27
|
+
pressure / 100000.0
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module HumidityHelper
|
32
|
+
def humidity
|
33
|
+
state[:humidity]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|