- Difficulty
- Beginner hardware
- Time
- 15 min
- Review baseline
- App 0.2.0 beta · firmware 0.6.0 · PBLE/1
Prerequisites
- A board-specific pinout and a powered-off circuit
Outcomes
- Check voltage, current, polarity, and common ground
- Avoid assuming pins from a generic firmware profile
- Review wiring before applying power or running code
Release-aware guidance
Compatibility
The review baseline above is not a promise about the installer currently being served. Confirm the active version, exact profile, and enabled action on the current firmware and flash page before provisioning or changing hardware.
Qualified firmwaredescribes firmware evidence. The table below describes this lesson's scope; it does not turn designed compatibility into hardware validation.
| Firmware profile | Lesson scope |
|---|---|
Classic ESP32 (4 MiB)esp32-4mb | Designed for this profile |
ESP32-S3 N16R8 · lean genericesp32-s3-n16r8 | Designed for this profile |
Waveshare ESP32-S3-LCD-1.47Bwaveshare-esp32-s3-lcd-147b | Designed for this profile |
ESP32-C3 (4 MiB)esp32-c3-4mb | Designed for this profile |
Raspberry Pi Pico 2 Wrpi-pico2-w | Designed for this profile |
This review method is designed for every profile. It intentionally provides no pin selection: generic-profile firmware and exact-board hardware identity are different claims.
Before you begin
A generic ESP profile has no carrier pin map, so there is no safe generic pin assumption. Use exact carrier documentation and component datasheets. The exact Pico 2 W and Waveshare B-version profiles expose only the documented onboard surfaces named in their own lessons.
Runtime identity is a starting point, not a pin map
The maintained physical-session record associates these five Ready sessions with the prepared boards. The app observations verify a connection and runtime family; they do not authorize pins, wiring, or a provisioning profile.
PyBLE-5646 Generic ESP32-S3 · N16R8
Ready observation
Runtime token ·esp32-s3
Maintained physical-session record: generic ESP32-S3. The shared runtime token does not identify a carrier or provisioning profile.
PyBLE-8C9E Generic ESP32 · 4 MiB
Ready observation
Runtime token ·esp32
Maintained physical-session record: classic ESP32. The app observation does not prove flash capacity or a carrier pinout.
PyBLE-C81A Generic ESP32-C3 · 4 MiB
Ready observation
Runtime token ·esp32-c3
Maintained physical-session record: ESP32-C3. Revision, flash capacity, and pin choices still come from the physical board record and exact documentation.
PyBLE-DA86 Waveshare ESP32-S3-LCD-1.47B
Ready observation
Runtime token ·esp32-s3
Maintained physical-session record: exact Waveshare B-version. Its esp32-s3 token alone does not prove this carrier or its firmware profile.
PyBLE-3DCB Raspberry Pi Pico 2 W
Ready observation
Runtime token ·rpi-pico2-w
Maintained physical-session record: exact Pico 2 W. Keep the physical marking and UF2 installer record as the profile evidence.
Classify before you connect
- Portable code
Uses no carrier pin, fixed peripheral, or exact-board assumption.
- Configured capability
Requires your reviewed pin choices, electrical limits, and wiring.
- Exact board
Names one carrier, its matching firmware image, and fixed onboard surface.
Three compatibility classes
- Portable
- Console, language, data, workflow, or filesystem code with no pin or external-peripheral assumption.
- Configured capability
- GPIO, ADC, PWM, I2C, SPI, or NeoPixel behavior whose pins and circuit must be supplied from exact documentation.
- Exact board
- A named carrier surface such as Pico 2 W
Pin("LED")or Waveshare LCD wiring; another carrier with the same MCU is outside that claim.
What PyBLE does not decide for you
Firmware qualification does not prove your circuit, chosen pin, peripheral voltage, power source, component current, resistor value, pull configuration, or bus wiring. Example design metadata is also not HIL evidence. The safe path is documentation, calculation, cold wiring, inspection, a bounded first effect, Stop, and cleanup.
Follow in order
Tutorial steps
Power off and identify every exact part
Disconnect board and peripheral power. Record the full board/carrier name and revision, component part number, supply voltage, signal voltage, and intended connection. Open the exact carrier documentation and each component datasheet—not a pinout for a similar board.
Stop if: a suffix, board revision, component marking, voltage domain, or pin label is unknown.
Classify the code before choosing pins
Decide whether the example is portable, capability-configured, or exact-board-only. Portable code assumes no physical peripheral. Capability code requires your explicit pins and circuit. Exact-board code applies only to the named carrier revision.
Expected: you can name the example class and explain why your exact hardware is or is not in its designed scope.
Build a pin and conflict worksheet
For each signal, copy the physical header location, GPIO or exact MicroPython pin name, mode, pull state, voltage capability, and shared peripheral use from the exact documentation. Check input-only pins, boot/strapping pins, flash or PSRAM connections, and pins already used by displays, USB, radio, or another device.
Stop if: a selected pin is reserved, input-only for an output role, a boot/strapping risk, or shared in an incompatible way.
Review the electrical path
Confirm supply and logic voltage, maximum source/sink current, polarity, component power demand, shared ground, current-limiting resistor or other required protection, and any level shifting or separate supply. Account for startup states before user code configures a pin.
Stop if: a voltage or current limit is exceeded, grounds cannot be shared safely, or required resistor, protection, or level conversion is missing.
Bound the program before execution
Read the complete source. Identify its maximum loop count or duration, highest output level, expected physical effect, Console progress, Stop behavior, exception behavior, and final cleanup state. Replace an unbounded effect with a finite test before first power-up.
Expected: you can state the bounded effect, when to press Stop, and the exact cleanup that returns outputs and power to a safe state.
Wire cold, inspect, then power
With all power removed, make the reviewed connections. Trace every wire from source to destination against the worksheet, check polarity and protection again, remove loose conductors, then apply power while ready to disconnect it.
Stop if: the powered board resets, heats, smells unusual, draws unexpected current, or a component behaves before Run.
Run once, observe, Stop, and clean up
Verify connected identity, choose Run explicitly, and compare the bounded physical and Console observations with the plan. Press Stop on any mismatch. When the test ends, drive outputs to their safe state when possible, disconnect peripheral power, then remove wiring.
Expected: the finite effect matches the plan and the circuit finishes powered down in the documented cleanup state.
Need recovery help?
Stop at the current step, record the exact profile, board identity, app and firmware versions, and the first useful error. Then use the PyBLE support and recovery guide.