Fix a Board

A board acting up, dark screen, won't connect, ignoring your code, "address in use," anything? Work down this page from the top. Stop as soon as it's working. Nothing here can hurt the board.

The single most useful fact: a Pico needs nothing but power to run. If a finished board is misbehaving, it's almost always a stuck connection or a bit of leftover state, not a broken Pico. The steps below clear those, then rebuild your confidence one layer at a time.

First: the clean-slate ritual


Nine times out of ten, this alone fixes it. Do it in order, each step clears a different kind of "stuck."

Stop the program.

In Viper, click Stop (or click the terminal and press Ctrl+C). A running program can't be changed.

Disconnect Viper.

Click disconnect (top right). This lets go of the board so nothing is holding it.

Unplug the board.

Pull the USB. This is a full power-off, it clears leftover network sockets and any wedged state. (A "soft reset" does not; only real power-off does.)

Refresh the Viper page.

Reload viper-ide.org in the browser. Clears any stuck connection on the computer's side.

Plug the board back in.

Use a cable you know carries data (charge-only cables power the board but won't connect). Reseat both ends firmly.

Connect Viper.

Connect button → USB → pick the Pico. You should land at the >>> prompt.

Reinstall the code.

Click the project's one-click Install link again. This pulls the current, known-good code fresh. (Just editing a file can leave old code in charge.)

Reset and run.

Press Viper's reset, or run main.py. Fresh start, fresh code.

Working now? You're done. Still off? Don't guess, test one layer at a time. ↓

Still stuck? Test one layer at a time


Instead of poking at the whole station, load these tiny programs in order. Each one proves a single layer works. The first one that fails tells you exactly where the problem is, no more mystery.

Test 1

Does code run at all?, Blink

No wiring needed. Loads a program that blinks the Pico's own green light. Install & run Blink

Light blinks? The Pico, its firmware, and code-pushing all work. Go to Test 2.
Nothing blinks / can't install? The board isn't running code. Re-flash the firmware (bottom of page).

Test 2

Does the screen work?, Display

Needs the OLED wired (4 wires: 3V3, GND, SDA=GP0, SCL=GP1). Draws text to the screen. Install & run Display

Text on the screen? Your wiring and the screen are good. Go to Test 3.
Blank screen / error? It's the wiring, not the code. Check those four wires, especially 3V3 and GND to the breadboard rail (if power's out, the whole bus goes dark). Then reseat SDA (GP0) and SCL (GP1).

Test 3

Does WiFi work?, Webserver

No wiring. The Pico makes its own WiFi network and serves a web page. Install & run Webserver

You can join its WiFi and see the page? Everything works, load your real station, it should be fine.
"Address in use" error? A leftover socket from a previous run. Do the clean-slate ritual above (the unplug step clears it). Our current code also recovers from this on its own, reinstall to get the latest.

Deeper fixes


Wipe

Wipe the board clean (keeps the firmware)

Removes every file (old programs, leftover settings, junk from past projects) back to bare MicroPython. The reliable "make it behave" reset. Then reinstall.

In Viper: open tools/wipe.py, paste into a new file, Run. Then reinstall.
Command line:
mpremote connect <port> run tools/wipe.py
Re-flash

Re-flash the firmware (true factory reset)

The nuclear option: wipes everything, firmware included, and lays down a fresh known-good MicroPython. Use when a board is truly unresponsive, or Blink (Test 1) won't run.

  1. Hold the BOOTSEL button while plugging into USB. It appears as a drive named RP2350.
  2. Drag on the tested firmware (.uf2).
  3. The drive vanishes and the board reboots into fresh MicroPython. Reinstall your project.

Already-working board? From the >>> prompt, import machine; machine.bootloader() jumps to that drive with no button.

Note on old boards: a board set up before this guide may carry leftover compiled .mpy files that override newer code. If an update won't take even after reinstalling, Wipe it (above) and reinstall, that clears them for good. New installs are all readable source, so this won't happen going forward.

The golden rule


When in doubt, wipe and reinstall. Ten seconds of certainty beats an hour of chasing a ghost. And remember: a finished board needs only power, it runs main.py from flash every time it boots and rejoins the network on its own.