# https://www.tomshardware.com/how-to/oled-display-raspberry-pi-pico
# https://peppe8o.com/ssd1306-i2c-oled-raspberry-pi-pico-micropython/
# Raspberry Icon added from various examples
# Display Image & text on I2C driven ssd1306 OLED display 

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import framebuf
import math 
import utime 
WIDTH  = 128                                            # oled display width
HEIGHT = 64                                             # oled display height

# Explicit Method
sda=machine.Pin(8)
scl=machine.Pin(9)
i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000)
oled = SSD1306_I2C(128, 64, i2c)

'''
# Unsure why simulation does not show shell, I need to work on this
print("I2C Address      : "+hex(i2c.scan()[0]).upper()) # Display device address
print("I2C Configuration: "+str(i2c))                   # Display I2C config
'''

while True:
    # From Peppo80.com 
    oled.fill(1)   # Fill screen with color 1
    oled.show()    # Execute fill
    utime.sleep(1) # Wait 1 seconds

    oled.fill(0)   # Fill screen with color 0
    oled.show()    # Execute fill

    oled.pixel(20, 20, 1)   # Pixel to x20, y10, on(1)
    oled.show()             # Execute pixel command
    for i in range(21, 40):
        oled.pixel(i, int(i+i/8), 1) # Pixel to xi, yint(i+i/8), on(1)
        oled.show()      # Execute pixel command
        utime.sleep(0.1) # Wait 0.1 seconds
    utime.sleep(1) # Wait 1 seconds
    
    oled.fill(0)   # Fill screen with color 0
    oled.show()    # Execute fill

    oled.pixel(20, 10, 0) # Pixel to x20, y10, off(0)
    oled.show()    # Execute pixel command
    utime.sleep(0.5) # Wait 0.5 seconds

    # Display hline and vline
    oled.hline(0, 8, 60, 1) # Line starts at x0, y8, is 60px long, 1 is color
    oled.vline(0, 8, 60, 1) # Line starts at x0, y8, is 60px long, 1 is color
    oled.show()    # Execute line commands
    utime.sleep(1) # Wait 1 seconds

    # Display rect and fill_rect
    oled.rect(12, 12, 107, 43, 1) # rect requires x,y start and x,y end, 1 is color
    oled.show()    # Execute rect command
    utime.sleep(1) # Wait 1 seconds
    oled.fill_rect(12, 12, 107, 43, 1) # fill_rect requires x,y start and x,y end, 1 is color
    oled.show()    # Execute fill_rect command
    utime.sleep(1) # Wait 1 seconds
    oled.fill_rect(13, 13, 105, 41, 0) # fill_rect requires x,y start and x,y end, 0 is color
    oled.show()    # Execute fill_rect command
    utime.sleep(1) # Wait 1 seconds

    # Clear Screen
    oled.fill(0)   # Fill screen with color 0
    oled.show()    # Execute fill

    # Display line
    oled.line(0, 0, 128, 64, 1) # line requires x,y start and x,y end, 1 is color
    oled.line(0, 64, 128, 0, 1) # line requires x,y start and x,y end, 1 is color
    oled.show()    # Execute line commands
    utime.sleep(1) # Wait 1 seconds

    # Clear Screen
    oled.fill(0)   # Fill screen with color 0
    oled.show()    # Execute fill

    # Complex display of MicroPython Logo and Icon
    oled.fill(0)
    oled.fill_rect(0, 0, 32, 32, 1)
    oled.fill_rect(2, 2, 28, 28, 0)
    oled.vline(9, 8, 22, 1)
    oled.vline(16, 2, 22, 1)
    oled.vline(23, 8, 22, 1)
    oled.fill_rect(26, 24, 2, 4, 1)
    oled.text('MicroPython', 40, 0, 1)
    oled.text('SSD1306', 40, 12, 1)
    oled.text('OLED 128x64', 40, 24, 1)
    oled.show()
    utime.sleep(1) # Wait 1 seconds

    # Clear Screen
    oled.fill(0)   # Fill screen with color 0
    oled.show()    # Execute fill

    # The following part changes according to what you want to display
    oled.text('Hello,', 0, 0)          # Text to x0, y0
    oled.text('Welcome to', 0, 16)     # Text to x0, y16
    oled.text('my RPi Pico W!', 0, 32) # Text to x0, y32
    oled.show()    # Send text to display
    utime.sleep(1) # Wait 1 seconds


    oled.invert(1)   # Invert the display colors
    utime.sleep(0.5) # Wait 1/2 second

    oled.invert(0)   # Return display to normal
    utime.sleep(0.5) # Wait 1/2 second
    
    # Tom's Hardware Hammer Icon 
    TH = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[P\x00\x00\x00\x00\x00\x03\xad\xec\x0f\x00\x00\x00\x00\rv\xb6\x1a\x80\x00\x00\x00\x16\xdb[m\x80\x00\x00\x00um\xb5\xb6\x80\x00\x00\x00[\xb5n\xdb\x00\x00\x00\x01\xadW\xb5m\x80\x00\x00\x01w\xed[\xb6\x80\x00\x00\x03\xa8\x1a\xec+\x00\x00\x00\x05@\x17P\x1d\x00\x00\x00\x0e\x00\r\xb0\x06\x80\x00\x00\x08\x00\n\xd0\x00\x00\x00\x00\x08\x00\x17`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x1f\xa0\x00\x00\x00\x00\x00\x00\n\xd0\x00\x00\x00\x00\x00\x00\r`\x00\x00\x00\x00\x00\x00\x17\xb0\x00\x00\x00\x00\x00\x00\n\xd0\x00\x00\x00\x00\x00\x00\x1b`\x00\x00\x00\x00\x00\x00\r\xb0\x00\x00\x00\x00\x00\x00\x16\xa0\x00\x00\x00\x00\x00\x00\x0bp\x00\x00\x00\x00\x00\x00\x1d\xa0\x00\x00\x00\x00\x00\x00\n\xd0\x00\x00\x00\x00\x00\x00\x17p\x00\x00\x00\x00\x00\x00\x1a\xa0\x00\x00\x00\x00\x00\x00\r\xd0\x00\x00\x00\x00\x00\x00\x16\xb0\x00\x00\x00\x00\x00\x00\x1b`\x00\x00\x00\x00\x00\x00\r\xb0\x00\x00\x00\x00\x00\x00\x16\xd0\x00\x00\x00\x00\x00\x00\x1bp\x00\x00\x00\x00\x00\x00\r\xa8\x00\x00\x00\x00\x00\x00\x16\xb0\x00\x00\x00\x00\x00\x00\x1b`\x00\x00\x00\x00\x00\x00\x15\xb0\x00\x00\x00\x00\x00\x00\x1e\xd0\x00\x00\x00\x00\x00\x00\x13p\x00\x00\x00\x00\x00\x00\x1d\xa8\x00\x00\x00\x00\x00\x00\x16\xb0\x00\x00\x00\x00\x00\x00\x15\xd0\x00\x00\x00\x00\x00\x00\x1a\xb8\x00\x00\x00\x00\x00\x00\x17`\x00\x00\x00\x00\x00\x00\x1a\xd8\x00\x00\x00\x00\x00\x00\x17h\x00\x00\x00\x00\x00\x00\x1a\xb0\x00\x00\x00\x00\x00\x00\x1d\xd8\x00\x00\x00\x00\x00\x00+h\x00\x00\x00\x00\x00\x00\x16\xb0\x00\x00\x00\x00\x00\x00\x1b\xd8\x00\x00\x00\x00\x00\x00\x16`\x00\x00\x00\x00\x00\x00\x0b\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
    fb = framebuf.FrameBuffer(TH,64,64, framebuf.MONO_HLSB)
    oled.fill(0)
    for i in range(-64,128):
        oled.blit(fb,i,0)
        oled.show()
       
    # Tom's Hardware Logo   
    LOGO = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x800\xc0\xc7\xf8~0\xc3\x0c\x1f\x87\xf8\x0c\x00\x00\x01\x800\xc1\xcf\xec\x7f0\xc7\x1c\x1f\xc7\xf8\x0c\x00\x00\x01\x800\xc1\xc1\x8ec\x99\xc6\x1c\x18\xe6\x00\x0c\x0c&`\x180\xc3\xe0\x06a\x99\xe6\x1e\x18f\x00\x1f>\x7f\xf8~0\xc3a\x8ea\x99\xe66\x18f\x00\x0cws\x98d?\xc3a\xbca\x99\xee6\x1f\xc7\xf0\x0ccs\x98`?\xc61\xb8a\x8f<s\x1f\x87\xf0\x0ccs\x18~0\xc61\x98a\x8f<c\x19\x86\x00\x0ccs\x18\x1e0\xc7\xf1\x9ca\x8f<\x7f\x99\xc6\x00\x0ccs\x18\x060\xcf\xf9\x8cc\x8e8\xff\x98\xc6\x00\x0f\x7fs\x18~0\xcc\x19\x8e\x7f\x06\x18\xc1\x98\xe7\xf8\x07>s\x18|0\xcc\x1d\x86|\x06\x18\xc1\xd8g\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
    fb = framebuf.FrameBuffer(LOGO,128,64, framebuf.MONO_HLSB)
    oled.fill(0)
    for i in range(-128,128):
        oled.blit(fb,i,0)
        oled.show()
       
    # Raspberry Pi Icon 
    RPiI = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|?\x00\x01\x86@\x80\x01\x01\x80\x80\x01\x11\x88\x80\x01\x05\xa0\x80\x00\x83\xc1\x00\x00C\xe3\x00\x00~\xfc\x00\x00L'\x00\x00\x9c\x11\x00\x00\xbf\xfd\x00\x00\xe1\x87\x00\x01\xc1\x83\x80\x02A\x82@\x02A\x82@\x02\xc1\xc2@\x02\xf6>\xc0\x01\xfc=\x80\x01\x18\x18\x80\x01\x88\x10\x80\x00\x8c!\x00\x00\x87\xf1\x00\x00\x7f\xf6\x00\x008\x1c\x00\x00\x0c \x00\x00\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
    fb = framebuf.FrameBuffer(RPiI,32,32, framebuf.MONO_HLSB)
    oled.fill(0)
    for i in range(-32,128):
        oled.blit(fb,i,14)
        oled.show()
 
    # Thermometer Icon
    # Image to Bytearray: http://www.digole.com/tools/PicturetoC_Hex_converter.php
    Thermometer = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x80\x00\x00\x07\xf0\x00\x00\x1f\x78\x00\x00\x18\x1c\x00\x00\x30\x0c\x00\x00\x30\x0c\x00\x00\x30\x0f\x00\x00\x30\x07\x80\x00\x30\x06\x00\x00\x30\x06\x00\x00\x30\x07\xe0\x00\x30\x07\xe0\x00\x30\x06\x00\x00\x30\x06\x00\x00\x31\x87\x00\x00\x31\xc7\x80\x00\x33\xc6\x00\x00\x33\xc6\x00\x00\x33\xc7\xc0\x00\x33\xc7\xe0\x00\x33\xc6\x00\x00\x33\xc6\x00\x00\x33\xc7\x00\x00\x33\xc7\x80\x00\x33\xc6\x00\x00\x33\xc6\x00\x00\x33\xc7\xc0\x00\x33\xc7\xe0\x00\x33\xc6\x00\x00\x33\xc6\x00\x00\x33\xc7\x00\x00\x33\xc7\x80\x00\x33\xc6\x00\x00\x33\xc6\x00\x00\x73\xc6\x00\x00\xe3\xc7\x00\x01\xc3\xc3\x80\x03\x87\xe1\xc0\x03\x0f\xf0\xc0\x07\x1f\xf8\x60\x06\x3f\xfc\x60\x06\x3f\xfe\x60\x06\x7f\xfe\x30\x06\x7f\xfe\x30\x06\x7f\xfe\x30\x06\x7f\xfe\x70\x06\x3f\xfc\x60\x06\x3f\xfc\x60\x07\x1f\xf8\xe0\x03\x0f\xf0\xc0\x01\x83\xc1\xc0\x01\xc0\x03\x80\x00\xf0\x0f\x00\x00\x3f\xfe\x00\x00\x1f\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
    fb = framebuf.FrameBuffer(Thermometer,32,64, framebuf.MONO_HLSB)
    oled.fill(0)
    for i in range(-32,128):
        oled.blit(fb,i,0)
        oled.show()
    
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT