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
@@ -5,40 +5,24 @@
5
5
  require 'bundler/setup'
6
6
  require 'denko'
7
7
 
8
- # Method to let the user set I2C pins.
9
- def enter_pins
10
- puts "Please manually specify I2C pins..."
11
- print "I2C SDA pin: "; sda = gets
12
- print "I2C SCL pin: "; scl = gets
13
- puts
14
- [sda.to_i, scl.to_i]
15
- end
16
-
17
8
  board = Denko::Board.new(Denko::Connection::Serial.new)
18
9
 
19
- # If no board map, ask user to set pins manually.
20
- unless board.map
21
- puts "Error: Pin map not available for this board"
22
- sda, scl = enter_pins
23
-
24
- # Else get defaults from map.
25
- else
10
+ # If board has a map, show the pins to the user.
11
+ if board.map
26
12
  puts "Detected board: #{board.name}"
27
-
28
13
  sda = board.map[:SDA] || board.map[:SDA0]
29
14
  scl = board.map[:SCL] || board.map[:SCL0]
30
-
31
- # If not in map, ask user to set manually.
32
- unless sda && scl
33
- puts "Error: I2C pins not found in this board's pin map"
34
- sda, scl = enter_pins
35
- end
15
+ puts "Using default I2C interface on pins #{sda} (SDA) and #{scl} (SCL)"
16
+ else
17
+ puts "Pin map not available for this board. Using default interface, but SCL and SDA pins unknown"
36
18
  end
37
-
38
- puts "Using I2C interface on pins #{sda} (SDA) and #{scl} (SCL)"
39
19
  puts
40
20
 
41
- bus = Denko::I2C::Bus.new(board: board, pin: sda)
21
+ # Board's hardware I2C interface on predetermined pins.
22
+ bus = Denko::I2C::Bus.new(board: board)
23
+ # Bit-banged I2C on any pins.
24
+ # bus = Denko::I2C::BitBang.new(board: board, pins: {scl: 8, sda: 9})
25
+
42
26
  bus.search
43
27
 
44
28
  if bus.found_devices.empty?
@@ -15,10 +15,9 @@ PIXELS = 8
15
15
  # Move along the strip and back, one pixel at a time.
16
16
  positions = (0..PIXELS-1).to_a + (1..PIXELS-2).to_a.reverse
17
17
 
18
- board = Denko::Board.new(Denko::Connection::Serial.new)
19
-
20
18
  # Use the default hardware SPI bus.
21
- bus = Denko::SPI::Bus.new(board: board)
19
+ board = Denko::Board.new(Denko::Connection::Serial.new)
20
+ bus = Denko::SPI::Bus.new(board: board)
22
21
  strip = Denko::LED::APA102.new(bus: bus, length: PIXELS)
23
22
 
24
23
  loop do
@@ -27,7 +26,7 @@ loop do
27
26
  strip.clear
28
27
  strip[index] = color
29
28
  strip.show
30
- sleep 0.05
29
+ sleep 0.025
31
30
  end
32
31
  end
33
32
  end
