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.
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
@@ -1,15 +1,16 @@
1
1
  #
2
- # Example using a BME280 sensor over I2C, for temperature, pressure and humidity.
2
+ # BME280 sensor over I2C, for temperature, pressure and humidity.
3
3
  #
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
+ require_relative 'neat_tph_readings'
6
7
 
7
8
  board = Denko::Board.new(Denko::Connection::Serial.new)
8
- bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
9
+ bus = Denko::I2C::Bus.new(board: board)
9
10
 
10
11
  sensor = Denko::Sensor::BME280.new(bus: bus) # address: 0x76 default
11
12
  # Use A BMP280 with no humidity instead.
12
- # sensor = Denko::Sensor::BMP280.new(bus: bus) # address: 0x76
13
+ # sensor = Denko::Sensor::BMP280.new(bus: bus) # address: 0x76 default
13
14
 
14
15
  # Default reading mode is oneshot ("forced" in datasheet).
15
16
  # sensor.oneshot_mode
@@ -28,7 +29,6 @@ sensor = Denko::Sensor::BME280.new(bus: bus) # address: 0x76 default
28
29
  # print sensor.config_register_bits
29
30
 
30
31
  # Get the shared #print_tph_reading method to print readings neatly.
31
- require_relative 'neat_tph_readings'
32
32
 
33
33
  # Poll it and print readings.
34
34
  sensor.poll(5) do |reading|
@@ -1,18 +1,22 @@
1
1
  #
2
- # Example using a BMP180 sensor over I2C, for temperature and pressure.
2
+ # BMP180 sensor over I2C, for temperature and pressure.
3
3
  #
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
+ require_relative 'neat_tph_readings'
6
7
 
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
- bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
8
+ board = Denko::Board.new(Denko::Connection::Serial.new)
9
+ bus = Denko::I2C::Bus.new(board: board)
9
10
  sensor = Denko::Sensor::BMP180.new(bus: bus) # address: 0x77 default
10
11
 
11
12
  # Enable oversampling for the pressure sensor only (1,2,4, 8).
12
13
  # sensor.pressure_samples = 8
13
14
 
14
- # Get the shared #print_tph_reading method to print readings neatly.
15
- require_relative 'neat_tph_readings'
15
+ # Demonstrate helper methods
16
+ result = sensor.read
17
+ puts "Temperature unit helpers: #{sensor.temperature} \xC2\xB0C | #{sensor.temperature_f} \xC2\xB0F | #{sensor.temperature_k} K"
18
+ puts "Pressure unit helpers: #{sensor.pressure} Pa | #{sensor.pressure_atm.round(6)} atm | #{sensor.pressure_bar.round(6)} bar"
19
+ puts
16
20
 
17
21
  # Poll it and print readings.
18
22
  sensor.poll(5) do |reading|
@@ -1,24 +1,29 @@
1
1
  #
2
- # Example of how to use the DHT class for DHT 11 and DHT 22 sensors.
2
+ # DHT sensor class for DHT 11 and DHT 22 sensors.
3
3
  #
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
+ require_relative 'neat_tph_readings'
6
7
 
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
- dht = Denko::Sensor::DHT.new(pin: 5, board: board)
8
+ PIN = 5
9
9
 
10
- # The DHT class pre-processes raw data from the board. When it reaches callbacks
11
- # it's already hash of :temperature and :humidity keys, both with Float values.
12
- dht.add_callback do |reading|
13
- print "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} | "
14
- if reading[:error]
15
- puts "Error: #{reading[:error]}"
16
- else
17
- print "#{reading[:celsius]} \xC2\xB0C | #{reading[:fahrenheit]} \xC2\xB0F | "
18
- puts "#{reading[:humidity]}% relative humidity"
19
- end
10
+ board = Denko::Board.new(Denko::Connection::Serial.new)
11
+ sensor = Denko::Sensor::DHT.new(board: board, pin: PIN)
12
+
13
+ sensor.read
14
+ if sensor.temperature
15
+ puts "Temperature unit helpers: #{sensor.temperature} \xC2\xB0C | #{sensor.temperature_f} \xC2\xB0F | #{sensor.temperature_k} K"; puts
16
+ else
17
+ puts "ERROR: Sensor not connected... Quitting..."
18
+ return
19
+ end
20
+
21
+ # Don't try to read it again too quickly.
22
+ sleep(1)
23
+
24
+ # Poll it and print readings.
25
+ sensor.poll(5) do |reading|
26
+ print_tph_reading(reading)
20
27
  end
