Extending Drawing Functions
Although there are several drawing functions available in most of the standard graphics libraries, most of them lack some basic shapes such as a circle. To draw circles on your display, you will need to add new Python functions. Here are some examples of these custom drawing functions.
Circle
Here is a function to draw a circle at a given (x,y) point with a radius of r and fill indicator.
Here are the parameters for circle functions
- X position of the circle center
- Y position of the circle center
- The radius of the circle in pixels
- The color of the circle (1 for on and 0 for off.
1
2
3
4
5
6
7
8
9
10
11
12
13 | from math import sqrt
def draw_circle(cx, cy, r, color):
diameter = r*2
upper_left_x = cx - r
upper_left_y = cy - r
# scan through all pixels and only turn on pixels within r of the center
for i in range(upper_left_x, upper_left_x + diameter):
for j in range(upper_left_y, upper_left_y + diameter):
# distance of the current point (i, j) from the center (cx, cy)
d = sqrt( (i - cx) ** 2 + (j - cy) ** 2 )
if d < r:
oled.pixel(i, j, color)
|
Testing Circle Drawing
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 | from machine import Pin
from utime import sleep
from math import sqrt
import ssd1306
WIDTH = 128
HEIGHT = 64
clock=Pin(2) # SCL
data=Pin(3) # SDA
RES = machine.Pin(4)
DC = machine.Pin(5)
CS = machine.Pin(6)
spi=machine.SPI(0, sck=clock, mosi=data)
oled = ssd1306.SSD1306_SPI(WIDTH, HEIGHT, spi, DC, RES, CS)
def circle(cx, cy, r, color):
diameter = r*2
upper_left_x = cx - r
upper_left_y = cy - r
# scan through all pixels and only turn on pixels within r of the center
for i in range(upper_left_x, upper_left_x + diameter):
for j in range(upper_left_y, upper_left_y + diameter):
# distance of the current point (i, j) from the center (cx, cy)
d = sqrt( (i - cx) ** 2 + (j - cy) ** 2 )
if d < r:
oled.pixel(i, j, color)
HALF_WIDTH = int(WIDTH/2)
HALF_HEIGHT = int(HEIGHT/2)
while True:
for rad in range(1,HALF_HEIGHT+2):
draw_circle(HALF_WIDTH, HALF_HEIGHT, rad, 1)
oled.show()
sleep(.1)
sleep(3)
oled.fill(1)
for rad in range(1,HALF_HEIGHT+2):
circle(HALF_WIDTH, HALF_HEIGHT, rad, 0)
oled.show()
sleep(.1)
oled.fill(0)
sleep(3)
|
Drawing a Face
If we assume we have a 64x128 display we can call two circle functions to draw eyes
display.fill(0) # Clear the display.
display.circle(32, 32, 10, 1) # draw the left eye