Seeed sent me a Wio Terminal to play with, and I have to say I am impressed.
Rather than do a straight review, I thought I would show how easy it is to make a quick project with it.
As you can tell, I like it! For under $30 this little guy delivers:
- ARM Cortex 120-200MHz ATSAMD51 with BLE / BLE 5.0 bluetooth and 2.4Ghz / 5Ghz Wi-Fi
- 4 MB External Flash, 192 KB RAM
- 2.4” LCD Screen + buttons and joystick
- Accelerometer, microphone, buzzer, light sensor
- microSD, SPI, I2C, I2S, ADC, DAC, PWM, UART
- Infrared emitter,
- 2x Grove ports
- USB Host/Client OTG
- 40-pin Raspberry Pi compatible GPIO (Can be mounted to a Pi or use Pi HAT!)

Check out the intro video here for a better idea what is packed into the tiny box.
It can be coded with Arduino or Micro/CircuitPython.
Just take a look at what the community has built with it already.
Some pretty impressive stuff, I am sure you will agree.
Display, IoT + the Grove Ecosystem
What really makes this stand out is it isn’t just powerful for the price, it’s not just wireless, it hasn’t just got a pretty display … it’s all that AND it enables use of the plug-and-play Grove system of sensors and inputs!
I am a big fan of the Grove Ecosystem (and have been for a while), especially when working with kids and folks like me who don’t want to touch a soldering iron unless 100% necessary.
Here is my ultrasonic range finding example in action.
Setting up CircuitPython is as simple as downloading the firmware file from the link above, double clicking the reset button, and dragging the firmware to the CircuitPython drive that pops up. Saving your code is a simple case of writing code.py to the same drive.

The sensor plugs into the right-hand port in the case as you look at the screen, which is the Analog A0 input.

Add the code below to try it out:
import board
import pulseio
import time
import board
import terminalio
from adafruit_display_text import label
sig = pulseio.PulseIn(board.A0)
text = "000.0000 [cm]"
text_area = label.Label(terminalio.FONT, text=text)
text_area.x = 10
text_area.y = 10
while True:
sig.pause()
sig.clear()
sig.resume(10)
time.sleep(0.1) # should poll len(sig) here with a timeout
sig.pause()
sig_value = sig[0]*0.017
if len(sig) != 0 and sig_value < 500:
text= "{:6.2f} [cm]".format(sig_value)
text_area.text = text
board.DISPLAY.show(text_area)

If you really want to get fancy, you can change the text color or the font face.
The fonts are bitmap fonts in the BDF format. You can drag and drop a font file onto the CircuitPython drive and change the following:
from adafruit_bitmap_font import bitmap_font
text = "000.0000 [cm]"
FONT = bitmap_font.load_font("/IBMPlexMono-Medium-24_jep.bdf")
text_area = label.Label(FONT, text=text)
text_area.x = 20
text_area.y = 20