[修改] 增加Led、Oled目录
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@ -160,3 +160,4 @@ cython_debug/
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
#.idea/
|
||||
|
||||
.vscode/
|
||||
|
||||
@ -3,13 +3,18 @@
|
||||
|
||||
import RPi.GPIO as GPIO
|
||||
import time
|
||||
import spidev
|
||||
|
||||
def main():
|
||||
LED = 26
|
||||
|
||||
GPIO.setwarnings(False)
|
||||
|
||||
GPIO.setmode(GPIO.BCM)
|
||||
GPIO.setup(LED,GPIO.OUT)
|
||||
|
||||
spi = spidev.SpiDev()
|
||||
|
||||
try:
|
||||
while True:
|
||||
GPIO.output(LED,GPIO.HIGH)
|
||||
@ -23,4 +28,3 @@ def main():
|
||||
|
||||
if __name__=='__main__':
|
||||
main()
|
||||
|
||||
172
Oled/SSD1306.py
Normal file
172
Oled/SSD1306.py
Normal file
@ -0,0 +1,172 @@
|
||||
import spidev
|
||||
import RPi.GPIO as GPIO
|
||||
import time
|
||||
|
||||
# Constants
|
||||
SSD1306_SETCONTRAST = 0x81
|
||||
SSD1306_DISPLAYALLON_RESUME = 0xA4
|
||||
SSD1306_DISPLAYALLON = 0xA5
|
||||
SSD1306_NORMALDISPLAY = 0xA6
|
||||
SSD1306_INVERTDISPLAY = 0xA7
|
||||
SSD1306_DISPLAYOFF = 0xAE
|
||||
SSD1306_DISPLAYON = 0xAF
|
||||
SSD1306_SETDISPLAYOFFSET = 0xD3
|
||||
SSD1306_SETCOMPINS = 0xDA
|
||||
SSD1306_SETVCOMDETECT = 0xDB
|
||||
SSD1306_SETDISPLAYCLOCKDIV = 0xD5
|
||||
SSD1306_SETPRECHARGE = 0xD9
|
||||
SSD1306_SETMULTIPLEX = 0xA8
|
||||
SSD1306_SETLOWCOLUMN = 0x00
|
||||
SSD1306_SETHIGHCOLUMN = 0x10
|
||||
SSD1306_SETSTARTLINE = 0x40
|
||||
SSD1306_MEMORYMODE = 0x20
|
||||
SSD1306_COLUMNADDR = 0x21
|
||||
SSD1306_PAGEADDR = 0x22
|
||||
SSD1306_COMSCANINC = 0xC0
|
||||
SSD1306_COMSCANDEC = 0xC8
|
||||
SSD1306_SEGREMAP = 0xA0
|
||||
SSD1306_CHARGEPUMP = 0x8D
|
||||
SSD1306_EXTERNALVCC = 0x1
|
||||
SSD1306_SWITCHCAPVCC = 0x2
|
||||
|
||||
# Scrolling constants
|
||||
SSD1306_ACTIVATE_SCROLL = 0x2F
|
||||
SSD1306_DEACTIVATE_SCROLL = 0x2E
|
||||
SSD1306_SET_VERTICAL_SCROLL_AREA = 0xA3
|
||||
SSD1306_RIGHT_HORIZONTAL_SCROLL = 0x26
|
||||
SSD1306_LEFT_HORIZONTAL_SCROLL = 0x27
|
||||
SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL = 0x29
|
||||
SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL = 0x2A
|
||||
|
||||
class SSD1306(object):
|
||||
"""class for SSD1306 128*64 0.96inch OLED displays."""
|
||||
|
||||
def __init__(self,rst,dc,spi):
|
||||
self.width = 128
|
||||
self.height = 64
|
||||
self._pages = 8
|
||||
self._buffer = [0]*(self.width*self._pages)
|
||||
#Initialize DC RST pin
|
||||
self._dc = dc
|
||||
self._rst = rst
|
||||
GPIO.setmode(GPIO.BCM)
|
||||
GPIO.setwarnings(False)
|
||||
GPIO.setup(self._dc,GPIO.OUT)
|
||||
GPIO.setup(self._rst,GPIO.OUT)
|
||||
#Initialize SPI
|
||||
self._spi = spi
|
||||
def command(self,cmd):
|
||||
"""Send command byte to display"""
|
||||
GPIO.output(self._dc,GPIO.LOW)
|
||||
self._spi.writebytes([cmd])
|
||||
def data(self,val):
|
||||
"""Send byte of data to display"""
|
||||
GPIO.output(self._dc,GPIO.HIGHT)
|
||||
self._spi.writebytes([val])
|
||||
def begin(self,vccstate=SSD1306_SWITCHCAPVCC):
|
||||
"""Initialize dispaly"""
|
||||
self._vccstate = vccstate
|
||||
self.reset()
|
||||
self.command(SSD1306_DISPLAYOFF) # 0xAE
|
||||
self.command(SSD1306_SETDISPLAYCLOCKDIV) # 0xD5
|
||||
self.command(0x80) # the suggested ra tio 0x80
|
||||
|
||||
self.command(SSD1306_SETMULTIPLEX) # 0xA8
|
||||
self.command(0x3F)
|
||||
self.command(SSD1306_SETDISPLAYOFFSET) # 0xD3
|
||||
self.command(0x0) # no offset
|
||||
self.command(SSD1306_SETSTARTLINE | 0x0) # line #0
|
||||
self.command(SSD1306_CHARGEPUMP) # 0x8D
|
||||
if self._vccstate == SSD1306_EXTERNALVCC:
|
||||
self.command(0x10)
|
||||
else:
|
||||
self.command(0x14)
|
||||
self.command(SSD1306_MEMORYMODE) # 0x20
|
||||
self.command(0x00) # 0x0 act like ks0108
|
||||
self.command(SSD1306_SEGREMAP | 0x1)
|
||||
self.command(SSD1306_COMSCANDEC)
|
||||
self.command(SSD1306_SETCOMPINS) # 0xDA
|
||||
self.command(0x12)
|
||||
self.command(SSD1306_SETCONTRAST) # 0x81
|
||||
if self._vccstate == SSD1306_EXTERNALVCC:
|
||||
self.command(0x9F)
|
||||
else:
|
||||
self.command(0xCF)
|
||||
self.command(SSD1306_SETPRECHARGE) # 0xd9
|
||||
if self._vccstate == SSD1306_EXTERNALVCC:
|
||||
self.command(0x22)
|
||||
else:
|
||||
self.command(0xF1)
|
||||
self.command(SSD1306_SETVCOMDETECT) # 0xDB
|
||||
self.command(0x40)
|
||||
self.command(SSD1306_DISPLAYALLON_RESUME) # 0xA4
|
||||
self.command(SSD1306_NORMALDISPLAY) # 0xA6
|
||||
self.command(SSD1306_DISPLAYON)
|
||||
def reset(self):
|
||||
"""Reset the display"""
|
||||
GPIO.output(self._rst,GPIO.HIGH)
|
||||
time.sleep(0.001)
|
||||
GPIO.output(self._rst,GPIO.LOW)
|
||||
time.sleep(0.010)
|
||||
GPIO.output(self._rst,GPIO.HIGH)
|
||||
def display(self):
|
||||
"""Write display buffer to physical display"""
|
||||
self.command(SSD1306_COLUMNADDR)
|
||||
self.command(0) #Cloumn start address
|
||||
self.command(self.width-1) #Cloumn end address
|
||||
self.command(SSD1306_PAGEADDR)
|
||||
self.command(0) #Page start address
|
||||
self.command(self._pages-1) #Page end address
|
||||
#Write buffer data
|
||||
GPIO.output(self._dc,GPIO.HIGH)
|
||||
self._spi.writebytes(self._buffer)
|
||||
def image(self, image):
|
||||
"""Set buffer to value of Python Imaging Library image."""
|
||||
if image.mode != '1':
|
||||
raise ValueError('Image must be in mode 1.')
|
||||
imwidth, imheight = image.size
|
||||
if imwidth != self.width or imheight != self.height:
|
||||
raise ValueError('Image must be same dimensions as display \
|
||||
({0}x{1}).' .format(self.width, self.height))
|
||||
|
||||
pix = image.load()
|
||||
# Iterate through the memory pages
|
||||
index = 0
|
||||
for page in range(self._pages):
|
||||
# Iterate through all x axis columns.
|
||||
for x in range(self.width):
|
||||
# Set the bits for the column of pixels at the current position.
|
||||
bits = 0
|
||||
# Don't use range here as it's a bit slow
|
||||
for bit in [0, 1, 2, 3, 4, 5, 6, 7]:
|
||||
bits = bits << 1
|
||||
bits |= 0 if pix[(x, page*8+7-bit)] == 0 else 1
|
||||
# Update buffer byte and increment to next byte.
|
||||
self._buffer[index] = bits
|
||||
index += 1
|
||||
def clear(self):
|
||||
"""Clear contents of image buffer"""
|
||||
self._buffer = [0]*(self.width*self._pages)
|
||||
def set_contrast(self, contrast):
|
||||
"""Sets the contrast of the display.
|
||||
Contrast should be a value between 0 and 255."""
|
||||
if contrast < 0 or contrast > 255:
|
||||
raise ValueError('Contrast must be a value from 0 to 255).')
|
||||
self.command(SSD1306_SETCONTRAST)
|
||||
self.command(contrast)
|
||||
|
||||
def dim(self, dim):
|
||||
"""Adjusts contrast to dim the display if dim is True,
|
||||
otherwise sets the contrast to normal brightness if dim is False."""
|
||||
# Assume dim display.
|
||||
contrast = 0
|
||||
# Adjust contrast based on VCC if not dimming.
|
||||
if not dim:
|
||||
if self._vccstate == SSD1306_EXTERNALVCC:
|
||||
contrast = 0x9F
|
||||
else:
|
||||
contrast = 0xCF
|
||||
|
||||
|
||||
|
||||
|
||||
91
Oled/animate.py
Normal file
91
Oled/animate.py
Normal file
@ -0,0 +1,91 @@
|
||||
# Copyright (c) 2015 WaveShare
|
||||
# Author: My MX
|
||||
import math
|
||||
import time
|
||||
|
||||
import spidev as SPI
|
||||
import SSD1306
|
||||
|
||||
from PIL import Image
|
||||
from PIL import ImageFont
|
||||
from PIL import ImageDraw
|
||||
|
||||
|
||||
# Raspberry Pi pin configuration:
|
||||
RST = 19
|
||||
DC = 16
|
||||
bus = 0
|
||||
device = 0
|
||||
|
||||
# 128x32 display with hardware SPI:
|
||||
disp = SSD1306.SSD1306(rst=RST,dc=DC,spi=SPI.SpiDev(bus,device))
|
||||
|
||||
# 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 = 'SSD1306 ORGANIC LED DISPLAY. THIS IS AN OLD SCHOOL DEMO SCROLLER!! GREETZ TO: LADYADA & THE ADAFRUIT CREW, TRIXTER, FUTURE CREW, AND FARBRAUSCH'
|
||||
maxwidth, unused = draw.textsize(text, font=font)
|
||||
|
||||
# Set animation and sine wave parameters.
|
||||
amplitude = height/4
|
||||
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:
|
||||
pos = startpos
|
||||
# Pause briefly before drawing next frame.
|
||||
time.sleep(0.1)
|
||||
62
Oled/dispchar.py
Normal file
62
Oled/dispchar.py
Normal file
@ -0,0 +1,62 @@
|
||||
import time
|
||||
|
||||
import spidev as SPI
|
||||
import SSD1306
|
||||
|
||||
from PIL import Image
|
||||
from PIL import ImageDraw
|
||||
from PIL import ImageFont
|
||||
|
||||
# Raspberry Pi pin configuration:
|
||||
RST = 19
|
||||
# Note the following are only used with SPI:
|
||||
DC = 16
|
||||
bus = 0
|
||||
device = 0
|
||||
|
||||
# 128x64 display with hardware SPI:
|
||||
disp = SSD1306.SSD1306(RST, DC, SPI.SpiDev(bus,device))
|
||||
|
||||
# Initialize library.
|
||||
disp.begin()
|
||||
|
||||
# Clear display.
|
||||
disp.clear()
|
||||
disp.display()
|
||||
|
||||
# Create blank image for drawing.
|
||||
# Make sure to create image with mode '1' for 1-bit color.
|
||||
width = disp.width
|
||||
height = disp.height
|
||||
image = Image.new('1', (width, height))
|
||||
|
||||
# Get drawing object to draw on image.
|
||||
draw = ImageDraw.Draw(image)
|
||||
|
||||
# Draw a black filled box to clear the image.
|
||||
draw.rectangle((0,0,width,height), outline=0, fill=0)
|
||||
|
||||
# Draw some shapes.
|
||||
# First define some constants to allow easy resizing of shapes.
|
||||
padding = 1
|
||||
top = padding
|
||||
x = padding
|
||||
# Load default font.
|
||||
font = ImageFont.load_default()
|
||||
|
||||
# Alternatively load a TTF font.
|
||||
# Some other nice fonts to try: http://www.dafont.com/bitmap.php
|
||||
#font = ImageFont.truetype('Minecraftia.ttf', 8)
|
||||
|
||||
# Write two lines of text.
|
||||
draw.text((x, top), 'This is first line', font=font, fill=255)
|
||||
draw.text((x, top+10), 'This is second line', font=font, fill=255)
|
||||
draw.text((x, top+20), 'This is third line', font=font, fill=255)
|
||||
draw.text((x, top+30), 'This is fourth line', font=font, fill=255)
|
||||
draw.text((x, top+40), 'This is fifth line', font=font, fill=255)
|
||||
draw.text((x, top+50), 'This is last line', font=font, fill=255)
|
||||
|
||||
# Display image.
|
||||
disp.image(image)
|
||||
disp.display()
|
||||
|
||||
BIN
Oled/happycat.ppm
Normal file
BIN
Oled/happycat.ppm
Normal file
Binary file not shown.
36
Oled/image.py
Normal file
36
Oled/image.py
Normal file
@ -0,0 +1,36 @@
|
||||
# Copyright (c) 2015 WaveShare
|
||||
# Author: My MX
|
||||
import time
|
||||
|
||||
import spidev as SPI
|
||||
import SSD1306
|
||||
|
||||
from PIL import Image
|
||||
|
||||
|
||||
# Raspberry Pi pin configuration:
|
||||
RST = 19
|
||||
DC = 16
|
||||
bus = 0
|
||||
device = 0
|
||||
|
||||
|
||||
# 128x32 display with hardware I2C:
|
||||
disp = SSD1306.SSD1306(rst=RST,dc=DC,spi=SPI.SpiDev(bus,device))
|
||||
|
||||
# Initialize library.
|
||||
disp.begin()
|
||||
|
||||
# Clear display.
|
||||
disp.clear()
|
||||
disp.display()
|
||||
|
||||
# Load image based on OLED display height. Note that image is converted to 1 bit color.
|
||||
image = Image.open('happycat.ppm').convert('1')
|
||||
|
||||
# Alternatively load a different format image, resize it, and convert to 1 bit color.
|
||||
#image = Image.open('happycat.png').resize((disp.width, disp.height), Image.ANTIALIAS).convert('1')
|
||||
|
||||
# Display image.
|
||||
disp.image(image)
|
||||
disp.display()
|
||||
55
Oled/oled.py
Normal file
55
Oled/oled.py
Normal file
@ -0,0 +1,55 @@
|
||||
import spidev as SPI
|
||||
import SSD1306
|
||||
import time
|
||||
|
||||
from PIL import Image,ImageDraw,ImageFont
|
||||
|
||||
# Raspberry Pi pin configuration:
|
||||
GPIO_RST = 19
|
||||
GPIO_DC = 16
|
||||
SPI_BUS = 0
|
||||
SPI_CS = 0
|
||||
|
||||
# 128x64 display with hardware SPI:
|
||||
disp = SSD1306.SSD1306(GPIO_RST, GPIO_DC, SPI.SpiDev(SPI_BUS, SPI_CS))
|
||||
|
||||
# Initialize library.
|
||||
disp.begin()
|
||||
|
||||
# Clear display.
|
||||
disp.clear()
|
||||
disp.display()
|
||||
|
||||
# Create blank image for drawing.
|
||||
# Make sure to create image with mode '1' for 1-bit color.
|
||||
width = disp.width
|
||||
height = disp.height
|
||||
image = Image.new('1', (width, height))
|
||||
|
||||
# Get drawing object to draw on image.
|
||||
draw = ImageDraw.Draw(image)
|
||||
|
||||
# Draw a black filled box to clear the image.
|
||||
draw.rectangle((0,0,width,height), outline=0, fill=0)
|
||||
|
||||
# Draw some shapes.
|
||||
# First define some constants to allow easy resizing of shapes.
|
||||
padding = 2
|
||||
shape_width = 20
|
||||
|
||||
top = padding
|
||||
bottom = height - padding
|
||||
|
||||
# Move left to right keeping track of the current x position for drawing shapes.
|
||||
x = padding
|
||||
y = top
|
||||
|
||||
# Load default font.
|
||||
font = ImageFont.load_default()
|
||||
|
||||
# Write two lines of text.
|
||||
draw.text((x, y), 'Hello, world', font=font, fill=255)
|
||||
|
||||
# Display image.
|
||||
disp.image(image)
|
||||
disp.display()
|
||||
BIN
Oled/waveshare.bmp
Normal file
BIN
Oled/waveshare.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
36
Oled/waveshare.py
Normal file
36
Oled/waveshare.py
Normal file
@ -0,0 +1,36 @@
|
||||
# Copyright (c) 2015 WaveShare
|
||||
# Author: My MX
|
||||
import time
|
||||
|
||||
import spidev as SPI
|
||||
import SSD1306
|
||||
|
||||
#import Image
|
||||
from PIL import Image
|
||||
|
||||
# Raspberry Pi pin configuration:
|
||||
RST = 19
|
||||
DC = 16
|
||||
bus = 0
|
||||
device = 0
|
||||
|
||||
|
||||
# 128x32 display with hardware I2C:
|
||||
disp = SSD1306.SSD1306(rst=RST,dc=DC,spi=SPI.SpiDev(bus,device))
|
||||
|
||||
# Initialize library.
|
||||
disp.begin()
|
||||
|
||||
# Clear display.
|
||||
disp.clear()
|
||||
disp.display()
|
||||
|
||||
# Load image based on OLED display height. Note that image is converted to 1 bit color.
|
||||
image = Image.open('waveshare.bmp').convert('1')
|
||||
|
||||
# Alternatively load a different format image, resize it, and convert to 1 bit color.
|
||||
#image = Image.open('happycat.png').resize((disp.width, disp.height), Image.ANTIALIAS).convert('1')
|
||||
|
||||
# Display image.
|
||||
disp.image(image)
|
||||
disp.display()
|
||||
26
gpio.py
26
gpio.py
@ -1,26 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
import RPi.GPIO as GPIO
|
||||
import time
|
||||
|
||||
def main():
|
||||
LED = 26
|
||||
|
||||
GPIO.setmode(GPIO.BCM)
|
||||
GPIO.setup(LED, GPIO.OUT)
|
||||
|
||||
try:
|
||||
while True:
|
||||
GPIO.output(LED, GPIO.HIGH)
|
||||
time.sleep(1)
|
||||
GPIO.output(LED, GPIO.LOW)
|
||||
time.sleep(1)
|
||||
except:
|
||||
print("except")
|
||||
GPIO.output(LED, GPIO.HIGH)
|
||||
GPIO.cleanup()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
33
main.py
Normal file
33
main.py
Normal file
@ -0,0 +1,33 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import RPi.GPIO as GPIO
|
||||
import spidev as SPI
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__),'Oled'))
|
||||
import SSD1306
|
||||
|
||||
from PIL import Image,ImageDraw,ImageFont
|
||||
|
||||
# Raspberry Pi pin configuration:
|
||||
OLED_GPIO_RST = 19
|
||||
OLED_GPIO_DC = 16
|
||||
OLED_SPI_BUS = 0
|
||||
OLED_SPI_CS = 0
|
||||
|
||||
LED_GPIO_RED = 26
|
||||
|
||||
# 128x64 display with hardware SPI:
|
||||
disp = SSD1306.SSD1306(OLED_GPIO_RST, OLED_GPIO_DC, SPI.SpiDev(OLED_SPI_BUS, OLED_SPI_CS))
|
||||
|
||||
def main():
|
||||
|
||||
try:
|
||||
while True:
|
||||
time.sleep(1)
|
||||
except:
|
||||
print("except")
|
||||
|
||||
if __name__=='__main__':
|
||||
main()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user