@@ -0,0 +1,44 @@
1
+ #
2
+ # Fade test for APA102 LED strip.
3
+ #
4
+ require 'bundler/setup'
5
+ require 'denko'
6
+
7
+ RED = [255, 0, 0]
8
+ GREEN = [0, 255, 0]
9
+ BLUE = [0, 0, 255]
10
+ WHITE = [255, 255, 255]
11
+ COLORS = [RED, GREEN, BLUE, WHITE]
12
+ PIXELS = 4
13
+
14
+ # Get all the brightness values as an array.
15
+ brightness_steps = (0..31).to_a + (1..30).to_a.reverse
16
+
17
+ # Use the default hardware SPI bus.
18
+ board = Denko::Board.new(Denko::Connection::Serial.new)
19
+ bus = Denko::SPI::Bus.new(board: board)
20
+ strip = Denko::LED::APA102.new(bus: bus, length: PIXELS)
21
+
22
+ strip[0] = RED
23
+ strip[1] = GREEN
24
+ strip[2] = BLUE
25
+ strip[3] = WHITE
26
+
27
+ # Fade all 4 in sync using global brightness control.
28
+ brightness_steps.each do |value|
29
+ strip.brightness = value
30
+ strip.show
31
+ sleep 0.05
32
+ end
33
+
34
+ # Set 4th pixel back to full brightness white.
35
+ strip[3] = WHITE + [31]
36
+
37
+ # Fade per-pixel, in different directions.
38
+ brightness_steps.cycle do |value|
39
+ strip[0] = RED + [value]
40
+ strip[1] = GREEN + [31 - value]
41
+ strip[2] = BLUE + [value]
42
+ strip.show
43
+ sleep 0.025
44
+ end
@@ -4,8 +4,10 @@
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
6
 
7
+ PIN = :LED_BUILTIN
8
+
7
9
  board = Denko::Board.new(Denko::Connection::Serial.new)
8
- led = Denko::LED.new(board: board, pin: :LED_BUILTIN)
10
+ led = Denko::LED.new(board: board, pin: PIN)
9
11
 
10
12
  led.blink 0.5
11
13
 
@@ -0,0 +1,19 @@
1
+ #
2
+ # Blink example for standard built-in LEDs named :LED_BUILTIN
3
+ #
4
+ require 'bundler/setup'
5
+ require 'denko'
6
+
7
+ PIN = :LED_BUILTIN
8
+
9
+ board = Denko::Board.new(Denko::Connection::Serial.new)
10
+ led = Denko::LED.new(board: board, pin: PIN)
11
+
12
+ min = 0
13
+ max = 100
14
+ values = (min..max).to_a + (min..max-1).to_a.reverse
15
+
16
+ values.cycle do |value|
17
+ led.duty = value
18
+ sleep 0.005
19
+ end
@@ -0,0 +1,31 @@
1
+ #
2
+ # A standard 3 pin RGB LED (not single pin addressable), on 3 PWM pins.
3
+ #
4
+ require 'bundler/setup'
5
+ require 'denko'
6
+
7
+ RED_PIN = 11
8
+ GREEN_PIN = 10
9
+ BLUE_PIN = 9
10
+
11
+ board = Denko::Board.new(Denko::Connection::Serial.new)
12
+ rgb_led = Denko::LED::RGB.new board: board,
13
+ pins: {red: RED_PIN, green: GREEN_PIN, blue: BLUE_PIN}
14
+
15
+ # Set these predefined colors with symbols.
16
+ [:red, :green, :blue, :cyan, :yellow, :magenta, :white, :off].each do |color|
17
+ rgb_led.color = color
18
+ sleep 0.5
19
+ end
20
+
21
+ # Set duty cycle for each "sub LED".
22
+ loop do
23
+ rgb_led.red.duty = 100
24
+ rgb_led.green.duty = 50
25
+ rgb_led.blue.duty = 0
26
+ sleep 0.5
27
+ rgb_led.red.duty = 100
28
+ rgb_led.green.duty = 0
29
+ rgb_led.blue.duty = 50
30
+ sleep 0.5
31
+ end
@@ -1,12 +1,14 @@
1
1
  #
2
- # This is an example of how to use the ssd class
2
+ # Echo pressed keys to a seven segment LED.
3
3
  #
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
6
 
7
+ PINS = { cathode: 10, a: 3, b: 4, c: 5, d: 6, e: 7, f: 8, g: 9 }
8
+
7
9
  board = Denko::Board.new(Denko::Connection::Serial.new)
8
10
  ssd = Denko::LED::SevenSegment.new board: board,
9
- pins: { cathode: 10, a: 3, b: 4, c: 5, d: 6, e: 7, f: 8, g: 9 }
11
+ pins: PINS
10
12
 
11
13
  # Turn off the ssd on exit
