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
data/lib/denko/fonts.rb DELETED
@@ -1,106 +0,0 @@
1
- module Denko
2
- module Fonts
3
- #
4
- # Adapted from:
5
- # https://github.com/lexus2k/ssd1306/blob/master/src/ssd1306_fonts.c
6
- #
7
- FONT_6x8 = [
8
- [0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # sp
9
- [0x00, 0x00, 0x00, 0x2f, 0x00, 0x00], # !
10
- [0x00, 0x00, 0x07, 0x00, 0x07, 0x00], # "
11
- [0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14], # #
12
- [0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12], # $
13
- [0x00, 0x23, 0x13, 0x08, 0x64, 0x62], # %
14
- [0x00, 0x36, 0x49, 0x55, 0x22, 0x50], # &
15
- [0x00, 0x00, 0x05, 0x03, 0x00, 0x00], # '
16
- [0x00, 0x00, 0x1c, 0x22, 0x41, 0x00], # (
17
- [0x00, 0x00, 0x41, 0x22, 0x1c, 0x00], # )
18
- [0x00, 0x14, 0x08, 0x3E, 0x08, 0x14], # *
19
- [0x00, 0x08, 0x08, 0x3E, 0x08, 0x08], # +
20
- [0x00, 0x00, 0x00, 0xA0, 0x60, 0x00], # ,
21
- [0x00, 0x08, 0x08, 0x08, 0x08, 0x08], # -
22
- [0x00, 0x00, 0x60, 0x60, 0x00, 0x00], # .
23
- [0x00, 0x20, 0x10, 0x08, 0x04, 0x02], # /
24
- [0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E], # 0
25
- [0x00, 0x00, 0x42, 0x7F, 0x40, 0x00], # 1
26
- [0x00, 0x42, 0x61, 0x51, 0x49, 0x46], # 2
27
- [0x00, 0x21, 0x41, 0x45, 0x4B, 0x31], # 3
28
- [0x00, 0x18, 0x14, 0x12, 0x7F, 0x10], # 4
29
- [0x00, 0x27, 0x45, 0x45, 0x45, 0x39], # 5
30
- [0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30], # 6
31
- [0x00, 0x01, 0x71, 0x09, 0x05, 0x03], # 7
32
- [0x00, 0x36, 0x49, 0x49, 0x49, 0x36], # 8
33
- [0x00, 0x06, 0x49, 0x49, 0x29, 0x1E], # 9
34
- [0x00, 0x00, 0x36, 0x36, 0x00, 0x00], # :
35
- [0x00, 0x00, 0x56, 0x36, 0x00, 0x00], # ;
36
- [0x00, 0x08, 0x14, 0x22, 0x41, 0x00], # <
37
- [0x00, 0x14, 0x14, 0x14, 0x14, 0x14], # =
38
- [0x00, 0x00, 0x41, 0x22, 0x14, 0x08], # >
39
- [0x00, 0x02, 0x01, 0x51, 0x09, 0x06], # ?
40
- [0x00, 0x32, 0x49, 0x59, 0x51, 0x3E], # @
41
- [0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C], # A
42
- [0x00, 0x7F, 0x49, 0x49, 0x49, 0x36], # B
43
- [0x00, 0x3E, 0x41, 0x41, 0x41, 0x22], # C
44
- [0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C], # D
45
- [0x00, 0x7F, 0x49, 0x49, 0x49, 0x41], # E
46
- [0x00, 0x7F, 0x09, 0x09, 0x09, 0x01], # F
47
- [0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A], # G
48
- [0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F], # H
49
- [0x00, 0x00, 0x41, 0x7F, 0x41, 0x00], # I
50
- [0x00, 0x20, 0x40, 0x41, 0x3F, 0x01], # J
51
- [0x00, 0x7F, 0x08, 0x14, 0x22, 0x41], # K
52
- [0x00, 0x7F, 0x40, 0x40, 0x40, 0x40], # L
53
- [0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F], # M
54
- [0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F], # N
55
- [0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E], # O
56
- [0x00, 0x7F, 0x09, 0x09, 0x09, 0x06], # P
57
- [0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E], # Q
58
- [0x00, 0x7F, 0x09, 0x19, 0x29, 0x46], # R
59
- [0x00, 0x46, 0x49, 0x49, 0x49, 0x31], # S
60
- [0x00, 0x01, 0x01, 0x7F, 0x01, 0x01], # T
61
- [0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F], # U
62
- [0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F], # V
63
- [0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F], # W
64
- [0x00, 0x63, 0x14, 0x08, 0x14, 0x63], # X
65
- [0x00, 0x07, 0x08, 0x70, 0x08, 0x07], # Y
66
- [0x00, 0x61, 0x51, 0x49, 0x45, 0x43], # Z
67
- [0x00, 0x00, 0x7F, 0x41, 0x41, 0x00], # [
68
- [0x00, 0x02, 0x04, 0x08, 0x10, 0x20], # \
69
- [0x00, 0x00, 0x41, 0x41, 0x7F, 0x00], # ]
70
- [0x00, 0x04, 0x02, 0x01, 0x02, 0x04], # ^
71
- [0x00, 0x40, 0x40, 0x40, 0x40, 0x40], # _
72
- [0x00, 0x00, 0x01, 0x02, 0x04, 0x00], # '
73
- [0x00, 0x20, 0x54, 0x54, 0x54, 0x78], # a
74
- [0x00, 0x7F, 0x48, 0x44, 0x44, 0x38], # b
75
- [0x00, 0x38, 0x44, 0x44, 0x44, 0x20], # c
76
- [0x00, 0x38, 0x44, 0x44, 0x48, 0x7F], # d
77
- [0x00, 0x38, 0x54, 0x54, 0x54, 0x18], # e
78
- [0x00, 0x08, 0x7E, 0x09, 0x01, 0x02], # f
79
- [0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C], # g
80
- [0x00, 0x7F, 0x08, 0x04, 0x04, 0x78], # h
81
- [0x00, 0x00, 0x44, 0x7D, 0x40, 0x00], # i
82
- [0x00, 0x40, 0x80, 0x84, 0x7D, 0x00], # j
83
- [0x00, 0x7F, 0x10, 0x28, 0x44, 0x00], # k
84
- [0x00, 0x00, 0x41, 0x7F, 0x40, 0x00], # l
85
- [0x00, 0x7C, 0x04, 0x18, 0x04, 0x78], # m
86
- [0x00, 0x7C, 0x08, 0x04, 0x04, 0x78], # n
87
- [0x00, 0x38, 0x44, 0x44, 0x44, 0x38], # o
88
- [0x00, 0xFC, 0x24, 0x24, 0x24, 0x18], # p
89
- [0x00, 0x18, 0x24, 0x24, 0x18, 0xFC], # q
90
- [0x00, 0x7C, 0x08, 0x04, 0x04, 0x08], # r
91
- [0x00, 0x48, 0x54, 0x54, 0x54, 0x20], # s
92
- [0x00, 0x04, 0x3F, 0x44, 0x40, 0x20], # t
93
- [0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C], # u
94
- [0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C], # v
95
- [0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C], # w
96
- [0x00, 0x44, 0x28, 0x10, 0x28, 0x44], # x
97
- [0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C], # y
98
- [0x00, 0x44, 0x64, 0x54, 0x4C, 0x44], # z
99
- [0x00, 0x00, 0x08, 0x77, 0x00, 0x00], # {
100
- [0x00, 0x00, 0x00, 0x7F, 0x00, 0x00], # |
101
- [0x00, 0x00, 0x77, 0x08, 0x00, 0x00], # }
102
- [0x00, 0x10, 0x08, 0x10, 0x08, 0x00], # ~
103
- [0x14, 0x14, 0x14, 0x14, 0x14, 0x14], # horiz lines # DEL
104
- ]
105
- end
106
- end
@@ -1,61 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- class BoardMock < Denko::Board
4
- attr_reader :eeprom_stub
5
-
6
- def eeprom_read(start_address, length)
7
- # Initialize a fake EEPROM
8
- @eeprom_stub ||= Array.new(eeprom_length){255}
9
-
10
- # Pack it up like a string coming from the board.
11
- string = @eeprom_stub[start_address, length].map{ |x| x.to_s }.join(",")
12
-
13
- # Update ourselves with it.
14
- self.update("254:#{start_address}-#{string}\n")
15
- end
16
-
17
- def eeprom_write(start_address, bytes)
18
- @eeprom_stub[start_address, bytes.length] = bytes
19
- end
20
- end
21
-
22
- class BuiltInEEPROMTest < Minitest::Test
23
- def board
24
- @board ||= BoardMock.new
25
- end
26
-
27
- def part
28
- @part ||= board.eeprom
29
- end
30
-
31
- def test_pin_ee
32
- assert_equal part.pin, 254
33
- end
34
-
35
- def test_loads_on_initialize_and_updates_correctly
36
- assert_equal part.state, Array.new(board.eeprom_length){255}
37
- end
38
-
39
- def test_delegates_to_state_array
40
- mock = Minitest::Mock.new
41
- mock.expect(:[], 255, [0])
42
- mock.expect(:[]=, 128, [1, 128])
43
- mock.expect(:each, nil)
44
- mock.expect(:each_with_index, nil)
45
-
46
- part.stub(:state, mock) do
47
- part[0]
48
- part[1] = 128
49
- part.each { |el| el }
50
- part.each_with_index { |el| el }
51
- end
52
- end
53
-
54
- def test_saves_to_the_board
55
- part[0] = 128
56
- part[part.length] = 127
57
- part.save
58
- assert_equal 128, board.eeprom_stub[0]
59
- assert_equal 127, board.eeprom_stub[board.eeprom_length]
60
- end
61
- end
@@ -1,48 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- class SPITester
4
- include Denko::SPI::Peripheral::SinglePin
5
-
6
- def some_callback(data)
7
- end
8
- end
9
-
10
- class SPIPeripheralSinglePinTest < Minitest::Test
11
- def board
12
- @board ||= BoardMock.new
13
- end
14
-
15
- def bus
16
- @bus ||= Denko::SPI::Bus.new(board: board)
17
- end
18
-
19
- def options
20
- { bus: bus, pin: 9, spi_frequency: 800000, spi_mode: 2, spi_bit_order: :lsbfirst}
21
- end
22
-
23
- def part
24
- @part ||= SPITester.new(options)
25
- end
26
-
27
- def test_string_data_converts_to_bytes_for_callbacks
28
- part.on_data do |bytes|
29
- part.some_callback(bytes)
30
- end
31
- mock = Minitest::Mock.new.expect :call, nil, [[127,255]]
32
- part.stub(:some_callback, mock) do
33
- board.update("#{part.pin}:127,255")
34
- end
35
- mock.verify
36
- end
37
-
38
- def test_array_data_reaches_callbacks
39
- part.on_data do |bytes|
40
- part.some_callback(bytes)
41
- end
42
- mock = Minitest::Mock.new.expect :call, nil, [[127,255]]
43
- part.stub(:some_callback, mock) do
44
- part.update([127,255])
45
- end
46
- mock.verify
47
- end
48
- end
Binary file
Binary file
@@ -1,73 +0,0 @@
1
- #
2
- # Example 1: Controlling an LED
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- # If the board is plugged into a USB port, we can connect with serial over USB.
8
- connection = Denko::Connection::Serial.new
9
-
10
- # Create a new board object, giving the connection.
11
- board = Denko::Board.new(connection)
12
-
13
- #
14
- # Create an LED object, giving the board, and the pin that the positive
15
- # leg of the LED is connected to. The longer leg is usually positive.
16
- #
17
- # See led.pdf in this folder for a hook-up diagram.
18
- # Use a current limiting resistor with external LEDs to protect them.
19
- #
20
- # The on-board LED can also be used. It is connected to pin 13 on most Arduinos,
21
- # but can vary for other boards. The symbol :LED_BUILTIN should map to the right pin.
22
- # If it doesn't, change it to the pin number from your board's documentation.
23
- #
24
- # Note: Some boards use an addressable LED on-board. In those cases, connect an external
25
- # LED and use its pin for this example instead.
26
- #
27
- led = Denko::LED.new(board: board, pin: :LED_BUILTIN)
28
-
29
- # Now we can make it blink.
30
- puts "Blinking every half second..."
31
-
32
- #
33
- # A digital output can only have one of two states:
34
- # 1 / high / on
35
- # 0 / low / off
36
- # We can use led.digital_write to set it directly, or named convenience methods.
37
- # These 3 lines all do the same thing: turn on, wait half a second, turn off.
38
- #
39
- led.digital_write(1); sleep 0.5; led.digital_write(0)
40
- led.high; sleep 0.5; led.low
41
- led.on; sleep 0.5; led.off
42
-
43
- #
44
- # led.toggle will set it to the opposite state each time it's called.
45
- # Keep it blinking for 3 more seconds using #toggle.
46
- #
47
- 6.times do
48
- led.toggle
49
- sleep 0.5
50
- end
51
-
52
- #
53
- # What if we want to blink in the background?
54
- #
55
- # led.blink runs in a separate thread, managed by the led, and doesn't block the
56
- # main thread. Give it the blink interval in seconds.
57
- #
58
- led.blink 0.5
59
- puts "Blinking in the background... Hello from the main thread!"
60
- sleep 3
61
-
62
- #
63
- # Calling a method that sets the state (#digital_write, #high, #low, #on, #off)
64
- # automatically stops the blink thread.
65
- #
66
- puts "Turning off for 2 seconds..."
67
- led.off
68
- sleep 2
69
-
70
- # Blink faster indefinitely.
71
- puts "Blinking faster forever... (Press Ctrl+C to exit)"
72
- led.blink 0.1
73
- sleep
Binary file
Binary file
@@ -1,65 +0,0 @@
1
- #
2
- # Example 2: Using a Button
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- # Set up the board, connecting with serial over USB.
8
- board = Denko::Board.new(Denko::Connection::Serial.new)
9
-
10
- #
11
- # Create an object for a momentary button, giving the board, and the pin that
12
- # the ungrounded side of the button is connected to.
13
- #
14
- # `mode: :input_pullup` keeps the input pin high (logical 1) when the
15
- # button is not pressed. Without this (or an external pullup resistor), the pin
16
- # might float between 0 and 1, giving incorrect readings. When the button is
17
- # pressed, it pulls the input pin down to ground (0).
18
- #
19
- # See button.pdf in this folder for a hook-up diagram.
20
- #
21
- button = Denko::DigitalIO::Button.new(board: board, pin: 7, mode: :input_pullup)
22
-
23
- #
24
- # As soon as a Button (or any DigitalInput) is created, the board starts
25
- # listening for changes to the physical button. When that happens, our button
26
- # object is notified. To catch these notifications, we have to use a callback.
27
- # button.add_callback saves a block of code to run each time the button state changes.
28
- #
29
- # The callback below checks if the state is 0 (the button went from up to down),
30
- # then counts and prints the number of times pressed.
31
- #
32
- presses = 0
33
- button.add_callback(:count_presses) do |state|
34
- if state == 0
35
- presses = presses + 1
36
- puts "Button press ##{presses}"
37
- end
38
- end
39
-
40
- # Wait for the button to be pressed 3 times.
41
- puts "Press button 3 times to continue..."
42
- sleep 0.005 while presses < 3
43
-
44
- # Button keeps its callbacks in a Hash. We can be specific and use keys to add and remove.
45
- button.remove_callback(:count_presses)
46
-
47
- # Or remove them all. Either way, the block above won't run anymore.
48
- button.remove_callbacks
49
-
50
- #
51
- # button.down and button.up add callbacks that automatically check state for you.
52
- #
53
- # #down runs only when state goes from high (1) to low (0).
54
- # #up runs only when state goes from low (0) to high (1).
55
- #
56
- # We can use them to control the internal LED from example 1.
57
- #
58
- led = Denko::LED.new(board: board, pin: 13)
59
-
60
- button.up { led.off }
61
- button.down { led.on }
62
-
63
- puts "Press the button to turn on the LED... (Ctrl+C to exit)"
64
-
65
- sleep
@@ -1,66 +0,0 @@
1
- #
2
- # Example 3: Potentiometer and Analog Inputs
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- # Set up the board, connecting with serial over USB.
8
- board = Denko::Board.new(Denko::Connection::Serial.new)
9
-
10
- #
11
- # Connect the potentiometer's outer 2 pins to Ground and Vcc respectively.
12
- # The center is the wiper, and should be connected to one of the board's analog
13
- # pins. On most boards these pins start with 'A' and can be given as strings.
14
- #
15
- # See potentiometer.pdf in this folder for a hook-up diagram.
16
- #
17
- potentiometer = Denko::AnalogIO::Potentiometer.new(pin: 'A0', board: board)
18
-
19
- #
20
- # Like with Button, the Board starts reading the Potentiometer value immediately,
21
- # but we need to add a callback to do something with it.
22
- #
23
- potentiometer.on_change do |value|
24
- print "Potentiometer value: #{value} \r"
25
- end
26
- puts "Turn the potentiometer to change value. Press Enter to continue..."
27
-
28
- # Stop the callback.
29
- gets; puts
30
- potentiometer.remove_callbacks
31
-
32
- #
33
- # The default resolution for Analog Input is 10-bits, so you should have seen
34
- # values from 0 - 1023. We can use the value to control the blinking
35
- # speed of the LED from the earlier example.
36
- #
37
- led = Denko::LED.new(board: board, pin: 13)
38
-
39
- # Helper method to calculate the blink time.
40
- def map_pot_value(value)
41
- # Map 10 bit value into 0 to 1 range.
42
- fraction = value / 1023.to_f
43
-
44
- # Linearization hack for audio taper potentiometers.
45
- # Adjust k for different tapers. This was an A500K.
46
- k = 5
47
- linearized = (fraction * (k + 1)) / ((k * fraction) + 1)
48
- # Use this for linear potentiometers instead.
49
- # linearized = fraction
50
-
51
- # Map to the 0.1 to 0.5 seconds range in reverse. Clockwise = faster.
52
- 0.5 - (linearized * 0.4)
53
- end
54
-
55
- # Start blinking with interval of 0.3
56
- led.blink(0.3)
57
-
58
- # Callback that calculates the blink interval and tells the LED.
59
- potentiometer.on_change do |value|
60
- interval = map_pot_value(value)
61
- print "LED blink interval: #{interval.round(4)} seconds \r"
62
- # Update the LED's blink interval without stopping the blink.
63
- led.blink_interval = interval
64
- end
65
- puts "Turn potentiometer to control the LED blink. Press Ctrl+C to exit..."
66
- sleep
Binary file
Binary file
@@ -1,64 +0,0 @@
1
- #
2
- # Example 4: LED Brightness and PWM
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- # Set up the board, connecting with serial over USB
8
- board = Denko::Board.new(Denko::Connection::Serial.new)
9
-
10
- #
11
- # LEDs don't change brightness much with voltage, but we can vary it with a
12
- # technique called PWM. PWM sets up a fast (500Hz+) wave on the LED pin. Then we
13
- # set a duty cycle, telling the LED what fraction of those cycles to be on for.
14
- #
15
- # Eg. 1 cycle on, 4 cycles off = 20% duty cycle.
16
- # This happens so fast that it looks like 20% brightness to the naked eye.
17
- #
18
- # Depending on your board, some pins may not be PWM capable. Pin 13 on Arduinos
19
- # isn't, so the earlier example was limited to on/off. There might be a wave
20
- # symbol printed next to the pin number, but check your documentation.
21
- #
22
- # Note: If you have pins labeled "DAC", do not use them here. DACs generate steady
23
- # analog voltages, not pulses.
24
- #
25
- # Set up LED on a PWM pin. See pwm_led.pdf in this folder for hook-up diagram.
26
- #
27
- led = Denko::LED.new(board: board, pin: 11)
28
-
29
- # led.duty= sets duty cycle from 0 to 100, in percentage.
30
- [0, 20, 40, 60, 80, 100].each do |duty|
31
- led.duty = duty
32
- print "LED at #{duty}% duty cycle. Press Enter..."; gets
33
- end
34
- puts
35
-
36
- # Now let's add the potentiometer from the previous example to control it.
37
- potentiometer = Denko::AnalogIO::Potentiometer.new(pin: 'A0', board: board)
38
-
39
- # Helper method to calculate brightness.
40
- def map_pot_value(value)
41
- # Map 10 bit value into 0 to 1 range.
42
- fraction = value / 1023.to_f
43
-
44
- # Linearization hack for audio taper potentiometers.
45
- # Adjust k for different tapers. This was an A500K.
46
- # k = 5
47
- # linearized = (fraction * (k + 1)) / ((k * fraction) + 1)
48
-
49
- # Use this for linear potentiometers instead.
50
- linearized = fraction
51
-
52
- # x100 to get percentage out of 100.
53
- (linearized * 100).round
54
- end
55
-
56
- # Callback to change brightness.
57
- potentiometer.on_change do |value|
58
- duty = map_pot_value(value)
59
- led.duty = duty
60
- print "LED brightness: #{duty}% \r"
61
- end
62
-
63
- puts "Turn potentiometer to control the LED brightness. Press Ctrl+C to exit..."
64
- sleep
Binary file
Binary file
@@ -1,58 +0,0 @@
1
- #
2
- # Example 5: RGB LED
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- # Set up the board, connecting with serial over USB
8
- board = Denko::Board.new(Denko::Connection::Serial.new)
9
-
10
- #
11
- # To set up an RGB LED, connect its cathode leg to ground, and each of its 3 color
12
- # anodes to PWM-capable pin on your board, through a current limiting resistor. Make
13
- # the green resistor much larger. Since green is usually brighter, we want to limit
14
- # its current more than the others. See rgb_led.pdf for a hook-up diagram.
15
- # The values used are 4.7k Ohm for green, 220 Ohm for red and blue.
16
- #
17
- # An RGB LED is really 3 individual LEDS in one, sharing a cathode (sometimes anode).
18
- # We could initailize them separately, or use the RGBLed class, which takes all 3 pins.
19
- #
20
- rgb_led = Denko::LED::RGB.new(pins: {red: 11, green: 10, blue: 9}, board: board)
21
-
22
- #
23
- # We can call methods on the RGBLed as a whole. For example, these 8 defined colors.
24
- #
25
- print "Press Enter to cycle through RGBLed defined colors..."; gets
26
- [:red, :green, :blue, :cyan, :yellow, :magenta, :white, :off].each do |color|
27
- rgb_led.color = color
28
- sleep 0.5
29
- end
30
-
31
- #
32
- # Or we can access the individual Leds through the #red, #green and #blue methods.
33
- # This makes an orange color with them.
34
- #
35
- rgb_led.red.duty = 100
36
- rgb_led.green.duty = 40
37
- rgb_led.blue.off
38
- print "Done. Changed to orange. Press Enter to continue..."; gets
39
-
40
- # Let's bring the potentiometer back from the previous examples.
41
- potentiometer = Denko::AnalogIO::Potentiometer.new(pin: 'A0', board: board)
42
-
43
- #
44
- # In a separate file (rgb_mapping.rb), there are methods to map the 0-1023 values
45
- # received from the potentiometer into RGB values that create a rough color spectrum.
46
- #
47
- require_relative 'rgb_mapping'
48
- potentiometer.on_change do |pot_value|
49
- # Use the mapping methods to calculate values and write them.
50
- rgb_led.red.duty = map_red(pot_value)
51
- rgb_led.green.duty = map_green(pot_value)
52
- rgb_led.blue.duty = map_blue(pot_value)
53
-
54
- print "Potentiometer value: #{pot_value} \r"
55
- end
56
-
57
- puts "Turn potentiometer to change the RGB LED color. Press Ctrl+C to exit..."
58
- sleep
@@ -1,76 +0,0 @@
1
- # Maximum and minimum PWM values.
2
- OUT_MAX = 100
3
- OUT_MIN = 0
4
-
5
- def map_value(value, input_steps, reverse=false)
6
- # Map it to a 0-1 range first.
7
- fraction = value / input_steps.to_f
8
-
9
- # Reverse if needed.
10
- fraction = 1 - fraction if reverse
11
-
12
- # Map to the output range
13
- value = (fraction * OUT_MAX).floor
14
-
15
- # Clamp within the range just in case.
16
- value = OUT_MAX if value > OUT_MAX
17
- value = OUT_MIN if value < OUT_MIN
18
- value
19
- end
20
-
21
- def map_red(pot_value)
22
- # Red full on at low end.
23
- return OUT_MAX if pot_value < 171
24
-
25
- # Red fades out from 171-341
26
- if (171..341).include? pot_value
27
- return map_value(pot_value - 171, 170, true)
28
- end
29
-
30
- # Red full off in the middle third.
31
- return OUT_MIN if (342..682).include? pot_value
32
-
33
- # Red fades in from 683-853
34
- if (683..853).include? pot_value
35
- return map_value(pot_value - 683, 170, false)
36
- end
37
-
38
- # Red full on at high end.
39
- return OUT_MAX if pot_value > 853
40
- end
41
-
42
- def map_green(pot_value)
43
- # Green fades in from 0-171
44
- if (0..170).include? pot_value
45
- return map_value(pot_value, 170, false)
46
- end
47
-
48
- # Green full on from 1/6 to 1/2.
49
- return OUT_MAX if (171..511).include? pot_value
50
-
51
- # Green fades out from 512-682
52
- if (512..682).include? pot_value
53
- return map_value(pot_value - 512, 170, true)
54
- end
55
-
56
- # Geen full off above 2/3.
57
- return OUT_MIN if pot_value > 682
58
- end
59
-
60
- def map_blue(pot_value)
61
- # Blue full off until 1/3
62
- return OUT_MIN if pot_value < 342
63
-
64
- # Blue fades in from 342-512 (170 steps)
65
- if (342..542).include? pot_value
66
- return map_value(pot_value - 342, 170, false)
67
- end
68
-
69
- # Blue full on from 513 to 852
70
- return OUT_MAX if (513..852).include? pot_value
71
-
72
- # Blue fades out from 853-1023 (170 steps)
73
- if (853..1023).include? pot_value
74
- return map_value(pot_value - 853, 170, true)
75
- end
76
- end