21
28
 
22
- # Read it every 5 seconds.
23
- dht.poll(5)
24
29
  sleep
@@ -4,31 +4,22 @@
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
6
 
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
- bus = Denko::OneWire::Bus.new(pin:4, board: board)
7
+ PIN = 4
9
8
 
10
- # The bus detects parasite power automatically when initialized.
11
- # It can tell that parasite power is in use, but not by WHICH devices.
12
- if bus.parasite_power
13
- puts "Parasite power detected..."; puts
14
- end
9
+ board = Denko::Board.new(Denko::Connection::Serial.new)
10
+ bus = Denko::OneWire::Bus.new(board: board, pin: PIN)
15
11
 
16
- # Call #device_present to reset the bus and return presence pulse as a boolean.
17
- if bus.device_present?
18
- puts "Devices present on bus..."; puts
19
- else
12
+ unless bus.device_present?
20
13
  puts "No devices present on bus... Quitting..."
21
14
  return
22
15
  end
23
16
 
24
- # Calling #search finds connected devices and stores them in #found_devices.
25
- # Each hash contains a device's ROM address and matching Ruby class if one exists.
26
- bus.search
27
- count = bus.found_devices.count
28
- puts "Found #{count} device#{'s' if count > 1} on the bus:"
29
- puts bus.found_devices.inspect; puts
17
+ if bus.parasite_power
18
+ puts "Parasite power detected..."; puts
19
+ end
30
20
 
31
- # We can use the search results to setup instances of the device classes.
21
+ # Search the bus and use results to set up DS18B20 instances.
22
+ bus.search
32
23
  ds18b20s = []
33
24
  bus.found_devices.each do |d|
34
25
  if d[:class] == Denko::Sensor::DS18B20
@@ -36,7 +27,15 @@ bus.found_devices.each do |d|
36
27
  end
37
28
  end
38
29
 
39
- # Format a reading for printing on a line.
30
+ if ds18b20s.empty?
31
+ puts "No DS18B20 sensors found on the bus... Quitting...";
32
+ else
33
+ puts "Found DS18B20 sensors with these serials:"
34
+ puts ds18b20s.map { |d| d.serial_number }
35
+ puts
36
+ end
37
+
38
+ # Format a reading for printing on a line.
40
39
  def print_reading(reading, sensor)
41
40
  print "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} - "
42
41
  print "Serial(HEX): #{sensor.serial_number} | Res: #{sensor.resolution} bits | "
@@ -44,8 +43,8 @@ def print_reading(reading, sensor)
44
43
  if reading[:crc_error]
45
44
  puts "CRC check failed for this reading!"
46
45
  else
47
- print "#{reading[:celsius]} \xC2\xB0C | #{reading[:fahrenheit]} \xC2\xB0F | "
48
- puts "Raw: #{reading[:raw].inspect}"
46
+ fahrenheit = (reading[:temperature] * 1.8 + 32).round(1)
47
+ puts "#{reading[:temperature]} \xC2\xB0C | #{fahrenheit} \xC2\xB0F"
49
48
  end
50
49
  end
51
50
 
@@ -13,8 +13,10 @@
13
13
  require 'bundler/setup'
14
14
  require 'denko'
15
15
 
