Pimoroni Presto Feedback

Hey Pimoroni Team!

First, I love the Presto, it’s such a sleek design! I haven’t bought one yet, waiting for the final version.
One thing I am missing though is a way to mount a backplate. I think you should include a way to add screws to the backplate. Maybe a system like M2 slots use can work? So you have a little metal cylinder on the backplate that stands off a bit, that you can screw screws in?

Looking forward to the final design!

Hi and a Happy New Year to the Team at Pimoroni.

Great little display, just a few suggestions for the production version.

  1. Make the usb socket vertical (a lead sticking out the side spoils the looks and a stiff cable makes it a bit unstable).

  2. Separate the two buttons a little.

  3. You missed one IO pin (it must be lonely and unloved), maybe give it a button or led to look after.

  4. Add a socket that connects to Vbus, Vbat and Gnd to make connecting a battery charger easier. (something for any device with a battery connector maybe)

Keep up the great design work.

If there is a pin going spare please make it an I/O ADC. I miss using a pot as input.

I’ll just have to build a touch slider on the screen to use instead.

This was easier than I thought it would be. You can find a video and the code here:
PRESTO Slide Potentiometer - Discussion / Projects - Pimoroni Buccaneers

I have one on order.
Looks good for development, but if I want to use it for some permanent use, such as a clock, or status display or home control console, it is going to need some kind of rear cover. This could be as simple as a piece of flat plastic or PCB like material on spacers.
Thinking ahead, I would really like a way to mount a daughter card that would be a custom application specific PCB, AND a rear cover or cover plate.

1 Like

I agree with the first two, but which IO is loose and what is the point of vbus and vbat?

Unless I missed something, GPIO0 (pin 77 on the cpu) only appears to go to a test pad.

Maybe use it for the backlight_en or user_sw and bring out an analogue pin for Tonygo2.

For all the chargers I have seen on Pimoroni, the chargers appear drive the load AND charge the battery (ok if the load is small and cannot handle 5V), bringing out Vbus and Vbat would allow a charger to just charge the battery.

You could also use a Pimoroni LiPo Amigo Pro which means you can plug one JST-PH into the device and the other into the battery.

Received my Presto today, and have been impressed by the examples and demos so far, including those posted by Tony.

Are there any hints on how to use the Piezo buzzer? I can’t see any example code that is using it currently.

Same issue, the load is fed from the battery (via the switch - U2-2), high charge rate though.

I’ve had my PRESTO for two weeks now and have used it a great deal. The only thing I miss is a spare IO pin. I find the buzzer the least attractive element and would like a link or cuttable trace to a solder pad so that I could make a choice between using the buzzer or an IO pin. There appears to be space for this in that corner of the board.

I don’t get it, Tony?!
I am thinking of the following scenario ever since you wrote about the on-board beeber…

There are 2 Qu/St connectors at the back and by a Qu/St to DuPont adapter you get the two pins out for tinkering with the physical port GPIOs.
Just don’t use them for I2C, but define them as regular GPIO ports and you can make use of whatever you want…also connecting your buzzer of choice…

Am I mistaken…?

I prioritise i2c over the very quiet buzzer. I already hang a qw/st pad and some sensors of the i2c port and do not want to give them up. I just would like at least one user available GPIO pin to use as I want. More useful than a too quiet buzzer.

…at least this request is which I fully support, as well.
I would even request more than just one GPIO pin, say up to 6 user defined pins, broken out on the rear as female socket bar + plus ofc Ground & Voltage pins 3,3 and 5 Volts (for various applications). Same as on the Pico Explorers’s front…just on the Presto’s back…

I saw you have opened a feature request thread already, this should be definitively on that list.

I do not think there are that many pins left unused.

Hello, I’ve been trying out Presto and all the examples for a few days. It’s great what it can do.
I was able to translate the word clock into German, but now I’m stuck on the time zone. Adding the difference works, but it’s not optimal.
Unfortunately, I’m not a programmer and everything I’ve found so far about the time zone doesn’t work.
Does anyone have a tip on how I can tell Presto the right time zone?

