Skip to content

first commit guide code for power deliverer #2876

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 29, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 156 additions & 0 deletions USB_C_Power_Deliverer/code.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
# SPDX-FileCopyrightText: Copyright (c) 2024 John Park for Adafruit Industries
#
# SPDX-License-Identifier: MIT
"""
USB C PD power supply w HUSB238
pick voltages and then set them, measures high side current with INA219
"""
import time
import board
import keypad
import displayio
import terminalio
from adafruit_display_text import label
from adafruit_display_shapes.rect import Rect
import adafruit_husb238
from adafruit_ina219 import INA219

i2c = board.I2C()

tft_d0_button = keypad.Keys((board.D0,), value_when_pressed=False, pull=True)
tft_buttons = keypad.Keys((board.D1, board.D2), value_when_pressed=True, pull=True)

# Initialize INA219 current sensor
ina219 = INA219(i2c)

TXTCOL_VOLT = 0x8f00cd
TXTCOL_CURR = 0xb30090
TXTCOL_DIM = 0xCD8F00
TXTCOL_HEAD = 0xCD8F00
TXTCOL_BTN = 0xa0a0a0
BGCOL = 0x220030
display = board.DISPLAY
group = displayio.Group()

background_rect = Rect(0, 0, display.width, display.height, fill=BGCOL)
group.append(background_rect)

warning_text = "plug in USB C PD cable, press reset"

FONT = terminalio.FONT

display.root_group = group

RUNNING = None
PLUGGED = None

# Initialize HUSB238 PD dummy
try:
pd = adafruit_husb238.Adafruit_HUSB238(i2c)
RUNNING = True
PLUGGED = True
except ValueError:
print("plug in a USB C PD cable, then press reset")
RUNNING = False
PLUGGED = False

warning_label = label.Label(
FONT, text=warning_text, color=0xdd0000,
scale=1, anchor_point=(0,0),
anchored_position=(20, 10)
)
group.append(warning_label)
#stop the code here

while not RUNNING:
pass

while RUNNING:
voltages = pd.available_voltages
print("The following voltages are available:")
for i, volts in enumerate(voltages):
print(f"{volts}V")

v = 0

if pd.attached:
pd.voltage = voltages[0]
print(f"Voltage is set to {pd.voltage}V/{pd.current}A")

display = board.DISPLAY

group = displayio.Group()
background_rect = Rect(0, 0, display.width, display.height, fill=BGCOL)
group.append(background_rect)
vert_bar = Rect(40, 0, 3, display.height, fill=0x000000)
group.append(vert_bar)

FONT = terminalio.FONT

header_label = label.Label(
FONT, text="Power Deliverer", color=TXTCOL_HEAD,
scale=2, x=50, y=8
)
group.append(header_label)
voltage_label = label.Label(
FONT, text=str(voltages[0])+"V", color=TXTCOL_VOLT,
scale=5, anchor_point=(0,0),
anchored_position=(50, 20)
)
group.append(voltage_label)
current_label = label.Label(
FONT, text="0mA", color=TXTCOL_CURR,
scale=5, anchor_point=(0,0),
anchored_position=(50, 80)
)
group.append(current_label)
go_label = label.Label(FONT, text="set", color=TXTCOL_BTN, scale=2, x=1, y=6)
group.append(go_label)
up_label = label.Label(FONT, text="+v", color=TXTCOL_BTN, scale=2, x=1, y=display.height//2-2)
group.append(up_label)
down_label = label.Label(FONT, text="-v", color=TXTCOL_BTN, scale=2, x=1, y=display.height-12)
group.append(down_label)

display.root_group = group


while True:
tft_d0_button_event = tft_d0_button.events.get()
if tft_d0_button_event and tft_d0_button_event.pressed:
try:
print(f"Setting to {voltages[v]}V!")
pd.voltage = voltages[v]
voltage_label.text=str(voltages[v]) + "V"
voltage_label.color=TXTCOL_VOLT
print(f"It is set to {pd.voltage}V/{pd.current}A")
print()
PLUGGED=True
except OSError:
print(warning_text)
voltage_label.text="replug"
current_label.text="USB C"
PLUGGED=False

if PLUGGED:
tft_buttons_event = tft_buttons.events.get()
if tft_buttons_event and tft_buttons_event.pressed:
if tft_buttons_event.key_number == 0:
v = (v + 1) % len(voltages) # maybe have this stop at max
voltage_label.color=TXTCOL_DIM
voltage_label.text="["+str(voltages[v]) + "V]"
print(f"Voltage will be set to {voltages[v]}V")

if tft_buttons_event.key_number == 1:
v = (v - 1) % len(voltages) # maybe have this stop at min
voltage_label.color=TXTCOL_DIM
voltage_label.text="["+str(voltages[v]) + "V]"
print(f"Voltage will be set to {voltages[v]}V")

current = ina219.current # current in mA
# power = ina219.power # power in watts
current_label.text= str(abs(int(current))) + "mA"

if ina219.overflow:
print("Internal Math Overflow Detected!")
print("")
time.sleep(0.2)