This is code I used to display the battery state on a Pico W + Display pack.
from machine import ADC, Pin
import time
import network
# change to DISPLAY_PICO_DISPLAY_2 for Pico Display 2.0
from picographics import PicoGraphics, DISPLAY_PICO_DISPLAY
def get_vsys():
# Pico W voltage read function by darconeous on reddit:
# https://www.reddit.com/r/raspberrypipico/comments/xalach/comment/ipigfzu/
conversion_factor = 3 * 3.3 / 65535
wlan = network.WLAN(network.STA_IF)
wlan_active = wlan.active()
try:
# Don't use the WLAN chip for a moment.
wlan.active(False)
# Make sure pin 25 is high.
Pin(25, mode=Pin.OUT, pull=Pin.PULL_DOWN).high()
# Reconfigure pin 29 as an input.
Pin(29, Pin.IN)
vsys = ADC(29)
return vsys.read_u16() * conversion_factor
finally:
# Restore the pin state and possibly reactivate WLAN
Pin(29, Pin.ALT, pull=Pin.PULL_DOWN, alt=7)
wlan.active(wlan_active)
display = PicoGraphics(display=DISPLAY_PICO_DISPLAY, rotate=0)
display.set_backlight(0.8)
charging = Pin('WL_GPIO2', Pin.IN) # reading this pin tells us whether or not USB power is connected
full_battery = 4.2 # these are our reference voltages for a full/empty battery, in volts
empty_battery = 2.8 # the values could vary by battery size/manufacturer so you might need to adjust them
# Create some pen colours for drawing with
BLACK = display.create_pen(0, 0, 0)
GREY = display.create_pen(190, 190, 190)
GREEN = display.create_pen(0, 255, 0)
RED = display.create_pen(255, 0, 0)
while True:
# convert the raw ADC read into a voltage, and then a percentage
percentage = 100 * ((get_vsys() - empty_battery) / (full_battery - empty_battery))
if percentage > 100:
percentage = 100.00
# draw the battery outline
display.set_pen(BLACK)
display.clear()
display.set_pen(GREY)
display.rectangle(0, 0, 220, 135)
display.rectangle(220, 40, 20, 55)
display.set_pen(GREEN)
display.rectangle(3, 3, 214, 129)
# draw a green box for the battery level
display.set_pen(GREEN)
display.rectangle(5, 5, round(210 / 100 * percentage), 125)
# add text
display.set_pen(RED)
if charging.value() == True: # if it's plugged into USB power...
display.text("Charging!", 15, 55, 240, 4)
else: # if not, display the battery stats
display.text('{:.2f}'.format(get_vsys()) + "v", 15, 10, 240, 5)
display.text('{:.0f}%'.format(percentage), 15, 50, 240, 5)
display.update()
time.sleep(0.5)