S&B Volcano vaporizer remote control with Pi Pico W
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

lcd.py 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. # https://www.waveshare.com/wiki/Pico-LCD-1.3
  2. # https://thepihut.com/blogs/raspberry-pi-tutorials/coding-graphics-with-micropython-on-raspberry-pi-pico-displays
  3. # https://api.arcade.academy/en/latest/_modules/arcade/draw_commands.html#draw_arc_filled
  4. from machine import Pin, SPI, PWM
  5. from array import array
  6. import framebuf
  7. import time
  8. import os
  9. import math
  10. import gc
  11. class KeyCheck:
  12. def __init__(self, new, old):
  13. self.new = new
  14. self.old = old
  15. def once(self, k):
  16. return self.new[k] and not self.old[k]
  17. class LCD(framebuf.FrameBuffer):
  18. def __init__(self):
  19. self.width = 240
  20. self.height = 240
  21. self.cs = Pin(9, Pin.OUT)
  22. self.rst = Pin(12, Pin.OUT)
  23. self.cs(1)
  24. #self.spi = SPI(1)
  25. #self.spi = SPI(1, 1_000_000)
  26. self.spi = SPI(1, 100_000_000, polarity=0, phase=0, sck=Pin(10), mosi=Pin(11), miso=None)
  27. self.dc = Pin(8, Pin.OUT)
  28. self.dc(1)
  29. gc.collect()
  30. self.buffer = bytearray(self.height * self.width * 2)
  31. super().__init__(self.buffer, self.width, self.height, framebuf.RGB565)
  32. self.init_display()
  33. self.red = 0x07E0
  34. self.green = 0x001f
  35. self.blue = 0xf800
  36. self.white = 0xffff
  37. self.black = 0x0000
  38. self.fill(self.black)
  39. self.show()
  40. self.pwm = PWM(Pin(13))
  41. self.pwm.freq(1000)
  42. self.brightness(0.0)
  43. self.keyA = Pin(15,Pin.IN,Pin.PULL_UP)
  44. self.keyB = Pin(17,Pin.IN,Pin.PULL_UP)
  45. self.keyX = Pin(19 ,Pin.IN,Pin.PULL_UP)
  46. self.keyY= Pin(21 ,Pin.IN,Pin.PULL_UP)
  47. self.up = Pin(2,Pin.IN,Pin.PULL_UP)
  48. self.down = Pin(18,Pin.IN,Pin.PULL_UP)
  49. self.left = Pin(16,Pin.IN,Pin.PULL_UP)
  50. self.right = Pin(20,Pin.IN,Pin.PULL_UP)
  51. self.ctrl = Pin(3,Pin.IN,Pin.PULL_UP)
  52. self.keys_old = {
  53. "a": False,
  54. "b": False,
  55. "x": False,
  56. "y": False,
  57. "up": False,
  58. "down": False,
  59. "left": False,
  60. "right": False,
  61. "enter": False,
  62. }
  63. def buttons(self):
  64. keys = {
  65. "a": self.keyA.value() == 0,
  66. "b": self.keyB.value() == 0,
  67. "x": self.keyX.value() == 0,
  68. "y": self.keyY.value() == 0,
  69. "up": self.up.value() == 0,
  70. "down": self.down.value() == 0,
  71. "left": self.left.value() == 0,
  72. "right": self.right.value() == 0,
  73. "enter": self.ctrl.value() == 0,
  74. }
  75. kc = KeyCheck(keys, self.keys_old)
  76. self.keys_old = keys.copy()
  77. return kc
  78. def brightness(self, v):
  79. self.pwm.duty_u16(int(v * 65535))
  80. def write_cmd(self, cmd):
  81. self.cs(1)
  82. self.dc(0)
  83. self.cs(0)
  84. self.spi.write(bytearray([cmd]))
  85. self.cs(1)
  86. def write_data(self, buf):
  87. self.cs(1)
  88. self.dc(1)
  89. self.cs(0)
  90. self.spi.write(bytearray([buf]))
  91. self.cs(1)
  92. def init_display(self):
  93. self.rst(1)
  94. self.rst(0)
  95. self.rst(1)
  96. self.write_cmd(0x36)
  97. self.write_data(0x70)
  98. self.write_cmd(0x3A)
  99. self.write_data(0x05)
  100. self.write_cmd(0xB2)
  101. self.write_data(0x0C)
  102. self.write_data(0x0C)
  103. self.write_data(0x00)
  104. self.write_data(0x33)
  105. self.write_data(0x33)
  106. self.write_cmd(0xB7)
  107. self.write_data(0x35)
  108. self.write_cmd(0xBB)
  109. self.write_data(0x19)
  110. self.write_cmd(0xC0)
  111. self.write_data(0x2C)
  112. self.write_cmd(0xC2)
  113. self.write_data(0x01)
  114. self.write_cmd(0xC3)
  115. self.write_data(0x12)
  116. self.write_cmd(0xC4)
  117. self.write_data(0x20)
  118. self.write_cmd(0xC6)
  119. self.write_data(0x0F)
  120. self.write_cmd(0xD0)
  121. self.write_data(0xA4)
  122. self.write_data(0xA1)
  123. self.write_cmd(0xE0)
  124. self.write_data(0xD0)
  125. self.write_data(0x04)
  126. self.write_data(0x0D)
  127. self.write_data(0x11)
  128. self.write_data(0x13)
  129. self.write_data(0x2B)
  130. self.write_data(0x3F)
  131. self.write_data(0x54)
  132. self.write_data(0x4C)
  133. self.write_data(0x18)
  134. self.write_data(0x0D)
  135. self.write_data(0x0B)
  136. self.write_data(0x1F)
  137. self.write_data(0x23)
  138. self.write_cmd(0xE1)
  139. self.write_data(0xD0)
  140. self.write_data(0x04)
  141. self.write_data(0x0C)
  142. self.write_data(0x11)
  143. self.write_data(0x13)
  144. self.write_data(0x2C)
  145. self.write_data(0x3F)
  146. self.write_data(0x44)
  147. self.write_data(0x51)
  148. self.write_data(0x2F)
  149. self.write_data(0x1F)
  150. self.write_data(0x1F)
  151. self.write_data(0x20)
  152. self.write_data(0x23)
  153. self.write_cmd(0x21)
  154. self.write_cmd(0x11)
  155. self.write_cmd(0x29)
  156. def show(self):
  157. self.write_cmd(0x2A)
  158. self.write_data(0x00)
  159. self.write_data(0x00)
  160. self.write_data(0x00)
  161. self.write_data(0xef)
  162. self.write_cmd(0x2B)
  163. self.write_data(0x00)
  164. self.write_data(0x00)
  165. self.write_data(0x00)
  166. self.write_data(0xEF)
  167. self.write_cmd(0x2C)
  168. self.cs(1)
  169. self.dc(1)
  170. self.cs(0)
  171. self.spi.write(self.buffer)
  172. self.cs(1)
  173. def circle(self, x, y, r, c):
  174. self.hline(x-r,y,r*2,c)
  175. for i in range(1,r):
  176. a = int(math.sqrt(r*r-i*i)) # Pythagoras!
  177. self.hline(x-a,y+i,a*2,c) # Lower half
  178. self.hline(x-a,y-i,a*2,c) # Upper half
  179. def ring(self, x, y, r, c):
  180. self.pixel(x-r,y,c)
  181. self.pixel(x+r,y,c)
  182. self.pixel(x,y-r,c)
  183. self.pixel(x,y+r,c)
  184. for i in range(1, r):
  185. a = int(math.sqrt(r*r-i*i))
  186. self.pixel(x-a,y-i,c)
  187. self.pixel(x+a,y-i,c)
  188. self.pixel(x-a,y+i,c)
  189. self.pixel(x+a,y+i,c)
  190. self.pixel(x-i,y-a,c)
  191. self.pixel(x+i,y-a,c)
  192. self.pixel(x-i,y+a,c)
  193. self.pixel(x+i,y+a,c)
  194. def arc(self, x_off, y_off, w, h, c,
  195. start_angle, end_angle,
  196. filled = True,
  197. num_segments = 128):
  198. start_segment = int(start_angle / 360 * num_segments)
  199. end_segment = int(end_angle / 360 * num_segments)
  200. gc.collect()
  201. point_list = array('h')
  202. point_list.append(0)
  203. point_list.append(0)
  204. for segment in range(start_segment, end_segment + 1):
  205. theta = 2.0 * 3.1415926 * segment / num_segments
  206. x = w * math.cos(theta) / 2
  207. y = h * math.sin(theta) / 2
  208. i = (segment - start_segment + 1) * 2
  209. point_list.append(int(x))
  210. point_list.append(int(y))
  211. self.poly(int(x_off), int(y_off), point_list, c, True)
  212. def pie(self, x0, y0, w, c_border, c_circle, v):
  213. if v > 0.0:
  214. self.arc(int(x0), int(y0), int(w), int(w), c_circle, -90, int(v * 360) - 90)
  215. self.ring(int(x0), int(y0), int(w / 2), c_border)
  216. def textC(self, s, x, y, c):
  217. self.text(s, x - int(len(s) * 8 / 2), y - 5, c)