Repository navigation
v3.1.1 — Wi-Fi failures are diagnosed, not guessed
A small release, and it is about one thing: the radio no longer guesses why
your Wi-Fi did not connect.
The message that sent people the wrong way
Until now, every failed connection ended in "Saved password no longer
matches". The radio had no way to tell a wrong password from a network that
was out of range, a router that never handed out an address, or a connection
that simply timed out — so it named the only cause it knew.
That wording cost someone a real evening. A user upgrading from an older
version could not get online, believed the leftover files on his SD card were
to blame, deleted his program and his station list, and then began to suspect
his whole device. None of it was the password.
The driver does know the reason, but it says so exactly once, in the
disconnect event, and WiFi.status() never carries it. The radio now catches
that event and tells you which of these it was:
| On screen | What it means |
|---|---|
Wrong password for this network |
authentication or the key exchange failed |
Network not in range |
the access point was not there to answer |
No IP address from the router |
you got in, but no address came back — DHCP |
No answer from the network |
nothing happened at all within the timeout |
And it only asks you to retype the password when the password is plausibly
the problem. Being asked for a password after a DHCP failure taught you
nothing and pointed at the wrong thing.
Two defects that turned up while building it
Every password was accepted. Success was measured with WiFi.status(),
which still reports WL_CONNECTED from the running connection when you start
an attempt from the system menu — the radio is playing, after all. The check
saw that in its first pass and reported success before the attempt had begun.
A deliberately wrong password went through without a murmur. Success is now
taken from this attempt's own GOT_IP event, the driver's auto-reconnect is
held off while the attempt runs, and an existing connection is dropped and
awaited first.
A typo was saved before it was tried. Credentials went into NVS ahead of
the connection, so a mistyped password stayed in the list and the radio
quietly retried it at every start. They are now written after the connection
stands; a failed attempt leaves an existing entry untouched.
The rest
- Timeout is 15 s with a second attempt, instead of a single 9 s one. Slow
DHCP, WPA2/WPA3 transition networks and repeaters need more than nine
seconds more often than you would think. - Channel and BSSID from the scan are passed to
WiFi.begin(), so the first
attempt skips the driver's own hunt across all channels. disconnect(true, true)is gone everywhere except the explicit reset. The
second flag cleared the driver's stored network innvs.net80211— a
region every program on the device shares, not just this one.- The window for the
BtnG0Wi-Fi reset at power-on is 2.5 s instead of 1 s.
One second was not enough to read the prompt and act on it.
Carried over from the working copy: the footer now names the codec next to
the bitrate (AAC+ 96kBit), and the old L station list has been removed —
if you used L, that key does nothing now. It drew over the header and
the scale, and BtnG0 → Local list has done the same job properly since
3.0.0.
Flashing
| File | Use with |
|---|---|
Cardputer-WebRadio_v3.1.1.bin |
SD card / M5Launcher — application only |
Cardputer-WebRadio_v3.1.1_merged.bin |
M5Burner or a web flasher — complete image, write to address 0x0 |
Building from source still requires the library patches in
library-patch/ —
the https one and the AAC decoder swap. Without the second, AAC streams
reboot the device. The prebuilt images above already have both.
Nothing changed about the known limits: no https, AAC+ plays its base layer
only, and the Cardputer Adv has no PSRAM. They are explained with the measured
numbers in the README.