16
- board = Denko::Board.new(Denko::Connection::Serial.new)
17
- sensor = Denko::Sensor::GenericPIR.new(board: board, pin: 8)
16
+ PIN = 8
17
+
18
+ board = Denko::Board.new(Denko::Connection::Serial.new)
19
+ sensor = Denko::Sensor::GenericPIR.new(board: board, pin: PIN)
18
20
 
19
21
  sensor.on_motion_start { print "Motion detected! \r" }
20
22
  sensor.on_motion_stop { print "No motion detected... \r" }
@@ -4,10 +4,13 @@
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
6
 
7
+ TRIGGER_PIN = 6
8
+ ECHO_PIN = 7
9
+
7
10
  board = Denko::Board.new(Denko::Connection::Serial.new)
8
- hcsr04 = Denko::Sensor::HCSR04.new(board: board, pins: {trigger: 6, echo: 7})
11
+ hcsr04 = Denko::Sensor::HCSR04.new(board: board, pins: {trigger: TRIGGER_PIN, echo: ECHO_PIN})
9
12
 
10
- hcsr04.poll(0.05) do |distance|
13
+ hcsr04.poll(0.50) do |distance|
11
14
  puts "Distance: #{distance} mm"
12
15
  end
13
16
 
@@ -1,11 +1,12 @@
1
1
  #
2
- # Example using HTU21D sensor over I2C, for temperature and humidity.
2
+ # HTU21D sensor over I2C, for temperature and humidity.
3
3
  #
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
+ require_relative 'neat_tph_readings'
6
7
 
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
- bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
8
+ board = Denko::Board.new(Denko::Connection::Serial.new)
9
+ bus = Denko::I2C::Bus.new(board: board)
9
10
  htu21d = Denko::Sensor::HTU21D.new(bus: bus) # address: 0x40 default
10
11
 
11
12
  # Get and set heater state.
@@ -30,25 +31,13 @@ puts "Temperature resolution: #{htu21d.resolution[:temperature]} bits"
30
31
  puts "Humidity resolution: #{htu21d.resolution[:humidity]} bits"
31
32
  puts
32
33
 
33
- # Take direct readings by calling methods on the HTU21D instance.
34
- # Note: These methods do not take block callbacks like other components.
35
- # The HTU21D class doesn't directly implement polling methods either.
36
- #
37
- puts "Direct Temperature: #{htu21d.read_temperature.round(3)} \xC2\xB0C"
38
- puts "Direct Humidity: #{htu21d.read_humidity.round(3)} %"
39
- puts
40
-
41
- # The last read state can be accessed through sub-objects or [].
42
- puts "Last Temperature: #{htu21d.temperature.fahrenheit.round(3)} \xC2\xB0F"
43
- puts "Last Humidity: #{htu21d[:humidity].round(3)} %"
34
+ htu21d.read
35
+ puts "Temperature unit helpers: #{htu21d.temperature} \xC2\xB0C | #{htu21d.temperature_f} \xC2\xB0F | #{htu21d.temperature_k} K"
44
36
  puts
45
37
 
46
- # Poll temperature and humidity at different rates by calling methods on the sub-objects.
47
- htu21d.temperature.poll(2) do |value|
48
- puts "Sub-Object Temperature: #{value.round(3)} \xC2\xB0C"
49
- end
50
- htu21d.humidity.poll(4) do |value|
51
- puts "Sub-Object Humidity: #{value.round(3)} %"
38
+ # Poll it and print readings.
39
+ htu21d.poll(5) do |reading|
40
+ print_tph_reading(reading)
52
41
  end
53
42
 
54
43
  sleep
@@ -1,12 +1,13 @@
1
1
  #