12
14
  trap("SIGINT") { exit !ssd.off }
@@ -1,24 +1,22 @@
1
1
  #
2
- # Walk a single pixel along the length of a WS2812 strip and back,
3
- # changing color each time it returns to position 0.
2
+ # Walk a pixel along a WS2812 strip and back, changing color each loop.
4
3
  #
5
4
  require 'bundler/setup'
6
5
  require 'denko'
7
6
 
7
+ PIN = 4
8
+ PIXELS = 8
9
+
8
10
  RED = [255, 0, 0]
9
11
  GREEN = [0, 255, 0]
10
12
  BLUE = [0, 0, 255]
11
13
  WHITE = [255, 255, 255]
12
14
  COLORS = [RED, GREEN, BLUE, WHITE]
13
15
 
14
- WS2812_PIN = 4
15
- PIXELS = 8
16
-
17
- # Move along the strip and back, one pixel at a time.
18
16
  positions = (0..PIXELS-1).to_a + (1..PIXELS-2).to_a.reverse
19
17
 
20
18
  board = Denko::Board.new(Denko::Connection::Serial.new)
21
- strip = Denko::LED::WS2812.new(board: board, pin: WS2812_PIN, length: PIXELS)
19
+ strip = Denko::LED::WS2812.new(board: board, pin: PIN, length: PIXELS)
22
20
 
23
21
  loop do
24
22
  COLORS.each do |color|
@@ -5,11 +5,12 @@
5
5
  require 'bundler/setup'
6
6
  require 'denko'
7
7
 
8
+ PIN = :LED_BUILTIN
8
9
  WHITE = [255, 255, 255]
9
- OFF = [0, 0, 0]
10
+ OFF = [0, 0, 0]
10
11
 
11
12
  board = Denko::Board.new(Denko::Connection::Serial.new)
12
- strip = Denko::LED::WS2812.new(board: board, pin: :LED_BUILTIN, length: 1)
13
+ strip = Denko::LED::WS2812.new(board: board, pin: PIN, length: 1)
13
14
 
14
15
  loop do
15
16
  strip[0] = WHITE
@@ -0,0 +1,43 @@
1
+ #
2
+ # Fade colors along a WS2812, and over time.
3
+ #
4
+ require 'bundler/setup'
5
+ require 'denko'
6
+
7
+ PIN = 4
8
+ PIXELS = 8
9
+
10
+ board = Denko::Board.new(Denko::Connection::Serial.new)
11
+ strip = Denko::LED::WS2812.new(board: board, pin: PIN, length: PIXELS)
12
+
13
+ min = 0
14
+ max = 255
15
+ gap = 5
16
+ values = (min..max).step(gap).to_a + (min..max-gap).step(gap).to_a.reverse
17
+
18
+ color_values= []
19
+ # Red
20
+ values.each { |v| color_values << [v, 0, 0] }
21
+ # Green
22
+ values.each { |v| color_values << [0, v, 0] }
23
+ # Blue
24
+ values.each { |v| color_values << [0, 0, v] }
25
+ # White
26
+ values.each { |v| color_values << [v, v, v] }
27
+
28
+ loop do
29
+ start = 0
30
+ finish = PIXELS - 1
31
+ while (finish < color_values.length)
32
+ slice = color_values[start..finish]
33
+
34
+ slice.each_with_index do |value, i|
35
+ strip[i] = value
36
+ end
37
+ strip.show
38
+ sleep 0.025
39
+
40
+ start += 1
41
+ finish += 1
42
+ end
43
+ end
@@ -1,27 +1,29 @@
1
1
  #
2
- # Example driving a DC motor with a L298 H-Bridge driver.
2
+ # Drive a DC motor with the L298 H-Bridge driver.
3
3
  #
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
6
  board = Denko::Board.new(Denko::Connection::Serial.new)
7
7
 
8
+ PINS = { direction1: 8, direction2: 9, enable: 10 }
9
+
8
10
  # This is only 1 channel of the driver. Make a new object for each channel.
