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,14 +0,0 @@
1
- #
2
- # Blink example for standard built-in LEDs named :LED_BUILTIN
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PIN = :LED_BUILTIN
8
-
9
- board = Denko::Board.new(Denko::Connection::Serial.new)
10
- led = Denko::LED.new(board: board, pin: PIN)
11
-
12
- led.blink 0.5
13
-
14
- sleep
@@ -1,19 +0,0 @@
1
- #
2
- # Blink example for standard built-in LEDs named :LED_BUILTIN
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PIN = :LED_BUILTIN
8
-
9
- board = Denko::Board.new(Denko::Connection::Serial.new)
10
- led = Denko::LED.new(board: board, pin: PIN)
11
-
12
- min = 0
13
- max = 100
14
- values = (min..max).to_a + (min..max-1).to_a.reverse
15
-
16
- values.cycle do |value|
17
- led.duty = value
18
- sleep 0.005
19
- end
@@ -1,31 +0,0 @@
1
- #
2
- # A standard 3 pin RGB LED (not single pin addressable), on 3 PWM pins.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- RED_PIN = 11
8
- GREEN_PIN = 10
9
- BLUE_PIN = 9
10
-
11
- board = Denko::Board.new(Denko::Connection::Serial.new)
12
- rgb_led = Denko::LED::RGB.new board: board,
13
- pins: {red: RED_PIN, green: GREEN_PIN, blue: BLUE_PIN}
14
-
15
- # Set these predefined colors with symbols.
16
- [:red, :green, :blue, :cyan, :yellow, :magenta, :white, :off].each do |color|
17
- rgb_led.color = color
18
- sleep 0.5
19
- end
20
-
21
- # Set duty cycle for each "sub LED".
22
- loop do
23
- rgb_led.red.duty = 100
24
- rgb_led.green.duty = 50
25
- rgb_led.blue.duty = 0
26
- sleep 0.5
27
- rgb_led.red.duty = 100
28
- rgb_led.green.duty = 0
29
- rgb_led.blue.duty = 50
30
- sleep 0.5
31
- end
@@ -1,17 +0,0 @@
1
- #
2
- # Echo pressed keys to a seven segment LED.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PINS = { cathode: 10, a: 3, b: 4, c: 5, d: 6, e: 7, f: 8, g: 9 }
8
-
9
- board = Denko::Board.new(Denko::Connection::Serial.new)
10
- ssd = Denko::LED::SevenSegment.new board: board,
11
- pins: PINS
12
-
13
- # Turn off the ssd on exit
14
- trap("SIGINT") { exit !ssd.off }
15
-
16
- # Display each new line on the ssd
17
- loop { ssd.display(gets.chomp) }
@@ -1,30 +0,0 @@
1
- #
2
- # Walk a pixel along a WS2812 strip and back, changing color each loop.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PIN = 4
8
- PIXELS = 8
9
-
10
- RED = [255, 0, 0]
11
- GREEN = [0, 255, 0]
12
- BLUE = [0, 0, 255]
13
- WHITE = [255, 255, 255]
14
- COLORS = [RED, GREEN, BLUE, WHITE]
15
-
16
- positions = (0..PIXELS-1).to_a + (1..PIXELS-2).to_a.reverse
17
-
18
- board = Denko::Board.new(Denko::Connection::Serial.new)
19
- strip = Denko::LED::WS2812.new(board: board, pin: PIN, length: PIXELS)
20
-
21
- loop do
22
- COLORS.each do |color|
23
- positions.each do |index|
24
- strip.clear
25
- strip[index] = color
26
- strip.show
27
- sleep 0.05
28
- end
29
- end
30
- end
@@ -1,22 +0,0 @@
1
- #
2
- # Blink example for the LOLIN ESP32 S3 or C3, or any board where
3
- # :LED_BUILTIN is the data pin for a single on-board WS2812.
4
- #
5
- require 'bundler/setup'
6
- require 'denko'
7
-
8
- PIN = :LED_BUILTIN
9
- WHITE = [255, 255, 255]
10
- OFF = [0, 0, 0]
11
-
12
- board = Denko::Board.new(Denko::Connection::Serial.new)
13
- strip = Denko::LED::WS2812.new(board: board, pin: PIN, length: 1)
14
-
15
- loop do
16
- strip[0] = WHITE
17
- strip.show
18
- sleep 0.5
19
- strip[0] = OFF
20
- strip.show
21
- sleep 0.5
22
- end
@@ -1,43 +0,0 @@
1
- #
2
- # Fade colors along a WS2812, and over time.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PIN = 4
8
- PIXELS = 8
9
-
10
- board = Denko::Board.new(Denko::Connection::Serial.new)
11
- strip = Denko::LED::WS2812.new(board: board, pin: PIN, length: PIXELS)
12
-
13
- min = 0
14
- max = 255
15
- gap = 5
16
- values = (min..max).step(gap).to_a + (min..max-gap).step(gap).to_a.reverse
17
-
18
- color_values= []
19
- # Red
20
- values.each { |v| color_values << [v, 0, 0] }
21
- # Green
22
- values.each { |v| color_values << [0, v, 0] }
23
- # Blue
24
- values.each { |v| color_values << [0, 0, v] }
25
- # White
26
- values.each { |v| color_values << [v, v, v] }
27
-
28
- loop do
29
- start = 0
30
- finish = PIXELS - 1
31
- while (finish < color_values.length)
32
- slice = color_values[start..finish]
33
-
34
- slice.each_with_index do |value, i|
35
- strip[i] = value
36
- end
37
- strip.show
38
- sleep 0.025
39
-
40
- start += 1
41
- finish += 1
42
- end
43
- end
@@ -1,45 +0,0 @@
1
- #
2
- # Drive a DC motor with the L298 H-Bridge driver.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
- board = Denko::Board.new(Denko::Connection::Serial.new)
7
-
8
- PINS = { direction1: 8, direction2: 9, enable: 10 }
9
-
10
- # This is only 1 channel of the driver. Make a new object for each channel.
11
- motor = Denko::Motor::L298.new(board: board, pins: PINS)
12
-
13
- # Off without braking (initial state).
14
- # motor.off
15
- # motor.idle
16
-
17
- # Go forward at half speed for a while.
18
- motor.forward(50)
19
- sleep 2
20
-
21
- # Change direction.
22
- motor.reverse(50)
23
- sleep 2
24
-
25
- # Speed up without changing direction.
26
- motor.speed = 100
27
- sleep 2
28
-
29
- # Brake to stop quickly.
30
- motor.brake
31
- sleep 1
32
-
33
- # Change from brake to forward, but 0 speed.
34
- motor.forward(0)
35
- sleep 1
36
-
37
- # Speed up in 5% increments.
38
- (1..20).each do |step|
39
- sleep 0.5
40
- motor.speed = step * 5
41
- end
42
-
43
- # Turn it off.
44
- motor.off
45
- board.finish_write
@@ -1,17 +0,0 @@
1
- #
2
- # This is an example of how to use the servo class
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PIN = 9
8
-
9
- board = Denko::Board.new(Denko::Connection::Serial.new)
10
- servo = Denko::Motor::Servo.new(board: board, pin: PIN)
11
-
12
- # Add different angles (in degrees) to the array below to try out your servo.
13
- # Note: Some servos may not have a full 180 degree sweep.
14
- [0, 90, 180, 90].cycle do |angle|
15
- servo.position = angle
16
- sleep 0.5
17
- end
Binary file
@@ -1,43 +0,0 @@
1
- #
2
- # Use a stepper motor with the EasyDriver board: https://www.sparkfun.com/products/12779
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PINS = { slp: 6, enable: 7, direction: 8, step: 10, ms1: 11, ms2: 12 }
8
-
9
- board = Denko::Board.new(Denko::Connection::Serial.new)
10
- stepper = Denko::Motor::Stepper.new(board: board, pins: PINS)
11
-
12
- # Default is 8 microsteps. Use 2 to move faster.
13
- stepper.microsteps = 2
14
-
15
- # 400 steps is now 1 revolution for a 200 step motor.
16
- 400.times do
17
- stepper.step_ccw
18
- sleep 0.002
19
- end
20
-
21
- # Sleep the driver and wait a while.
22
- stepper.sleep
23
- sleep 1
24
-
25
- # Wake it up and set to full steps.
26
- stepper.wake
27
- stepper.microsteps = 1
28
-
29
- #
30
- # Now 200 steps the other way will return to the start.
31
- # Longer sleep times to match bigger steps. Adjust for your motor.
32
- #
33
- 200.times do
34
- stepper.step_cw
35
- sleep 0.006
36
- end
37
-
38
- # Sleep the driver once we're done.
39
- stepper.sleep
40
-
41
- # Writing to the board is done asynchronously.
42
- # Make sure all commands are written before exit.
43
- board.finish_write
@@ -1,32 +0,0 @@
1
- #
2
- # Search a 1-Wire bus.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PIN = 4
8
-
9
- board = Denko::Board.new(Denko::Connection::Serial.new)
10
- bus = Denko::OneWire::Bus.new(board: board, pin: PIN)
11
-
12
- # Call #device_present to reset the bus and return presence pulse as a boolean.
13
- if bus.device_present?
14
- puts "Devices present on bus..."; puts
15
- else
16
- puts "No devices present on bus... Quitting..."
17
- return
18
- end
19
-
20
- # The bus detects parasite power automatically when initialized.
21
- # It can tell that parasite power is in use, but not by WHICH devices.
22
- if bus.parasite_power
23
- puts "Parasite power detected..."; puts
24
- end
25
-
26
- # Calling #search finds connected devices and stores them in #found_devices.
27
- # Each hash contains a device's ROM address and matching Ruby class if one exists.
28
- bus.search
29
- count = bus.found_devices.count
30
- puts "Found #{count} device#{'s' if count > 1} on the bus:"
31
-
32
- puts bus.found_devices.inspect
@@ -1,35 +0,0 @@
1
- #
2
- # Example of playing a melody on a piezoelectric buzzer.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PIN = 9
8
-
9
- board = Denko::Board.new(Denko::Connection::Serial.new)
10
- buzzer = Denko::PulseIO::Buzzer.new(board: board, pin: PIN)
11
-
12
- C4 = 262
13
- D4 = 294
14
- E4 = 330
15
-
16
- notes = [
17
- [E4, 1], [D4, 1], [C4, 1], [D4, 1], [E4, 1], [E4, 1], [E4, 2],
18
- [D4, 1], [D4, 1], [D4, 2], [E4, 1], [E4, 1], [E4, 2],
19
- [E4, 1], [D4, 1], [C4, 1], [D4, 1], [E4, 1], [E4, 1], [E4, 1], [E4, 1],
20
- [D4, 1], [D4, 1], [E4, 1], [D4, 1], [C4, 4],
21
- ]
22
-
23
- bpm = 240
24
- beat_time = 60.to_f / bpm
25
-
26
- notes.each do |note|
27
- buzzer.tone(note[0])
28
- sleep note[1] * beat_time
29
-
30
- # Stop for a bit so notes are properly defined.
31
- buzzer.stop; sleep 0.010
32
- end
33
-
34
- buzzer.stop
35
- board.finish_write
@@ -1,51 +0,0 @@
1
- #
2
- # Test of the IROutput (infrared transmitter) class.
3
- # The specific NEC code is one taken from the Arduino example:
4
- # https://github.com/Arduino-IRremote/Arduino-IRremote/tree/master/examples/SendDemo
5
- #
6
- # To test your emitter works, flash the recieve sketch on a second board:
7
- # https://github.com/Arduino-IRremote/Arduino-IRremote/tree/master/examples/ReceiveDemo
8
- # Attach an IR receiver to the receive pin (2 for Atmel AVR) and observe its serial output.
9
- #
10
- # If you don't have 2 boards, use that sketch to capture a code from a remote.
11
- # Copy the raw code (list of numbers in curly braces) and modify into a Ruby array.
12
- # Put denko firmare back on your board, then test if the IR code operates your device.
13
- #
14
- # IR codes are also available from sites like:
15
- # https://github.com/zmoteio/irdb.tk
16
- # If formatted numbers with + and - prepended, you need to convert into a Ruby array first.
17
- #
18
- require 'bundler/setup'
19
- require 'denko'
20
-
21
- PIN = 4
22
-
23
- # Note: If testing with 2 boards on one computer, be explicit about which serial device
24
- # runs denko. Use the second Serial.new call below and modify device: as needed.
25
- # Monitor the receiver board in the Arduino (or some other) serial monitor.
26
- #
27
- connection = Denko::Connection::Serial.new
28
- # connection = Denko::Connection::Serial.new(device: "/dev/ttyACM0")
29
- board = Denko::Board.new(connection)
30
-
31
- #
32
- # Infrared can be used on most pins for most boards, but there might be conflicts
33
- # with other hardware or libraries. Try different pins. For more info:
34
- # https://github.com/Arduino-IRremote/Arduino-IRremote?#timer-and-pin-usage
35
- #
36
- ir = Denko::PulseIO::IROutput.new(board: board, pin: PIN)
37
-
38
- # NEC Raw-Data=0xF708FB04. LSBFIRST, so the binary for each hex digit below is backward.
39
- code = [ 9000, 4500, # Start bit
40
- 560, 560, 560, 560, 560, 1690, 560, 560, # 0010 0x4 command
41
- 560, 560, 560, 560, 560, 560, 560, 560, # 0000 0x0 command
42
- 560, 1690, 560, 1690, 560,560, 560, 1690, # 1101 0xB command inverted
43
- 560, 1690, 560, 1690, 560, 1690, 560, 1690, # 1111 0xF command inverted
44
- 560, 560, 560, 560, 560, 560, 560, 1690, # 0001 0x8 address
45
- 560, 560, 560, 560, 560, 560, 560, 560, # 0000 0x0 address
46
- 560, 1690, 560, 1690, 560, 1690, 560, 560, # 1110 0x7 address inverted
47
- 560, 1690, 560, 1690, 560, 1690, 560, 1690, # 1111 0xF address inverted
48
- 560] # Stop bit
49
-
50
- ir.write(code)
51
- board.finish_write
@@ -1,30 +0,0 @@
1
- #
2
- # PWM (pulse width modulation) output demo.
3
- # Frequency and resolution are configurable (only on ESP32 and PiBoard/Linux for now).
4
- # Capture output with logic analyzer or oscilloscope to verify accuracy.
5
- #
6
- require 'bundler/setup'
7
- require 'denko'
8
-
9
- PIN = 2
10
-
11
- board = Denko::Board.new(Denko::Connection::Serial.new)
12
- pwm = Denko::PulseIO::PWMOutput.new(board: board, pin: PIN)
13
-
14
- # Resolution test: ~1% duty at 1 kHz / 10-bit.
15
- # On and off approx. 10us and 990us respectively.
16
- pwm.pwm_enable(frequency: 1_000, resolution: 10)
17
- pwm.write 10 # of 1023
18
- sleep 0.5
19
- pwm.digital_write 0
20
-
21
- sleep 0.5
22
-
23
- # Frequency test: ~50% duty at 10 kHz / 8-bit.
24
- # On and off both approx. 50us.
25
- pwm.pwm_enable(frequency: 10_000, resolution: 8)
26
- pwm.write 127 # of 255
27
- sleep 0.5
28
- pwm.digital_write 0
29
-
30
- board.finish_write
@@ -1,31 +0,0 @@
1
- #
2
- # D3231 real-time-clock over I2C. Set time and read back every 5 seconds.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- board = Denko::Board.new(Denko::Connection::Serial.new)
8
- i2c = Denko::I2C::Bus.new(board: board) # address: 0x68 default
9
-
10
- # Tell the bus to search for devices.
11
- i2c.search
12
-
13
- if i2c.found_devices.empty?
14
- puts "No I2C devices connected!"
15
- return
16
- end
17
-
18
- # 0x68 is the I2C address for most real time clocks.
19
- unless (i2c.found_devices.include? 0x68)
20
- puts "DS3231 real time clock not found!"
21
- return
22
- end
23
-
24
- puts "Using DS3231 RTC at address 0x68"; puts
25
- rtc = Denko::RTC::DS3231.new(bus: i2c, address: 0x68)
26
- rtc.time = Time.now
27
-
28
- 5.times do
29
- puts rtc.time
30
- sleep 5
31
- end
@@ -1,17 +0,0 @@
1
- #
2
- # AHT10 sensor over I2C, for temperature and humidity.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
- require_relative 'neat_tph_readings'
7
-
8
- board = Denko::Board.new(Denko::Connection::Serial.new)
9
- bus = Denko::I2C::Bus.new(board: board)
10
- sensor = Denko::Sensor::AHT10.new(bus: bus) # address: 0x38 default
11
-
12
- # Poll it and print readings.
13
- sensor.poll(5) do |reading|
14
- print_tph_reading(reading)
15
- end
16
-
17
- sleep
@@ -1,17 +0,0 @@
1
- #
2
- # AHT21 sensor over I2C, for temperature and humidity.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
- require_relative 'neat_tph_readings'
7
-
8
- board = Denko::Board.new(Denko::Connection::Serial.new)
9
- bus = Denko::I2C::Bus.new(board: board)
10
- sensor = Denko::Sensor::AHT20.new(bus: bus) # address: 0x38 default
11
-
12
- # Poll it and print readings.
13
- sensor.poll(5) do |reading|
14
- print_tph_reading(reading)
15
- end
16
-
17
- sleep
@@ -1,38 +0,0 @@
1
- #
2
- # BME280 sensor over I2C, for temperature, pressure and humidity.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
- require_relative 'neat_tph_readings'
7
-
8
- board = Denko::Board.new(Denko::Connection::Serial.new)
9
- bus = Denko::I2C::Bus.new(board: board)
10
-
11
- sensor = Denko::Sensor::BME280.new(bus: bus) # address: 0x76 default
12
- # Use A BMP280 with no humidity instead.
13
- # sensor = Denko::Sensor::BMP280.new(bus: bus) # address: 0x76 default
14
-
15
- # Default reading mode is oneshot ("forced" in datasheet).
16
- # sensor.oneshot_mode
17
-
18
- # Enable oversampling independently on each sensor.
19
- # sensor.temperature_samples = 8
20
- # sensor.pressure_samples = 2
21
- # sensor.humidity_samples = 4
22
-
23
- # Enable continuous reading mode ("normal" in datasheet), with standby time and IIR filter.
24
- # sensor.continuous_mode
25
- # sensor.standby_time = 62.5
26
- # sensor.iir_coefficient = 4
27
-
28
- # Print raw config register bits.
29
- # print sensor.config_register_bits
30
-
31
- # Get the shared #print_tph_reading method to print readings neatly.
32
-
33
- # Poll it and print readings.
34
- sensor.poll(5) do |reading|
35
- print_tph_reading(reading)
36
- end
37
-
38
- sleep
@@ -1,26 +0,0 @@
1
- #
2
- # BMP180 sensor over I2C, for temperature and pressure.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
- require_relative 'neat_tph_readings'
7
-
8
- board = Denko::Board.new(Denko::Connection::Serial.new)
9
- bus = Denko::I2C::Bus.new(board: board)
10
- sensor = Denko::Sensor::BMP180.new(bus: bus) # address: 0x77 default
11
-
12
- # Enable oversampling for the pressure sensor only (1,2,4, 8).
13
- # sensor.pressure_samples = 8
14
-
15
- # Demonstrate helper methods
16
- result = sensor.read
17
- puts "Temperature unit helpers: #{sensor.temperature} \xC2\xB0C | #{sensor.temperature_f} \xC2\xB0F | #{sensor.temperature_k} K"
18
- puts "Pressure unit helpers: #{sensor.pressure} Pa | #{sensor.pressure_atm.round(6)} atm | #{sensor.pressure_bar.round(6)} bar"
19
- puts
20
-
21
- # Poll it and print readings.
22
- sensor.poll(5) do |reading|
23
- print_tph_reading(reading)
24
- end
25
-
26
- sleep
@@ -1,29 +0,0 @@
1
- #
2
- # DHT sensor class for DHT 11 and DHT 22 sensors.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
- require_relative 'neat_tph_readings'
7
-
8
- PIN = 5
9
-
10
- board = Denko::Board.new(Denko::Connection::Serial.new)
11
- sensor = Denko::Sensor::DHT.new(board: board, pin: PIN)
12
-
13
- sensor.read
14
- if sensor.temperature
15
- puts "Temperature unit helpers: #{sensor.temperature} \xC2\xB0C | #{sensor.temperature_f} \xC2\xB0F | #{sensor.temperature_k} K"; puts
16
- else
17
- puts "ERROR: Sensor not connected... Quitting..."
18
- return
19
- end
20
-
21
- # Don't try to read it again too quickly.
22
- sleep(1)
23
-
24
- # Poll it and print readings.
25
- sensor.poll(5) do |reading|
26
- print_tph_reading(reading)
27
- end
28
-
29
- sleep
@@ -1,57 +0,0 @@
1
- #
2
- # Example of how to use the Dallas DS18B20 temperature sensor.
3
- #
4
- require 'bundler/setup'
5
- require 'denko'
6
-
7
- PIN = 4
8
-
9
- board = Denko::Board.new(Denko::Connection::Serial.new)
10
- bus = Denko::OneWire::Bus.new(board: board, pin: PIN)
11
-
12
- unless bus.device_present?
13
- puts "No devices present on bus... Quitting..."
14
- return
15
- end
16
-
17
- if bus.parasite_power
18
- puts "Parasite power detected..."; puts
19
- end
20
-
21
- # Search the bus and use results to set up DS18B20 instances.
22
- bus.search
23
- ds18b20s = []
24
- bus.found_devices.each do |d|
25
- if d[:class] == Denko::Sensor::DS18B20
26
- ds18b20s << d[:class].new(bus: bus, address: d[:address])
27
- end
28
- end
29
-
30
- if ds18b20s.empty?
31
- puts "No DS18B20 sensors found on the bus... Quitting...";
32
- else
33
- puts "Found DS18B20 sensors with these serials:"
34
- puts ds18b20s.map { |d| d.serial_number }
35
- puts
36
- end
37
-
38
- # Format a reading for printing on a line.
39
- def print_reading(reading, sensor)
40
- print "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} - "
41
- print "Serial(HEX): #{sensor.serial_number} | Res: #{sensor.resolution} bits | "
42
-
43
- if reading[:crc_error]
44
- puts "CRC check failed for this reading!"
45
- else
46
- fahrenheit = (reading[:temperature] * 1.8 + 32).round(1)
47
- puts "#{reading[:temperature]} \xC2\xB0C | #{fahrenheit} \xC2\xB0F"
48
- end
49
- end
50
-
51
- ds18b20s.each do |sensor|
52
- sensor.poll(5) do |reading|
53
- print_reading(reading, sensor)
54
- end
55
- end
56
-
57
- sleep