Jeśli chcesz wejść w świat elektroniki i programowania mikrokontrolerów bez kupowania sprzętu na start, świetnym rozwiązaniem jest Tinkercad Circuits (symulator Arduino w przeglądarce). Pozwala budować wirtualne układy (Arduino + diody, przyciski, rezystory, czujniki) i uruchamiać kod tak, jakby działał na prawdziwej płytce.
W tym artykule przejdziemy przez absolutne podstawy: void setup(), void loop(), opóźnienia (delay), oraz konfigurację i obsługę pinów GPIO jako wejścia i wyjścia.
Arduino + Tinkercad: o co chodzi?
Arduino to platforma do nauki i prototypowania elektroniki. Składa się z:
płytki (np. Arduino Uno),
środowiska programistycznego,
prostego języka opartego o C/C++.
Tinkercad Circuits pozwala:
złożyć układ na wirtualnej płytce stykowej,
pisać kod Arduino,
włączyć symulację i obserwować działanie (np. miganie LED, odczyt przycisku).
Struktura programu Arduino:
setup() i loop()
Każdy szkic (program) Arduino ma zwykle dwie główne funkcje:
void setup()
To część kodu, która uruchamia się raz – na starcie programu (po włączeniu zasilania lub resecie).
W setup() najczęściej:
ustawiasz tryby pinów (pinMode)
uruchamiasz komunikację szeregową (Serial.begin)
ustawiasz stan początkowy wyjść (np. gasisz diodę)
void setup() {
pinMode(13, OUTPUT); // pin 13 jako wyjście (np. LED)
Serial.begin(9600); // start komunikacji z monitorem portu
}void loop()
To pętla wykonywana w kółko – Arduino nie kończy programu, tylko ciągle powtarza loop().
W loop() zwykle:
odczytujesz czujniki i przyciski
podejmujesz decyzje (if/else)
sterujesz diodami, silnikami, buzzerem
wysyłasz dane do komputera
void loop() {
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}Efekt: LED miga co 0,5 sekundy.
Opóźnienie w Arduino: delay() i co to znaczy „blokuje” delay(ms)
Funkcja delay() wstrzymuje wykonywanie programu na określony czas w milisekundach.
delay(1000) = 1 sekunda
delay(200) = 0,2 sekundy
digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000);
Ważne: delay() jest opóźnieniem blokującym.
To znaczy: w trakcie delay() Arduino nie robi nic innego (nie odczytuje przycisków, nie reaguje na zdarzenia w kodzie, bo po prostu „czeka”).
Na początek to wygodne, ale później (przy większych projektach) przechodzi się na programowanie bezblokujące (np. millis()).
GPIO – co to jest i jak działa?
GPIO (General Purpose Input/Output) to piny mikrokontrolera, które mogą pracować jako:
wejście (INPUT) – odczytujesz stan (np. przycisk)
wyjście (OUTPUT) – ustawiasz stan (np. LED)
wejście z podciąganiem (INPUT_PULLUP) – przycisk bez dodatkowego rezystora
W Arduino konfigurujesz to funkcją:
pinMode(pin, tryb)
Przykłady trybów:
OUTPUT
INPUT
INPUT_PULLUP
Ustawianie pinu jako WYJŚCIE (OUTPUT)
Gdy pin jest wyjściem, sterujesz nim:
digitalWrite(pin, HIGH) – stan wysoki (zwykle ~5V w UNO)
digitalWrite(pin, LOW) – stan niski (0V)
Przykład – LED na pinie 13:
const int LED = 13;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, HIGH);
delay(300);
digitalWrite(LED, LOW);
delay(300);
}Odczyt pinu jako WEJŚCIE (INPUT)
Gdy pin jest wejściem, odczytujesz go:
• digitalRead(pin) – zwraca HIGH albo LOW
Przykład – przycisk na pinie 2 (z zewnętrznym rezystorem):
const int BTN = 2;
const int LED = 13;
void setup() {
pinMode(BTN, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
int state = digitalRead(BTN);
if (state == HIGH) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}INPUT_PULLUP – najprostszy przycisk bez rezystora
Arduino ma wewnętrzne rezystory podciągające.
Jeśli użyjesz:
pinMode(BTN, INPUT_PULLUP);
to:
pin domyślnie jest w stanie HIGH
po wciśnięciu przycisku (zwierasz do GND) odczytujesz LOW
To często myli na początku, bo logika jest „odwrócona”.
const int BTN = 2;
const int LED = 13;
void setup() {
pinMode(BTN, INPUT_PULLUP);
pinMode(LED, OUTPUT);
}
void loop() {
int state = digitalRead(BTN);
if (state == LOW) { // wciśnięty!
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}
W Tinkercad podłączasz przycisk: jeden styk do pinu 2, drugi do GND.
20 pytań (z odpowiedziami)
Do czego służy Tinkercad Circuits?
Odp: Do symulowania układów elektronicznych i uruchamiania kodu Arduino w przeglądarce.
Z czego składa się platforma Arduino (w uproszczeniu)?
Odp: Płytka (np. Uno), środowisko programistyczne i język oparty o C/C++.
Ile głównych funkcji ma typowy program Arduino? Jakie to funkcje?
Odp: Dwie: setup() i loop().
Kiedy wykonuje się void setup()?
Odp: Raz, na starcie programu (po włączeniu zasilania lub resecie).
Podaj 2 typowe rzeczy robione w setup().
Odp: Ustawienie trybów pinów pinMode(), uruchomienie Serial.begin(), ustawienie stanu początkowego wyjść.
Kiedy wykonuje się void loop()?
Odp: W pętli bez końca, ciągle od początku do końca funkcji.
Co robi pinMode(pin, OUTPUT)?
Odp: Ustawia dany pin jako wyjście (Arduino steruje napięciem na pinie).
Co zwraca digitalRead(pin)?
Odp: HIGH albo LOW.
Co robi digitalWrite(pin, HIGH)?
Odp: Ustawia stan wysoki na pinie (np. ~5V w Arduino Uno).
Jaka jednostka czasu jest w delay()?
Odp: Milisekundy.
Ile to delay(1000)?
Odp: 1 sekunda.
Co znaczy, że delay() jest „blokujące”?
Odp: W czasie opóźnienia program nie wykonuje innych działań (np. nie sprawdza przycisków).
Co to jest GPIO?
Odp: Piny ogólnego przeznaczenia wejścia/wyjścia mikrokontrolera.
Wymień trzy tryby pinMode() opisane w tekście.
Odp: OUTPUT, INPUT, INPUT_PULLUP.
Po co używa się INPUT_PULLUP?
Odp: Żeby użyć wewnętrznego rezystora podciągającego i podłączyć przycisk bez zewnętrznego rezystora.
Jaki jest stan pinu w INPUT_PULLUP, gdy przycisk NIE jest wciśnięty?
Odp: HIGH.
Jaki jest stan pinu w INPUT_PULLUP, gdy przycisk JEST wciśnięty (zwarty do GND)?
Odp: LOW.
Dlaczego INPUT_PULLUP bywa mylące dla początkujących?
Odp: Bo logika przycisku jest odwrócona: wciśnięty = LOW, puszczony = HIGH.
W prostym miganiu LED: co trzeba zrobić z pinem LED w setup()?
Odp: Ustawić pinMode(LED, OUTPUT).
Do czego służy Serial.begin(9600)?
Odp: Uruchamia komunikację szeregową (np. do Monitora portu) z prędkością 9600 bps.