2
- # Example using HTU31D sensor over I2C, for temperature and humidity.
2
+ # HTU31D sensor over I2C, for temperature and humidity.
3
3
  #
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
+ require_relative 'neat_tph_readings'
6
7
 
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
- bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
9
- sensor = Denko::Sensor::HTU31D.new(bus: bus)
8
+ board = Denko::Board.new(Denko::Connection::Serial.new)
9
+ bus = Denko::I2C::Bus.new(board: board)
10
+ sensor = Denko::Sensor::HTU31D.new(bus: bus) # address: 0x40 default
10
11
 
11
12
  # Get and set heater state.
12
13
  sensor.heater_on
@@ -22,12 +23,9 @@ puts
22
23
 
23
24
  # Resolution goes from 0..3 separately for temperature and humidity. See datasheet.
24
25
  sensor.temperature_resolution = 3
25
- sensor.humidity_resolution = 3
26
-
27
- # Get the shared #print_tph_reading method to print readings neatly.
28
- require_relative 'neat_tph_readings'
26
+ sensor.humidity_resolution = 3
29
27
 
30
- # Unlike HTU21D, HTU31D works as a regular polled sensor.
28
+ # Poll it and print readings.
31
29
  sensor.poll(5) do |reading|
32
30
  print_tph_reading(reading)
33
31
  end
@@ -3,24 +3,30 @@
3
3
  # Give a hash with readings as float values and it prints them neatly.
4
4
  #
5
5
  def print_tph_reading(reading)
6
- # Time
7
- print "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} - "
8
-
6
+ elements = []
7
+
9
8
  # Temperature
10
- formatted_temp = reading[:temperature].to_f.round(2).to_s.ljust(5, '0')
11
- print "Temperature: #{formatted_temp} \xC2\xB0C"
9
+ if reading[:temperature]
10
+ formatted_temp = reading[:temperature].to_f.round(2).to_s.ljust(5, '0')
11
+ elements << "Temperature: #{formatted_temp} \xC2\xB0C"
12
+ end
12
13
 
13
14
  # Pressure
14
15
  if reading[:pressure]
15
- formatted_pressure = (reading[:pressure] / 101325).round(5).to_s.ljust(7, '0')
16
- print " | Pressure #{formatted_pressure} atm"
16
+ formatted_pressure = reading[:pressure].round(2).to_s.ljust(7, '0')
17
+ elements << "Pressure: #{formatted_pressure} Pa"
17
18
  end
18
19
 
19
20
  # Humidity
20
21
  if reading[:humidity]
21
22
  formatted_humidity = reading[:humidity].round(2).to_s.ljust(5, '0')
22
- print " | Humidity #{formatted_humidity} %"
23
+ elements << "Humidity: #{formatted_humidity} %"
23
24
  end
25
+
26
+ return if elements.empty?
27
+
28
+ # Time
29
+ print "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} - "
24
30
 
25
- puts
31
+ puts elements.join(" | ")
26
32
  end
@@ -3,9 +3,10 @@
3
3
  #
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
+ require_relative 'neat_tph_readings'
6
7
 
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
- bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
8
+ board = Denko::Board.new(Denko::Connection::Serial.new)
9
+ bus = Denko::I2C::Bus.new(board: board)
9
10
  sensor = Denko::Sensor::QMP6988.new(bus: bus) # address: 0x70 default
10
11
 
11
12
  # Verify chip_id.
@@ -25,8 +26,8 @@ puts
25
26
  #
26
27
  # High accuracy settings from datasheet, with IIR of 2.
27
28
  sensor.temperature_samples = 2
28
- sensor.pressure_samples = 16
29
- sensor.iir_coefficient = 2
29
+ sensor.pressure_samples = 16
30
+ sensor.iir_coefficient = 2
30
31
 
31
32
  #
32
33
  # Change mode (default: forced_mode)
@@ -42,9 +43,6 @@ sensor.continuous_mode
42
43
  #
43
44
  # sensor.standby_time = 500
44
45
 
45
- # Get the shared #print_tph_reading method to print readings neatly.
46
- require_relative 'neat_tph_readings'
47
-
48
46
  # Poll it and print readings.
