S&B Volcano vaporizer remote control with Pi Pico W
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

lcd.py 9.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  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. class KeyCheck:
  11. def __init__(self, new, old):
  12. self.new = new
  13. self.old = old
  14. def once(self, k):
  15. return self.new[k] and not self.old[k]
  16. class LCD(framebuf.FrameBuffer):
  17. def __init__(self):
  18. self.width = 240
  19. self.height = 240
  20. self.cs = Pin(9, Pin.OUT)
  21. self.rst = Pin(12, Pin.OUT)
  22. self.cs(1)
  23. #self.spi = SPI(1)
  24. #self.spi = SPI(1, 1_000_000)
  25. self.spi = SPI(1, 100_000_000, polarity=0, phase=0, sck=Pin(10), mosi=Pin(11), miso=None)
  26. self.dc = Pin(8, Pin.OUT)
  27. self.dc(1)
  28. self.buffer = bytearray(self.height * self.width * 2)
  29. super().__init__(self.buffer, self.width, self.height, framebuf.RGB565)
  30. self.init_display()
  31. self.red = 0x07E0
  32. self.green = 0x001f
  33. self.blue = 0xf800
  34. self.white = 0xffff
  35. self.black = 0x0000
  36. self.fill(self.black)
  37. self.show()
  38. self.pwm = PWM(Pin(13))
  39. self.pwm.freq(1000)
  40. self.brightness(0.0)
  41. self.keyA = Pin(15,Pin.IN,Pin.PULL_UP)
  42. self.keyB = Pin(17,Pin.IN,Pin.PULL_UP)
  43. self.keyX = Pin(19 ,Pin.IN,Pin.PULL_UP)
  44. self.keyY= Pin(21 ,Pin.IN,Pin.PULL_UP)
  45. self.up = Pin(2,Pin.IN,Pin.PULL_UP)
  46. self.down = Pin(18,Pin.IN,Pin.PULL_UP)
  47. self.left = Pin(16,Pin.IN,Pin.PULL_UP)
  48. self.right = Pin(20,Pin.IN,Pin.PULL_UP)
  49. self.ctrl = Pin(3,Pin.IN,Pin.PULL_UP)
  50. self.keys_old = {
  51. "a": False,
  52. "b": False,
  53. "x": False,
  54. "y": False,
  55. "up": False,
  56. "down": False,
  57. "left": False,
  58. "right": False,
  59. "enter": False,
  60. }
  61. def buttons(self):
  62. keys = {
  63. "a": self.keyA.value() == 0,
  64. "b": self.keyB.value() == 0,
  65. "x": self.keyX.value() == 0,
  66. "y": self.keyY.value() == 0,
  67. "up": self.up.value() == 0,
  68. "down": self.down.value() == 0,
  69. "left": self.left.value() == 0,
  70. "right": self.right.value() == 0,
  71. "enter": self.ctrl.value() == 0,
  72. }
  73. kc = KeyCheck(keys, self.keys_old)
  74. self.keys_old = keys.copy()
  75. return kc
  76. def brightness(self, v):
  77. self.pwm.duty_u16(int(v * 65535))
  78. def write_cmd(self, cmd):
  79. self.cs(1)
  80. self.dc(0)
  81. self.cs(0)
  82. self.spi.write(bytearray([cmd]))
  83. self.cs(1)
  84. def write_data(self, buf):
  85. self.cs(1)
  86. self.dc(1)
  87. self.cs(0)
  88. self.spi.write(bytearray([buf]))
  89. self.cs(1)
  90. def init_display(self):
  91. self.rst(1)
  92. self.rst(0)
  93. self.rst(1)
  94. self.write_cmd(0x36)
  95. self.write_data(0x70)
  96. self.write_cmd(0x3A)
  97. self.write_data(0x05)
  98. self.write_cmd(0xB2)
  99. self.write_data(0x0C)
  100. self.write_data(0x0C)
  101. self.write_data(0x00)
  102. self.write_data(0x33)
  103. self.write_data(0x33)
  104. self.write_cmd(0xB7)
  105. self.write_data(0x35)
  106. self.write_cmd(0xBB)
  107. self.write_data(0x19)
  108. self.write_cmd(0xC0)
  109. self.write_data(0x2C)
  110. self.write_cmd(0xC2)
  111. self.write_data(0x01)
  112. self.write_cmd(0xC3)
  113. self.write_data(0x12)
  114. self.write_cmd(0xC4)
  115. self.write_data(0x20)
  116. self.write_cmd(0xC6)
  117. self.write_data(0x0F)
  118. self.write_cmd(0xD0)
  119. self.write_data(0xA4)
  120. self.write_data(0xA1)
  121. self.write_cmd(0xE0)
  122. self.write_data(0xD0)
  123. self.write_data(0x04)
  124. self.write_data(0x0D)
  125. self.write_data(0x11)
  126. self.write_data(0x13)
  127. self.write_data(0x2B)
  128. self.write_data(0x3F)
  129. self.write_data(0x54)
  130. self.write_data(0x4C)
  131. self.write_data(0x18)
  132. self.write_data(0x0D)
  133. self.write_data(0x0B)
  134. self.write_data(0x1F)
  135. self.write_data(0x23)
  136. self.write_cmd(0xE1)
  137. self.write_data(0xD0)
  138. self.write_data(0x04)
  139. self.write_data(0x0C)
  140. self.write_data(0x11)
  141. self.write_data(0x13)
  142. self.write_data(0x2C)
  143. self.write_data(0x3F)
  144. self.write_data(0x44)
  145. self.write_data(0x51)
  146. self.write_data(0x2F)
  147. self.write_data(0x1F)
  148. self.write_data(0x1F)
  149. self.write_data(0x20)
  150. self.write_data(0x23)
  151. self.write_cmd(0x21)
  152. self.write_cmd(0x11)
  153. self.write_cmd(0x29)
  154. def show(self):
  155. self.write_cmd(0x2A)
  156. self.write_data(0x00)
  157. self.write_data(0x00)
  158. self.write_data(0x00)
  159. self.write_data(0xef)
  160. self.write_cmd(0x2B)
  161. self.write_data(0x00)
  162. self.write_data(0x00)
  163. self.write_data(0x00)
  164. self.write_data(0xEF)
  165. self.write_cmd(0x2C)
  166. self.cs(1)
  167. self.dc(1)
  168. self.cs(0)
  169. self.spi.write(self.buffer)
  170. self.cs(1)
  171. def circle(self, x, y, r, c):
  172. self.hline(x-r,y,r*2,c)
  173. for i in range(1,r):
  174. a = int(math.sqrt(r*r-i*i)) # Pythagoras!
  175. self.hline(x-a,y+i,a*2,c) # Lower half
  176. self.hline(x-a,y-i,a*2,c) # Upper half
  177. def ring(self, x, y, r, c):
  178. self.pixel(x-r,y,c)
  179. self.pixel(x+r,y,c)
  180. self.pixel(x,y-r,c)
  181. self.pixel(x,y+r,c)
  182. for i in range(1, r):
  183. a = int(math.sqrt(r*r-i*i))
  184. self.pixel(x-a,y-i,c)
  185. self.pixel(x+a,y-i,c)
  186. self.pixel(x-a,y+i,c)
  187. self.pixel(x+a,y+i,c)
  188. self.pixel(x-i,y-a,c)
  189. self.pixel(x+i,y-a,c)
  190. self.pixel(x-i,y+a,c)
  191. self.pixel(x+i,y+a,c)
  192. def arc(self, x_off, y_off, w, h, c,
  193. start_angle, end_angle,
  194. filled = True,
  195. num_segments = 128):
  196. point_list = [0, 0]
  197. start_segment = int(start_angle / 360 * num_segments)
  198. end_segment = int(end_angle / 360 * num_segments)
  199. for segment in range(start_segment, end_segment + 1):
  200. theta = 2.0 * 3.1415926 * segment / num_segments
  201. x = w * math.cos(theta) / 2
  202. y = h * math.sin(theta) / 2
  203. point_list.append(int(x))
  204. point_list.append(int(y))
  205. self.poly(int(x_off), int(y_off), array('h', point_list), c, True)
  206. def pie(self, x0, y0, w, c_border, c_circle, v):
  207. if v > 0.0:
  208. lcd.arc(int(x0), int(y0), int(w), int(w), c_circle, -90, int(v * 360) - 90)
  209. lcd.ring(int(x0), int(y0), int(w / 2), c_border)
  210. if __name__ == '__main__':
  211. start = time.time()
  212. def gfx_test(lcd):
  213. v = (time.time() - start)
  214. lcd.fill(lcd.black)
  215. lcd.pie(lcd.width / 2, lcd.height / 2, lcd.width, lcd.red, lcd.green, (v % 11) / 10)
  216. def key_test(lcd):
  217. lcd.fill(lcd.white)
  218. if lcd.keyA.value() == 0:
  219. lcd.fill_rect(208,15,30,30,lcd.red)
  220. else:
  221. lcd.fill_rect(208,15,30,30,lcd.white)
  222. lcd.rect(208,15,30,30,lcd.red)
  223. if lcd.keyB.value() == 0:
  224. lcd.fill_rect(208,75,30,30,lcd.red)
  225. else:
  226. lcd.fill_rect(208,75,30,30,lcd.white)
  227. lcd.rect(208,75,30,30,lcd.red)
  228. if lcd.keyX.value() == 0:
  229. lcd.fill_rect(208,135,30,30,lcd.red)
  230. else:
  231. lcd.fill_rect(208,135,30,30,lcd.white)
  232. lcd.rect(208,135,30,30,lcd.red)
  233. if lcd.keyY.value() == 0:
  234. lcd.fill_rect(208,195,30,30,lcd.red)
  235. else:
  236. lcd.fill_rect(208,195,30,30,lcd.white)
  237. lcd.rect(208,195,30,30,lcd.red)
  238. if lcd.up.value() == 0:
  239. lcd.fill_rect(60,60,30,30,lcd.red)
  240. else:
  241. lcd.fill_rect(60,60,30,30,lcd.white)
  242. lcd.rect(60,60,30,30,lcd.red)
  243. if lcd.down.value() == 0:
  244. lcd.fill_rect(60,150,30,30,lcd.red)
  245. else:
  246. lcd.fill_rect(60,150,30,30,lcd.white)
  247. lcd.rect(60,150,30,30,lcd.red)
  248. if lcd.left.value() == 0:
  249. lcd.fill_rect(15,105,30,30,lcd.red)
  250. else:
  251. lcd.fill_rect(15,105,30,30,lcd.white)
  252. lcd.rect(15,105,30,30,lcd.red)
  253. if lcd.right.value() == 0:
  254. lcd.fill_rect(105,105,30,30,lcd.red)
  255. else:
  256. lcd.fill_rect(105,105,30,30,lcd.white)
  257. lcd.rect(105,105,30,30,lcd.red)
  258. if lcd.ctrl.value() == 0:
  259. lcd.fill_rect(60,105,30,30,lcd.red)
  260. else:
  261. lcd.fill_rect(60,105,30,30,lcd.white)
  262. lcd.rect(60,105,30,30,lcd.red)
  263. lcd = LCD()
  264. lcd.brightness(1.0)
  265. try:
  266. while True:
  267. #key_test(lcd)
  268. gfx_test(lcd)
  269. lcd.show()
  270. time.sleep(0.1)
  271. except KeyboardInterrupt:
  272. pass
  273. lcd.fill(lcd.black)
  274. lcd.show()
  275. lcd.brightness(0.0)