forked from embedded/micropython-ili9341
				
			Add SD card demo
							parent
							
								
									4291bc5c1f
								
							
						
					
					
						commit
						fa78877ce3
					
				@ -0,0 +1,104 @@
 | 
				
			|||||||
 | 
					"""ILI9341 demo (SD Card with touchscreen demo).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The Micropython Machine SDCard library can cause conflicts with the ILI9341.
 | 
				
			||||||
 | 
					Therefore, I'm using micropython-lib sdcard.py to control the SD Card.
 | 
				
			||||||
 | 
					https://github.com/micropython/micropython-lib/tree/master/micropython/drivers/storage/sdcard
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The SD Card should be set to the same SPI bus as the touchscreen because they
 | 
				
			||||||
 | 
					both run at slower speeds.  The display should be run on it's own SPI bus to
 | 
				
			||||||
 | 
					take advantage of the higher bandwidth.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If your board has a built-in SD card then you will want to identify what GPIO
 | 
				
			||||||
 | 
					pins and what SPI bus it uses.  This demo was tested using a Lolin 32 Pro
 | 
				
			||||||
 | 
					which uses bus 1 (HSPI) for the SD card and GPIO pin 13 for CS.  Therefore,
 | 
				
			||||||
 | 
					the SD Card and the touch screen will share HSPI and the display will be on
 | 
				
			||||||
 | 
					VSPI.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Demo requires the Python41x49.raw image to be copied to the  SD card.  The
 | 
				
			||||||
 | 
					SD card should be formatted to Fat32.
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					from ili9341 import Display, color565
 | 
				
			||||||
 | 
					from xpt2046 import Touch
 | 
				
			||||||
 | 
					from machine import idle, Pin, SPI  # type: ignore
 | 
				
			||||||
 | 
					from sdcard import SDCard
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Demo(object):
 | 
				
			||||||
 | 
					    """SD Card with touchscreen demo."""
 | 
				
			||||||
 | 
					    CYAN = color565(0, 255, 255)
 | 
				
			||||||
 | 
					    PURPLE = color565(255, 0, 255)
 | 
				
			||||||
 | 
					    WHITE = color565(255, 255, 255)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, display, spi2):
 | 
				
			||||||
 | 
					        """Initialize box.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Args:
 | 
				
			||||||
 | 
					            display (ILI9341): display object
 | 
				
			||||||
 | 
					            spi2 (SPI): SPI bus
 | 
				
			||||||
 | 
					        Notes:
 | 
				
			||||||
 | 
					            Some ILI9341's require touchscreen width & height to be swapped
 | 
				
			||||||
 | 
					            when the Touch class is initialized.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        self.display = display
 | 
				
			||||||
 | 
					        self.touch = Touch(spi2, cs=Pin(5), int_pin=Pin(0),
 | 
				
			||||||
 | 
					                           int_handler=self.touchscreen_press,
 | 
				
			||||||
 | 
					                           width=240, height=320)
 | 
				
			||||||
 | 
					        # Display initial message
 | 
				
			||||||
 | 
					        self.display.draw_text8x8(self.display.width // 2 - 32,
 | 
				
			||||||
 | 
					                                  self.display.height - 9,
 | 
				
			||||||
 | 
					                                  "TOUCH ME",
 | 
				
			||||||
 | 
					                                  self.WHITE,
 | 
				
			||||||
 | 
					                                  background=self.PURPLE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def touchscreen_press(self, x, y):
 | 
				
			||||||
 | 
					        """Process touchscreen press events."""
 | 
				
			||||||
 | 
					        # x, y = y, x  # Some screens require swapping X and Y
 | 
				
			||||||
 | 
					        # x = (self.display.width - 1) - x  # Some screens require flipping X
 | 
				
			||||||
 | 
					        y = (self.display.height - 1) - y  # Some screens require flipping Y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Display coordinates
 | 
				
			||||||
 | 
					        self.display.draw_text8x8(self.display.width // 2 - 32,
 | 
				
			||||||
 | 
					                                  self.display.height - 9,
 | 
				
			||||||
 | 
					                                  "{0:03d}, {1:03d}".format(x, y),
 | 
				
			||||||
 | 
					                                  self.CYAN)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Draw image from SD Card
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            x -= 20  # Image center X
 | 
				
			||||||
 | 
					            y -= 25  # Image center Y
 | 
				
			||||||
 | 
					            x = max(x, 41)
 | 
				
			||||||
 | 
					            x = min(x, self.display.width - 42)
 | 
				
			||||||
 | 
					            y = max(y, 49)
 | 
				
			||||||
 | 
					            y = min(y, self.display.height - 50)
 | 
				
			||||||
 | 
					            self.display.draw_image('sd/Python41x49.raw', x, y, 41, 49)
 | 
				
			||||||
 | 
					        except OSError as e:
 | 
				
			||||||
 | 
					            print("Error:", e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def test():
 | 
				
			||||||
 | 
					    """Test code."""
 | 
				
			||||||
 | 
					    # Initialize SPI bus for touch screen & built-in SD card (bus must match).
 | 
				
			||||||
 | 
					    spi1 = SPI(1, baudrate=1000000, sck=Pin(14), mosi=Pin(15), miso=Pin(2))
 | 
				
			||||||
 | 
					    # Initialize and mount SD card
 | 
				
			||||||
 | 
					    sd_cs = Pin(13)  # When using an internal SD card, ensure CS matches.
 | 
				
			||||||
 | 
					    sd = SDCard(spi1, sd_cs)
 | 
				
			||||||
 | 
					    os.mount(sd, '/sd')
 | 
				
			||||||
 | 
					    # Initialize SPI bus for display
 | 
				
			||||||
 | 
					    spi2 = SPI(2, baudrate=40000000, sck=Pin(18), mosi=Pin(23), miso=Pin(19))
 | 
				
			||||||
 | 
					    display = Display(spi2, dc=Pin(22), cs=Pin(19), rst=Pin(21))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Demo(display, spi1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        while True:
 | 
				
			||||||
 | 
					            idle()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    except KeyboardInterrupt:
 | 
				
			||||||
 | 
					        print("\nCtrl-C pressed.  Cleaning up and exiting...")
 | 
				
			||||||
 | 
					    finally:
 | 
				
			||||||
 | 
					        display.cleanup()  # Clean up display
 | 
				
			||||||
 | 
					        os.umount('/sd')  # Unmount SD card
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test()
 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue