denko 0.13.6 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (376) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/{build_avr.yml → build_atmega_avr.yml} +18 -18
  3. data/.github/workflows/{build_megaavr.yml → build_atmega_megaavr.yml} +18 -18
  4. data/.github/workflows/{build_sam3x.yml → build_atsam3x.yml} +17 -17
  5. data/.github/workflows/{build_samd.yml → build_atsamd21.yml} +18 -18
  6. data/.github/workflows/build_esp32.yml +17 -18
  7. data/.github/workflows/build_esp32c3.yml +57 -0
  8. data/.github/workflows/build_esp32c6.yml +57 -0
  9. data/.github/workflows/build_esp32h2.yml +56 -0
  10. data/.github/workflows/build_esp32s2.yml +57 -0
  11. data/.github/workflows/build_esp32s3.yml +57 -0
  12. data/.github/workflows/build_esp8266.yml +15 -15
  13. data/.github/workflows/build_ra4m1.yml +16 -16
  14. data/.github/workflows/build_rp2040.yml +17 -16
  15. data/.github/workflows/ruby.yml +20 -20
  16. data/CHANGELOG.md +195 -11
  17. data/DEPS_CLI.md +9 -9
  18. data/DEPS_IDE.md +17 -18
  19. data/HARDWARE.md +50 -51
  20. data/README.md +61 -53
  21. data/Rakefile +1 -1
  22. data/benchmarks/analog_listen.rb +49 -0
  23. data/benchmarks/digital_write.rb +28 -0
  24. data/benchmarks/i2c_ssd1306_refresh.rb +13 -6
  25. data/build +1 -1
  26. data/denko.gemspec +5 -2
  27. data/examples/advanced/{m5_env.rb → m5_env3.rb} +12 -14
  28. data/examples/advanced/rotary_encoder_mac_volume.rb +18 -13
  29. data/examples/advanced/ssd1306_time_temp_rh.rb +8 -13
  30. data/examples/analog_io/ads1100.rb +48 -0
  31. data/examples/analog_io/ads1115.rb +2 -2
  32. data/examples/analog_io/ads1118.rb +3 -11
  33. data/examples/analog_io/input.rb +17 -16
  34. data/examples/analog_io/input_smoothing.rb +27 -0
  35. data/examples/analog_io/potentiometer.rb +31 -0
  36. data/examples/connection/binary_echo.rb +34 -0
  37. data/examples/connection/tcp.rb +12 -27
  38. data/examples/digital_io/button.rb +7 -3
  39. data/examples/digital_io/relay.rb +17 -0
  40. data/examples/digital_io/rotary_encoder.rb +21 -11
  41. data/examples/display/hd44780.rb +13 -5
  42. data/examples/display/ssd1306.rb +20 -17
  43. data/examples/display/ssd1306_s2_pico.rb +2 -2
  44. data/examples/i2c/search.rb +10 -26
  45. data/examples/led/apa102_bounce.rb +3 -4
  46. data/examples/led/apa102_fade.rb +44 -0
  47. data/examples/led/builtin_blink.rb +3 -1
  48. data/examples/led/builtin_fade.rb +19 -0
  49. data/examples/led/rgb_led.rb +31 -0
  50. data/examples/led/seven_segment_char_echo.rb +4 -2
  51. data/examples/led/ws2812_bounce.rb +5 -7
  52. data/examples/led/ws2812_builtin_blink.rb +3 -2
  53. data/examples/led/ws2812_fade.rb +43 -0
  54. data/examples/motor/l298.rb +10 -8
  55. data/examples/motor/servo.rb +4 -3
  56. data/examples/motor/stepper.rb +13 -13
  57. data/examples/one_wire/search.rb +32 -0
  58. data/examples/pulse_io/buzzer.rb +8 -3
  59. data/examples/pulse_io/ir_output.rb +51 -0
  60. data/examples/pulse_io/pwm_output.rb +30 -0
  61. data/examples/rtc/ds3231.rb +18 -35
  62. data/examples/sensor/aht10.rb +4 -6
  63. data/examples/sensor/aht20.rb +4 -6
  64. data/examples/sensor/bme280.rb +4 -4
  65. data/examples/sensor/bmp180.rb +9 -5
  66. data/examples/sensor/dht.rb +20 -15
  67. data/examples/sensor/ds18b20.rb +20 -21
  68. data/examples/sensor/generic_pir.rb +4 -2
  69. data/examples/sensor/hcsr04.rb +5 -2
  70. data/examples/sensor/htu21d.rb +9 -20
  71. data/examples/sensor/htu31d.rb +7 -9
  72. data/examples/sensor/neat_tph_readings.rb +15 -9
  73. data/examples/sensor/qmp6988.rb +5 -7
  74. data/examples/sensor/rcwl9620.rb +3 -3
  75. data/examples/sensor/sht3x.rb +4 -6
  76. data/examples/spi/bitbang_loopback.rb +46 -0
  77. data/examples/spi/input_register.rb +9 -19
  78. data/examples/spi/output_register.rb +9 -17
  79. data/examples/spi/ssd_through_registers.rb +28 -0
  80. data/examples/spi/two_registers.rb +18 -24
  81. data/examples/uart/bit_bang_demo.rb +25 -0
  82. data/examples/uart/board_passthrough.rb +19 -13
  83. data/examples/uart/hardware_loopback.rb +1 -1
  84. data/lib/denko/analog_io/ads1100.rb +127 -0
  85. data/lib/denko/analog_io/ads1115.rb +8 -25
  86. data/lib/denko/analog_io/ads1118.rb +10 -25
  87. data/lib/denko/analog_io/ads111x.rb +25 -11
  88. data/lib/denko/analog_io/input.rb +29 -55
  89. data/lib/denko/analog_io/input_helper.rb +42 -0
  90. data/lib/denko/analog_io/output.rb +5 -5
  91. data/lib/denko/analog_io/potentiometer.rb +6 -8
  92. data/lib/denko/analog_io.rb +2 -1
  93. data/lib/denko/behaviors/board_proxy.rb +13 -1
  94. data/lib/denko/behaviors/bus_controller.rb +1 -0
  95. data/lib/denko/behaviors/bus_controller_addressed.rb +1 -0
  96. data/lib/denko/behaviors/bus_peripheral.rb +3 -4
  97. data/lib/denko/behaviors/bus_peripheral_addressed.rb +8 -6
  98. data/lib/denko/behaviors/callbacks.rb +9 -7
  99. data/lib/denko/behaviors/component.rb +16 -14
  100. data/lib/denko/behaviors/input_pin.rb +14 -15
  101. data/lib/denko/behaviors/lifecycle.rb +51 -0
  102. data/lib/denko/behaviors/multi_pin.rb +22 -18
  103. data/lib/denko/behaviors/output_pin.rb +9 -4
  104. data/lib/denko/behaviors/single_pin.rb +1 -0
  105. data/lib/denko/behaviors/state.rb +15 -9
  106. data/lib/denko/behaviors/subcomponents.rb +72 -12
  107. data/lib/denko/behaviors.rb +2 -1
  108. data/lib/denko/board/core.rb +36 -18
  109. data/lib/denko/board/i2c.rb +14 -14
  110. data/lib/denko/board/i2c_bit_bang.rb +49 -0
  111. data/lib/denko/board/infrared.rb +6 -6
  112. data/lib/denko/board/led_array.rb +6 -5
  113. data/lib/denko/board/spi.rb +15 -10
  114. data/lib/denko/board/spi_bit_bang.rb +9 -7
  115. data/lib/denko/board.rb +35 -33
  116. data/lib/denko/connection/binary_echo.rb +17 -0
  117. data/lib/denko/connection/flow_control.rb +11 -15
  118. data/lib/denko/connection/handshake.rb +2 -0
  119. data/lib/denko/digital_io/button.rb +4 -0
  120. data/lib/denko/digital_io/c_bit_bang.rb +15 -0
  121. data/lib/denko/digital_io/input.rb +4 -5
  122. data/lib/denko/digital_io/output.rb +7 -6
  123. data/lib/denko/digital_io/relay.rb +2 -0
  124. data/lib/denko/digital_io/rotary_encoder.rb +78 -60
  125. data/lib/denko/digital_io.rb +1 -0
  126. data/lib/denko/display/hd44780.rb +136 -93
  127. data/lib/denko/display/sh1106.rb +42 -0
  128. data/lib/denko/display/ssd1306.rb +105 -45
  129. data/lib/denko/display.rb +1 -0
  130. data/lib/denko/eeprom/built_in.rb +19 -16
  131. data/lib/denko/i2c/bit_bang.rb +31 -0
  132. data/lib/denko/i2c/bus.rb +8 -36
  133. data/lib/denko/i2c/bus_common.rb +45 -0
  134. data/lib/denko/i2c/peripheral.rb +28 -19
  135. data/lib/denko/i2c.rb +2 -0
  136. data/lib/denko/led/apa102.rb +43 -29
  137. data/lib/denko/led/base.rb +8 -2
  138. data/lib/denko/led/rgb.rb +5 -7
  139. data/lib/denko/led/seven_segment.rb +24 -9
  140. data/lib/denko/led/ws2812.rb +10 -7
  141. data/lib/denko/message.rb +5 -0
  142. data/lib/denko/motor/l298.rb +11 -10
  143. data/lib/denko/motor/servo.rb +22 -10
  144. data/lib/denko/motor/stepper.rb +11 -14
  145. data/lib/denko/mutex_stub.rb +7 -0
  146. data/lib/denko/one_wire/bus.rb +9 -5
  147. data/lib/denko/one_wire/peripheral.rb +0 -3
  148. data/lib/denko/pulse_io/buzzer.rb +9 -3
  149. data/lib/denko/pulse_io/{ir_transmitter.rb → ir_output.rb} +9 -4
  150. data/lib/denko/pulse_io/pwm_output.rb +69 -15
  151. data/lib/denko/pulse_io.rb +3 -3
  152. data/lib/denko/rtc/ds3231.rb +11 -13
  153. data/lib/denko/sensor/aht.rb +22 -21
  154. data/lib/denko/sensor/bme280.rb +60 -63
  155. data/lib/denko/sensor/bmp180.rb +41 -38
  156. data/lib/denko/sensor/dht.rb +22 -5
  157. data/lib/denko/sensor/ds18b20.rb +40 -34
  158. data/lib/denko/sensor/hcsr04.rb +7 -5
  159. data/lib/denko/sensor/helper.rb +37 -0
  160. data/lib/denko/sensor/htu21d.rb +44 -55
  161. data/lib/denko/sensor/htu31d.rb +32 -33
  162. data/lib/denko/sensor/qmp6988.rb +25 -23
  163. data/lib/denko/sensor/rcwl9620.rb +2 -5
  164. data/lib/denko/sensor/sht3x.rb +23 -21
  165. data/lib/denko/sensor.rb +1 -2
  166. data/lib/denko/spi/base_register.rb +22 -22
  167. data/lib/denko/spi/bit_bang.rb +17 -51
  168. data/lib/denko/spi/bus.rb +15 -29
  169. data/lib/denko/spi/bus_common.rb +36 -0
  170. data/lib/denko/spi/input_register.rb +36 -30
  171. data/lib/denko/spi/output_register.rb +25 -40
  172. data/lib/denko/spi/peripheral.rb +93 -24
  173. data/lib/denko/spi.rb +6 -1
  174. data/lib/denko/uart/bit_bang.rb +5 -3
  175. data/lib/denko/uart/hardware.rb +9 -8
  176. data/lib/denko/version.rb +1 -1
  177. data/lib/denko.rb +10 -0
  178. data/lib/denko_cli/generator.rb +2 -2
  179. data/lib/denko_cli/packages.rb +8 -10
  180. data/lib/denko_cli/targets.rb +8 -8
  181. data/lib/denko_cli/targets.txt +4 -4
  182. data/lib/denko_cli/usage.txt +1 -1
  183. data/src/denko_ethernet.ino +0 -14
  184. data/src/denko_serial.ino +0 -14
  185. data/src/denko_wifi.ino +6 -15
  186. data/src/lib/Denko.cpp +39 -3
  187. data/src/lib/Denko.h +42 -26
  188. data/src/lib/DenkoCoreIO.cpp +57 -102
  189. data/src/lib/DenkoDefines.h +36 -31
  190. data/src/lib/DenkoI2C.cpp +54 -45
  191. data/src/lib/DenkoI2CBB.cpp +238 -0
  192. data/src/lib/DenkoIROut.cpp +12 -7
  193. data/src/lib/DenkoLEDArray.cpp +36 -13
  194. data/src/lib/DenkoSPI.cpp +6 -5
  195. data/src/lib/DenkoSPIBB.cpp +7 -6
  196. data/target.yml +37 -2
  197. data/test/analog_io/potentiometer_test.rb +10 -10
  198. data/test/behaviors/board_proxy_test.rb +1 -1
  199. data/test/behaviors/callbacks_test.rb +11 -3
  200. data/test/behaviors/component_test.rb +17 -9
  201. data/test/behaviors/input_pin_test.rb +14 -9
  202. data/test/behaviors/multi_pin_test.rb +14 -4
  203. data/test/behaviors/output_pin_test.rb +11 -8
  204. data/test/behaviors/poller_test.rb +1 -0
  205. data/test/behaviors/reader_test.rb +3 -2
  206. data/test/behaviors/subcomponents_test.rb +22 -2
  207. data/test/board/core_test.rb +15 -11
  208. data/test/board/i2c_test.rb +39 -33
  209. data/test/board/infrared_test.rb +1 -1
  210. data/test/board/message_test.rb +17 -11
  211. data/test/board/spi_test.rb +21 -21
  212. data/test/digital_io/button_test.rb +15 -0
  213. data/test/digital_io/relay_test.rb +18 -0
  214. data/test/digital_io/rotary_encoder_test.rb +80 -60
  215. data/test/eeprom/built_in_test.rb +9 -9
  216. data/test/i2c/bus_test.rb +30 -14
  217. data/test/i2c/peripheral_test.rb +36 -17
  218. data/test/led/base_test.rb +2 -1
  219. data/test/led/rgb_test.rb +6 -6
  220. data/test/led/seven_segment_test.rb +7 -7
  221. data/test/motor/servo_test.rb +1 -1
  222. data/test/motor/stepper_test.rb +2 -2
  223. data/test/one_wire/bus_test.rb +1 -0
  224. data/test/pulse_io/buzzer_test.rb +7 -4
  225. data/test/pulse_io/{ir_transmitter_test.rb → ir_output_test.rb} +10 -10
  226. data/test/pulse_io/pwm_output_test.rb +74 -18
  227. data/test/rtc/ds3231_test.rb +11 -13
  228. data/test/sensor/dht_test.rb +1 -1
  229. data/test/sensor/ds18b20_test.rb +4 -8
  230. data/test/spi/bus_test.rb +7 -7
  231. data/test/spi/input_register_test.rb +15 -15
  232. data/test/spi/output_register_test.rb +10 -28
  233. data/test/spi/peripheral_multi_pin_test.rb +53 -0
  234. data/test/spi/peripheral_single_pin_test.rb +48 -0
  235. data/test/test_helper.rb +36 -33
  236. data/tutorial/02-button/button.rb +5 -4
  237. data/tutorial/03-potentiometer/potentiometer.rb +9 -5
  238. data/tutorial/04-pwm_led/pwm_led.rb +14 -16
  239. data/tutorial/05-rgb_led/rgb_led.rb +6 -6
  240. data/tutorial/05-rgb_led/rgb_mapping.rb +11 -11
  241. data/vendor/board-maps/BoardMap.h +416 -56
  242. data/vendor/board-maps/lib/header_parser.rb +12 -2
  243. data/vendor/board-maps/yaml/ADAFRUIT_CAMERA_ESP32S3.yml +2 -2
  244. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32C6.yml +15 -0
  245. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +1 -1
  246. data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_RP2040_ADALOGGER.yml +44 -0
  247. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32C3.yml +1 -0
  248. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S2.yml +1 -0
  249. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_N4R2.yml +1 -0
  250. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_NOPSRAM.yml +1 -0
  251. data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +1 -0
  252. data/vendor/board-maps/yaml/AMKEN_BB.yml +48 -0
  253. data/vendor/board-maps/yaml/AMKEN_ES.yml +48 -0
  254. data/vendor/board-maps/yaml/AMKEN_REVELOP.yml +48 -0
  255. data/vendor/board-maps/yaml/AMKEN_REVELOP_PLUS.yml +48 -0
  256. data/vendor/board-maps/yaml/ASL_CAN_X2.yml +41 -0
  257. data/vendor/board-maps/yaml/BLING.yml +25 -0
  258. data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +1 -0
  259. data/vendor/board-maps/yaml/BRIDGETEK_IDM2040_7A.yml +48 -0
  260. data/vendor/board-maps/yaml/Bee_Motion_Mini.yml +13 -1
  261. data/vendor/board-maps/yaml/Breadstick_Raspberry.yml +31 -0
  262. data/vendor/board-maps/yaml/DFROBOT_BEETLE_ESP32C6.yml +8 -0
  263. data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32C6.yml +20 -0
  264. data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_ESP32.yml +46 -0
  265. data/vendor/board-maps/yaml/DPTECHNICS_WALTER.yml +39 -0
  266. data/vendor/board-maps/yaml/ELECROW_CROWPANEL_7.yml +8 -0
  267. data/vendor/board-maps/yaml/ESP32C2_DEV.yml +12 -0
  268. data/vendor/board-maps/yaml/ESP32C3_DEVKIT_LIPO.yml +14 -0
  269. data/vendor/board-maps/yaml/ESP32C6_DEV.yml +15 -0
  270. data/vendor/board-maps/yaml/ESP32C6_EVB.yml +15 -0
  271. data/vendor/board-maps/yaml/ESP32C6_QWIIC_POCKET.yml +15 -0
  272. data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +15 -0
  273. data/vendor/board-maps/yaml/ESP32H2_DEV.yml +13 -0
  274. data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +13 -0
  275. data/vendor/board-maps/yaml/ESP32S2_DEV.yml +1 -0
  276. data/vendor/board-maps/yaml/{RMP.yml → ESP32S2_DEVKIT_LIPO.yml} +2 -1
  277. data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +44 -0
  278. data/vendor/board-maps/yaml/ESP32S3_DEVKIT_LIPO.yml +42 -0
  279. data/vendor/board-maps/yaml/ESP32S3_POWERFEATHER.yml +22 -0
  280. data/vendor/board-maps/yaml/ESP32_SBC_FABGL.yml +35 -0
  281. data/vendor/board-maps/yaml/EVN_ALPHA.yml +48 -0
  282. data/vendor/board-maps/yaml/FEATHERS3NEO.yml +32 -0
  283. data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +14 -0
  284. data/vendor/board-maps/yaml/HELTEC_CAPSULE_SENSOR_V3.yml +43 -0
  285. data/vendor/board-maps/yaml/HELTEC_WIFI_LORA_32_V3.yml +42 -0
  286. data/vendor/board-maps/yaml/HELTEC_WIRELESS_BRIDGE.yml +8 -0
  287. data/vendor/board-maps/yaml/HELTEC_WIRELESS_MINI_SHELL.yml +13 -0
  288. data/vendor/board-maps/yaml/HELTEC_WIRELESS_PAPER.yml +42 -0
  289. data/vendor/board-maps/yaml/HELTEC_WIRELESS_SHELL_V3.yml +42 -0
  290. data/vendor/board-maps/yaml/HELTEC_WIRELESS_STICK_LITE_V3.yml +30 -0
  291. data/vendor/board-maps/yaml/HELTEC_WIRELESS_TRACKER.yml +41 -0
  292. data/vendor/board-maps/yaml/HT_DE01.yml +42 -0
  293. data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +1 -1
  294. data/vendor/board-maps/yaml/LILYGO_T3S3_LR1121.yml +9 -0
  295. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1262.yml +9 -0
  296. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1276.yml +9 -0
  297. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1278.yml +9 -0
  298. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280.yml +9 -0
  299. data/vendor/board-maps/yaml/LILYGO_T3S3_SX1280PA.yml +8 -0
  300. data/vendor/board-maps/yaml/LILYGO_T_ETH_LITE.yml +21 -0
  301. data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +14 -0
  302. data/vendor/board-maps/yaml/LOLIN_S3.yml +1 -0
  303. data/vendor/board-maps/yaml/LOLIN_S3_MINI_PRO.yml +40 -0
  304. data/vendor/board-maps/yaml/Lion_Bit_Dev_Board.yml +0 -2
  305. data/vendor/board-maps/yaml/LoPy.yml +1 -0
  306. data/vendor/board-maps/yaml/LoPy4.yml +1 -0
  307. data/vendor/board-maps/yaml/M5STACK_CAPSULE.yml +8 -0
  308. data/vendor/board-maps/yaml/M5STACK_CARDPUTER.yml +8 -0
  309. data/vendor/board-maps/yaml/M5STACK_DIAL.yml +8 -0
  310. data/vendor/board-maps/yaml/M5STACK_FIRE.yml +0 -1
  311. data/vendor/board-maps/yaml/M5STACK_NANOC6.yml +17 -0
  312. data/vendor/board-maps/yaml/M5STACK_PAPER.yml +9 -0
  313. data/vendor/board-maps/yaml/M5STACK_POE_CAM.yml +5 -0
  314. data/vendor/board-maps/yaml/M5STACK_STAMP_C3.yml +13 -0
  315. data/vendor/board-maps/yaml/M5STACK_STAMP_S3.yml +4 -0
  316. data/vendor/board-maps/yaml/{M5Stick_C.yml → M5STACK_STICKC.yml} +0 -1
  317. data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS.yml +9 -0
  318. data/vendor/board-maps/yaml/M5STACK_STICKC_PLUS2.yml +9 -0
  319. data/vendor/board-maps/yaml/M5STACK_TOUGH.yml +9 -0
  320. data/vendor/board-maps/yaml/M5STACK_UNIT_CAM.yml +10 -0
  321. data/vendor/board-maps/yaml/M5STACK_UNIT_CAMS3.yml +4 -0
  322. data/vendor/board-maps/yaml/M5Stack_ATOM.yml +0 -1
  323. data/vendor/board-maps/yaml/MAKERGO_C3_SUPERMINI.yml +14 -0
  324. data/vendor/board-maps/yaml/MARBLE_PICO.yml +48 -0
  325. data/vendor/board-maps/yaml/METEHOCA_AKANA_R1.yml +46 -0
  326. data/vendor/board-maps/yaml/NAMINO_BIANCO.yml +13 -0
  327. data/vendor/board-maps/yaml/NEBULAS3.yml +0 -1
  328. data/vendor/board-maps/yaml/NEWSAN_ARCHI.yml +48 -0
  329. data/vendor/board-maps/yaml/NOLOGO_ESP32C3_SUPER_MINI.yml +14 -0
  330. data/vendor/board-maps/yaml/NOLOGO_ESP32S3_PICO.yml +12 -0
  331. data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_16MB.yml +48 -0
  332. data/vendor/board-maps/yaml/OLIMEX_RP2040_PICO30_2MB.yml +48 -0
  333. data/vendor/board-maps/yaml/OPTA_ANALOG.yml +7 -0
  334. data/vendor/board-maps/yaml/OPTA_DIGITAL.yml +5 -0
  335. data/vendor/board-maps/yaml/PINTRONIX_PINMAX.yml +42 -0
  336. data/vendor/board-maps/yaml/PYCOM_GPY.yml +1 -0
  337. data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +0 -1
  338. data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +12 -0
  339. data/vendor/board-maps/yaml/SPARKFUN_MICROMOD_RP2040.yml +48 -0
  340. data/vendor/board-maps/yaml/SPARKFUN_PRO_MICRO_ESP32C3.yml +24 -0
  341. data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER.yml +31 -0
  342. data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +15 -0
  343. data/vendor/board-maps/yaml/TINYC6.yml +25 -0
  344. data/vendor/board-maps/yaml/UPESY_EDU_ESP32.yml +28 -0
  345. data/vendor/board-maps/yaml/UPESY_ESP32C3_BASIC.yml +13 -0
  346. data/vendor/board-maps/yaml/UPESY_ESP32C3_MINI.yml +12 -0
  347. data/vendor/board-maps/yaml/UPESY_ESP32S3_BASIC.yml +42 -0
  348. data/vendor/board-maps/yaml/VIRALINK_GATE32_01.yml +6 -0
  349. data/vendor/board-maps/yaml/VIRALINK_GATE32_11.yml +7 -0
  350. data/vendor/board-maps/yaml/WAVESHARE_ESP32S3_TOUCH_LCD_128.yml +8 -0
  351. data/vendor/board-maps/yaml/WAVESHARE_RP2040_MATRIX.yml +48 -0
  352. data/vendor/board-maps/yaml/WAVESHARE_RP2040_ONE.yml +1 -0
  353. data/vendor/board-maps/yaml/WAVESHARE_RP2040_PIZERO.yml +47 -0
  354. data/vendor/board-maps/yaml/WAVESHARE_RP2040_ZERO.yml +1 -0
  355. data/vendor/board-maps/yaml/WEACT_STUDIO_ESP32C3.yml +14 -0
  356. data/vendor/board-maps/yaml/WIPY3.yml +1 -0
  357. data/vendor/board-maps/yaml/WT32_SC01_PLUS.yml +7 -0
  358. data/vendor/board-maps/yaml/WiFiduinoV2.yml +1 -0
  359. data/vendor/board-maps/yaml/XIAO_ESP32C3.yml +0 -1
  360. data/vendor/board-maps/yaml/XIAO_ESP32C6.yml +22 -0
  361. data/vendor/board-maps/yaml/unphone9.yml +8 -0
  362. metadata +169 -30
  363. data/examples/led/apa102_breathe.rb +0 -45
  364. data/examples/pulse_io/ir_transmitter.rb +0 -55
  365. data/examples/spi/ssd_through_register.rb +0 -40
  366. data/examples/uart/bit_bang_read.rb +0 -16
  367. data/examples/uart/bit_bang_write.rb +0 -16
  368. data/lib/denko/analog_io/sensor.rb +0 -6
  369. data/lib/denko/sensor/virtual.rb +0 -42
  370. data/src/lib/DenkoIROutESP.cpp +0 -26
  371. data/vendor/board-maps/yaml/STAMP_S3.yml +0 -8
  372. /data/vendor/board-maps/yaml/{BRIDGETEK_IDM2040-7A.yml → BRIDGETEK_IDM2040_43A.yml} +0 -0
  373. /data/vendor/board-maps/yaml/{heltec_wifi_32_lora_V3.yml → HELTEC_WIRELESS_STICK_V3.yml} +0 -0
  374. /data/vendor/board-maps/yaml/{M5Stack_Core_ESP32.yml → M5STACK_CORE.yml} +0 -0
  375. /data/vendor/board-maps/yaml/{M5Stamp_Pico.yml → M5STACK_STAMP_PICO.yml} +0 -0
  376. /data/vendor/board-maps/yaml/{M5Stack-Timer-CAM.yml → M5STACK_TIMER_CAM.yml} +0 -0
