import math import time import Adafruit_GPIO.SPI as SPI import Adafruit_SSD1306 from PIL import Image from PIL import ImageFont from PIL import ImageDraw RST = 24 # 128x64 display with hardware I2C: disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST) # Initialize library. disp.begin() # Get display width and height. width = disp.width height = disp.height # Clear display. disp.clear() disp.display() # Create image buffer. # Make sure to create image with mode '1' for 1-bit color. image = Image.new('1', (width, height)) # Load default font. font = ImageFont.load_default() # Alternatively load a TTF font. Make sure the .ttf font file is in the same directory as this python script! # Some nice fonts to try: http://www.dafont.com/bitmap.php # font = ImageFont.truetype('Minecraftia.ttf', 8) # Create drawing object. draw = ImageDraw.Draw(image) # Define text and get total width. text = 'Floppy Player' maxwidth, unused = draw.textsize(text, font=font) # Set animation and sine wave parameters. amplitude = height/4-10 offset = height/2 - 4 velocity = -2 startpos = width # Animate text moving in sine wave. # print('Press Ctrl-C to quit.') pos = startpos while True: # Clear image buffer by drawing a black filled box. draw.rectangle((0,0,width,height), outline=0, fill=0) # Enumerate characters and draw them offset vertically based on a sine wave. x = pos for i, c in enumerate(text): # Stop drawing if off the right side of screen. if x > width: break # Calculate width but skip drawing if off the left side of screen. if x < -10: char_width, char_height = draw.textsize(c, font=font) x += char_width continue # Calculate offset from sine wave. y = offset+math.floor(amplitude*math.sin(x/float(width)*2.0*math.pi)) # Draw text. draw.text((x, y), c, font=font, fill=255) # Increment x position based on chacacter width. char_width, char_height = draw.textsize(c, font=font) x += char_width # Draw the image buffer. disp.image(image) disp.display() # Move position for next frame. pos += velocity # Start over if text has scrolled completely off left side of screen. if pos < -maxwidth: break # Pause briefly before drawing next frame. time.sleep(0.1)