denko 0.14.0 → 0.15.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 (344) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build_atmega_avr.yml +2 -1
  3. data/.github/workflows/build_atmega_megaavr.yml +2 -1
  4. data/.github/workflows/build_atsam3x.yml +1 -0
  5. data/.github/workflows/build_atsamd21.yml +2 -1
  6. data/.github/workflows/build_esp32.yml +4 -2
  7. data/.github/workflows/build_esp32c3.yml +4 -3
  8. data/.github/workflows/build_esp32c6.yml +4 -2
  9. data/.github/workflows/build_esp32h2.yml +4 -2
  10. data/.github/workflows/build_esp32s2.yml +4 -2
  11. data/.github/workflows/build_esp32s3.yml +4 -2
  12. data/.github/workflows/build_esp8266.yml +2 -1
  13. data/.github/workflows/build_ra4m1.yml +1 -0
  14. data/.github/workflows/build_rp2040.yml +4 -3
  15. data/.github/workflows/ruby.yml +1 -1
  16. data/CHANGELOG.md +203 -0
  17. data/DEPS_CLI.md +16 -16
  18. data/DEPS_IDE.md +31 -30
  19. data/MICROCONTROLLERS.md +103 -0
  20. data/PERIPHERALS.md +178 -0
  21. data/README.md +28 -21
  22. data/denko.gemspec +6 -1
  23. data/lib/denko/analog_io/ads1118.rb +5 -5
  24. data/lib/denko/analog_io/ads111x.rb +23 -19
  25. data/lib/denko/analog_io/joystick.rb +87 -0
  26. data/lib/denko/analog_io/potentiometer.rb +1 -5
  27. data/lib/denko/analog_io.rb +22 -8
  28. data/lib/denko/behaviors/bus_controller.rb +2 -1
  29. data/lib/denko/behaviors/bus_peripheral.rb +1 -1
  30. data/lib/denko/behaviors/callbacks.rb +18 -16
  31. data/lib/denko/behaviors/component.rb +0 -4
  32. data/lib/denko/behaviors/lifecycle.rb +1 -1
  33. data/lib/denko/behaviors/listener.rb +9 -3
  34. data/lib/denko/behaviors/multi_pin.rb +4 -6
  35. data/lib/denko/behaviors/poller.rb +11 -2
  36. data/lib/denko/behaviors/reader.rb +109 -21
  37. data/lib/denko/behaviors/single_pin.rb +2 -4
  38. data/lib/denko/behaviors/state.rb +18 -13
  39. data/lib/denko/behaviors/threaded.rb +19 -8
  40. data/lib/denko/behaviors.rb +36 -23
  41. data/lib/denko/board/eeprom.rb +1 -1
  42. data/lib/denko/board/i2c.rb +1 -1
  43. data/lib/denko/board/i2c_bit_bang.rb +9 -5
  44. data/lib/denko/board/map.rb +6 -2
  45. data/lib/denko/board/one_wire.rb +3 -3
  46. data/lib/denko/board/spi.rb +30 -30
  47. data/lib/denko/board/spi_bit_bang.rb +8 -11
  48. data/lib/denko/board.rb +6 -3
  49. data/lib/denko/connection/flow_control.rb +1 -1
  50. data/lib/denko/connection/serial.rb +5 -5
  51. data/lib/denko/digital_io/output.rb +12 -4
  52. data/lib/denko/digital_io/pcf8574.rb +114 -0
  53. data/lib/denko/digital_io/rotary_encoder.rb +10 -6
  54. data/lib/denko/digital_io.rb +24 -6
  55. data/lib/denko/display/canvas.rb +350 -157
  56. data/lib/denko/display/font/bmp_5x7.rb +142 -0
  57. data/lib/denko/display/font/bmp_6x8.rb +142 -0
  58. data/lib/denko/display/font/bmp_8x16.rb +141 -0
  59. data/lib/denko/display/font.rb +22 -0
  60. data/lib/denko/display/hd44780.rb +24 -20
  61. data/lib/denko/display/il0373.rb +186 -0
  62. data/lib/denko/display/mono_oled.rb +193 -0
  63. data/lib/denko/display/pcd8544.rb +154 -0
  64. data/lib/denko/display/pixel_common.rb +83 -0
  65. data/lib/denko/display/sh1106.rb +17 -21
  66. data/lib/denko/display/sh1107.rb +10 -0
  67. data/lib/denko/display/spi_common.rb +35 -0
  68. data/lib/denko/display/spi_epaper_common.rb +30 -0
  69. data/lib/denko/display/ssd1306.rb +6 -228
  70. data/lib/denko/display/ssd1680.rb +14 -0
  71. data/lib/denko/display/ssd1681.rb +8 -0
  72. data/lib/denko/display/ssd168x.rb +227 -0
  73. data/lib/denko/display/st7302.rb +207 -0
  74. data/lib/denko/display/st7565.rb +166 -0
  75. data/lib/denko/display.rb +40 -4
  76. data/lib/denko/eeprom/at24c.rb +67 -0
  77. data/lib/denko/eeprom/board.rb +69 -0
  78. data/lib/denko/eeprom.rb +15 -1
  79. data/lib/denko/helpers/engine_check.rb +13 -0
  80. data/lib/denko/{mutex_stub.rb → helpers/mutex_stub.rb} +6 -0
  81. data/lib/denko/helpers.rb +6 -0
  82. data/lib/denko/i2c/bit_bang.rb +1 -0
  83. data/lib/denko/i2c/bus_common.rb +9 -4
  84. data/lib/denko/i2c/peripheral.rb +5 -1
  85. data/lib/denko/i2c.rb +17 -4
  86. data/lib/denko/led/apa102.rb +1 -3
  87. data/lib/denko/led/base.rb +5 -0
  88. data/lib/denko/led/rgb.rb +16 -10
  89. data/lib/denko/led/seven_segment.rb +1 -1
  90. data/lib/denko/led.rb +17 -8
  91. data/lib/denko/motor/{stepper.rb → a3967.rb} +1 -1
  92. data/lib/denko/motor/servo.rb +16 -6
  93. data/lib/denko/motor.rb +16 -3
  94. data/lib/denko/one_wire/bus.rb +20 -16
  95. data/lib/denko/one_wire/bus_enumerator.rb +25 -14
  96. data/lib/denko/one_wire/helper.rb +4 -2
  97. data/lib/denko/one_wire.rb +18 -5
  98. data/lib/denko/pulse_io/buzzer.rb +2 -6
  99. data/lib/denko/pulse_io/ir_output.rb +1 -5
  100. data/lib/denko/pulse_io/pwm_output.rb +56 -31
  101. data/lib/denko/pulse_io.rb +17 -3
  102. data/lib/denko/rtc/ds3231.rb +4 -3
  103. data/lib/denko/rtc.rb +14 -1
  104. data/lib/denko/sensor/aht.rb +16 -20
  105. data/lib/denko/sensor/bme280.rb +23 -36
  106. data/lib/denko/sensor/bmp180.rb +8 -13
  107. data/lib/denko/sensor/dht.rb +17 -7
  108. data/lib/denko/sensor/ds18b20.rb +5 -4
  109. data/lib/denko/sensor/hdc1080.rb +174 -0
  110. data/lib/denko/sensor/htu21d.rb +17 -6
  111. data/lib/denko/sensor/htu31d.rb +6 -5
  112. data/lib/denko/sensor/jsnsr04t.rb +49 -0
  113. data/lib/denko/sensor/qmp6988.rb +14 -30
  114. data/lib/denko/sensor/rcwl9620.rb +1 -0
  115. data/lib/denko/sensor/sht3x.rb +6 -5
  116. data/lib/denko/sensor/sht4x.rb +125 -0
  117. data/lib/denko/sensor/vl53l0x.rb +58 -0
  118. data/lib/denko/sensor.rb +33 -15
  119. data/lib/denko/spi/base_register.rb +11 -7
  120. data/lib/denko/spi/bus_common.rb +12 -15
  121. data/lib/denko/spi/input_register.rb +6 -6
  122. data/lib/denko/spi/output_register.rb +13 -4
  123. data/lib/denko/spi/peripheral.rb +82 -84
  124. data/lib/denko/spi.rb +20 -10
  125. data/lib/denko/uart/bit_bang.rb +2 -27
  126. data/lib/denko/uart/common.rb +33 -0
  127. data/lib/denko/uart/hardware.rb +1 -26
  128. data/lib/denko/uart.rb +16 -2
  129. data/lib/denko/version.rb +1 -1
  130. data/lib/denko.rb +22 -25
  131. data/lib/denko_cli/targets.rb +7 -7
  132. data/lib/denko_cli/targets.txt +19 -20
  133. data/src/lib/Denko.cpp +26 -13
  134. data/src/lib/Denko.h +4 -4
  135. data/src/lib/DenkoDefines.h +7 -26
  136. data/src/lib/DenkoLEDArray.cpp +1 -8
  137. data/src/lib/DenkoSPI.cpp +31 -29
  138. data/src/lib/DenkoSPIBB.cpp +12 -14
  139. data/test/analog_io/input_test.rb +1 -1
  140. data/test/analog_io/potentiometer_test.rb +2 -2
  141. data/test/behaviors/bus_peripheral_test.rb +4 -4
  142. data/test/behaviors/callbacks_test.rb +20 -10
  143. data/test/behaviors/component_test.rb +18 -8
  144. data/test/board/board_test.rb +9 -9
  145. data/test/board/one_wire_test.rb +25 -14
  146. data/test/board/spi_test.rb +31 -15
  147. data/test/digital_io/input_test.rb +2 -2
  148. data/test/display/canvas_test.rb +306 -0
  149. data/test/display/hd44780_test.rb +34 -7
  150. data/test/eeprom/board_test.rb +45 -0
  151. data/test/helpers/mruby_minitest.rb +95 -0
  152. data/test/helpers/mruby_runner.rb +13 -0
  153. data/test/i2c/bus_test.rb +93 -30
  154. data/test/i2c/peripheral_test.rb +2 -2
  155. data/test/led/apa102_test.rb +24 -0
  156. data/test/led/rgb_test.rb +4 -4
  157. data/test/motor/{stepper_test.rb → a3967_test.rb} +2 -2
  158. data/test/one_wire/bus_enumerator_test.rb +1 -1
  159. data/test/one_wire/bus_test.rb +42 -35
  160. data/test/one_wire/peripheral_test.rb +5 -17
  161. data/test/pulse_io/ir_output_test.rb +5 -0
  162. data/test/pulse_io/pwm_output_test.rb +10 -10
  163. data/test/rtc/ds3231_test.rb +3 -2
  164. data/test/sensor/dht_test.rb +11 -11
  165. data/test/spi/bitbang_test.rb +27 -0
  166. data/test/spi/bus_test.rb +19 -29
  167. data/test/spi/input_register_test.rb +2 -2
  168. data/test/spi/{peripheral_multi_pin_test.rb → peripheral_test.rb} +25 -5
  169. data/test/test_helper.rb +44 -124
  170. data/vendor/board-maps/BoardMap.h +264 -0
  171. data/vendor/board-maps/yaml/ALFREDO_NOU3.yml +2 -0
  172. data/vendor/board-maps/yaml/ATD143_S3.yml +1 -0
  173. data/vendor/board-maps/yaml/BHARATPI_A7672S_4G.yml +14 -0
  174. data/vendor/board-maps/yaml/BHARATPI_LORA.yml +14 -0
  175. data/vendor/board-maps/yaml/BHARATPI_NODE_WIFI.yml +14 -0
  176. data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +0 -1
  177. data/vendor/board-maps/yaml/CEZERIO_DEV_ESP32C6.yml +14 -0
  178. data/vendor/board-maps/yaml/CEZERIO_MINI_DEV_ESP32C6.yml +12 -0
  179. data/vendor/board-maps/yaml/CIRCUITART_ZERO_S3.yml +71 -0
  180. data/vendor/board-maps/yaml/CODECELLC3.yml +13 -0
  181. data/vendor/board-maps/yaml/CYOBOT_V2_ESP32S3.yml +7 -0
  182. data/vendor/board-maps/yaml/EDGES3D.yml +25 -0
  183. data/vendor/board-maps/yaml/ESP32C6_DEV.yml +3 -4
  184. data/vendor/board-maps/yaml/ESP32C6_THING_PLUS.yml +0 -1
  185. data/vendor/board-maps/yaml/ESP32H2_DEV.yml +0 -1
  186. data/vendor/board-maps/yaml/ESP32H2_DEVKIT_LIPO.yml +0 -1
  187. data/vendor/board-maps/yaml/ESP32P4_DEV.yml +35 -0
  188. data/vendor/board-maps/yaml/ESP32S2_DEV.yml +0 -1
  189. data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO.yml +0 -1
  190. data/vendor/board-maps/yaml/ESP32S2_DEVKIT_LIPO_USB.yml +0 -1
  191. data/vendor/board-maps/yaml/ESP32_2432S028R.yml +14 -0
  192. data/vendor/board-maps/yaml/FEATHERS3.yml +1 -1
  193. data/vendor/board-maps/yaml/FRI3D_2024_ESP32S3.yml +43 -0
  194. data/vendor/board-maps/yaml/GEEKBLE_ESP32C3.yml +0 -1
  195. data/vendor/board-maps/yaml/GEEKBLE_NANO_ESP32S3.yml +25 -0
  196. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E290.yml +41 -0
  197. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_E_213.yml +41 -0
  198. data/vendor/board-maps/yaml/HELTEC_VISION_MASTER_T190.yml +41 -0
  199. data/vendor/board-maps/yaml/HUIDU_HD_WF2.yml +5 -0
  200. data/vendor/board-maps/yaml/HUIDU_HD_WF4.yml +1 -0
  201. data/vendor/board-maps/yaml/LILYGO_LORA_CC1101.yml +6 -0
  202. data/vendor/board-maps/yaml/LILYGO_LORA_LR1121.yml +6 -0
  203. data/vendor/board-maps/yaml/LILYGO_LORA_SI4432.yml +6 -0
  204. data/vendor/board-maps/yaml/LILYGO_LORA_SX1262.yml +6 -0
  205. data/vendor/board-maps/yaml/LILYGO_LORA_SX1280.yml +6 -0
  206. data/vendor/board-maps/yaml/LOLIN_C3_MINI.yml +0 -1
  207. data/vendor/board-maps/yaml/LOLIN_C3_PICO.yml +1 -2
  208. data/vendor/board-maps/yaml/LoPy.yml +0 -1
  209. data/vendor/board-maps/yaml/LoPy4.yml +0 -1
  210. data/vendor/board-maps/yaml/M5STACK_DINMETER.yml +8 -0
  211. data/vendor/board-maps/yaml/M5STACK_FIRE.yml +1 -1
  212. data/vendor/board-maps/yaml/OMGS3.yml +25 -0
  213. data/vendor/board-maps/yaml/PCBCUPID_GLYPHC3.yml +23 -0
  214. data/vendor/board-maps/yaml/PCBCUPID_GLYPHC6.yml +32 -0
  215. data/vendor/board-maps/yaml/PCBCUPID_GLYPHH2.yml +24 -0
  216. data/vendor/board-maps/yaml/PYCOM_GPY.yml +0 -1
  217. data/vendor/board-maps/yaml/SENSEBOX_MCU_ESP32S2.yml +1 -1
  218. data/vendor/board-maps/yaml/SPARKFUN_ESP32S3_THING_PLUS.yml +13 -0
  219. data/vendor/board-maps/yaml/SPARKLEMOTIONMINI_ESP32.yml +12 -0
  220. data/vendor/board-maps/yaml/SPARKLEMOTIONSTICK_ESP32.yml +11 -0
  221. data/vendor/board-maps/yaml/SPARKLEMOTION_ESP32.yml +12 -0
  222. data/vendor/board-maps/yaml/SQUIXL.yml +7 -0
  223. data/vendor/board-maps/yaml/THINGPULSE_EPULSE_FEATHER_C6.yml +0 -1
  224. data/vendor/board-maps/yaml/T_LORA_PAGER.yml +6 -0
  225. data/vendor/board-maps/yaml/T_WATCH_S3.yml +7 -0
  226. data/vendor/board-maps/yaml/T_WATCH_S3_ULTRA.yml +6 -0
  227. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_146.yml +41 -0
  228. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_147.yml +41 -0
  229. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_169.yml +38 -0
  230. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_LCD_185.yml +41 -0
  231. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_RELAY_6CH.yml +41 -0
  232. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_143.yml +7 -0
  233. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_164.yml +7 -0
  234. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_18.yml +38 -0
  235. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_191.yml +7 -0
  236. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_AMOLED_241.yml +7 -0
  237. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_146.yml +41 -0
  238. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_169.yml +38 -0
  239. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185.yml +41 -0
  240. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_185_BOX.yml +41 -0
  241. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_21.yml +41 -0
  242. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_28.yml +41 -0
  243. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_4.yml +36 -0
  244. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43.yml +38 -0
  245. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_43B.yml +38 -0
  246. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5.yml +38 -0
  247. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_5B.yml +38 -0
  248. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_TOUCH_LCD_7.yml +38 -0
  249. data/vendor/board-maps/yaml/WAVESHARE_ESP32_S3_ZERO.yml +36 -0
  250. data/vendor/board-maps/yaml/WIPY3.yml +0 -1
  251. data/vendor/board-maps/yaml/WS_ESP32_S3_MATRIX.yml +38 -0
  252. data/vendor/board-maps/yaml/XIAO_ESP32S3_PLUS.yml +46 -0
  253. data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V2.yml +28 -0
  254. data/vendor/board-maps/yaml/YB_ESP32S3_AMP_V3.yml +28 -0
  255. data/vendor/board-maps/yaml/YB_ESP32S3_ETH.yml +40 -0
  256. data/vendor/board-maps/yaml/mercury.yml +20 -0
  257. metadata +116 -101
  258. data/.vscode/settings.json +0 -5
  259. data/.vscode/tasks.json +0 -20
  260. data/HARDWARE.md +0 -263
  261. data/benchmarks/analog_listen.rb +0 -49
  262. data/benchmarks/digital_write.rb +0 -28
  263. data/benchmarks/i2c_ssd1306_refresh.rb +0 -91
  264. data/examples/advanced/m5_env3.rb +0 -46
  265. data/examples/advanced/rotary_encoder_mac_volume.rb +0 -53
  266. data/examples/advanced/ssd1306_time_temp_rh.rb +0 -43
  267. data/examples/analog_io/ads1100.rb +0 -48
  268. data/examples/analog_io/ads1115.rb +0 -57
  269. data/examples/analog_io/ads1118.rb +0 -65
  270. data/examples/analog_io/dac_loopback.rb +0 -34
  271. data/examples/analog_io/input.rb +0 -56
  272. data/examples/analog_io/input_smoothing.rb +0 -27
  273. data/examples/analog_io/potentiometer.rb +0 -31
  274. data/examples/connection/binary_echo.rb +0 -34
  275. data/examples/connection/tcp.rb +0 -19
  276. data/examples/digital_io/button.rb +0 -17
  277. data/examples/digital_io/relay.rb +0 -17
  278. data/examples/digital_io/rotary_encoder.rb +0 -36
  279. data/examples/display/hd44780.png +0 -0
  280. data/examples/display/hd44780.rb +0 -47
  281. data/examples/display/ssd1306.rb +0 -43
  282. data/examples/display/ssd1306_s2_pico.rb +0 -29
  283. data/examples/eeprom/built_in.rb +0 -32
  284. data/examples/i2c/search.rb +0 -39
  285. data/examples/led/apa102_bounce.rb +0 -32
  286. data/examples/led/apa102_fade.rb +0 -44
  287. data/examples/led/builtin_blink.rb +0 -14
  288. data/examples/led/builtin_fade.rb +0 -19
  289. data/examples/led/rgb_led.rb +0 -31
  290. data/examples/led/seven_segment_char_echo.rb +0 -17
  291. data/examples/led/ws2812_bounce.rb +0 -30
  292. data/examples/led/ws2812_builtin_blink.rb +0 -22
  293. data/examples/led/ws2812_fade.rb +0 -43
  294. data/examples/motor/l298.rb +0 -45
  295. data/examples/motor/servo.rb +0 -17
  296. data/examples/motor/stepper.png +0 -0
  297. data/examples/motor/stepper.rb +0 -43
  298. data/examples/one_wire/search.rb +0 -32
  299. data/examples/pulse_io/buzzer.rb +0 -35
  300. data/examples/pulse_io/ir_output.rb +0 -51
  301. data/examples/pulse_io/pwm_output.rb +0 -30
  302. data/examples/rtc/ds3231.rb +0 -31
  303. data/examples/sensor/aht10.rb +0 -17
  304. data/examples/sensor/aht20.rb +0 -17
  305. data/examples/sensor/bme280.rb +0 -38
  306. data/examples/sensor/bmp180.rb +0 -26
  307. data/examples/sensor/dht.rb +0 -29
  308. data/examples/sensor/ds18b20.rb +0 -57
  309. data/examples/sensor/generic_pir.rb +0 -27
  310. data/examples/sensor/hcsr04.rb +0 -17
  311. data/examples/sensor/htu21d.rb +0 -43
  312. data/examples/sensor/htu31d.rb +0 -33
  313. data/examples/sensor/neat_tph_readings.rb +0 -32
  314. data/examples/sensor/qmp6988.rb +0 -51
  315. data/examples/sensor/rcwl9620.rb +0 -15
  316. data/examples/sensor/sht3x.rb +0 -32
  317. data/examples/spi/bitbang_loopback.rb +0 -46
  318. data/examples/spi/input_register.rb +0 -40
  319. data/examples/spi/output_register.rb +0 -41
  320. data/examples/spi/ssd_through_registers.rb +0 -28
  321. data/examples/spi/two_registers.rb +0 -40
  322. data/examples/uart/bit_bang_demo.rb +0 -25
  323. data/examples/uart/board_passthrough.rb +0 -40
  324. data/examples/uart/hardware_loopback.rb +0 -16
  325. data/lib/denko/eeprom/built_in.rb +0 -72
  326. data/lib/denko/fonts.rb +0 -106
  327. data/test/eeprom/built_in_test.rb +0 -61
  328. data/test/spi/peripheral_single_pin_test.rb +0 -48
  329. data/tutorial/01-led/led.fzz +0 -0
  330. data/tutorial/01-led/led.pdf +0 -0
  331. data/tutorial/01-led/led.rb +0 -73
  332. data/tutorial/02-button/button.fzz +0 -0
  333. data/tutorial/02-button/button.pdf +0 -0
  334. data/tutorial/02-button/button.rb +0 -65
  335. data/tutorial/03-potentiometer/potentiometer.fzz +0 -0
  336. data/tutorial/03-potentiometer/potentiometer.pdf +0 -0
  337. data/tutorial/03-potentiometer/potentiometer.rb +0 -66
  338. data/tutorial/04-pwm_led/pwm_led.fzz +0 -0
  339. data/tutorial/04-pwm_led/pwm_led.pdf +0 -0
  340. data/tutorial/04-pwm_led/pwm_led.rb +0 -64
  341. data/tutorial/05-rgb_led/rgb_led.fzz +0 -0
  342. data/tutorial/05-rgb_led/rgb_led.pdf +0 -0
  343. data/tutorial/05-rgb_led/rgb_led.rb +0 -58
  344. data/tutorial/05-rgb_led/rgb_mapping.rb +0 -76
