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
@@ -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}"