first commit guide code for power deliverer
This commit is contained in:
parent
8d7863b718
commit
60904c301f
1 changed files with 156 additions and 0 deletions
156
USB_C_Power_Deliverer/code.py
Normal file
156
USB_C_Power_Deliverer/code.py
Normal file
|
|
@ -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)
|
||||||
Loading…
Reference in a new issue