85 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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) |