from machine import Pin, I2C
import ssd1306
from math import sin, cos
import utime
# ESP32 Pin assignment
i2c = I2C(0, scl=Pin(1), sda=Pin(0))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
"""
oled.text("Welcome To", 0, 0)
oled.text("TechnicalUpdate", 7, 10)
oled.text("Interfacing RPI PICO", 5, 20)
oled.text("with OLED", 22, 30)
oled.show()
oled.pixel(10,10,1)
oled.hline(2,3,4,1)
oled.vline(0, 0, 64, 1)
oled.line(0, 0, 128, 64, 1)
oled.rect(0, 0, 64, 32, 1)
oled.fill_rect(0, 0, 64, 32, 1)
oled.show()
"""
X = const(64)
Y = const(32)
f = [[0.0 for _ in range(3)] for _ in range(8)]
cube = ((-20,-20, 20), (20,-20, 20), (20,20, 20), (-20,20, 20),
(-20,-20,-20), (20,-20,-20), (20,20,-20), (-20,20,-20))
while True:
for angle in range(0, 361, 3): # 0 to 360 deg 3step
for i in range(8):
r = angle * 0.0174532 # 1 degree
x1 = cube[i][2] * sin(r) + cube[i][0] * cos(r) # rotate Y
ya = cube[i][1]
z1 = cube[i][2] * cos(r) - cube[i][0] * sin(r)
x2 = x1
y2 = ya * cos(r) - z1 * sin(r) # rotate X
z2 = ya * sin(r) + z1 * cos(r)
x3 = x2 * cos(r) - y2 * sin(r) # rotate Z
y3 = x2 * sin(r) + y2 * cos(r)
z3 = z2
x3 = x3 + X
y3 = y3 + Y
f[i][0] = x3 # store new values
f[i][1] = y3
f[i][2] = z3
oled.fill(0) # clear
oled.line(int(f[0][0]), int(f[0][1]), int(f[1][0]), int(f[1][1]), 1)
oled.line(int(f[1][0]), int(f[1][1]), int(f[2][0]), int(f[2][1]), 1)
oled.line(int(f[2][0]), int(f[2][1]), int(f[3][0]), int(f[3][1]), 1)
oled.line(int(f[3][0]), int(f[3][1]), int(f[0][0]), int(f[0][1]), 1)
oled.line(int(f[4][0]), int(f[4][1]), int(f[5][0]), int(f[5][1]), 1)
oled.line(int(f[5][0]), int(f[5][1]), int(f[6][0]), int(f[6][1]), 1)
oled.line(int(f[6][0]), int(f[6][1]), int(f[7][0]), int(f[7][1]), 1)
oled.line(int(f[7][0]), int(f[7][1]), int(f[4][0]), int(f[4][1]), 1)
oled.line(int(f[0][0]), int(f[0][1]), int(f[4][0]), int(f[4][1]), 1)
oled.line(int(f[1][0]), int(f[1][1]), int(f[5][0]), int(f[5][1]), 1)
oled.line(int(f[2][0]), int(f[2][1]), int(f[6][0]), int(f[6][1]), 1)
oled.line(int(f[3][0]), int(f[3][1]), int(f[7][0]), int(f[7][1]), 1)
oled.line(int(f[1][0]), int(f[1][1]), int(f[3][0]), int(f[3][1]), 1)
oled.line(int(f[0][0]), int(f[0][1]), int(f[2][0]), int(f[2][1]), 1)
oled.text('3D CUBE', 0, 0)
oled.show() # display
utime.sleep(1)