9
- motor = Denko::Motor::L298.new board: board, pins: {direction1: 8, direction2: 9, enable: 10}
11
+ motor = Denko::Motor::L298.new(board: board, pins: PINS)
10
12
 
11
13
  # Off without braking (initial state).
12
14
  # motor.off
13
15
  # motor.idle
14
16
 
15
17
  # Go forward at half speed for a while.
16
- motor.forward board.pwm_high / 2
18
+ motor.forward(50)
17
19
  sleep 2
18
20
 
19
21
  # Change direction.
20
- motor.reverse board.pwm_high / 2
22
+ motor.reverse(50)
21
23
  sleep 2
22
24
 
23
25
  # Speed up without changing direction.
24
- motor.speed = board.pwm_high
26
+ motor.speed = 100
25
27
  sleep 2
26
28
 
27
29
  # Brake to stop quickly.
@@ -29,13 +31,13 @@ motor.brake
29
31
  sleep 1
30
32
 
31
33
  # Change from brake to forward, but 0 speed.
32
- motor.forward 0
34
+ motor.forward(0)
33
35
  sleep 1
34
36
 
35
- # Gradually speed up.
37
+ # Speed up in 5% increments.
36
38
  (1..20).each do |step|
37
39
  sleep 0.5
38
- motor.speed = (board.pwm_high * (step / 20.0)).round
40
+ motor.speed = step * 5
39
41
  end
40
42
 
41
43
  # Turn it off.
@@ -4,13 +4,14 @@
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
6
 
7
+ PIN = 9
8
+
7
9
  board = Denko::Board.new(Denko::Connection::Serial.new)
8
- servo = Denko::Motor::Servo.new(pin: 9, board: board)
10
+ servo = Denko::Motor::Servo.new(board: board, pin: PIN)
9
11
 
10
12
  # Add different angles (in degrees) to the array below to try out your servo.
11
13
  # Note: Some servos may not have a full 180 degree sweep.
12
-
13
- [0, 90].cycle do |angle|
14
+ [0, 90, 180, 90].cycle do |angle|
14
15
  servo.position = angle
15
16
  sleep 0.5
16
17
  end
@@ -1,34 +1,34 @@
1
1
  #
2
- # Example driving a stepper motor with the EasyDriver board: https://www.sparkfun.com/products/10267?
2
+ # Use a stepper motor with the EasyDriver board: https://www.sparkfun.com/products/12779
3
3
  #
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
6
 
7
+ PINS = { slp: 6, enable: 7, direction: 8, step: 10, ms1: 11, ms2: 12 }
8
+
7
9
  board = Denko::Board.new(Denko::Connection::Serial.new)
8
- stepper = Denko::Motor::Stepper.new board: board,
9
- pins: { slp: 6, enable: 7, direction: 8, step: 10, ms1: 11, ms2: 12 }
10
-
11
- # Default is 8 microsteps. Set to 2 so we can move faster.
10
+ stepper = Denko::Motor::Stepper.new(board: board, pins: PINS)
11
+
12
+ # Default is 8 microsteps. Use 2 to move faster.
12
13
  stepper.microsteps = 2
13
14
 
14
15
  # 400 steps is now 1 revolution for a 200 step motor.
15
16
  400.times do
16
- stepper.step_cc
17
+ stepper.step_ccw
17
18
  sleep 0.002
18
19
  end
19
20
 
20
- # Sleep the driver chip and wait a while.
21
+ # Sleep the driver and wait a while.
21
22
  stepper.sleep
22
23
  sleep 1
23
24
 
24
- # Wake it up and set to full steps.
25
+ # Wake it up and set to full steps.
25
26
  stepper.wake
26
27
  stepper.microsteps = 1
27
28
 
28
29
  #
