Skip to content

Commit 03d5362

Browse files
authored
Add files via upload
1 parent c4c6b55 commit 03d5362

File tree

2 files changed

+233
-0
lines changed

2 files changed

+233
-0
lines changed
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
from micropython import const
2+
from machine import Pin
3+
from utime import sleep_ms
4+
import framebuf
5+
6+
7+
disp_width = const(128)
8+
disp_height = const(64)
9+
disp_pages = const((disp_height >> 3))
10+
11+
# Constants
12+
SSD1309_SET_CONTRAST = const(0x81)
13+
SSD1309_DISPLAY_ALL_ON_RESUME = const(0xA4)
14+
SSD1309_DISPLAY_ALL_ON = const(0xA5)
15+
SSD1309_NORMAL_DISPLAY = const(0xA6)
16+
SSD1309_INVERT_DISPLAY = const(0xA7)
17+
SSD1309_DISPLAY_OFF = const(0xAE)
18+
SSD1309_DISPLAY_ON = const(0xAF)
19+
SSD1309_SET_DISPLAY_OFFSET = const(0xD3)
20+
SSD1309_SET_COM_PINS = const(0xDA)
21+
SSD1309_SET_VCOM_DETECT = const(0xDB)
22+
SSD1309_SET_DISPLAY_CLOCK_DIV = const(0xD5)
23+
SSD1309_SET_PRECHARGE = const(0xD9)
24+
SSD1309_SET_MULTIPLEX = const(0xA8)
25+
SSD1309_SET_LOW_COLUMN = const(0x00)
26+
SSD1309_SET_HIGH_COLUMN = const(0x10)
27+
SSD1309_SET_START_LINE = const(0x40)
28+
SSD1309_MEMORY_MODE = const(0x20)
29+
SSD1309_COLUMN_ADDR = const(0x21)
30+
SSD1309_PAGE_ADDR = const(0x22)
31+
SSD1309_COM_SCAN_INC = const(0xC0)
32+
SSD1309_COM_SCAN_DEC = const(0xC8)
33+
SSD1309_SEG_REMAP = const(0xA0)
34+
SSD1309_CHARGE_PUMP = const(0x8D)
35+
SSD1309_EXTERNAL_VCC = const(0x01)
36+
SSD1309_SWITCH_CAP_VCC = const(0x02)
37+
38+
# Scrolling constants
39+
SSD1309_ACTIVATE_SCROLL = const(0x2F)
40+
SSD1309_DEACTIVATE_SCROLL = const(0x2E)
41+
SSD1309_SET_VERTICAL_SCROLL_AREA = const(0xA3)
42+
SSD1309_RIGHT_HORIZONTAL_SCROLL = const(0x26)
43+
SSD1309_LEFT_HORIZONTAL_SCROLL = const(0x27)
44+
SSD1309_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL = const(0x29)
45+
SSD1309_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL = const(0x2A)
46+
47+
LOW = const(0)
48+
HIGH = const(1)
49+
50+
CMD = LOW
51+
DAT = HIGH
52+
53+
54+
class OLED1309(framebuf.FrameBuffer):
55+
56+
def __init__(self, _spi, _dc, _rst, _cs):
57+
self.width = disp_width
58+
self.height = disp_height
59+
self._pages = disp_pages
60+
61+
self.WHITE = 1
62+
self.BLACK = 0
63+
64+
self.spi = _spi
65+
self.cs = Pin(_cs, Pin.OUT)
66+
self.rst = Pin(_rst, Pin.OUT)
67+
self.dc = Pin(_dc, Pin.OUT)
68+
69+
self.buffer = bytearray(self._pages * self.width)
70+
super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB)
71+
self.init_display()
72+
73+
74+
def write_command(self, value):
75+
self.dc.value(CMD)
76+
self.cs.value(LOW)
77+
self.spi.write(bytearray([value]))
78+
self.cs.value(HIGH)
79+
80+
81+
def reset(self):
82+
self.rst.value(HIGH)
83+
sleep_ms(1)
84+
self.rst.value(LOW)
85+
sleep_ms(10)
86+
self.rst.value(HIGH)
87+
88+
89+
def init_display(self):
90+
self.reset()
91+
92+
self.write_command(SSD1309_DISPLAY_OFF)
93+
self.write_command(SSD1309_SET_DISPLAY_CLOCK_DIV)
94+
self.write_command(0x80)
95+
96+
self.write_command(SSD1309_SET_MULTIPLEX)
97+
self.write_command((self.height - 1))
98+
99+
self.write_command(SSD1309_SET_DISPLAY_OFFSET)
100+
self.write_command(0x00)
101+
102+
self.write_command((SSD1309_SET_START_LINE | 0x00))
103+
104+
self.write_command(SSD1309_CHARGE_PUMP)
105+
self.write_command(0x14) # 0x10 # 0x14
106+
107+
self.write_command(SSD1309_MEMORY_MODE)
108+
self.write_command(0x00)
109+
110+
self.write_command((SSD1309_SEG_REMAP | 0x01))
111+
self.write_command(SSD1309_COM_SCAN_DEC)
112+
self.write_command(SSD1309_SET_COM_PINS)
113+
self.write_command(0x12)
114+
115+
self.write_command(SSD1309_SET_CONTRAST)
116+
self.write_command(0xCF) # 0x9F # 0xCF
117+
118+
self.write_command(SSD1309_SET_PRECHARGE)
119+
self.write_command(0xF1) # 0x22 # 0xF1
120+
121+
self.write_command(SSD1309_SET_VCOM_DETECT)
122+
self.write_command(0x40)
123+
124+
self.write_command(SSD1309_DISPLAY_ALL_ON_RESUME)
125+
self.write_command(SSD1309_NORMAL_DISPLAY)
126+
self.write_command(SSD1309_DISPLAY_ON)
127+
128+
129+
def show(self):
130+
x0 = 0
131+
x1 = self.width - 1
132+
if (self.width == 64):
133+
# displays with width of 64 pixels are shifted by 32
134+
x0 += 32
135+
x1 += 32
136+
137+
self.write_command(SSD1309_COLUMN_ADDR)
138+
self.write_command(x0)
139+
self.write_command(x1)
140+
self.write_command(SSD1309_PAGE_ADDR)
141+
self.write_command(0x00)
142+
self.write_command((self._pages - 1))
143+
144+
self.dc.value(DAT)
145+
self.cs.value(LOW)
146+
self.spi.write(self.buffer)
147+
self.cs.value(HIGH)
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
from pyb import Pin, SPI, Timer
2+
from SSD1309 import OLED1309
3+
from utime import sleep_ms, sleep_us
4+
from micropython import const
5+
6+
7+
points = const(32)
8+
9+
10+
f = 1
11+
i = 0
12+
j = 0
13+
k = 0
14+
pulse = 1
15+
last_capture = 0
16+
bar = bytearray(b'\x3F' * points)
17+
18+
19+
cs_pin = Pin('PB7', Pin.OUT_PP) #'PB7'
20+
dc_pin = Pin('PB8', Pin.OUT_PP) #'PB8'
21+
rst_pin = Pin('PB9', Pin.OUT_PP) #'PB9'
22+
cap_pin = Pin('PA1', Pin.IN)
23+
24+
spi = SPI(2, mode = SPI.MASTER, baudrate = 1000000, polarity = 0, phase = 0, bits = 8, firstbit = SPI.MSB)
25+
26+
oled = OLED1309(spi, dc_pin, rst_pin, cs_pin)
27+
28+
29+
def input_capture(timer):
30+
global last_capture, pulse
31+
32+
pulse = (in_cap.capture() - last_capture)
33+
last_capture = in_cap.capture()
34+
pulse &= 0x0FFFFFFF
35+
36+
37+
TIM2 = Timer(2,
38+
prescaler = 10,
39+
period = 0x0FFFFFFF)
40+
41+
in_cap = TIM2.channel(2,
42+
mode = Timer.IC,
43+
pin = cap_pin,
44+
polarity = Timer.RISING,
45+
callback = input_capture)
46+
47+
48+
def map_value(v, x_min, x_max, y_min, y_max):
49+
return int(y_min + (((y_max - y_min) / (x_max - x_min)) * (v - x_min)))
50+
51+
52+
def constrain(value, min_value, max_value):
53+
if(value > max_value):
54+
return max_value
55+
56+
elif(value < min_value):
57+
return min_value
58+
59+
else:
60+
return value
61+
62+
63+
oled.fill(oled.BLACK)
64+
oled.show()
65+
66+
67+
while(True):
68+
f = (4000 / pulse)
69+
f = constrain(f, 1, 100)
70+
71+
bar[j] = map_value(f, 1, 100, 63, 25)
72+
73+
oled.fill(oled.BLACK)
74+
oled.text("PYB TSL235", 20, 4, oled.WHITE)
75+
oled.text(("F./kHz: " + str("%3.1f " %f)), 15, 15, oled.WHITE)
76+
77+
for k in range (0, points, 1):
78+
oled.fill_rect((k * 4), bar[k], 2, (63 - bar[k]), oled.WHITE)
79+
80+
j += 1
81+
82+
if(j >= points):
83+
j = 0
84+
85+
oled.show()
86+
sleep_ms(100)

0 commit comments

Comments
 (0)