import time, utime
from machine import Pin, PWM, I2C
from ssd1306 import SSD1306_I2C
import framebuf, sys
# Utilities Functions
def hex2rgb(hex):
return tuple([int(hex[0:2],16),int(hex[2:4],16),int(hex[4:6],16)])
def int8_2_u16(x):
return x * 65535 // 255
# OLED Setup
def init_i2c(scl_pin, sda_pin):
# Initialize I2C device
i2c_dev = I2C(1, scl=Pin(scl_pin), sda=Pin(sda_pin), freq=200000)
i2c_addr = [hex(ii) for ii in i2c_dev.scan()]
if not i2c_addr:
print('No I2C Display Found')
sys.exit()
else:
print("I2C Address : {}".format(i2c_addr[0]))
print("I2C Configuration: {}".format(i2c_dev))
return i2c_dev
def displayGreeting(oled):
oled.fill(0)
oled.text("Hello", 5, 5)
oled.text("Use keypad to", 5, 15)
oled.text("pick color", 5, 25)
oled.show()
def displayText(oled, text):
oled.fill(0)
oled.text("Hex Code:", 5, 5)
oled.text(text, 5, 15)
oled.show()
# PWM Setup
RED = 0; GREEN = 1; BLUE = 2
pwms = [PWM(Pin(13)),PWM(Pin(14)),PWM(Pin(15))]
[pwm.freq(1000) for pwm in pwms]
def turnOff():
pwms[RED].duty_u16(0); pwms[GREEN].duty_u16(0); pwms[BLUE].duty_u16(0)
time.sleep(0.1)
# Keypad Setup
KEY_R1 = 9; KEY_R2 = 8; KEY_R3 = 7; KEY_R4 = 6
KEY_C1 = 5; KEY_C2 = 4; KEY_C3 = 3; KEY_C4 = 2
KEYPAD_ROWS = [9,8,7,6]; KEYPAD_COLUMNS = [5,4,3,2]
MATRIX_KEYS = [ ['1','2','3','A'], ['4','5','6','B'], ['7','8','9','C'], ['*','0','#','D']]
rowPins = []; colPins = []
for x in range(0, 4):
rowPins.append(Pin(KEYPAD_ROWS[x], Pin.OUT)); rowPins[x].value(1)
colPins.append(Pin(KEYPAD_COLUMNS[x], Pin.IN, Pin.PULL_DOWN)); colPins[x].value(0)
def readKey():
key = None
for row in range(4):
for col in range(4):
rowPins[row].high()
if (colPins[col].value()) == 1:
key = MATRIX_KEYS[row][col]
utime.sleep(0.1)
rowPins[row].low()
return key
def displayColor(oled,hexString):
red, green, blue = hex2rgb(hexString)
pwms[RED].duty_u16(int8_2_u16(red))
pwms[GREEN].duty_u16(int8_2_u16(green))
pwms[BLUE].duty_u16(int8_2_u16(blue))
oled.fill(0)
oled.text("Displaying:", 5, 5)
oled.text(hexString, 5, 15)
oled.show()
pix_res_x = 128
pix_res_y = 64
oled = SSD1306_I2C(pix_res_x, pix_res_y, init_i2c(27, 26))
hexString = '';
displayGreeting(oled)
while True:
key = None
key = readKey()
if key != None:
if key.isdigit():
hexString = hexString + key
displayText(oled,hexString)
elif key == '*':
if len(hexString) == 6:
displayColor(oled,hexString)
else:
hexString = hexString[:- 1]
displayText(oled,hexString)