29
- # Now 200 steps the other way will move us back to the start.
30
- # Note the longer sleep here since the steps are bigger.
31
- # Adjust both sleep vales to suit your motor.
30
+ # Now 200 steps the other way will return to the start.
31
+ # Longer sleep times to match bigger steps. Adjust for your motor.
32
32
  #
33
33
  200.times do
34
34
  stepper.step_cw
@@ -38,6 +38,6 @@ end
38
38
  # Sleep the driver once we're done.
39
39
  stepper.sleep
40
40
 
41
- # We write to the board asynchronously.
42
- # Make sure we send all step commands before exit.
41
+ # Writing to the board is done asynchronously.
42
+ # Make sure all commands are written before exit.
43
43
  board.finish_write
@@ -0,0 +1,32 @@
1
+ #
2
+ # Search a 1-Wire bus.
3
+ #
4
+ require 'bundler/setup'
5
+ require 'denko'
6
+
7
+ PIN = 4
8
+
9
+ board = Denko::Board.new(Denko::Connection::Serial.new)
10
+ bus = Denko::OneWire::Bus.new(board: board, pin: PIN)
11
+
12
+ # Call #device_present to reset the bus and return presence pulse as a boolean.
13
+ if bus.device_present?
14
+ puts "Devices present on bus..."; puts
15
+ else
16
+ puts "No devices present on bus... Quitting..."
17
+ return
18
+ end
19
+
20
+ # The bus detects parasite power automatically when initialized.
21
+ # It can tell that parasite power is in use, but not by WHICH devices.
22
+ if bus.parasite_power
23
+ puts "Parasite power detected..."; puts
24
+ end
25
+
26
+ # Calling #search finds connected devices and stores them in #found_devices.
27
+ # Each hash contains a device's ROM address and matching Ruby class if one exists.
28
+ bus.search
29
+ count = bus.found_devices.count
30
+ puts "Found #{count} device#{'s' if count > 1} on the bus:"
31
+
32
+ puts bus.found_devices.inspect
@@ -4,8 +4,10 @@
4
4
  require 'bundler/setup'
5
5
  require 'denko'
6
6
 
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
- buzzer = Denko::PulseIO::Buzzer.new(board: board, pin: 9)
7
+ PIN = 9
8
+
9
+ board = Denko::Board.new(Denko::Connection::Serial.new)
10
+ buzzer = Denko::PulseIO::Buzzer.new(board: board, pin: PIN)
9
11
 
10
12
  C4 = 262
11
13
  D4 = 294
@@ -17,13 +19,16 @@ notes = [
17
19
  [E4, 1], [D4, 1], [C4, 1], [D4, 1], [E4, 1], [E4, 1], [E4, 1], [E4, 1],
18
20
  [D4, 1], [D4, 1], [E4, 1], [D4, 1], [C4, 4],
19
21
  ]
20
-
22
+
21
23
  bpm = 240
22
24
  beat_time = 60.to_f / bpm
23
25
 
24
26
  notes.each do |note|
25
27
  buzzer.tone(note[0])
26
28
  sleep note[1] * beat_time
29
+
30
+ # Stop for a bit so notes are properly defined.
31
+ buzzer.stop; sleep 0.010
27
32
  end
28
33
 
29
34
  buzzer.stop