@@ -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 0xF7, 8
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
- @state_mutex.synchronize do
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
- @reading[:temperature] = temperature
220
-
216
+ reading[:temperature] = temperature
217
+
221
218
  # Pressure and humidity are optional. Humidity is not available on the BMP280.
222
- @reading[:pressure] = decode_pressure(bytes, t_fine) if reading_pressure?
223
- @reading[:humidity] = decode_humidity(bytes, t_fine) if reading_humidity?
224
-
225
- @reading
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(0x88, 26) }
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, 7 }
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
  #
@@ -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
- def before_initialize(options={})
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 _start_read_temperature
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 _start_read_pressure
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
- def _read
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
- _start_read_temperature
95
- sleep(@measurement_time)
96
- i2c_read 0xF6, 2
101
+ read_using(self.method(:_read_temperature), *args, **kwargs)
102
+ read_using(self.method(:_read_pressure), *args, **kwargs, &block)
103
+ end
97
104
 
98
- _start_read_pressure
99
- sleep(@measurement_time)
100
- i2c_read 0xF6, 3
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
- @state_mutex.synchronize do
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
- @reading[:temperature] = temperature
145
- @reading[:pressure] = decode_pressure(bytes, b5)
146
- @reading
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(0xAA, 22) }
203
+ read_using -> { i2c_read(22, register: 0xAA) }
201
204
  end
