PlatformIO – pierwszy projekt Arduino

maj 25, 2026 | Arduino

Skoro mamy już zainstalowane środowisko Visual Studio Code z rozszerzeniem PlatformIO, możemy przejść do kolejnego etapu. Jesteśmy gotowi, aby przystąpić do utworzenia pierwszego projektu, wybierając odpowiedni model płytki oraz framework.

Zacznijmy od tej niezwykle popularnej płytki
ESP32 DevKit V1.

Strona początkowa platformIO

W tym celu przechodzimy do zakładki PlatformIO znajdującej się na pasku bocznym środowiska i otwieramy stronę główną narzędzia, wybierając polecenie PIO Home (Open).

Tam klikamy przycisk „New Project”, co spowoduje wyświetlenie nowego okna konfiguracyjnego. To właśnie w nim będziemy mogli dokonać kluczowych wyborów, takich jak wskazanie odpowiedniego środowiska pracy oraz konkretnego modelu płytki, na którą zamierzamy napisać i wgrać nasz program.

W polu oznaczonym jako Name wpisujemy unikalną nazwę naszego projektu, która pozwoli nam go łatwo rozpoznać w przyszłości. Następnie, w polu Board, wpisujemy przynajmniej część nazwy płytki rozwojowej, na którą zamierzamy napisać program. System automatycznie przefiltruje dostępne urządzenia, a we wskazanym miejscu pojawi się lista wyników, z której musimy wskazać i wybrać dokładnie ten konkretny model, który nas w danym momencie interesuje.

W następnym kroku wybieramy odpowiedni framework dla naszego projektu. W tym przypadku będzie to „Arduino„, co pozwoli nam na korzystanie z jego standardowych bibliotek oraz funkcji.

TIP: Aby sprawdzić, w którym folderze zostanie stworzony nasz projekt, wystarczy najechać kursorem na znak zapytania obok pola „Location”. Nic nie stoi na przeszkodzie, by wybrać zupełnie inne miejsce na dysku.

Po kliknięciu przycisku „Finish” nastąpi utworzenie katalogu z projektem.

Struktura projektu

Po pomyślnym utworzeniu i zainicjowaniu nowego projektu, interfejs aplikacji załaduje się, a nasze główne okno będzie wyglądać w następujący sposób.

W folderze projektu powstaną wymagane pliki oraz podkatalogi. Przyjrzyjmy się im po kolei.

  • platformio.ini – to jest podstawowy plik konfiguracji projektu. W tym pliku znajduje się to co wybraliśmy podczas tworzenia projeku. W tym pliku będziemy potem mogli dodawac kolejne płytki, biblioteki, dyrektywy kompilatora i inne szczególne ustawienia. Na podstawie tego pliku platformio wie jak zbudowac projekt.
  • src/ – katalog, w którym umieścimy nasze pliki źródłowe (.c, lub .cpp)
  • include/ – katalog w którym umieścimy pliki nagłówkowe (.h lub .hpp)
  • lib/ – katalog, w którym możemy umieścić zewnętrzne biblioteki,
  • test/ – katalog, w którym umieścimy testy jednostkowe
  • src/main.cpp – główny plik źródłowy, który zawiera funkcje setup() oraz loop(),
  • .pio/ – katalog roboczy, w który przechowywane są pliki tymczasowe i wynikowe
  • .vscode/ – katalog, który zawiera pliki konfiguracyjne edytora, aby lepiej działało podpowiadanie składni itp.
  • .gitignore – plik, który informuje system kontroli GIT, o tym, które pliki można wersjonować, a ktorych nie nalezy.

Plik main.cpp oraz funkcje setup() i loop()

Po utworzeniu projektu plik main.cpp będzie w uproszeczniu wyglądał tak

C++
#include <Arduino.h>

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}

Na samym wstępie zauważamy dołączenie pliku nagłówkowego „Arduino.h”. To on zapewnia nam dostęp do wszystkich podstawowych funkcji wchodzących w skład frameworka Arduino.

Funkcje setup() oraz loop() mają szczególne znaczenie, ponieważ to od nich zaczyna sie wykonywanie naszego kodu. Różnica między nimi jest taka, że setup() jest wywoływana jako pierwsza i jest wywoływana tylko raz. Jej zadaniem jest zainicjowanie wszystkich komponentów i urządzeń, które chcemy używac w trakcie wykonywania programu. Funkcja loop() natomiast jest funkcją głównej pętli. Wszystkie instrukcje w niej zawarte będą powtarzane w kółko, w nieskończoność, do czasu aż nie odłczymy zasilania płytki.

Budowanie projektu i wgrywanie na płytkę

Pomimo że projekt jest na razie pusty, już teraz powinno być możliwe jego zbudowanie i wgranie na płytkę.

aby zbudować projekt mamy kilka możliwości, kombinacja klawiszy Ctrl + Alt + B, pozycja „Build” w project tasks lub ikonka „ptaszka” w pasku na dole (zaznaczone na czerowono)

wgrywanie na płytkę wygląda podobnie, tu jest kombinacja klawiszy Ctrl + Alt + U lub odpowiednio „Upload” w project tasks lub „strzałka” w pasku na dole.

Jak wyraźnie widzimy na powyższym przykładzie, nawet niemal całkowicie pusty projekt, zawierający tylko niezbędne minimum kodu, można bez problemu skompilować i pomyślnie wgrać na płytkę rozwojową.

Driver do naszej płytki w systemie Windows

W niektórych sytuacjach może się zdarzyć, że system operacyjny nie będzie w stanie poprawnie zidentyfikować podłączonej płytki, co sprawi, że podczas próby wgrywania programu otrzymamy komunikat o błędzie.

