┌──(admin㉿rtembedded.dev)-[~/blog]
$ cat ~/blog/2026-11-02-esp32-linux-vscode-start-2026.md

ESP32 + Linux + VS Code — jak zacząć zabawę, czyli migamy! (edycja 2026)

Ten wpis to uwspółcześniona wersja mojego tutoriala z 2020 roku (oryginał na forum.lothar-team.pl). Przez 5 lat zmieniło się praktycznie wszystko — i to na lepsze. Kiedyś trzeba było ręcznie klonować repo, pilnować submodułów i wklejać kilometrowe ścieżki do .bashrc. Dziś całość stawia się w kilkanaście minut, a Python 2.7 odszedł (na szczęście) w niepamięć.

Co się zmieniło od 2020?

Było (ESP-IDF v4.1, 2020) Jest (ESP-IDF v6.x, 2026)
ręczne git clone --recursive + checkout release instalator EIM robi wszystko sam
install.sh + ręczne dopisywanie PATH do .bashrc jedna komenda aktywująca środowisko
Python 2.7 (już wtedy martwy) Python ≥ 3.10
make, make flash idf.py build, idf.py flash monitor
VS Code = goły edytor + wtyczki C/C++ i CMake oficjalne rozszerzenie ESP-IDF (build/flash/monitor/menuconfig z poziomu edytora)
tylko ESP32 ESP32, S2, S3, C3, C6, H2, P4...

1. Instalacja ESP-IDF przez EIM

Espressif ma teraz oficjalny instalator: ESP-IDF Installation Manager (EIM). Na Ubuntu/Debianie dodajemy repozytorium APT i instalujemy:

echo "deb [trusted=yes] https://dl.espressif.com/dl/eim/apt/ stable main" | sudo tee /etc/apt/sources.list.d/espressif.list
sudo apt update
sudo apt install eim        # GUI + CLI (albo: eim-cli, jeśli wolisz sam terminal)

Następnie instalujemy najnowszą stabilną wersję ESP-IDF (w chwili pisania: v6.1):

eim install

I to naprawdę wszystko. EIM pobierze ESP-IDF, toolchain (kompilator, OpenOCD, esptool), postawi środowisko Pythona i skonfiguruje ścieżki. Żadnego grzebania w .bashrc, żadnego kopiowania kilometrowego PATH jak 5 lat temu 😉

Jeśli chcesz wybrać konkretną wersję IDF albo ścieżkę instalacji, odpal interaktywny kreator:

eim wizard

2. Aktywacja środowiska

Po instalacji EIM wypisze ścieżkę do skryptu aktywacyjnego. Środowisko aktywujemy w terminalu:

source ~/.espressif/activate_idf_v6.1.sh

Warto dodać sobie alias do ~/.bashrc (to jedyna rzecz, jaką dziś dopisujemy do basha!):

alias idf='source ~/.espressif/activate_idf_v6.1.sh'

Od teraz wpisanie idf w terminalu daje nam dostęp do idf.py i całego toolchaina.

3. Uprawnienia do portu szeregowego

To się akurat nie zmieniło — user musi należeć do grupy dialout, żeby esptool mógł gadać z płytką po /dev/ttyUSB0:

sudo usermod -aG dialout $USER

Po tym trzeba się wylogować i zalogować ponownie (albo zrestartować system).

4. VS Code — teraz z prawdziwym wsparciem

W 2020 pisałem, że "nie ma IDE, po prostu edytujemy pliki". To już nieaktualne. Espressif rozwija oficjalne rozszerzenie ESP-IDF dla VS Code:

  1. Otwórz VS Code → Extensions (Ctrl+Shift+X)
  2. Zainstaluj ESP-IDF (wydawca: Espressif Systems)
  3. F1 → ESP-IDF: Configure ESP-IDF Extension → wskaż istniejącą instalację z EIM

Dostajemy: budowanie/flashowanie/monitor jednym kliknięciem z paska na dole, graficzny menuconfig, debugowanie przez OpenOCD i poprawnie skonfigurowany IntelliSense bez ręcznej zabawy w c_cpp_properties.json.

5. No to migamy! 🚨

Tworzymy projekt z przykładu (już nie kopiujemy ręcznie folderów z repo):

idf.py create-project-from-example "espressif/led_strip:blink"
# albo klasycznie, z przykładów IDF:
cp -r $IDF_PATH/examples/get-started/blink ~/projekty/blink && cd ~/projekty/blink

Ustawiamy target (nowość — jeden framework obsługuje całą rodzinę chipów):

idf.py set-target esp32      # albo esp32s3, esp32c3, esp32c6...

Numer pinu LED ustawiamy teraz w menuconfig (sekcja Example Configuration), a nie w kodzie:

idf.py menuconfig

Sam kod też się zmienił. Nowe devkity mają adresowalną diodę RGB (WS2812), więc przykład obsługuje oba warianty. Wersja dla zwykłej diody na GPIO:

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "sdkconfig.h"

static const char *TAG = "example";

#define BLINK_GPIO CONFIG_BLINK_GPIO

static uint8_t s_led_state = 0;

static void configure_led(void)
{
    ESP_LOGI(TAG, "Example configured to blink GPIO LED!");
    gpio_reset_pin(BLINK_GPIO);
    gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
}

void app_main(void)
{
    configure_led();

    while (1) {
        ESP_LOGI(TAG, "Turning the LED %s!", s_led_state ? "ON" : "OFF");
        gpio_set_level(BLINK_GPIO, s_led_state);
        s_led_state = !s_led_state;
        vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
    }
}

Ciekawostki vs 2020:

  • gpio_pad_select_gpio() → gpio_reset_pin() (stare API wyleciało),
  • zamiast printf używamy ESP_LOGI — logi mają poziomy, tagi i kolory w monitorze,
  • okres migania (CONFIG_BLINK_PERIOD) też konfigurujemy w menuconfig.

Budujemy, wgrywamy i podglądamy logi jedną komendą:

idf.py -p /dev/ttyUSB0 flash monitor
I (315) example: Example configured to blink GPIO LED!
I (325) example: Turning the LED ON!
I (1325) example: Turning the LED OFF!
I (2325) example: Turning the LED ON!

Z monitora wychodzimy przez Ctrl+].

Podsumowanie

Postawienie środowiska ESP32 w 2026 to zupełnie inna bajka niż 5 lat temu: 3 komendy na instalację, 1 na aktywację — i migamy. Espressif odrobił lekcję z developer experience, a ESP-IDF to dziś jeden z przyjemniejszych ekosystemów embedded do pracy pod Linuksem.

Dioda miga, logi lecą — można zaczynać prawdziwą zabawę. 🎉

← cd ~/blog