202
205
 
203
206
  def process_calibration(bytes)
@@ -1,8 +1,19 @@
1
1
  module Denko
2
2
  module Sensor
3
3
  class DHT
4
- include Behaviors::SinglePin
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
- celsius = ((bytes[2] << 8) | bytes[3]).to_f / 10
32
- humidity = ((bytes[0] << 8) | bytes[1]).to_f / 10
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
- { celsius: celsius, fahrenheit: fahrenheit, humidity: humidity }
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)
@@ -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 scratch
7
- @state ? @state[:raw] : read_scratch(9)
8
+ def state
9
+ state_mutex.synchronize { @state ||= { temperature: nil } }
8
10
  end
9
11
 
10
- def resolution
11
- @resolution ||= decode_resolution(scratch)
12
+ def reading
13
+ @reading ||= { temperature: nil }
12
14
  end
13
15
 
14
- def resolution=(bits)
15
- unless (9..12).include?(bits)
16
- raise ArgumentError, 'Invalid DS18B20 resolution, expected 9 to 12'
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 _read
45
- convert
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
- decode_temperature(bytes).merge(raw: bytes)
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
- celsius = bytes[0..1].pack('C*').unpack('s<')[0] * (2.0 ** -4)
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
- def decode_resolution(bytes)
68
- config_byte = bytes[4]
69
- offset = config_byte >> 5
70
- offset + 9
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
@@ -1,19 +1,21 @@
1
1
  module Denko
2
2
  module Sensor
3
3
  class HCSR04
4
- # Speed of sound in meters per second.
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
- def after_initialize(options={})
16
- super(options)
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