49
47
  sensor.poll(5) do |reading|
50
48
  print_tph_reading(reading)
@@ -1,11 +1,11 @@
1
1
  #
2
- # Example using an RCWL-9620 sensor over I2C to measure distance.
2
+ # RCWL-9620 sensor over I2C to measure distance.
3
3
  #
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
6
 
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
- bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
7
+ board = Denko::Board.new(Denko::Connection::Serial.new)
8
+ bus = Denko::I2C::Bus.new(board: board)
9
9
  sensor = Denko::Sensor::RCWL9620.new(bus: bus) # address: 0x57 default
10
10
 
11
11
  sensor.poll(1) do |distance|
@@ -1,11 +1,12 @@
1
1
  #
2
- # Example using SHT30/31/35 sensor over I2C, for temperature and humidity.
2
+ # SHT30/31/35 sensor over I2C, for temperature and humidity.
3
3
  #
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
+ require_relative 'neat_tph_readings'
6
7
 
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
- bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
8
+ board = Denko::Board.new(Denko::Connection::Serial.new)
9
+ bus = Denko::I2C::Bus.new(board: board)
9
10
  sensor = Denko::Sensor::SHT3X.new(bus: bus) # address: 0x44 default
10
11
 
11
12
  # Heater control
@@ -23,9 +24,6 @@ puts
23
24
  # Set repeatability= :low, :medium or :high (default). See datasheet for details.
24
25
  sensor.repeatability = :high
25
26
 
26
- # Get the shared #print_tph_reading method to print readings neatly.
27
- require_relative 'neat_tph_readings'
28
-
29
27
  # Poll it and print readings.
30
28
  sensor.poll(5) do |reading|
31
29
  print_tph_reading(reading)
@@ -0,0 +1,46 @@
1
+ require 'bundler/setup'
2
+ require 'denko'
3
+
4
+ SPI_BIT_BANG_PINS = { clock: 13, input: 12, output: 11 }
5
+ SELECT_PIN = 10
6
+
7
+ board = Denko::Board.new(Denko::Connection::Serial.new)
8
+ bus = Denko::SPI::BitBang.new(board: board, pins: SPI_BIT_BANG_PINS)
9
+
10
+ # Methods so results print neatly. SPI transfers don't block main thread.
11
+ def stop_waiting
12
+ $waiting = false
13
+ end
14
+
15
+ def wait_for_read
16
+ $waiting = true
17
+ sleep 0.001 while $waiting
18
+ end
19
+
20
+ # Create a simple test component class.
21
+ class SPITester
22
+ include Denko::SPI::Peripheral::SinglePin
23
+ end
24
+ spi_tester = SPITester.new(bus: bus, pin: SELECT_PIN)
25
+
26
+ spi_tester.add_callback do |rx_bytes|
27
+ # If MOSI and MISO are connected this should match TEST_DATA.
28
+ # If not, all bytes should be 255.
29
+ puts "Result : #{rx_bytes.inspect}"
30
+ stop_waiting
31
+ end
32
+
33
+ TEST_DATA = [0, 1, 2, 3, 4, 5, 6, 7]
34
+
35
+ # Send and receive same data.
36
+ puts "Tx 8 / Rx 8 : #{TEST_DATA.inspect}"
37
+ spi_tester.spi_transfer(write: TEST_DATA, read: 8)
38
+ wait_for_read
39
+
40
+ puts "Tx 8 / Rx 12: #{TEST_DATA.inspect}"
41
+ spi_tester.spi_transfer(write: TEST_DATA, read: 12)
42
+ wait_for_read
43
+
44
+ puts "Tx 8 / Rx 4 : #{TEST_DATA.inspect}"
45
+ spi_tester.spi_transfer(write: TEST_DATA, read: 4)
46
+ wait_for_read
@@ -1,6 +1,5 @@
1
1
  #