Taka sytuacja wynika zazwyczaj z poniższych powodów.

1. Wybraliśmy nieodpowiedni port COM, pod którym widoczna jest płytka. Może się tak zdarzyć, gdy do komputera mamy podłączonych więcej niż jedno urzadzenie. W PlatformIO port możemy wybrać lub zmienić na kilka sposobów

  • w dolnej belce
  • w pliku platformio.ini dyrektywą upload_port

2. Nie mamy zainstalowanego odpowiedniego sterownika w systemie. Aby go więc zainstalować postępuj zgodnie z instrukcją z tego artykułu https://rt-pro.pl/blog/arduino/instalacja-sterownikow-do-plytki-arduino

3. W przypadku korzystania z systemu Linux, możemy napotkać brak dostępu do urządzenia portu. Problem ten łatwo naprawić, stosując się do poradnika pod adresem https://rt-pro.pl/blog/arduino/esp32-i-arduino-na-linuksie-jak-naprawic-uprawnienia-do-portu-szeregowego

Pierwszy program – Blink czyli miganie diodą

Aby nie przeładować tego poradnika, przygotujemy najbardziej klasyczny program dla Arduino, jaki można sobie wyobrazić: miganie diodą podpiętą do kontrolera. Sporo płytek posiada przynajmniej jedną diodę, którą da się sterować programowo. Zatem zacznijmy.

C++
#include <Arduino.h>

static constexpr int LED_PIN = 2;

void setup()
{
  pinMode(LED_PIN, OUTPUT);
}

void loop()
{
  digitalWrite(LED_PIN, HIGH);
  delay(500);
  digitalWrite(LED_PIN, LOW);
  delay(500);
}

Poniżej znajduje się szczegółowe omówienie działania programu.

Na samym początku definiujemy zmienną LED_PIN, która pozwala nam w czytelny sposób ustalić, do której nóżki mikrokontrolera zostanie podłączony sygnał sterujący diodą LED. Zastosowanie zmiennej zamiast wpisywania numeru pinu bezpośrednio w kodzie ułatwia późniejsze modyfikacje projektu. Następnie funkcja pinMode() ustala tryb pracy wybranego pinu: parametr OUTPUT konfiguruje go jako wyjście sterujące, podczas gdy INPUT służyłby do odczytu sygnałów wejściowych. Funkcję tę umieszczamy w bloku setup(), ponieważ taką konfigurację wystarczy wykonać tylko jeden raz przy uruchomieniu urządzenia.

Po zakończeniu funkcji setup(), Arduino zaczyna cyklicznie powtarzać funkcję loop(), która w tym przykładzie składa się z czterech kluczowych fragmentów:

  1. Pierwsza z nich to digitalWrite(), która służy do ustawienia stanu logicznego pinu. Przekazanie parametru HIGH oznacza podanie napięcia, co skutkuje zapaleniem diody.
  2. Następnie wywoływana jest funkcja delay(), która wstrzymuje działanie programu na określoną liczbę milisekund. W tym przypadku wartość 500 sprawia, że mikrokontroler „czeka” przez 0,5 sekundy.
  3. Teraz ponownie korzystamy z instrukcji digitalWrite(), lecz tym razem ustawiamy stan LOW, czyli stan niski, co powoduje odcięcie zasilania i zgaśnięcie diody.
  4. Na samym końcu pętli ponownie odczekujemy 0,5 sekundy za pomocą delay(), aby dioda pozostała wyłączona przed rozpoczęciem kolejnego cyklu świecenia.

To w zasadzie cała idea stojąca za tym nieskomplikowanym programem. Jako doskonałe ćwiczenie sugeruję modyfikowanie wartości w funkcji delay, co pozwoli zaobserwować reakcję diody na wydłużanie lub skracanie przerw. Innym sposobem na naukę jest kopiowanie bloków wewnątrz loop(), by stworzyć bardziej rozbudowane cykle świecenia. Ambitniejszym osobom polecam takie zaprogramowanie sekwencji, by dioda nadawała sygnał SOS alfabetem Morse’a.

Podsumowanie

Gratulacje! Właśnie poznałeś absolutny fundament programowania mikrokontrolerów. Choć cykliczne mruganie diodą LED może wydawać się prostym ćwiczeniem, to właśnie na tej logice opierają się najbardziej zaawansowane projekty automatyki. Zrozumienie, jak konfigurować piny za pomocą pinMode() oraz jak kontrolować stany napięć poprzez digitalWrite() i delay(), otwiera przed Tobą drzwi do świata elektroniki i Internetu Rzeczy (IoT).

Nie zatrzymuj się jednak na samym czytaniu! Najlepszym sposobem na naukę jest praktyka. Wykorzystaj wskazówki z artykułu. A kolejne materiały pojawią się już wkrótce.

ESP32 i Arduino na Linuksie – Jak naprawić uprawnienia do portu szeregowego

ESP32 i Arduino na Linuksie – Jak naprawić uprawnienia do portu szeregowego

Korzystanie z ESP32 i Arduino na Linuxie jest bardzo wygodne, ale często napotyka problem z dostępem do portu szeregowego. Jeśli PlatformIO lub Arduino IDE wyświetla błąd Permission denied, prawdopodobnie musisz dodać swojego użytkownika do grupy dialout. Dowiedz się, jak szybko nadać odpowiednie uprawnienia za pomocą terminala, aby bez przeszkód programować mikrokontrolery w systemie Linux.

czytaj dalej