@@ -0,0 +1,51 @@
1
+ #
2
+ # Test of the IROutput (infrared transmitter) class.
3
+ # The specific NEC code is one taken from the Arduino example:
4
+ # https://github.com/Arduino-IRremote/Arduino-IRremote/tree/master/examples/SendDemo
5
+ #
6
+ # To test your emitter works, flash the recieve sketch on a second board:
7
+ # https://github.com/Arduino-IRremote/Arduino-IRremote/tree/master/examples/ReceiveDemo
8
+ # Attach an IR receiver to the receive pin (2 for Atmel AVR) and observe its serial output.
9
+ #
10
+ # If you don't have 2 boards, use that sketch to capture a code from a remote.
11
+ # Copy the raw code (list of numbers in curly braces) and modify into a Ruby array.
12
+ # Put denko firmare back on your board, then test if the IR code operates your device.
13
+ #
14
+ # IR codes are also available from sites like:
15
+ # https://github.com/zmoteio/irdb.tk
16
+ # If formatted numbers with + and - prepended, you need to convert into a Ruby array first.
17
+ #
18
+ require 'bundler/setup'
19
+ require 'denko'
20
+
21
+ PIN = 4
22
+
23
+ # Note: If testing with 2 boards on one computer, be explicit about which serial device
24
+ # runs denko. Use the second Serial.new call below and modify device: as needed.
25
+ # Monitor the receiver board in the Arduino (or some other) serial monitor.
26
+ #
27
+ connection = Denko::Connection::Serial.new
28
+ # connection = Denko::Connection::Serial.new(device: "/dev/ttyACM0")
29
+ board = Denko::Board.new(connection)
30
+
31
+ #
32
+ # Infrared can be used on most pins for most boards, but there might be conflicts
33
+ # with other hardware or libraries. Try different pins. For more info:
34
+ # https://github.com/Arduino-IRremote/Arduino-IRremote?#timer-and-pin-usage
35
+ #
36
+ ir = Denko::PulseIO::IROutput.new(board: board, pin: PIN)
37
+
38
+ # NEC Raw-Data=0xF708FB04. LSBFIRST, so the binary for each hex digit below is backward.
39
+ code = [ 9000, 4500, # Start bit
40
+ 560, 560, 560, 560, 560, 1690, 560, 560, # 0010 0x4 command
41
+ 560, 560, 560, 560, 560, 560, 560, 560, # 0000 0x0 command
42
+ 560, 1690, 560, 1690, 560,560, 560, 1690, # 1101 0xB command inverted
43
+ 560, 1690, 560, 1690, 560, 1690, 560, 1690, # 1111 0xF command inverted
44
+ 560, 560, 560, 560, 560, 560, 560, 1690, # 0001 0x8 address
45
+ 560, 560, 560, 560, 560, 560, 560, 560, # 0000 0x0 address
46
+ 560, 1690, 560, 1690, 560, 1690, 560, 560, # 1110 0x7 address inverted
47
+ 560, 1690, 560, 1690, 560, 1690, 560, 1690, # 1111 0xF address inverted
48
+ 560] # Stop bit
49
+
50
+ ir.write(code)
51
+ board.finish_write
@@ -0,0 +1,30 @@
1
+ #
2
+ # PWM (pulse width modulation) output demo.
3
+ # Frequency and resolution are configurable (only on ESP32 and PiBoard/Linux for now).
4
+ # Capture output with logic analyzer or oscilloscope to verify accuracy.
5
+ #
6
+ require 'bundler/setup'
7
+ require 'denko'
8
+
9
+ PIN = 2
10
+
11
+ board = Denko::Board.new(Denko::Connection::Serial.new)
12
+ pwm = Denko::PulseIO::PWMOutput.new(board: board, pin: PIN)
13
+
14
+ # Resolution test: ~1% duty at 1 kHz / 10-bit.
15
+ # On and off approx. 10us and 990us respectively.
16
+ pwm.pwm_enable(frequency: 1_000, resolution: 10)
17
+ pwm.write 10 # of 1023
18
+ sleep 0.5
19
+ pwm.digital_write 0
20
+
21
+ sleep 0.5
22
+
23
+ # Frequency test: ~50% duty at 10 kHz / 8-bit.
24
+ # On and off both approx. 50us.
25
+ pwm.pwm_enable(frequency: 10_000, resolution: 8)
26
+ pwm.write 127 # of 255
27
+ sleep 0.5
28
+ pwm.digital_write 0
29
+
30
+ board.finish_write
@@ -1,48 +1,31 @@
1
1
  #
2
- # Example using a D3231 real-time-clock over I2C. Sets the time and reads it
3
- # back every 5 seconds.
2
+ # D3231 real-time-clock over I2C. Set time and read back every 5 seconds.
4
3
  #