2
- # Example of a Button connected through an input shift register (CD4021B).
3
- # Can be used over either a bit bang or hardware SPI interface.
2
+ # Button connected through input shift register (CD4021B).
4
3
  #
5
4
  require 'bundler/setup'
6
5
  require 'denko'
@@ -13,16 +12,7 @@ REGISTER_SELECT_PIN = 9
13
12
  BUTTON_PIN = 0
14
13
 
15
14
  board = Denko::Board.new(Denko::Connection::Serial.new)
16
-
17
- # 1-way (input) bit bang SPI interface on any pins (slower, but flexible).
18
- bus = Denko::SPI::BitBang.new(board: board, pins: SPI_BIT_BANG_PINS)
19
-
20
- # Use the default hardware SPI bus (faster, but predetermined pins).
21
- # bus = Denko::SPI::Bus.new(board: board)
22
-
23
- # Show the hardware SPI pins to aid connection.
24
- # MOSI = output | MISO = input | SCK = clock
25
- # puts board.map.select { |name, number| [:MOSI, :MISO, :SCK].include?(name) }
15
+ bus = Denko::SPI::BitBang.new(board: board, pins: SPI_BIT_BANG_PINS)
26
16
 
27
17
  # InputRegister needs a bus and its select pin. The CD4021 likes SPI mode 2.
28
18
  # Other options and their defaults:
@@ -33,18 +23,18 @@ bus = Denko::SPI::BitBang.new(board: board, pins: SPI_BIT_BANG_PINS)
33
23
  #
34
24
  register = Denko::SPI::InputRegister.new(bus: bus, pin: REGISTER_SELECT_PIN, spi_mode: 2)
35
25
 
36
- # InputRegister implements enough of the Board interface that digital input
37
- # components can treat it as a Board. Do that with the Button.
26
+ # InputRegister is a BoardProxy, so DigitalInput components can can use
27
+ # it in place of a board. Use it with a Button instance.
38
28
  #
39
- # button starts listening automatically, which triggers register to start listening,
40
- # so it can update button as needed. Registers listen with an 8ms interval by default,
41
- # compared to the 4ms default for a Button directly connected to a Board.
29
+ # button starts listening automatically, which tells register to start listening.
30
+ # On Denko::Board, InputRegisters listen with an 8ms interval by default, compared
31
+ # to 1ms default for a Button directly connected to a Board.
42
32
  #
43
- button = Denko::DigitalIO::Button.new(pin: 0, board: register)
33
+ button = Denko::DigitalIO::Button.new(pin: BUTTON_PIN, board: register)
44
34
 
45
35
  # Button callbacks.
46
36
  button.down { puts "Button pressed" }
47
37
  button.up { puts "Button released" }
48
38
 
49
- # Sleep the main thread. Press the button and callbacks will run.
39
+ # Keep main thread alive.
50
40
  sleep
@@ -12,17 +12,10 @@ REGISTER_SELECT_PIN = 10
12
12
  # LED pin (on register parallel outputs)
13
13
  LED_PIN = 0
14
14
 
15
+ # Works on hardware or bit-bang SPI.
15
16
  board = Denko::Board.new(Denko::Connection::Serial.new)
16
-
17
- # 1-way (output) bit bang SPI interface on any pins (slower, but flexible).
18
- bus = Denko::SPI::BitBang.new(board: board, pins: SPI_BIT_BANG_PINS)
19
-
20
- # Use the default hardware SPI bus (faster, but predetermined pins).
21
17
  # bus = Denko::SPI::Bus.new(board: board)
22
-
23
- # Show the hardware SPI pins to aid connection.
24
- # MOSI = output | MISO = input | SCK = clock
25
- # puts board.map.select { |name, number| [:MOSI, :MISO, :SCK].include?(name) }
18
+ bus = Denko::SPI::BitBang.new(board: board, pins: SPI_BIT_BANG_PINS)
26
19
 
27
20
  # OutputRegister needs a bus and its select pin.
