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