S&B Volcano vaporizer remote control with Pi Pico W
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #!/usr/bin/env python
  2. import uasyncio as asyncio
  3. import io
  4. import sys
  5. class States:
  6. def __init__(self, lcd):
  7. self.lcd = lcd
  8. self.states = []
  9. self.current = None
  10. def add(self, s):
  11. self.states.append(s)
  12. async def draw(self):
  13. self.lcd.fill(self.lcd.black)
  14. self.lcd.text("Volcano Remote Control App", 0, 0, self.lcd.green)
  15. r = await self.states[self.current].draw()
  16. self.lcd.show()
  17. return r
  18. def run(self):
  19. if self.current == None:
  20. self.current = 0
  21. self.states[self.current].enter()
  22. next = asyncio.run(self.draw())
  23. if next >= 0:
  24. val = self.states[self.current].exit()
  25. self.current = next
  26. self.states[self.current].enter(val)
  27. def state_machine(lcd):
  28. states = States(lcd)
  29. # 0 - Scan
  30. from state_scan import StateScan
  31. scan = StateScan(lcd)
  32. states.add(scan)
  33. # 1 - Connect
  34. from state_connect import StateConnect
  35. conn = StateConnect(lcd, True)
  36. states.add(conn)
  37. # 2 - Select
  38. from state_select import StateSelect
  39. select = StateSelect(lcd)
  40. states.add(select)
  41. # 3 - Heater On
  42. from state_heat import StateHeat
  43. heatOn = StateHeat(lcd, True)
  44. states.add(heatOn)
  45. # 4 - Heater Off
  46. heatOff = StateHeat(lcd, False)
  47. states.add(heatOff)
  48. # 5 - Disconnect
  49. disconn = StateConnect(lcd, False)
  50. states.add(disconn)
  51. # 6 - Wait for temperature
  52. from state_wait_temp import StateWaitTemp
  53. waitTemp = StateWaitTemp(lcd)
  54. states.add(waitTemp)
  55. # 7 - Wait for time
  56. from state_wait_time import StateWaitTime
  57. waitTime = StateWaitTime(lcd)
  58. states.add(waitTime)
  59. # 8 - Pump
  60. from state_pump import StatePump
  61. pump = StatePump(lcd)
  62. states.add(pump)
  63. # 9 - Notify
  64. from state_notify import StateNotify
  65. notify = StateNotify(lcd)
  66. states.add(notify)
  67. while True:
  68. states.run()
  69. from lcd import LCD
  70. lcd = LCD()
  71. # splash screen
  72. lcd.fill(lcd.black)
  73. lcd.textC("S&B Volcano Remote", int(lcd.width / 2), int(lcd.height / 2) - 25, lcd.green)
  74. lcd.textC("by xythobuz", int(lcd.width / 2), int(lcd.height / 2), lcd.yellow)
  75. lcd.textC("Initializing...", int(lcd.width / 2), int(lcd.height / 2) + 25, lcd.white)
  76. lcd.show()
  77. lcd.brightness(1.0)
  78. try:
  79. state_machine(lcd)
  80. except Exception as e:
  81. os = io.StringIO()
  82. sys.print_exception(e, os)
  83. s = os.getvalue()
  84. os.close()
  85. lcd.fill(lcd.black)
  86. lcd.textBlock(s, lcd.white)
  87. lcd.show()
  88. raise e