28
21
  # Other options and their defaults:
@@ -30,19 +23,18 @@ bus = Denko::SPI::BitBang.new(board: board, pins: SPI_BIT_BANG_PINS)
30
23
  # spi_frequency: 1000000 - Only affects hardware SPI interfaces
31
24
  # spi_mode: 0
32
25
  # spi_bit_order: :msbfirst
33
- # write_delay: 0.001 - How long to buffer writes, in seconds
34
- # buffer_writes: true - Wait for write_delay before writing whole register state.
35
- # Makes proxied components write pseudo-parallelly.
36
26
  #
37
27
  register = Denko::SPI::OutputRegister.new(bus: bus, pin: REGISTER_SELECT_PIN)
38
28
 
39
- # We can turn the LED on by writing a 1 to the lowest bit (0) of the register.
40
- register.write(0b00000001)
29
+ # Turn the LED on by setting the corresponding register bit to 1, then writing to it.
30
+ register.bit_set(LED_PIN, 1)
31
+ register.write
32
+ sleep 2
41
33
 
42
- # OutputRegister implements enough of the Board interface that digital output
43
- # components can treat it as a Board. Do that with the LED instead.
34
+ # OutputRegister is a BoardProxy, so DigitalOutput components can use
35
+ # it in place of a board. Use it with an LED instance.
44
36
  #
45
- led = Denko::LED.new(board: register, pin: 0)
37
+ led = Denko::LED.new(board: register, pin: LED_PIN)
46
38
 
47
39
  # Blink the LED and sleep the main thread.
48
40
  led.blink 0.5
@@ -0,0 +1,28 @@
1
+ #
2
+ # SevenSegment LED driven though a pair of daisy chained OutputRegisters
3
+ # (74HC595), with some segments on each register.
4
+ #
5
+ require 'bundler/setup'
6
+ require 'denko'
7
+
8
+ # SPI pins (on board)
9
+ SPI_BIT_BANG_PINS = { clock: 13, output: 11 }
10
+ REGISTER_SELECT_PIN = 10
11
+
12
+ # SevenSegment pins (on registers' parallel outputs)
13
+ SEVEN_SEGMENT_PINS = { cathode: 14, a: 10, b: 9, c: 4, d: 2, e: 1, f: 12, g: 13 }
14
+
15
+ board = Denko::Board.new(Denko::Connection::Serial.new)
16
+ bus = Denko::SPI::BitBang.new(board: board, pins: SPI_BIT_BANG_PINS)
17
+
18
+ # Model as one 2-byte (16-bit) OutputRegister, since they're daisy chained.
19
+ # Bit numbering starts at the first register, so bit 0 of the second register
20
+ # is bit 8 of the OutputRegister instance.
21
+ register = Denko::SPI::OutputRegister.new(bus: bus, pin: REGISTER_SELECT_PIN, bytes: 2)
22
+ ssd = Denko::LED::SevenSegment.new(board: register, pins: SEVEN_SEGMENT_PINS)
23
+
24
+ # Turn off the ssd on exit.
25
+ trap("SIGINT") { exit !ssd.off }
26
+
27
+ # Type a character and press Enter to show it on the SevenSegment LED.
28
+ loop { ssd.display(gets.chomp) }
@@ -1,6 +1,6 @@
1
1
  #
2
- # Example of 2 SPI devices on the same bus with different select pins.
3
- # Combination of input_register.rb and output_register.rb
2
+ # 2 SPI registers (74HC595 and CD4021B) on the same bus, both acting as
3
+ # BoardProxies for their Subcomponents.
4
4
  #
5
5
  require 'bundler/setup'
6
6
  require 'denko'
@@ -11,36 +11,30 @@ OUT_REGISTER_SELECT = 10
11
11
  IN_REGISTER_SELECT = 9
12
12
 
13
13
  # LED and Button pins (on their respective registers' parallel pins)