…so what do you want instead? Unless you tell any device the deviation from standard time (GMT, UTC, etc.), the device would not know where you are…except you are giving some meaningful geo meta data to elaborate further on automatically…

So the point is, the device needs to know where it is (or YOU are) located. Then it can adjust the time according to the given timezone, which usually derives from the geo-coordinates… This can be either manually adjusted or automatically retrieved by some more information given, such as your location.

Apart from a moving object, this is in principle done by a timezone adjustment within the code.
However, if you need to be flexible, because - say - you are always moving between continents, you could derive the geolocation by the device’s IP address retrieved from the local network provider you are connected to. Then you could auto-adjust the geolocation and have the proper timezone adjustment calculated automatically…and -boom- time is set right…

I for one, believe this is too much over-engineering… ;)

Hello Presto Team. I love the Presto Beta and thought it would be nice with a Lipo charger and on/off switch…

Thanks

You could also use an IO Expander.

Thanks, I’ve been using one since the middle of February. It is very useful and an ideal addition to your PRESTO allowing all the usual IO facilities such as Digital Input/Output ADC and PWM.

Here is a simple demo:

# IO Expander Demo on Presto
# Tony Goodhew 14th February 2025
# Requirements: IO expander on Qw/ST port
# Button to GND on Pin 2
# 10K potentiometer wiper on 10, + 3.3v and GND
# LED with 330 ohm resistor on pin 6

import time
from pimoroni_i2c import PimoroniI2C
from breakout_ioexpander import BreakoutIOExpander
from presto import Presto
from picovector import ANTIALIAS_FAST, PicoVector, Polygon, Transform
# Setup for the Presto display
presto = Presto(full_res=True)
display = presto.display

# Pico Vector setup section
vector = PicoVector(display)
vector.set_antialiasing(ANTIALIAS_FAST)
t = Transform()

vector.set_font("cherry-hq.af", 54)

vector.set_font_letter_spacing(100)
vector.set_font_word_spacing(100)
vector.set_transform(t)
vector.set_font_size(20)

# Setup IO Expander
PINS_PRESTO  = {"sda": 40, "scl": 41}
i2c = PimoroniI2C(**PINS_PRESTO)
ioe = BreakoutIOExpander(i2c, address=0x18)

def clean(): # Clear the screen to Black
    display.set_pen(BLACK)
    display.clear()

# Create some colours
BLUE = display.create_pen(20,0,255)
WHITE = display.create_pen(255, 255, 255)
RED = display.create_pen(255,0,0)
ORANGE = display.create_pen(245, 165, 4)
GREEN = display.create_pen(0,255,0)
PINK = display.create_pen(250, 125, 180)
CYAN = display.create_pen(0,255,255)
MAGENTA = display.create_pen(255,0,255)
BLACK = display.create_pen(0, 0, 0)
YELLOW = display.create_pen(255, 255, 0)

clean()
display.set_pen(RED)
vector.set_font_size(70)
vector.text("IO Expander",40,120)
display.set_pen(BLUE)
vector.set_font_size(20)
vector.text("Tony Goodhew, Leicester UK",120,450)
presto.update()
time.sleep(1)

#  10K Potentiometer - ADC input
ioe_adc_pin = 10
ioe.set_mode(ioe_adc_pin, BreakoutIOExpander.PIN_ADC)

for count in range(60):
    clean()
    display.set_pen(GREEN)
    vector.set_font_size(35)
    vector.text("Turn the Potentiometer",10,50)
    pot = ioe.input(ioe_adc_pin) // 4 # 10 bit resolution
    h = int(pot/2.5)
    display.set_pen(YELLOW)
    vector.set_font_size(40)
    vector.text("Pot Value: " + str(int(pot)),10,150)
    display.set_pen(ORANGE)
    display.rectangle(350,430-h,60,h)
    display.set_pen(BLUE)
    display.rectangle(335,431,90,4)
    voltage = round(ioe.input_as_voltage(ioe_adc_pin),2)
    vector.text("Volts: " + str(voltage),10,200)
    presto.update()
    time.sleep(0.2)

