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
@@ -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)