14
- LED_PIN = 0
15
- BUTTON_PIN = 0
14
+ LED_PIN = 0
15
+ BUTTON_PIN = 0
16
16
 
17
- board = Denko::Board.new(Denko::Connection::Serial.new)
18
-
19
- # 2-way bit bang SPI bus (slower, but use any pins).
20
- bus = Denko::SPI::BitBang.new(board: board, pins: SPI_BIT_BANG_PINS)
21
-
22
- # Use the default hardware SPI bus (faster, but predetermined pins).
23
- # bus = Denko::SPI::Bus.new(board: board)
24
-
25
- # Show the hardware SPI pins to aid connection.
26
- # MOSI = output | MISO = input | SCK = clock
27
- # puts board.map.select { |name, number| [:MOSI, :MISO, :SCK].include?(name) }
28
-
29
- # OutputRegister needs a bus and its select pin.
17
+ board = Denko::Board.new(Denko::Connection::Serial.new)
18
+ bus = Denko::SPI::BitBang.new(board: board, pins: SPI_BIT_BANG_PINS)
30
19
  out_register = Denko::SPI::OutputRegister.new(bus: bus, pin: OUT_REGISTER_SELECT)
31
-
32
- # InputRegister needs a bus and its select pin. The CD4021 likes SPI mode 2.
33
- in_register = Denko::SPI::InputRegister.new(bus: bus, pin: IN_REGISTER_SELECT, spi_mode: 2)
20
+ in_register = Denko::SPI::InputRegister.new(bus: bus, pin: IN_REGISTER_SELECT, spi_mode: 2)
34
21
 
35
22
  # LED connected to the output register.
36
- led = Denko::LED.new(board: out_register, pin: LED_PIN)
23
+ led = Denko::LED.new(board: out_register, pin: LED_PIN)
37
24
 
38
25
  # Button connected to the input register.
39
26
  button = Denko::DigitalIO::Button.new(board: in_register, pin: BUTTON_PIN)
40
27
 
41
28
  # Button callbacks.
42
- button.down { led.on; puts "Button pressed" }
43
- button.up { led.off; puts "Button released" }
29
+ button.down do
30
+ led.on
31
+ puts "Button pressed"
32
+ end
33
+
34
+ button.up do
35
+ led.off
36
+ puts "Button released"
37
+ end
44
38
 
45
- # Sleep the main thread. Press the button and callbacks will run.
39
+ # Keep main thread alive.
46
40
  sleep
@@ -0,0 +1,25 @@
1
+ #
2
+ # Bit-bang UART is only used on the Arduino UNO / ATmega328p, because it has no
3
+ # extra hardware UARTs. This also makes a self-loopback test impossible. Connect a
4
+ # second board (Arduino Mega) and use its UART1 to verify bit-bang works on the Uno.
5
+ #
6
+ require 'bundler/setup'
7
+ require 'denko'
8
+
9
+ uno = Denko::Board.new(Denko::Connection::Serial.new(device: "/dev/cu.usbserial-1450"))
10
+ mega = Denko::Board.new(Denko::Connection::Serial.new(device: "/dev/cu.usbmodem14101"))
11
+
12
+ mega_uart1 = Denko::UART::Hardware.new(board: mega, index: 1, baud: 31250)
13
+ uno_bb_uart = Denko::UART::BitBang.new(board: uno, pins: { rx:10, tx:11 }, baud: 31250)
14
+
15
+ # Write to Uno, read from Mega
16
+ uno_bb_uart.write("Hello World!\n")
17
+ sleep 0.5
18
+ line = mega_uart1.gets
19
+ puts "Mega received from Uno: #{line}"
20
+
21
+ # Write to Uno, read from Mega
22
+ mega_uart1.write("Goodbye World!\n")
23
+ sleep 0.5
24
+ line = uno_bb_uart.gets
25
+ puts "Uno received from Mega: #{line}"