5
4
  require 'bundler/setup'
6
5
  require 'denko'
7
6
 
8
7
  board = Denko::Board.new(Denko::Connection::Serial.new)
9
-
10
- #
11
- # Default pins for the I2C0 (first) interface on most chips:
12
- #
13
- # ATmega 328p: SDA = 'A4' SCL = 'A5' - Arduino Uno, Nano
14
- # ATmega 32u4: SDA = 2 SCL = 3 - Arduino Leonardo, Pro Micro
15
- # ATmega1280 / 2560: SDA = 20 SCL = 21 - Arduino Mega
16
- # SAM3X8E: SDA = 20 SCL = 21 - Arduino Due
17
- # SAMD21G18: SDA = 20 SCL = 21 - Arduino Zero, M0, M0 Pro
18
- # ESP8266: SDA = 4 SCL = 5
19
- # ESP32: SDA = 21 SCL = 22
20
- # RP2040: SDA = 4 SCL = 5 - Raspberry Pi Pico (W)
21
- #
22
- # Only give the SDA pin of the I2C bus. SCL (clock) pin must be
23
- # connected for it to work, but we don't need to control it.
24
- #
25
- bus = Denko::I2C::Bus.new(board: board, pin: 'A4')
8
+ i2c = Denko::I2C::Bus.new(board: board) # address: 0x68 default
26
9
 
27
10
  # Tell the bus to search for devices.
28
- bus.search
11
+ i2c.search
12
+
13
+ if i2c.found_devices.empty?
14
+ puts "No I2C devices connected!"
15
+ return
16
+ end
29
17
 
30
- # Show the found devices.
31
- puts "No I2C devices connected!" if bus.found_devices.empty?
32
- bus.found_devices.each do |address|
33
- puts "I2C device connected with address: 0x#{address.to_s(16)}"
18
+ # 0x68 is the I2C address for most real time clocks.
19
+ unless (i2c.found_devices.include? 0x68)
20
+ puts "DS3231 real time clock not found!"
21
+ return
34
22
  end
35
23
 
36
- # 0x68 or 140 is the I2C address for most real time clocks.
37
- unless (bus.found_devices.include? 0x68)
38
- puts "No real time clock found!" unless bus.found_devices.empty?
39
- else
40
- puts; puts "Using real time clock at address 0x68"; puts
41
- rtc = Denko::RTC::DS3231.new(bus: bus, address: 0x68)
42
- rtc.time = Time.now
24
+ puts "Using DS3231 RTC at address 0x68"; puts
25
+ rtc = Denko::RTC::DS3231.new(bus: i2c, address: 0x68)
26
+ rtc.time = Time.now
43
27
 
44
- 5.times do
45
- puts rtc.time
46
- sleep 5
47
- end
28
+ 5.times do
29
+ puts rtc.time
30
+ sleep 5
48
31
  end
@@ -1,16 +1,14 @@
1
1
  #
2
- # Example using AHT21 sensor over I2C, for temperature and humidity.
2
+ # AHT10 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::AHT10.new(bus: bus) # address: 0x38 default
10
11
 
11
- # Get the shared #print_tph_reading method to print readings neatly.
12
- require_relative 'neat_tph_readings'
13
-
14
12
  # Poll it and print readings.
15
13
  sensor.poll(5) do |reading|
16
14
  print_tph_reading(reading)
@@ -1,16 +1,14 @@
1
1
  #
2
- # Example using AHT21 sensor over I2C, for temperature and humidity.
2
+ # AHT21 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::AHT20.new(bus: bus) # address: 0x38 default
10
11
 
11
- # Get the shared #print_tph_reading method to print readings neatly.
12
- require_relative 'neat_tph_readings'
13
-
14
12
  # Poll it and print readings.
15
13
  sensor.poll(5) do |reading|
16
14
  print_tph_reading(reading)