@@ -1,57 +0,0 @@
1
- #
2
- # Example using an ADS1115 ADC over the I2C bus.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
- bus = Denko::I2C::Bus.new(board: board)
9
- ads = Denko::AnalogIO::ADS1115.new(bus: bus)
10
-
11
- # Helper method so readings look nice.
12
- def print_reading(name, raw, voltage)
13
- print "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} - "
14
- print "#{name.rjust(18, " ")} | "
15
- print "Raw: #{raw.to_s.rjust(6, " ")} | "
16
- print "Voltage: "
17
- print ("%.10f" % voltage).rjust(13, " ")
18
- puts " V"
19
- end
20
-
21
- #
22
- # Use the ADS1115 directly by writing values to its config registers.
23
- # ADS1115#read automatically waits for conversion time and gets the 16-bit reading.
24
- # See datasheet for register bitmaps.
25
- #
26
- # Note: This is the only way to use continuous mode. Subcomponents always use one-shot.
27
- #
28
- ads.read([0b11000001, 0b10001011]) do |reading|
29
- voltage = reading * 0.0001875
30
- print_reading("Direct", reading, voltage)
31
- end
32
-
33
- #
34
- # Or use its BoardProxy interface, adding subcomponents as if it were a Board.
35
- # The key adc: can substitute for board: when intializing AnalogIO::Input.
36
- # Gain and sample rate bitmasks can be found in the datasheet.
37
- #
38
- # Input on pin 0, with pin 1 as differential negative input, and 6.144 V full range.
39
- diff_input = Denko::AnalogIO::Input.new(adc: ads, pin: 0, negative_pin: 1, gain: 0b000)
40
-
41
- # Input on pin 2 with no negative input (single ended), and 1.024V full range.
42
- # Ths one uses a 8 SPS rate, essentially 16x oversampling compared to the default 128.
43
- single_input = Denko::AnalogIO::Input.new(adc: ads, pin: 2, gain: 0b011, sample_rate: 0b000)
44
-
45
- # Poll the differential input every second.
46
- diff_input.poll(1) do |reading|
47
- voltage = reading * diff_input.volts_per_bit
48
- print_reading("Differential A1-A0", reading, voltage)
49
- end
50
-
51
- # Poll the single ended input every 2 seconds.
52
- single_input.poll(2) do |reading|
53
- voltage = reading * single_input.volts_per_bit
54
- print_reading("Single A2-GN", reading, voltage)
55
- end
56
-
57
- sleep
@@ -1,65 +0,0 @@
1
- #
2
- # Example using an ADS1118 ADC over the SPI bus.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
- bus = Denko::SPI::Bus.new(board: board)
9
- ads = Denko::AnalogIO::ADS1118.new(bus: bus, pin: 10)
10
-
11
- # Helper method so readings look nice.
12
- def print_reading(name, raw, voltage)
13
- print "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} - "
14
- print "#{name.rjust(18, " ")} | "
15
- print "Raw: #{raw.to_s.rjust(6, " ")} | "
16
- print "Voltage: "
17
- print ("%.10f" % voltage).rjust(13, " ")
18
- puts " V"
19
- end
20
-
21
- #
22
- # Read the ADS1118 internal temperature sensor.
23
- # This always uses the 128 SPS mode, and there is no polling method for it.
24
- #
25
- temperature = ads.temperature_read
26
- puts "ADS1118 Temperature: #{temperature} \xC2\xB0C"
27
- puts
28
-
29
- #
30
- # Use the ADS1118 directly by writing values to its config registers.
31
- # ADS1118#read automatically waits for conversion time and gets the 16-bit reading.
32
- # See datasheet for register bitmaps.
33
- #
34
- # Note: This is the only way to use continuous mode. Subcomponents always use one-shot.
35
- #
36
- ads.read([0b10000001, 0b10001011]) do |reading|
37
- voltage = reading * 0.0001875
38
- print_reading("Direct", reading, voltage)
39
- end
40
-
41
- #
42
- # Or use its BoardProxy interface, adding subcomponents as if it were a Board.
43
- # The key adc: can substitute for board: when intializing AnalogIO::Input.
44
- # Gain and sample rate bitmasks can be found in the datasheet.
45
- #
46
- # Input on pin 0, with pin 1 as differential negative input, and 6.144 V full range.
47
- diff_input = Denko::AnalogIO::Input.new(adc: ads, pin: 0, negative_pin: 1, gain: 0b000)
48
-
49
- # Input on pin 2 with no negative input (single ended), and 1.024V full range.
50
- # Ths one uses a 8 SPS rate, essentially 16x oversampling compared to the default 128.
51
- single_input = Denko::AnalogIO::Input.new(adc: ads, pin: 2, gain: 0b011, sample_rate: 0b000)
52
-
53
- # Poll the differential input every second.
54
- diff_input.poll(1) do |reading|
55
- voltage = reading * diff_input.volts_per_bit
56
- print_reading("Differential A1-A0", reading, voltage)
57
- end
58
-
59
- # Poll the single ended input every 2 seconds.
60
- single_input.poll(2) do |reading|
61
- voltage = reading * single_input.volts_per_bit
62
- print_reading("Single A2-GN", reading, voltage)
63
- end
64
-
65
- sleep
@@ -1,34 +0,0 @@
1
- #
2
- # Example looping the Arduino Zero's DAC back into one of its ADC pins.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- #
8
- # Arduino Zero: :DAC0 is :A0 is GPIO14
9
- # Arduino UNO R4: :DAC is :A0 is GPIO14
10
- # ESP32 V1: :DAC0 is GPIO25, :DAC1 is GPIO26, :A4 is GPIO32
11
- # ESP32-S2: :DAC0 is GPIO17, :DAC1 is GPIO18, :A4 is GPIO5
12
- #
13
- # Connect DAC_PIN TO ADC_PIN with a jumper to test.
14
- #
15
- DAC_PIN = :DAC0
16
- ADC_PIN = :A4
17
-
18
- board = Denko::Board.new(Denko::Connection::Serial.new)
19
- dac = Denko::AnalogIO::Output.new(pin: DAC_PIN, board: board)
20
- adc = Denko::AnalogIO::Input.new(pin: ADC_PIN, board: board)
21
-
22
- #
23
- # Read values should be approximately 4x the written values, since Board#new tries to
24
- # set output resolution at 8-bits and input to 10-bits. Not configurable on all chips.
25
- # Scale may be off but, readings should still be proportional.
26
- #
27
- [0, 32, 64, 128, 192, 255].each do |output_value|
28
- dac.write output_value
29
- sleep 1
30
- loopback_value = adc.read
31
- puts "ADC reads: #{loopback_value} when DAC writes: #{output_value}"
32
- end
33
-
34
- board.finish_write
@@ -1,56 +0,0 @@
1
- #
2
- # Use your board's analog-to-digital-converter(ADC) pins with AnalogIO::Input.
3
- # ADC inputs can be connected to sensors that produce variable output voltage,
4
- # such as light dependent resistors, or a temperature sensor like the TMP36.
5
- #
6
- require 'bundler/setup'
7
- require 'denko'
8
-
9
- PIN = :A0
10
-
11
- board = Denko::Board.new(Denko::Connection::Serial.new)
12
- input = Denko::AnalogIO::Input.new(pin: PIN, board: board)
13
-
14
- # Single read. Blocks main thread during read, then runs given block with the value.
15
- input.read { |value| puts "#{Time.now} Single read #1: #{value}" }
16
-
17
- # Poll repeatedly does single reads, in a separate thread, with an interval in seconds.
18
- # Given block is saved as a callback, and runs each time a value is received.
19
- input.poll(0.5) { |value| puts "#{Time.now} Polling: #{value}" }
20
-
21
- # Does not block main thread, so wait for some values.
22
- sleep 3
23
- # Stop polling, automatically removing callback from #poll.
24
- input.stop
25
-
26
- # "Listening" is where the Board keeps time, reading the ADC at a small interval
27
- # and continuously sends values, until #stop is called.
28
- # Powers of 2 from 1 to 128 (in milliseconds) are supported for listener intervals.
29
- input.listen(32) { |value| puts "#{Time.now} Listening: #{value}" }
30
- sleep 0.5
31
-
32
- # Stop listening. Automatically removes the #listen callback.
33
- input.stop
34
-
35
- # This adds a persistent callback, which runs no matter how a read happens.
36
- # It will not be removed by #stop.
37
- input.on_data { |value| puts "#{Time.now} Persistent callback: #{value}" }
38
-
39
- # This is a persistent callback with a custom key.
40
- input.on_data(:test) { |value| puts "#{Time.now} Keyed callback: #{value}"}
41
-
42
- # If we do a single read, the two persistent callbacks, and the block given, should run once each.
43
- input.read { |value| puts "#{Time.now} Single read #2: #{value}" }
44
-
45
- # If we listen, the two persistent callbacks, and the block given should run many times.
46
- input.listen(8) { |value| puts "#{Time.now } Listening again: #{value}" }
47
- sleep 0.125
48
- input.stop
49
-
50
- # Remove callbacks keyed with :test.
51
- input.remove_callbacks(:test)
52
-
53
- # Remove all callbacks.
54
- input.remove_callbacks
55
-
56
- board.finish_write
@@ -1,27 +0,0 @@
1
- #
2
- # This example shows how to smooth the input of an AnalogIO::Input.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PIN = :A0
8
-
9
- board = Denko::Board.new(Denko::Connection::Serial.new)
10
- input = Denko::AnalogIO::Input.new(pin: PIN, board: board)
11
-
12
- # Enable smoothing on the input using the last 16 values.
13
- input.smoothing = true
14
- input.smoothing_size = 16
15
-
16
- # Use the slowest listener possible.
17
- input.listen(128)
18
-
19
- #
20
- # With these settings, the input's state should gradually change (~2 seconds),
21
- # if you switch its supply from Vcc to Ground (or vice versa), instead of instantaneously.
22
- #
23
- # Print the state every 1/4 second. Change the voltage being input to the pin to see results.
24
- loop do
25
- puts input.state
26
- sleep(0.25)
27
- end
@@ -1,31 +0,0 @@
1
- #
2
- # Example for a potentiometer.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PIN = :A0
8
-
9
- board = Denko::Board.new(Denko::Connection::Serial.new)
10
- pot = Denko::AnalogIO::Potentiometer.new(pin: PIN, board: board)
11
-
12
- last_percent = nil
13
- pot.on_data do |reading|
14
- # Map reading to a decimal between 0 and 1.
15
- fraction = reading / board.adc_high.to_f
16
-
17
- # Linearization hack for audio taper potentiometers.
18
- # Adjust k for different tapers. This was an A500K.
19
- k = 5
20
- linearized = (fraction * (k + 1)) / ((k * fraction) + 1)
21
- # Use this for linear potentiometers instead.
22
- # linearized = fraction
23
-
24
- percent = (linearized * 100).round
25
- unless percent == last_percent
26
- puts "Potentiometer: #{percent.to_s.rjust(3, " ")}%"
27
- last_percent = percent
28
- end
29
- end
30
-
31
- sleep
@@ -1,34 +0,0 @@
1
- #
2
- # Diagnostic to confirm board is receiving binary data
3
- # (in aux message) properly.
4
- #
5
- require 'bundler/setup'
6
- require 'denko'
7
-
8
- board = Denko::Board.new(Denko::Connection::Serial.new)
9
- echo = Denko::Connection::BinaryEcho.new(board: board, pin: 253)
10
-
11
- min_byte = 0
12
- max_byte = 255
13
-
14
- expected_result = (min_byte..max_byte).to_a.join(',') << ','
15
-
16
- waiting = false
17
- wait_mutex = Mutex.new
18
-
19
- echo.on_data do |data|
20
- if data == expected_result
21
- puts "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} - Echo received"
22
- wait_mutex.synchronize { waiting = false }
23
- end
24
- end
25
-
26
- loop do
27
- wait_mutex.synchronize do
28
- unless waiting
29
- echo.test_range(min: min_byte, max: max_byte)
30
- waiting = true
31
- end
32
- end
33
- sleep 0.001
34
- end
@@ -1,19 +0,0 @@
1
- #
2
- # Connect to a Board via TCP. This works for WiFi and Ethernet sketches.
3
- # Default port is 3466, and must match the port the Board was flashed to listen on.
4
- #
5
- require 'bundler/setup'
6
- require 'denko'
7
-
8
- IP_ADDRESS = "192.168.0.52"
9
- PORT = 3466
10
- PIN = :LED_BUILTIN
11
-
12
- connection = Denko::Connection::TCP.new(IP_ADDRESS, PORT)
13
- board = Denko::Board.new(connection)
14
- led = Denko::LED.new(board: board, pin: PIN)
15
-
16
- [:on, :off].cycle do |switch|
17
- led.send(switch)
18
- sleep 0.5
19
- end
@@ -1,17 +0,0 @@
1
- #
2
- # Simple button example.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PIN = 3
8
-
9
- board = Denko::Board.new(Denko::Connection::Serial.new)
10
- button = Denko::DigitalIO::Button.new board: board,
11
- pin: PIN,
12
- mode: :input_pullup
13
-
14
- button.up { puts "Button released at #{Time.now.strftime '%H:%M:%S'}" }
15
- button.down { puts "Button pressed at #{Time.now.strftime '%H:%M:%S'}" }
16
-
17
- sleep
@@ -1,17 +0,0 @@
1
- #
2
- # Use Relays to work with higher voltage circuits. This example
3
- # closes and opens a relay to send a 500ms pulse on a 12V control circuit.
4
- #
5
- require 'bundler/setup'
6
- require 'denko'
7
-
8
- PIN = 6
9
-
10
- board = Denko::Board.new(Denko::Connection::Serial.new)
11
- relay = Denko::DigitalIO::Relay.new(board: board, pin: PIN)
12
-
13
- relay.close
14
- sleep(0.500)
15
- relay.open
16
-
17
- board.finish_write
@@ -1,36 +0,0 @@
1
- #
2
- # KY-040 (30 detent) rotary encoder on a microcontroller, listener at 1ms.
3
- #
4
- # WARNING: This method is not precise and may miss steps. Don't use for anything
5
- # that requires all steps to be read for exact positioning or high speed.
6
- #
7
- require 'bundler/setup'
8
- require 'denko'
9
-
10
- PIN_A = 4
11
- PIN_B = 5
12
-
13
- board = Denko::Board.new(Denko::Connection::Serial.new)
14
-
15
- # Other options and their default values:
16
- #
17
- # divider: 1 # read every divider milliseconds (Board only)
18
- # debounce_time: 1 # software debounce in microseconds (PiBoard only)
19
- # counts_per_revolution: 60 # for generic 30 detent rotary encoders
20
- #
21
- encoder = Denko::DigitalIO::RotaryEncoder.new board: board,
22
- pins: { a: PIN_A, b: PIN_B }
23
-
24
- # Reverse direction.
25
- # encoder.reverse
26
-
27
- # Reset count and angle to 0.
28
- # encoder.reset
29
-
30
- encoder.add_callback do |state|
31
- change_printable = state[:change].to_s
32
- change_printable = "+#{change_printable}" if state[:change] > 0
33
- puts "Encoder Change: #{change_printable} | Count: #{state[:count]} | Angle: #{state[:angle]}\xC2\xB0"
34
- end
35
-
36
- sleep
Binary file
@@ -1,47 +0,0 @@
1
- #
2
- # This example writes "Hello World!" in the display
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- # These pins match the SainSmart LCD Keypad Shield for Arduino boards.
8
- RS = 8
9
- EN = 9
10
- D4 = 4
11
- D5 = 5
12
- D6 = 6
13
- D7 = 7
14
-
15
- board = Denko::Board.new(Denko::Connection::Serial.new)
16
- lcd = Denko::Display::HD44780.new board: board,
17
- pins: { rs: RS, enable: EN, d4: D4, d5: D5, d6: D6, d7: D7 },
18
- cols: 16,
19
- rows: 2
20
-
21
- # Bitmap for a custom character. 5 bits wide x 8 high.
22
- # Useful for generating these: https://omerk.github.io/lcdchargen/
23
- heart = [ 0b00000,
24
- 0b00000,
25
- 0b01010,
26
- 0b11111,
27
- 0b11111,
28
- 0b01110,
29
- 0b00100,
30
- 0b00000 ]
31
-
32
- # Define the character in CGRAM address 2. 0-7 are usable.
33
- lcd.create_char(2, heart)
34
-
35
- # Need to call home/clear/set_cursor so we go back to writing DDRAM.
36
- lcd.home
37
-
38
- # End the first line with the heart by writing its CGRAM address.
39
- lcd.print "Hello World! "
40
- lcd.write(2)
41
-
42
- # Display a clock on second line, updating approximately every second.
43
- loop do
44
- lcd.move_to 0,1
45
- lcd.print(Time.now.strftime("%I:%M:%S"))
46
- sleep 1
47
- end
@@ -1,43 +0,0 @@
1
- #
2
- # Example using an SSD1306 driven OLED screen over I2C.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
-
9
- # The SSD1306 OLED connects to either an I2C or SPI bus, depending on the model you have.
10
- # Bus setup exampels in order:
11
- # I2C Hardware
12
- # I2C Bit-Bang
13
- # SPI Hardware
14
- # SPI Bit-Bang
15
- #
16
- bus = Denko::I2C::Bus.new(board: board)
17
- # bus = Denko::I2C::BitBang.new(board: board, pins: {scl: 4, sda: 5})
18
- # bus = Denko::SPI::Bus.new(board: board)
19
- # bus = Denko::SPI::BitBang.new(board: board, pins: {clock: 13, output: 11})
20
-
21
- # I2C OLED, connected to I2C SDA and SCL.
22
- oled = Denko::Display::SSD1306.new(bus: bus, rotate: true) # address: 0x3C is default
23
- # oled = Denko::Display::SH1106.new(bus: bus,rotate: true) # address: 0x3C is default
24
-
25
- # SPI OLED, connected to SPI CLK and MOSI pins.
26
- # select: and dc: pins must be given. reset is optional (can be pulled high instead).
27
- # oled = Denko::Display::SSD1306.new(bus: bus, pins: { select: 10, dc: 7, reset: 8 }, rotate: true)
28
- # oled = Denko::Display::SH1106.new(bus: bus, pins: { select: 10, dc: 7, reset: 8}, rotate: true)
29
-
30
- # Draw some text on the OLED's canvas (a Ruby memory buffer).
31
- canvas = oled.canvas
32
- canvas.text_cursor = [27,60]
33
- canvas.print("Hello World!")
34
-
35
- # Add some shapes to the canvas.
36
- baseline = 40
37
- canvas.rectangle(10, baseline, 30, -30)
38
- canvas.circle(66, baseline - 15, 15)
39
- canvas.triangle(87, baseline, 117, baseline, 102, baseline - 30)
40
-
41
- # Send the canvas to the OLED's graphics RAM so it shows.
42
- oled.draw
43
- board.finish_write
@@ -1,29 +0,0 @@
1
- #
2
- # Example using the SSD1306 OLED built into the LOLIN ES32-S2 PICO
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
-
9
- # The OLED's reset pin on this board isn't tied high. Do it manually.
10
- reset = Denko::DigitalIO::Output.new(board: board, pin: 18)
11
- reset.high
12
-
13
- bus = Denko::I2C::Bus.new(board: board, pin: :SDA)
14
- oled = Denko::Display::SSD1306.new(bus: bus, width: 128, height: 32)
15
- canvas = oled.canvas
16
-
17
- # Draw some text on the OLED's canvas (a Ruby memory buffer).
18
- canvas.text_cursor = [27,31]
19
- canvas.print("Hello World!")
20
-
21
- # Add some shapes to the canvas.
22
- baseline = 15
23
- canvas.rectangle(10, baseline, 15, -15)
24
- canvas.circle(66, baseline - 7, 8)
25
- canvas.triangle(102, baseline, 118, baseline, 110, baseline - 15)
26
-
27
- # Send the canvas to the OLED's graphics RAM so it shows.
28
- oled.draw
29
- board.finish_write
@@ -1,32 +0,0 @@
1
- #
2
- # Example showing how to load, modify and save the board's EEPROM.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
-
9
- # Initialization automatically gets all EEPROM data from the board.
10
- # eeprom = Denko::EEPROM::BuiltIn(board: board)
11
- eeprom = board.eeprom
12
-
13
- # EEPROM size reported by the board.
14
- puts "EEPROM Size: #{eeprom.length} bytes"
15
-
16
- # Write values like an array.
17
- eeprom[0] = 128
18
- eeprom[1] = 127
19
-
20
- # Changes do not save to the board automatically.
21
- # Call #save to write to the board, and automatically reload from it.
22
- eeprom.save
23
-
24
- # Read values like an array.
25
- puts "Address 0 contains: #{eeprom[0]}"
26
-
27
- # Enumerate like an array.
28
- eeprom.each_with_index do |byte, address|
29
- if address == 1
30
- puts "Address #{address} contains #{byte}"
31
- end
32
- end
@@ -1,39 +0,0 @@
1
- #
2
- # Example that shows the default I2C bus pins, and addresses of any
3
- # devices connected to the bus.
4
- #
5
- require 'bundler/setup'
6
- require 'denko'
7
-
8
- board = Denko::Board.new(Denko::Connection::Serial.new)
9
-
10
- # If board has a map, show the pins to the user.
11
- if board.map
12
- puts "Detected board: #{board.name}"
13
- sda = board.map[:SDA] || board.map[:SDA0]
14
- scl = board.map[:SCL] || board.map[:SCL0]
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"
18
- end
19
- puts
20
-
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
-
26
- bus.search
27
-
28
- if bus.found_devices.empty?
29
- puts "No devices found on I2C bus"
30
- else
31
- puts "I2C device addresses found:"
32
- bus.found_devices.each do |address|
33
- # Print as hexadecimal.
34
- puts "0x#{address.to_s(16).upcase}"
35
- end
36
- end
37
-
38
- puts
39
- board.finish_write
@@ -1,32 +0,0 @@
1
- #
2
- # Walk a single pixel along the length of an APA102 strip and back,
3
- # changing color each time it returns to position 0.
4
- #
5
- require 'bundler/setup'
6
- require 'denko'
7
-
8
- RED = [255, 0, 0]
9
- GREEN = [0, 255, 0]
10
- BLUE = [0, 0, 255]
11
- WHITE = [255, 255, 255]
12
- COLORS = [RED, GREEN, BLUE, WHITE]
13
- PIXELS = 8
14
-
15
- # Move along the strip and back, one pixel at a time.
16
- positions = (0..PIXELS-1).to_a + (1..PIXELS-2).to_a.reverse
17
-
18
- # Use the default hardware SPI bus.
19
- board = Denko::Board.new(Denko::Connection::Serial.new)
20
- bus = Denko::SPI::Bus.new(board: board)
21
- strip = Denko::LED::APA102.new(bus: bus, length: PIXELS)
22
-
23
- loop do
24
- COLORS.each do |color|
25
- positions.each do |index|
26
- strip.clear
27
- strip[index] = color
28
- strip.show
29
- sleep 0.025
30
- end
31
- end
32
- end
@@ -1,44 +0,0 @@
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