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/HARDWARE.md DELETED
@@ -1,263 +0,0 @@
1
- # Microcontrollers
2
-
3
- :green_heart: Full support :yellow_heart: Partial support :heart: Planned. No support yet :question: Works in theory. Untested in real hardware.
4
-
5
- ### Espressif Chips with Wi-Fi (Except H2)
6
- [![ESP8266 Build Status](https://github.com/denko-rb/denko/actions/workflows/build_esp8266.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_esp8266.yml)
7
- [![ESP32 Build Status](https://github.com/denko-rb/denko/actions/workflows/build_esp32.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_esp32.yml)
8
- [![ESP32-C3 Build Status](https://github.com/denko-rb/denko/actions/workflows/build_esp32c3.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_esp32c3.yml)
9
- [![ESP32-C6 Build Status](https://github.com/denko-rb/denko/actions/workflows/build_esp32c6.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_esp32c6.yml)
10
- [![ESP32-H2 Build Status](https://github.com/denko-rb/denko/actions/workflows/build_esp32h2.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_esp32h2.yml)
11
- [![ESP32-S2 Build Status](https://github.com/denko-rb/denko/actions/workflows/build_esp32s2.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_esp32s2.yml)
12
- [![ESP32-S3 Build Status](https://github.com/denko-rb/denko/actions/workflows/build_esp32s3.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_esp32s3.yml)
13
-
14
- | Chip | Status | Board Tested | Notes |
15
- | :-------- | :------: | :--------------- |------ |
16
- | ESP8266 | :green_heart: | NodeMCU |
17
- | ESP8285 | :question: | DOIT ESP-Mx DevKit | Should be identical to 8266. Not tested in hardware.
18
- | ESP32 | :green_heart: | DOIT ESP32 DevKit V1 |
19
- | ESP32-S2 | :green_heart: | LOLIN S2 Pico | Native USB-CDC (broken in core 3.0+)
20
- | ESP32-S3 | :green_heart: | LOLIN S3 V1.0.0 | Native USB-CDC (broken in core 3.0+)
21
- | ESP32-C3 | :green_heart: | LOLIN C3 Mini V2.1.0 | Native USB-CDC (broken in core 3.0+)
22
- | ESP32-H2 | :green_heart: | ESP32-H2-MINI-1 | No Wi-Fi. Native USB-CDC (broken in core 3.0+)
23
- | ESP32-C6 | :green_heart: | ESP32-C6-WROOM-1 | Native USB-CDC (broken in core 3.0+)
24
-
25
- **Note:** For ESP32 chips using native USB-CDC, make sure `USB CDC On Boot` is `Enabled` in the IDE's `Tools` menu. Flashing from the CLI doesn't automatically enable this, so the IDE is recommended for now.
26
-
27
- **Note:** Since Arduino ESP32 Core version 3.0+, USB-CDC is very unreliable when sending lots of data both directions (something denko can do). It's a known issue in the core. Use a regular UART until it's fixed.
28
-
29
- ### AVR/MegaAVR Based Arduino Products (and Clones)
30
- [![AVR Build Status](https://github.com/denko-rb/denko/actions/workflows/build_atmega_avr.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_atmega_avr.yml)
31
- [![MegaAVR Build Status](https://github.com/denko-rb/denko/actions/workflows/build_atmega_megaavr.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_atmega_megaavr.yml)
32
-
33
- | Chip | Status | Products | Notes |
34
- | :-------- | :------: | :--------------- |------ |
35
- | ATmega168 | :green_heart: | Duemilanove, Diecimila, Pro | Omits features. `denko targets` for info.
36
- | ATmega328 | :green_heart: | Uno R3, Uno WiFi, Nano, Fio, Pro |
37
- | ATmega32u4 | :green_heart: | Leonardo, Micro, Leonardo ETH, Esplora, LilyPad USB |
38
- | ATmega1280 | :green_heart: | Mega |
39
- | ATmega2560 | :green_heart: | Mega2560, Arduino Mega ADK |
40
- | ATmega4809 | :green_heart: | Nano Every, Uno WiFi Rev2 |
41
-
42
- **Note:** Only USB boards listed. Any board with a supported chip should work, once you can flash it and connect to serial.
43
-
44
- ### ARM Based Arduino Products (and Clones)
45
- [![SAM3X Build Satus](https://github.com/denko-rb/denko/actions/workflows/build_atsam3x.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_atsam3x.yml)
46
- [![SAMD Build Satus](https://github.com/denko-rb/denko/actions/workflows/build_atsamd21.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_atsamd21.yml)
47
- [![RA4M1 Build Satus](https://github.com/denko-rb/denko/actions/workflows/build_ra4m1.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_ra4m1.yml)
48
-
49
- | Chip | Status | Products | Notes |
50
- | :-------- | :------: | :--------------- |------ |
51
- | ATSAM3X8E | :yellow_heart: | Due | Uses Native USB. Tone and IR Out don't work.
52
- | ATSAMD21 | :green_heart: | Zero, M0 Series, Nano 33 IOT, MKR WiFi 1010 | Native USB
53
- | RA4M1 | :yellow_heart: | Uno R4 Minima, Uno R4 WiFi | IR and WS2812 libraries don't support this yet
54
-
55
- ### Arduino Networking
56
-
57
- | Chip | Status | Products | Notes |
58
- | :-------- | :------: | :--------------- |------ |
59
- | Wiznet W5100/5500 | :green_heart: | Ethernet Shield | Wired Ethernet for Uno/Mega pin-compatibles
60
- | HDG204 + AT32UC3 | :question: | WiFi Shield | Compiles, but no hardware
61
- | ATWINC1500 | :green_heart: | MKR1000, WiFi Shield 101 | #define WIFI_101 for shield. Automatic for MKR1000
62
- | u-blox NINA-W102 | :question: | Uno WiFi Rev 2, MKR WiFi 1010, Nano 33 IOT | Should work. No hardware
63
-
64
- ### AVR Chips from [MightyCore](https://github.com/MCUdude/MightyCore)
65
-
66
- | Chip | Status | Products | Notes |
67
- | :-------- | :------: | :--------------- |------ |
68
- | ATmega1284 | :heart: | Used in many 8-bit 3D printer boards. |
69
-
70
- ### Raspberry Pi Microcontrollers
71
- [![RP2040 Build Status](https://github.com/denko-rb/denko/actions/workflows/build_rp2040.yml/badge.svg)](https://github.com/denko-rb/denko/actions/workflows/build_rp2040.yml)
72
-
73
- | Chip | Status | Board Tested | Notes |
74
- | :-------- | :------: | :--------------- |------ |
75
- | RP2040 | :green_heart: | Raspberry Pi Pico (W) |
76
-
77
- # Single Board Computers
78
-
79
- See the [Support](https://github.com/denko-rb/denko-piboard?tab=readme-ov-file#support) section of denko-piboard.
80
-
81
- # Peripherals
82
-
83
- :green_heart: Full support :yellow_heart: Partial support :heart: Planned. No support yet
84
-
85
- ### Interfaces
86
-
87
- | Name | Status | HW/SW | Component Class | Notes |
88
- | :--------------- | :------: | :--- | :-------------- | :---- |
89
- | Digital In | :green_heart: | H | `DigitalIO::Input` | 1ms - 128ms (4ms default) listen, poll, or read
90
- | Analog In (ADC) | :green_heart: | H | `AnalogIO::Input` | 1ms - 128ms (16ms default) listen, poll, or read
91
- | Digital Out | :green_heart: | H | `DigitalIO::Output` |
92
- | Analog Out (DAC) | :green_heart: | H | `AnalogIO::Output` | **Only** SAM3X, SAMD21, RA4M1, ESP32, ESP32-S2
93
- | PWM Out | :green_heart: | H | `PulseIO::PWMOutput` |
94
- | Servo/ESC Motor Drive | :green_heart: | H | See Motor Driver Table | Depends on PWM
95
- | Tone Out (Sq. Wave) | :green_heart: | H | `PulseIO::Buzzer` | Except SAM3X. Uses PWM
96
- | I2C | :green_heart: | H | `I2C::Bus` | Predetermined pins per board
97
- | I2C Bit-Bang | :green_heart: | S | `I2C::BitBang` | Any pins
98
- | SPI | :green_heart: | H | `SPI::Bus` | Predetermined pins per board
99
- | SPI Bit-Bang | :green_heart: | S | `SPI::BitBang` | Any pins
100
- | UART | :green_heart: | H | `UART::Hardware` | **Except** Atmega328, ATmega168
101
- | UART Bit-Bang | :green_heart: | S | `UART::BitBang` | **Only** ATmega328
102
- | Maxim OneWire | :green_heart: | S | `OneWire::Bus` | No overdrive
103
- | Infrared Output | :green_heart: | S | `PulseIO::IROutput` | **Except** SAM3X, RA4M1
104
- | Infrared Input | :heart: | S | `PulseIO::IRInput` | Doable with existing library
105
- | WS2812 RGB LEDs | :green_heart: | S | `LED::WS2812` | **Except** RA4M1
106
- | ESP32-PCNT | :heart: | H | - | **Only** ESP32. Pulse and encoder counter
107
- | ESP32-MCPWM | :heart: | H | - | **Only** ESP32. Motor control PWM
108
-
109
- **Note:** When listening, the board checks the pin's value every **_2^n_** milliseconds (**_n_** from **_0_** to **_7_**), without further commands.
110
- Polling and reading follow a call and response pattern.
111
-
112
- ### Basic Input/Output
113
-
114
- | Name | Status | Interface | Component Class | Notes |
115
- | :--------------- | :------: | :-------- | :--------------- |------ |
116
- | Button | :green_heart: | Digital In | `DigitalIO::Button` |
117
- | Rotary Encoder | :green_heart: | Digital In | `DigitalIO::RotaryEncoder` | Listens every 1ms
118
- | Potentiometer | :green_heart: | Analog In | `AnalogIO::Potentiometer` | Smoothing on by default
119
- | Relay | :green_heart: | Digital Out | `DigitalIO::Relay` |
120
-
121
- ### LEDs
122
-
123
- | Name | Status | Interface | Component Class | Notes |
124
- | :--------------- | :------: | :-------- | :--------------- |------ |
125
- | LED | :green_heart: | Digi/Ana Out | `LED::Base` |
126
- | RGB LED | :green_heart: | Digi/Ana Out | `LED::RGB` |
127
- | 7 Segment Display | :yellow_heart: | Digital Out | `LED::SevenSegment` | No decimal point
128
- | 8x8 LED (MAX7219) | :heart: | SPI | `LED::MAX7219` |
129
- | TM1637 | :heart: | BitBang SPI | `LED::TM1637` | 4x 7 Segment + Colon
130
- | Neopixel / WS2812B | :yellow_heart: | Adafruit Library | `LED::WS2812` | Not working on RP2040
131
- | Dotstar / APA102 | :green_heart: | SPI | `LED::APA102` |
132
-
133
- ### Displays
134
-
135
- | Name | Status | Interface | Component Class | Notes |
136
- | :--------------- | :------: | :-------- | :--------------- |------ |
137
- | HD44780 LCD | :green_heart: | Digital Out, Output Register | `Display::HD44780` |
138
- | SSD1306 OLED | :yellow_heart: | I2C or SPI | `Display::SSD1306` | 1 font, some graphics
139
- | SH1106 OLED | :yellow_heart: | I2C or SPI | `Display::SH1106` | Works same as SSD1306
140
- | ST7565R (128x64 Mono) | :heart: | SPI | `Display::ST7565R` |
141
- | ST7735S (160x128 RGB) | :heart: | SPI | `Display::ST7735S` |
142
- | ILI9341 (240x320 RGB) | :heart: | SPI | `Display::ILI9341` |
143
- | GC9107 (128x128 RGB) | :heart: | SPI | `Display::GC9107` |
144
- | GC9A01 (240x240 Round) | :heart: | SPI | `Display::GCA9A01` |
145
- | IL0373 (212x104 E-Paper) | :heart: | SPI | `Display::IL0373` |
146
-
147
- ### Sound
148
-
149
- | Name | Status | Interface | Component Class | Notes |
150
- | :--------------- | :------: | :-------- | :--------------- |------ |
151
- | Piezo Buzzer | :green_heart: | Tone Out | `PulseIO::Buzzer` | Frequency > 30Hz
152
-
153
- ### Motors / Motor Drivers
154
-
155
- | Name | Status | Interface | Component Class | Notes |
156
- | :--------------- | :------: | :-------- | :--------------- |------ |
157
- | Generic Hobby Servo | :green_heart: | Servo/ESC PWM | `Motor::Servo` | Max depends on PWM channel count
158
- | Generic ESC | :yellow_heart: | Servo/ESC PWM | `Motor::Servo` | Works. Needs its own class.
159
- | PCA9685 | :heart: | I2C | `PulseIO::PCA9685` | 16-ch, 12-bit PWM for servo or LED
160
- | L298N | :green_heart: | Digi + PWM Out | `Motor::L298` | H-Bridge DC motor driver
161
- | DRV8833 | :heart: | Digi + PWM Out | `Motor::DRV8833` | H-Bridge DC motor driver
162
- | TB6612 | :heart: | Digi + PWM Out | `Motor::TB6612` | H-Bridge DC motor driver
163
- | A3967 | :green_heart: | Digital Out | `Motor::Stepper` | 1-ch microstepper (EasyDriver)
164
- | A4988 | :yellow_heart: | DigitalOut | `Motor::Stepper` | 1-ch microstepper
165
- | TMC2209 | :heart: | - | - | 1-ch silent stepper driver
166
-
167
- ### I/O Expansion
168
-
169
- | Name | Status | Interface | Component Class | Notes |
170
- | :--------------- | :------: | :-------- | :--------------- |------ |
171
- | Input Register | :green_heart: | SPI | `SPI::InputRegister` | Tested on CD4021B
172
- | Output Register | :green_heart: | SPI | `SPI::OutputRegister`| Tested on 74HC595
173
- | PCF8574 Expander | :heart: | I2C | `DigitalIO::PCF8574` | 8-ch bi-directional digital I/O
174
- | ADS1100 ADC | :green_heart: | I2C | `AnalogIO::ADS1100` | 1-ch, 16-bit ADC. No continuous mode.
175
- | ADS1115 ADC | :green_heart: | I2C | `AnalogIO::ADS1115` | 4-ch, 16-bit ADC. Comparator not implemented.
176
- | ADS1118 ADC | :green_heart: | SPI | `AnalogIO::ADS1118` | 4-ch, 16-bit ADC + temperature
177
- | ADS1232 ADC | :heart: | SPI | `AnalogIO::ADS1232` | 2-ch, 24-bit ADC + temperature
178
- | PCF8591 ADC/DAC | :heart: | I2C | `AnalogIO::PCF8591` | 4-ch, 8-bit ADC + 1-ch 8-bit DAC
179
- | MCP4725 DAC | :heart: | I2C | `AnalogIO::MCP4275` | 1-ch, 12-bit DAC
180
- | PCA9548 I2C Mux | :heart: | I2C | `I2C::PCA9548` | 8-way I2C multiplexer
181
-
182
- ### Environmental Sensors
183
-
184
- | Name | Status | Interface | Component Class | Type | Notes |
185
- | :--------------- | :------: | :-------- | :--------------- |--------------- | ---------------------- |
186
- | MAX31850 | :heart: | OneWire | `Sensor::MAX31850` | Thermocouple |
187
- | MAX6675 | :heart: | SPI | `Sensor::MAX6675` | Thermocouple |
188
- | DS18B20 | :green_heart: | OneWire | `Sensor::DS18B20` | Temp |
189
- | DHT11/21/22 | :green_heart: | Digi In/Out | `Sensor::DHT` | Temp / RH |
190
- | SHT30/31/35 | :green_heart: | I2C | `Sensor::SHT3X` | Temp / RH | M5Stack ENV III, one-shot only
191
- | SHT40/41 | :heart: | I2C | `Sensor::SHT4X` | Temp / RH |
192
- | QMP6988 | :green_heart: | I2C | `Sensor::QMP6988` | Temp / Press | M5Stack ENV III
193
- | BMP180 | :green_heart: | I2C | `Sensor::BMP180` | Temp / Press |
194
- | BMP280 | :green_heart: | I2C | `Sensor::BMP280` | Temp / Press |
195
- | BME280 | :green_heart: | I2C | `Sensor::BME280` | Temp / Press / RH |
196
- | BME680 | :heart: | I2C | `Sensor::BME680` | Temp / Press / RH / TVOC |
197
- | HTU21D | :green_heart: | I2C | `Sensor::HTU21D` | Temp / RH | No user register read
198
- | HTU31D | :green_heart: | I2C | `Sensor::HTU31D` | Temp / RH | No diagnostic read
199
- | AHT10/15 | :green_heart: | I2C | `Sensor::AHT10` | Temp / RH |
200
- | AHT20/21/25 | :green_heart: | I2C | `Sensor::AHT20` | Temp / RH |
201
- | ENS160 | :heart: | I2C | `Sensor::ENS160` | eCO2 / TVOC / AQI |
202
- | AGS02MA | :heart: | I2C | `Sensor::AGS02MA` | TVOC |
203
- | SCD40 | :heart: | I2C | `Sensor::SDC40` | Temp / Press / CO2 |
204
- | CCS811 | :heart: | I2C | `Sensor::CCS811` | eCO2 |
205
-
206
- ### Light Sensors
207
-
208
- | Name | Status | Interface | Component Class | Notes |
209
- | :--------------- | :------: | :-------- | :--------------- |------ |
210
- | BH1750 | :heart: | Digital In | `Sensor::BH1750` | Ambient Light
211
- | TCS34725 | :heart: | I2C | `Sensor::TCS34725` | RGB
212
- | APDS9960 | :heart: | I2C | `Sensor::APDS9960` | Proximity, RGB, Gesture
213
-
214
- ### PIR Motion Sensors
215
- | Name | Status | Interface | Component Class | Notes |
216
- | :--------------- | :------: | :-------- | :--------------- |------ |
217
- | HC-SR501 | :green_heart: | Digital In | `Sensor::GenericPIR` |
218
- | HC-SR505 | :yellow_heart: | Digital In | `Sensor::GenericPIR` |
219
- | AS312 | :green_heart: | Digital In | `Sensor::GenericPIR` |
220
- | AM312 | :yellow_heart: | Digital In | `Sensor::GenericPIR` |
221
-
222
- ### Distance Sensors
223
-
224
- | Name | Status | Interface | Component Class | Notes |
225
- | :--------------- | :------: | :-------- | :--------------- |------ |
226
- | HC-SR04 | :green_heart: | Digi In/Out | `Sensor::HCSR04` | Ultrasonic, 20-4000mm
227
- | RCWL-9620 | :green_heart: | I2C | `Sensor::RCWL9260` | Ultrasonic, 20-4500mm
228
- | VL53L0X | :heart: | I2C | `Sensor::VL53L0X` | Laser, 30 - 1000mm
229
- | GP2Y0E03 | :heart: | I2C | `Sensor::GP2Y0E03` | Infrared, 40 - 500mm
230
-
231
- ### Inertial Measurement Units
232
-
233
- | Name | Status | Interface | Component Class | Notes |
234
- | :--------------- | :------: | :-------- | :--------------- |------ |
235
- | ADXL345 | :heart: | I2C | `Sensor::ADXL345` | Accelerometer
236
- | IT3205 | :heart: | I2C | `Sensor::IT3205` | Gyroscope
237
- | HMC5883L | :heart: | I2C | `Sensor::HMC5883L` | Compass
238
- | MPU6050 | :heart: | I2C | `Sensor::MPU6050` | Gyro + Accelerometer
239
- | MPU6886 | :heart: | I2C | `Sensor::MPU6886` | Gyro + Accelerometer
240
- | BMI160 | :heart: | I2C | `Sensor::BMI160` | Gyro + Accelerometer
241
- | LSM6DS3 | :heart: | I2C | `Sensor:LSM6DS3` | Gyro + Accelerometer
242
-
243
- ### Real Time Clocks
244
-
245
- | Name | Status | Interface | Component Class | Notes |
246
- | :--------------- | :------: | :-------- | :--------------- |------ |
247
- | DS1302 | :heart: | I2C | `RTC::DS1302` |
248
- | DS1307 | :heart: | I2C | `RTC::DS1307` |
249
- | DS3231 | :green_heart: | I2C | `RTC::DS3231` | Alarms not implemented
250
- | PCF8563 | :heart: | I2C | `RTC::PCF8563` |
251
-
252
- ### GPS
253
-
254
- | Name | Status | Interface | Component Class | Notes |
255
- | :--------------- | :------: | :-------- | :--------------- |------ |
256
- | GT-U7 | :heart: | UART | - |
257
-
258
- ### Miscellaneous
259
-
260
- | Name | Status | Interface | Component Class | Notes |
261
- | :--------------- | :------: | :-------- | :--------------- |------ |
262
- | Board EEPROM | :green_heart: | Built-In | `EEPROM::BuiltIn` | Arduino ARM boards have no EEPROM
263
- | MFRC522 | :heart: | SPI/I2C | `DigitalIO::MFRC522` | RFID tag reader / writer
@@ -1,49 +0,0 @@
1
- #
2
- # Find how much analog listen throughput is available from a Board.
3
- #
4
- # To find the limit, add more pins and/or reduce the divider until
5
- # the rate per input pin can't meet the target.
6
- # Example: Rate per input pin is < 500 Hz when divider is 2 ms.
7
- #
8
- require 'bundler/setup'
9
- require 'denko'
10
-
11
- # In seconds
12
- TEST_TIME = 30
13
-
14
- # Millisecond interval for analog listeners
15
- # Valid values: 1, 2, 4, 8, 16, 32, 64, 128
16
- DIVIDER = 2
17
-
18
- # Input pins to read
19
- PINS = [:A0, :A1]
20
-
21
- connection = Denko::Connection::Serial.new
22
- board = Denko::Board.new(connection)
23
- inputs = PINS.map { |pin| Denko::AnalogIO::Input.new(pin: pin, board: board) }
24
-
25
- # No mutex. Denko::Board callbacks are sequential, regardless of Ruby engine.
26
- $readings = 0
27
- inputs.each do |input|
28
- input.add_callback { $readings += 1 }
29
- input.listen(DIVIDER)
30
- end
31
-
32
- print "Sampling for #{TEST_TIME} seconds... "
33
-
34
- # Main test
35
- start = Time.now
36
- $readings = 0
37
- sleep TEST_TIME
38
- finish = Time.now
39
- # Copy immediately to another variable before stopping inputs.
40
- readings = $readings
41
- inputs.each { |input| input.stop }
42
-
43
- puts "Done."; puts
44
-
45
- rps = (readings / (finish - start))
46
- rpspi = rps / inputs.count
47
- puts "Total analog readings : #{readings}"
48
- puts "Analog readings /s : #{rps.round(3)}"
49
- puts "Rate per input pin : #{rpspi.round(3)} Hz"
@@ -1,28 +0,0 @@
1
- #
2
- # Benchmark digital write throughput for a Denko::Board instance.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- # Pins > 63 will not benefit from the single-byte message optimization.
8
- PIN = 4
9
- TOTAL_WRITES = 200_000
10
-
11
- connection = Denko::Connection::Serial.new
12
- board = Denko::Board.new(connection)
13
- output = Denko::DigitalIO::Output.new(board: board, pin: PIN)
14
-
15
- print "Testing #{TOTAL_WRITES} digital writes... "
16
-
17
- start = Time.now
18
- (TOTAL_WRITES / 2).times do
19
- output.high
20
- output.low
21
- end
22
- board.finish_write
23
- finish = Time.now
24
-
25
- puts "Done."; puts
26
-
27
- wps = TOTAL_WRITES / (finish - start)
28
- puts "Digital writes per second : #{wps.round(3)}"
@@ -1,91 +0,0 @@
1
- #
2
- # Repeatedly writes filled and empty frames to the OLED
3
- # Calculates frames per second. Higher is better.
4
- #
5
- # RESULTS:
6
- # July 6 2023 | i7 8700k CPU | CRuby 3.2.1 | 100 frames | 1 Mhz I2C frequency | Average of 3 runs
7
- #
8
- # Arduino Uno R3 : 5.3 fps (ATmega16u2 UART bridge @ 115200, no I2C level shifter)
9
- # Arduino Uno R3 : 7.1 fps (ATmega16u2 UART bridge @ 230400, no I2C level shifter)
10
- # Arduino Leonardo : 12.9 fps (native USB, no I2C level shifter)
11
- # Arduino Due : 43.0 fps (native USB)
12
- # Arduino Due : 7.9 fps (programming USB @ 115200)
13
- # Arduino Zero : 28.6 fps (native USB)
14
- # Arduino Zero : 9.4 fps (programming USB @ 115200)
15
- # Arduino Zero : 13.6 fps (programming USB @ 230400)
16
- # ESP8266 (Node MCU) : 9.9 fps (Silicon Labs UART bridge @ 115200)
17
- # ESP8266 (Node MCU) : 19.7 fps (Silicon Labs UART bridge @ 230400)
18
- # ESP32 V1 : 9.8 fps (Silicon Labs UART bridge @ 115200)
19
- # ESP32 V1 : 19.4 fps (Silicon Labs UART bridge @ 230400)
20
- # ESP32-S3 : 58.8 fps (native USB)
21
- # Raspberry Pi Pico W : 36.4 fps (native USB)
22
- #
23
- # July 15 2023 | i7 8700k CPU | CRuby 3.2.1 | 100 frames | 1 Mhz I2C frequency | Average of 3 runs
24
- #
25
- # Arduino Uno R4 WiFi : 7.5 fps (USB through ESP32-S3 @ 115200, 32-byte I2C limit, no I2C level shifter)
26
- # Arduino Uno R4 WiFi : 7.8 fps (USB through ESP32-S3 @ 230400, 32-byte I2C limit, no I2C level shifter)
27
- #
28
- # August 13 2023 | i7 8700k CPU | CRuby 3.2.1 | 100 frames | 1 Mhz I2C frequency | Average of 3 runs
29
- #
30
- # Arduino Nano Every : 9.2 fps (USB through ATSAMD11 @ 115200, 128-byte I2C limit, no I2C level shifter)
31
- # Arduino Nano Every : 13.0 fps (USB through ATSAMD11 @ 230400, 128-byte I2C limit, no I2C level shifter)
32
- #
33
- # February 25 2024 | i7 8700k CPU | CRuby 3.2.1 | 100 frames | 1 Mhz I2C frequency | Average of 3 runs
34
- #
35
- # ESP32-S3 : 51.8 fps (native USB) - Changed from 64 to 128 serial ACK interval
36
- # ESP32-C3 : 51.7 fps (native USB) - Changed from 64 to 128 serial ACK interval
37
- #
38
- # July 27 2024 | i7 8700k CPU | CRuby 3.3.1 | 100 frames | Average of 3 runs
39
- #
40
- # ESP32-H2 : 7.3 fps (WCH UART bridge @ 115200, I2C @ 400kHz)
41
- # ESP32-H2 : 10.9 fps (WCH UART bridge @ 230400, I2C @ 400kHz)
42
- # ESP32-C6 : 8.0 fps (WCH UART bridge @ 115200, I2C @ 1MHz)
43
- # ESP32-C6 : 13.2 fps (WCH UART bridge @ 230400, I2C @ 1MHz)
44
- #
45
- require 'bundler/setup'
46
- require 'denko'
47
-
48
- # Settings
49
- # Must match speed in the sketch for UART briges. Doesn't matter for native USB.
50
- BAUD_RATE = 115_200
51
- FRAME_COUNT = 100
52
- # Request 1 Mhz I2C frequency. Wire libraries will fall back to fastest available speed.
53
- I2C_FREQUENCY = 1_000_000
54
- # Use :SDA0 for RP2040
55
- I2C_PIN = :SDA
56
-
57
- # Setup
58
- board = Denko::Board.new(Denko::Connection::Serial.new(baud: BAUD_RATE))
59
- bus = Denko::I2C::Bus.new(board: board)
60
- oled = Denko::Display::SSD1306.new(bus: bus, rotate: true, i2c_frequency: I2C_FREQUENCY)
61
- canvas = oled.canvas
62
-
63
- # Intro
64
- canvas.print "SSD1306 Benchmark"
65
- oled.draw
66
- sleep 1
67
-
68
- # Run
69
- start = Time.now
70
- (FRAME_COUNT / 2).times do
71
- canvas.fill
72
- oled.draw
73
- canvas.clear
74
- oled.draw
75
- end
76
- board.finish_write
77
- finish = Time.now
78
-
79
- # Calculate results
80
- fps = FRAME_COUNT / (finish - start)
81
-
82
- # Print to terminal
83
- puts "SSD1306 benchmark result: #{fps.round(2)} fps"
84
- puts
85
-
86
- # Print to screen
87
- canvas.clear
88
- canvas.text_cursor = [0,0]
89
- canvas.print "#{fps.round(2)} fps"
90
- oled.draw
91
- board.finish_write
@@ -1,46 +0,0 @@
1
- #
2
- # This example combines the SHTX and QMP6988 examples. The M5Stack ENV III unit
3
- # contains both sensors, accessible over a single I2C connection.
4
- #
5
- require 'bundler/setup'
6
- require 'denko'
7
- require_relative '../sensor/neat_tph_readings'
8
-
9
- # How many degrees C the two temperature values can differ by before a warning.
10
- TOLERANCE = 0.50
11
-
12
- board = Denko::Board.new(Denko::Connection::Serial.new)
13
- bus = Denko::I2C::Bus.new(board: board)
14
- sht = Denko::Sensor::SHT3X.new(bus: bus) # address: 0x44 default
15
- qmp = Denko::Sensor::QMP6988.new(bus: bus) # address: 0x70 default
16
-
17
- # Configure for higher accuracy.
18
- sht.repeatability = :high
19
- qmp.temperature_samples = 2
20
- qmp.pressure_samples = 16
21
- qmp.iir_coefficient = 2
22
-
23
- # Buggy on ESP32-S3 in forced mode. Data registers return zeroes on all but first read.
24
- # Can't recreate on ESP32 V1, AVR or SAMD21. Put it in contiuous mode just in case.
25
- qmp.continuous_mode
26
-
27
- loop do
28
- # Read both sensors.
29
- qmp_reading = qmp.read
30
- sht_reading = sht.read
31
-
32
- # Retry immediately if either failed.
33
- next unless (sht_reading && qmp_reading)
34
-
35
- # Warn if large gap between temperature readings.
36
- difference = (qmp_reading[:temperature] - sht_reading[:temperature]).abs
37
- if (difference > TOLERANCE)
38
- puts "WARNING: temperature values differed by more than #{TOLERANCE}\xC2\xB0C (#{difference.round(4)} \xC2\xB0C)"
39
- end
40
-
41
- # Combine values from both sensors, averaging their temperatures.
42
- average_temperature = (qmp_reading[:temperature] + sht_reading[:temperature]) / 2.0
43
- print_tph_reading(temperature: average_temperature, humidity: sht_reading[:humidity], pressure: qmp_reading[:pressure])
44
-
45
- sleep 5
46
- end
@@ -1,53 +0,0 @@
1
- #
2
- # Example using a KY-040 (30 detent) rotary encoder as a mac volume control.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PIN_A = 4
8
- PIN_B = 5
9
-
10
- board = Denko::Board.new(Denko::Connection::Serial.new)
11
- encoder = Denko::DigitalIO::RotaryEncoder.new board: board,
12
- pins: { a: PIN_A, b: PIN_B }
13
-
14
- # Set up a pseudo terminal with osascript (AppleScript) in interactive mode.
15
- # Calling a separate script each update is too slow.
16
- class AppleVolumeWrapper
17
- require 'pty'
18
- require 'expect'
19
-
20
- def initialize
21
- @in, @out, pid = PTY.spawn('osascript -i')
22
- @in.expect(/>> /) # Terminal ready.
23
- end
24
-
25
- def get
26
- @out.write("output volume of (get volume settings)\r\n")
27
- @in.expect(/=> (\d+)\r\n/)[1].to_i
28
- end
29
-
30
- def set(value)
31
- @out.write("set volume output volume #{value}\r\n")
32
- @in.expect(/>> /)
33
- end
34
- end
35
-
36
- volumeWrapper= AppleVolumeWrapper.new
37
- # volumeWrapper.get can return imprecise values.
38
- # Display those, but keep exact value in this variable.
39
- volume = volumeWrapper.get
40
- puts "Current volume: #{volume}%"
41
-
42
- encoder.add_callback do |update|
43
- # update[:change] is always either +1 or -1.
44
- volume = volume += update[:change]
45
- volume = 0 if volume < 0
46
- volume = 100 if volume > 100
47
-
48
- volumeWrapper.set(volume)
49
- current_volume = volumeWrapper.get
50
- puts "Current volume: #{current_volume}%"
51
- end
52
-
53
- sleep
@@ -1,43 +0,0 @@
1
- #
2
- # This example polls an HTU21D (temp/humidity sensor) in the background.
3
- # The main thread refreshes an SSD1306 OLED ~20 times per second,
4
- # showing the latest temperature and humidity values, and current time.
5
- # Both devices are conected to the same I2C bus.
6
- #
7
- require 'bundler/setup'
8
- require 'denko'
9
-
10
- board = Denko::Board.new(Denko::Connection::Serial.new)
11
- i2c = Denko::I2C::Bus.new(board: board)
12
-
13
- # Get temperature and humidity every second.
14
- htu21d = Denko::Sensor::HTU21D.new(bus: i2c)
15
- htu21d.poll(2)
16
-
17
- oled = Denko::Display::SSD1306.new(bus: i2c, rotate: true)
18
- canvas = oled.canvas
19
-
20
- last_refresh = Time.now
21
- loop do
22
- elapsed = Time.now - last_refresh
23
-
24
- # Aim for 20 fps.
25
- if elapsed > 0.049
26
- canvas.clear
27
-
28
- canvas.text_cursor = [0,0]
29
- canvas.print "Time: #{Time.now.strftime("%H:%M:%S.%L")}"
30
-
31
- canvas.text_cursor = [0,8]
32
- canvas.print "Temp: " + ('%.3f' % htu21d.temperature).rjust(7, " ") + " C"
33
-
34
- canvas.text_cursor = [0,16]
35
- canvas.print "Humidity: " + ('%.3f' % htu21d.humidity).rjust(7, " ") + " %"
36
-
37
- # Only refresh the area in use.
38
- oled.draw(0, 127, 0, 24)
39
- last_refresh = Time.now
40
- else
41
- sleep 0.001
42
- end
43
- end
@@ -1,48 +0,0 @@
1
- #
2
- # Example using an ADS1100 ADC over the I2C bus.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- # Helper method so readings look nice.
8
- def print_reading(name, raw, voltage)
9
- print "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} - "
10
- print "#{name.rjust(9, " ")} | "
11
- print "Raw: #{raw.to_s.rjust(6, " ")} | "
12
- print "Voltage: "
13
- print ("%.10f" % voltage).rjust(13, " ")
14
- puts " V"
15
- end
16
-
17
- board = Denko::Board.new(Denko::Connection::Serial.new)
18
- bus = Denko::I2C::Bus.new(board: board)
19
-
20
- # Unlike the ADS1115/1118, full-scale voltage depends on Vdd. Give during setup.
21
- # This works for my M5Stack ADC unit (0-12V) when checked against a multimeter.
22
- ads = Denko::AnalogIO::ADS1100.new bus: bus,
23
- full_scale_voltage: 26.408,
24
- sample_rate: 16,
25
- gain: 2
26
- # address: 0x48 default
27
-
28
- #
29
- # Configure gain and sample rate. See datasheet for more info.
30
- # Valid values:
31
- # Gain: 1 (default), 2, 4, 8
32
- # Sample Rate: 8 (default), 16, 32, 128
33
- #
34
- ads.gain = 1
35
- ads.sample_rate = 8
36
-
37
- # Configure smoothing.
38
- ads.smoothing = true
39
- ads.smoothing_size = 8
40
-
41
- # Poll and print indefinitely.
42
- ads.poll(0.25) do |reading|
43
- # volts_per_bit calculated from full-scale voltage, gain and sample rate.
44
- voltage = reading * ads.volts_per_bit
45
- print_reading("ADS1100:", reading, voltage)
46
- end
47
-
48
- sleep