clean()
display.set_pen(BLUE)
vector.text("PWM on LED",10,50)
display.set_pen(YELLOW)
vector.text("Press button to start",10,150)
presto.update()

ioe_button_pin = 2

ioe.set_mode(ioe_button_pin, BreakoutIOExpander.PIN_IN_PU)

ioe_pwm_pin = 6
button_state = ioe.input(ioe_button_pin)
while button_state == 1:
    button_state = ioe.input(ioe_button_pin)

# Settings to produce a 50Hz output from the 24MHz clock.
# 24,000,000 Hz / 8 = 3,000,000 Hz
# 3,000,000 Hz / 60,000 Period = 50 Hz
divider = 8
period = 60000 

ioe.set_pwm_period(period)
ioe.set_pwm_control(divider)

ioe.set_mode(ioe_pwm_pin, BreakoutIOExpander.PIN_PWM)
clean()
display.set_pen(BLUE)
vector.text("PWM on LED",10,50)
display.set_pen(YELLOW)
presto.update()

time.sleep(0.3)

for count in range(2):
    # Brightening
    for duty_cycle in range(0, 65536,2048):
        clean()
        display.set_pen(BLUE)
#        display.text("PWM on LED",10,50,400,4)
        vector.text("PWM on LED",10,50)
        display.set_pen(YELLOW)
        vector.text("Duty cycle: "+ str(duty_cycle),50,200)
        ioe.output(ioe_pwm_pin, duty_cycle)
        presto.update()
        
    clean()
    display.set_pen(BLUE)
    vector.text("PWM on LED",10,50)
    ioe.output(ioe_pwm_pin, 65535) # LED off
    display.set_pen(YELLOW)
    vector.text("Duty cycle: "+ str(65535),50,200)
    presto.update()
    time.sleep(0.6)
    
    # Dimming
    for duty_cycle in range(65535, -1,-2048):
        clean()
        display.set_pen(BLUE)
        vector.text("PWM on LED",10,50)
        display.set_pen(YELLOW)
        vector.text("Duty cycle: "+ str(duty_cycle),50,200)
        ioe.output(ioe_pwm_pin, duty_cycle)
        presto.update()
    
    clean()
    display.set_pen(BLUE)
    vector.text("PWM on LED",10,50)
    ioe.output(ioe_pwm_pin, 0) # LED off
    display.set_pen(YELLOW)
    vector.text("Duty cycle: "+ str(0),50,200)
    presto.update()
    time.sleep(0.6)
    
ioe_LED_pin = 6 # LED now digital on/off

ioe.set_mode(ioe_LED_pin, BreakoutIOExpander.PIN_OUT)

clean()
display.set_pen(GREEN)
vector.text("Basic LED Flashing",10,50)
presto.update()
for i in range(10):
    ioe.output(ioe_LED_pin, 1)
    time.sleep(0.2)
    ioe.output(ioe_LED_pin, 0)
    time.sleep(0.2)

clean()
display.set_pen(GREEN)
vector.text("Button Control of LED",10,50)
display.set_pen(YELLOW)
vector.text("Press button ON/OFF",10,150)
presto.update()
ioe.output(ioe_LED_pin, 0) # LED OFF
future = time.time() + 8 # 8 seconds
while time.time() < future:
    button_state = not(ioe.input(ioe_button_pin)) # True if pressed
    ioe.output(ioe_LED_pin, button_state)
    colour = RED
    if button_state == 0:
        colour = BLACK
    display.set_pen(colour)
    display.circle(240,300,50)
    presto.update()
    
ioe.output(ioe_LED_pin, 0) # LED OFF    

clean()
presto.update()