Dasar · 14 mnt baca

Daftar Perintah Arduino: Sintaks, Contoh, dan Kesalahan Umum

Penjelasan perintah Arduino: pinMode, digitalWrite, analogRead, analogWrite, millis, Serial, map, tone, pulseIn, dan attachInterrupt beserta contoh dan jebakannya.

Perintah Arduino adalah fungsi siap pakai yang memberi tahu board apa yang harus dilakukan: pinMode() menjadikan pin sebagai output, digitalWrite() menyalakan LED, analogRead() membaca sensor, dan Serial.println() mengirim pesan ke komputermu. Kebanyakan sketch Arduino sebenarnya hanya sekitar dua puluh perintah dasar yang digabung dengan cara berbeda. Begitu kamu memahami perintah-perintah ini dan artinya, kamu bisa membaca kode apa pun yang kamu temui, dari LED berkedip sampai mobil robot, dan menulis proyekmu sendiri dari nol.

Di panduan ini kami mengelompokkan perintah Arduino yang paling sering dipakai menjadi empat kategori: input/output, waktu, matematika, dan komunikasi. Untuk setiap perintah kamu akan menemukan sintaksnya, arti parameternya, contoh singkat yang bisa dikompilasi dan dijalankan di Arduino Uno, dan kesalahan yang paling sering dilakukan pemula. Di bagian terakhir kita juga akan melihat bagaimana perintah yang sama berperilaku berbeda di ESP32 dan apa padanan MicroPython-nya di Raspberry Pi Pico.

Board Arduino Uno dengan pin digital dan analognya
Arduino Uno: pin digital 0–13, input analog A0–A5, dan pin PWM bertanda ~ sudah cukup untuk mencoba setiap perintah di artikel ini.

Apa itu perintah Arduino, dan bagaimana sketch berjalan?

Kode Arduino dibangun di atas C/C++; kebanyakan yang kita sebut “perintah” sebenarnya adalah fungsi yang disediakan core Arduino untukmu. Sebuah fungsi menerima parameter di dalam kurung (misalnya nomor pin dan sebuah nilai), dan sebagian mengembalikan hasil: digitalRead() memberimu keadaan pin, millis() waktu yang sudah berlalu. Setiap sketch Arduino punya dua fungsi wajib: setup() hanya berjalan sekali ketika board menyala atau di-reset, dan loop() setelah itu berulang selamanya. Persiapan seperti pengaturan pin dan Serial.begin() masuk ke setup(), dan pekerjaan yang harus terus berlangsung masuk ke loop().

C++ (Arduino IDE)
1// Her Arduino programı bu iki fonksiyondan oluşur / Every Arduino sketch has these two functions
2void setup() {
3  // Açılışta ya da resetten sonra bir kez çalışır / Runs once at power-up or after reset
4  pinMode(13, OUTPUT);      // dahili LED pini çıkış / built-in LED pin as output
5}
6
7void loop() {
8  // Sonsuza kadar tekrar eder / Repeats forever
9  digitalWrite(13, HIGH);   // LED'i yak / turn the LED on
10  delay(500);               // 500 ms bekle / wait 500 ms
11  digitalWrite(13, LOW);    // LED'i söndür / turn the LED off
12  delay(500);
13}

Mengingat tiga aturan sejak awal menyelamatkanmu dari banyak error kompilasi: perintah membedakan huruf besar dan kecil (jika kamu mengetik digitalwrite kamu mendapat error “'digitalwrite' was not declared in this scope”), setiap pernyataan diakhiri titik koma, dan teks ditulis di dalam tanda kutip ganda sedangkan karakter tunggal di dalam tanda kutip tunggal. Untuk tipe variabel dan struktur seperti if dan for, lihat dasar-dasar pemrograman Arduino.

Daftar perintah Arduino: tabel per kategori

Empat tabel di bawah merangkum hampir semua perintah yang akan kamu pakai di proyek sehari-hari. Kelompok pertama adalah perintah input/output; perintah ini menentukan peran pin, memberi tegangan padanya, atau membaca nilai darinya. Kamu bisa melihat nomor pin board-mu di alat Pinout.

PerintahSintaksFungsinyaContoh
pinModepinMode(pin, mode)Menjadikan pin sebagai input atau outputpinMode(13, OUTPUT);
digitalWritedigitalWrite(pin, value)Mengatur pin menjadi HIGH (5 V) atau LOW (0 V)digitalWrite(13, HIGH);
digitalReaddigitalRead(pin)Membaca apakah pin HIGH atau LOWint b = digitalRead(2);
analogReadanalogRead(pin)Mengubah tegangan 0–5 V menjadi angka dari 0 sampai 1023int v = analogRead(A0);
analogWriteanalogWrite(pin, value)Menghasilkan sinyal PWM dari 0 sampai 255analogWrite(9, 128);
analogReferenceanalogReference(type)Memilih tegangan referensi untuk analogReadanalogReference(INTERNAL);
tone / noTonetone(pin, frequency, duration) (pin, frekuensi, durasi)Membuat suara dengan gelombang kotak; noTone menghentikannyatone(8, 440, 500);
pulseInpulseIn(pin, value, timeout) (pin, nilai, batas waktu)Mengukur panjang pulsa dalam µspulseIn(10, HIGH, 30000);
shiftOutshiftOut(dataPin, clockPin, order, byte)Mengirim satu byte bit demi bit (mis. ke 74HC595)shiftOut(11, 12, MSBFIRST, 255);
attachInterruptattachInterrupt(interrupt, function, mode) (interupsi, fungsi, mode)Memanggil fungsi tepat ketika pin berubahattachInterrupt(digitalPinToInterrupt(2), say, FALLING);

Kelompok kedua adalah perintah waktu. Memahami perbedaan antara delay(), yang menunggu, dengan millis() dan micros(), yang mengukur waktu, adalah kunci untuk menulis sketch yang berjalan lancar.

PerintahSintaksFungsinyaPerhatikan
delaydelay(ms)Menunggu selama sekian milidetikProgram berhenti selama waktu ini
delayMicrosecondsdelayMicroseconds(us)Menunggu selama sekian mikrodetikAkurat antara 3 dan 16383 µs
millismillis()Mengembalikan milidetik sejak board menyalaunsigned long; kembali ke nol setelah sekitar 49,7 hari
microsmicros()Mengembalikan mikrodetik sejak board menyalaLangkah 4 µs di Uno, kembali ke nol setelah sekitar 70 menit

Kelompok ketiga adalah perintah matematika; kamu memakainya untuk mengubah pembacaan sensor ke rentang lain, membatasinya, atau menghasilkan angka acak. Kelompok keempat, perintah komunikasi, memungkinkan board bertukar data dengan komputermu dan perangkat lain.

PerintahSintaksFungsinyaContoh hasil
mapmap(x, fromLow, fromHigh, toLow, toHigh)Menskalakan satu rentang ke rentang lainmap(512, 0, 1023, 0, 255) → 127
constrainconstrain(x, low, high) (nilai, batas bawah, batas atas)Menjaga nilai tetap di antara dua batasconstrain(300, 0, 255) → 255
min / maxmin(a, b) / max(a, b)Mengembalikan nilai yang lebih kecil atau lebih besarmin(7, 3) → 3
absabs(x)Nilai mutlakabs(-12) → 12
pow / sqrt / sqpow(base, exponent), sqrt(x), sq(x) (pangkat, akar, kuadrat)Pangkat, akar kuadrat, kuadratpow(2, 10) → 1024.0
randomrandom(min, max) (minimum, maksimum)Bilangan bulat acak (max tidak termasuk)random(1, 7) → 1 sampai 6
randomSeedrandomSeed(seed)Mengubah titik awal deret acakrandomSeed(analogRead(A3));
PerintahFungsinyaContoh
Serial.begin(speed)Membuka port serial dengan baud rate tertentuSerial.begin(9600);
Serial.print(data)Mencetak data dan tetap di baris yang samaSerial.print(temperature);
Serial.println(data)Mencetak data lalu pindah ke baris baruSerial.println("Hello");
Serial.available()Mengembalikan jumlah byte yang menunggu dibacaif (Serial.available() > 0)
Serial.read()Membaca satu byte, mengembalikan -1 jika tidak ada datachar c = Serial.read();
Serial.readStringUntil(c)Membaca teks sampai karakter tertentuString s = Serial.readStringUntil('\n');
Serial.parseInt()Mengambil bilangan bulat dari teks yang masukint n = Serial.parseInt();
Serial.write(byte)Mengirim byte mentahSerial.write(65); // 'A'
Wire.begin()Memulai bus I2C (Wire.h)Wire.begin();
SPI.begin()Memulai bus SPI (SPI.h)SPI.begin();

pinMode(): menentukan peran pin

pinMode(pin, mode) memberi tahu board apakah sebuah pin digital adalah input atau output, dan biasanya kamu menulisnya sekali di setup(). Ada tiga mode: OUTPUT menjadikan pin sebagai output (untuk mengendalikan LED, buzzer, atau relay), INPUT menjadikannya input berimpedansi tinggi (untuk rangkaian dengan resistor pull-up atau pull-down eksternal), dan INPUT_PULLUP menjadikannya input dan menyambungkan resistor internal sekitar 20–50 kΩ ke 5 V. Pin analog (A0–A5) juga bisa dipakai sebagai pin digital dengan pinMode; misalnya, pinMode(A0, OUTPUT) adalah perintah yang valid.

Jika kamu lupa pinMode(pin, OUTPUT) dan memakai digitalWrite(pin, HIGH), pin tidak menjadi output; di Uno perintah itu hanya menyalakan resistor pull-up internal. LED menyala, tapi terlihat sangat redup karena arusnya harus lewat resistor 20–50 kΩ. Jika LED-mu redup, tempat pertama yang perlu dicek adalah baris pinMode di setup().

digitalWrite() dan digitalRead(): output dan input digital

digitalWrite(pin, HIGH) menarik pin output ke 5 V di Uno, dan digitalWrite(pin, LOW) menariknya ke 0 V. Menarik sampai 20 mA dari satu pin itu aman (maksimum mutlaknya 40 mA); selalu sambungkan LED dengan resistor, dan kamu bisa mencari nilai yang tepat dengan kalkulator resistor LED. digitalRead(pin) melihat tegangan di pin dan mengembalikan HIGH atau LOW; di Uno, kira-kira apa pun di atas 3 V dihitung HIGH dan apa pun di bawah 1,5 V dihitung LOW. Di contoh di bawah, LED bawaan menyala ketika kamu menekan tombol yang tersambung ke D2:

C++ (Arduino IDE)
1const int BUTON_PIN = 2;   // buton: bir ucu D2, diğer ucu GND / button: one leg to D2, the other to GND
2const int LED_PIN = 13;    // dahili LED / built-in LED
3
4void setup() {
5  pinMode(BUTON_PIN, INPUT_PULLUP);   // dahili pull-up direnci açık / internal pull-up resistor enabled
6  pinMode(LED_PIN, OUTPUT);
7}
8
9void loop() {
10  int durum = digitalRead(BUTON_PIN); // HIGH ya da LOW döner / returns HIGH or LOW
11  if (durum == LOW) {                 // pull-up ile basılı = LOW / with pull-up, pressed = LOW
12    digitalWrite(LED_PIN, HIGH);
13  } else {
14    digitalWrite(LED_PIN, LOW);
15  }
16}

Dengan INPUT_PULLUP logikanya terbalik: ketika tombol dilepas pin terbaca HIGH berkat resistor internal, dan ketika ditekan terbaca LOW karena tersambung ke GND. Jika kamu menyambungkan tombol tanpa resistor dalam mode INPUT, pin mengambang dan digitalRead() mengembalikan nilai acak; bahkan mendekatkan tangan bisa mengubah hasilnya. Untuk pantulan tombol dan cara yang benar menyambungkan tombol, lihat Cara Menghubungkan Push Button ke Arduino.

analogRead() dan analogWrite(): input analog dan PWM

analogRead(pin) memakai konverter 10 bit (ADC) untuk mengubah tegangan antara 0 dan 5 V di pin A0–A5 menjadi angka dari 0 sampai 1023. Satu pembacaan butuh sekitar 100 µs, jadi kamu bisa mengambil kira-kira 10.000 pembacaan per detik. Untuk mengubah angka menjadi tegangan kamu memakai value × 5.0 / 1023; pembacaan 512, misalnya, berarti sekitar 2,5 V. Tegangan referensi bisa diubah dengan analogReference(): opsi INTERNAL memakai referensi internal 1,1 V milik Uno dan meningkatkan resolusi untuk tegangan kecil. Kamu akan menemukan detail tentang resolusi dan referensi di ADC dan konversi analog ke digital.

Walaupun namanya begitu, analogWrite(pin, value) tidak menghasilkan tegangan analog sungguhan. Perintah ini menyalakan dan mematikan pin dengan sangat cepat untuk membuat sinyal PWM: 0 berarti selalu mati, 255 selalu menyala, dan 127 kira-kira setengah menyala. Rata-rata itulah yang membuat LED terlihat setengah terang di mata kita dan motor berputar pelan. Di Uno hanya pin 3, 5, 6, 9, 10, dan 11, yang bertanda ~ di board, yang menyediakan PWM; frekuensinya 490 Hz di kebanyakan pin dan 980 Hz di pin 5 dan 6. analogWrite() mengatur pin sebagai output sendiri, jadi pinMode tidak wajib. Kode di bawah mengatur kecerahan LED dengan potensiometer dan mencetak pembacaan beserta tegangannya ke Serial Monitor; untuk detail duty cycle dan frekuensi, lihat Apa Itu PWM?.

C++ (Arduino IDE)
1const int POT_PIN = A0;   // potansiyometrenin orta bacağı / potentiometer wiper
2const int LED_PIN = 9;    // ~9 PWM pini + 220 ohm direnç / ~9 PWM pin + 220 ohm resistor
3
4void setup() {
5  Serial.begin(9600);
6}
7
8void loop() {
9  int ham = analogRead(POT_PIN);         // 0-1023 arası / between 0 and 1023
10  float volt = ham * (5.0 / 1023.0);     // sayıyı gerilime çevir / convert the reading to volts
11  analogWrite(LED_PIN, ham / 4);         // 0-1023 -> 0-255 PWM parlaklığı / 0-1023 -> 0-255 PWM brightness
12
13  Serial.print(F("Ham / raw: "));
14  Serial.print(ham);
15  Serial.print(F("  Gerilim / voltage: "));
16  Serial.print(volt, 2);                 // 2 ondalık basamak / 2 decimal places
17  Serial.println(F(" V"));
18  delay(200);
19}
Di pin tanpa PWM, analogWrite() tidak bisa menghasilkan nilai di tengah-tengah: perintah ini mengatur pin menjadi LOW untuk nilai di bawah 128 dan HIGH untuk 128 ke atas. Pin A0–A5 Uno juga tidak menyediakan PWM, dan Uno R3 klasik tidak punya output analog sungguhan (DAC); menulis analogWrite(A0, 100) tidak akan memberimu 2 V. Jika kamu butuh tegangan analog sungguhan, pakai board dengan DAC (seperti Uno R4, yang punya DAC di A0) atau tambahkan filter RC ke output PWM.

delay(), millis(), dan micros(): perintah waktu

delay(ms) menunggu selama sekian milidetik, dan selama waktu itu tidak ada baris lain di loop() yang berjalan; delay(1000) adalah jeda penuh satu detik. Untuk jeda singkat dalam orde mikrodetik ada delayMicroseconds(), yang akurat antara 3 dan 16383 µs. millis(), sebaliknya, tidak menunggu; perintah ini mengembalikan waktu sejak board mulai, dalam milidetik. Selalu simpan hasilnya di variabel unsigned long: jika kamu memakai int, di Uno nilainya meluap begitu melewati 32.767, setelah sekitar 33 detik, dan pengaturan waktumu rusak. millis() kembali ke nol kira-kira setiap 49,7 hari; cara pengurangan di bawah tetap bekerja dengan benar bahkan ketika melewati titik itu.

C++ (Arduino IDE)
1const int LED_PIN = 13;
2const unsigned long ARALIK = 500;   // yanıp sönme aralığı (ms) / blink interval (ms)
3unsigned long oncekiZaman = 0;      // son değişim anı / time of the last toggle
4
5void setup() {
6  pinMode(LED_PIN, OUTPUT);
7}
8
9void loop() {
10  unsigned long simdi = millis();
11  if (simdi - oncekiZaman >= ARALIK) {               // taşmada da doğru çalışır / safe across overflow
12    oncekiZaman = simdi;
13    digitalWrite(LED_PIN, !digitalRead(LED_PIN));    // LED'i tersine çevir / toggle the LED
14  }
15  // Burada buton, sensör ve ekran işleri de yapılabilir / button, sensor and display tasks can run here
16}

Dengan pola ini loop() tidak pernah berhenti; selagi LED terus berkedip kamu bisa membaca tombol, mengukur sensor, dan memperbarui layar di loop yang sama. micros() bekerja dengan cara yang sama dalam mikrodetik; di Uno ia maju dengan langkah 4 µs dan kembali ke nol setelah sekitar 70 menit. Kami membahas menjalankan beberapa tugas sekaligus secara lengkap di Arduino millis() vs delay().

Serial.begin(), Serial.print(), dan Serial.read(): komunikasi serial

Perintah Serial memungkinkan Arduino berkomunikasi dengan komputermu lewat kabel USB, dan merupakan alat paling penting untuk mencari bug. Serial.begin(9600) membuka port serial dengan 9600 bit per detik; jika kecepatan di Serial Monitor tidak cocok, kamu akan melihat karakter sampah di layar. Serial.print() mencetak data dan tetap di baris yang sama, sedangkan Serial.println() pindah ke baris baru setelah mencetak. Parameter kedua memungkinkanmu memilih formatnya: Serial.print(78, HEX) mencetak “4E”, Serial.print(78, BIN) mencetak “1001110”, dan Serial.print(3.14159, 3) menampilkan “3.142” (bilangan float bawaannya 2 angka di belakang koma). Menaruh teks tetap di dalam F("...") menghemat tempat di RAM 2 KB milik Uno.

Untuk membaca data, kamu cek dulu dengan Serial.available() apakah ada byte yang menunggu di buffer; buffer penerima Uno berukuran 64 byte. Serial.read() mengambil satu byte dari buffer itu dan mengembalikan -1 jika tidak ada yang bisa dibaca. Kode di bawah menyalakan dan mematikan LED dengan karakter 1 dan 0 yang kamu kirim dari Serial Monitor:

C++ (Arduino IDE)
1const int LED_PIN = 13;
2
3void setup() {
4  Serial.begin(9600);                    // Seri Monitör de 9600 olmalı / Serial Monitor must be 9600 too
5  pinMode(LED_PIN, OUTPUT);
6  Serial.println(F("1: LED açık / on, 0: LED kapalı / off"));
7}
8
9void loop() {
10  if (Serial.available() > 0) {          // tamponda bayt var mı? / any bytes waiting?
11    char c = Serial.read();              // ilk baytı al / read the first byte
12    if (c == '1') {                      // '1' karakteri, 1 sayısı değil / the character '1', not the number 1
13      digitalWrite(LED_PIN, HIGH);
14      Serial.println(F("LED açık / on"));
15    } else if (c == '0') {
16      digitalWrite(LED_PIN, LOW);
17      Serial.println(F("LED kapalı / off"));
18    }
19    // '\n' ve '\r' gibi diğer karakterler atlanır / other characters such as '\n' and '\r' are ignored
20  }
21}

Perhatikan bahwa perbandingan dilakukan dengan '1' (tanda kutip tunggal, jadi sebuah karakter): angka 1 yang kamu ketik di keyboard sesuai dengan angka 49 di tabel ASCII, jadi kondisi c == 1 tidak pernah benar. Untuk angka dengan beberapa digit kamu bisa memakai Serial.parseInt(), dan untuk mengambil satu baris penuh, Serial.readStringUntil('\n'). Untuk pengaturan akhir baris, baud rate, dan plotter di Serial Monitor, lihat Cara Memakai Serial Monitor Arduino.

map() dan constrain(): menskalakan dan membatasi nilai

map(value, fromLow, fromHigh, toLow, toHigh) memindahkan angka secara proporsional dari satu rentang ke rentang lain. Rumus di baliknya adalah: (x − fromLow) × (toHigh − toLow) / (fromHigh − fromLow) + toLow. Misalnya, map(512, 0, 1023, 0, 255) mengembalikan 127, bukan 127,6, karena map() hanya bekerja dengan bilangan bulat dan membuang pecahannya. Kamu bisa membuat hubungan terbalik dengan menukar rentang tujuan: map(x, 0, 1023, 255, 0). map() tidak membatasi hasilnya; jika input keluar dari rentang yang kamu berikan, output-nya juga keluar. Karena itu map() biasanya digabung dengan constrain(x, low, high).

C++ (Arduino IDE)
1const int LDR_PIN = A0;   // LDR + 10k gerilim bölücü / LDR + 10k voltage divider
2const int LED_PIN = 9;    // ~9 PWM pini / ~9 PWM pin
3
4void setup() {
5  pinMode(LED_PIN, OUTPUT);
6}
7
8void loop() {
9  int isik = analogRead(LDR_PIN);           // odada ölçülen aralık ~200-800 / measured range in the room ~200-800
10  int pwm = map(isik, 200, 800, 255, 0);    // karanlıkta parlak, aydınlıkta sönük / bright in the dark, dim in the light
11  pwm = constrain(pwm, 0, 255);             // aralık dışı değerleri kes / clip out-of-range values
12  analogWrite(LED_PIN, pwm);
13  delay(20);
14}

Di contoh ini LDR memberi nilai antara 200 dan 800 di dalam ruangan. Jika pembacaannya turun ke 100 di malam hari, map() menghitung 297; tanpa constrain(), analogWrite() akan menerima nilai di luar rentang 0–255 ini. Di Uno nilai seperti itu memberi hasil berbeda yang tidak terduga tergantung pinnya: di pin 3, 5, 6, dan 11, yang memakai timer 8 bit, 297 meluap dan berperilaku seperti 41, jadi LED hampir padam dalam gelap total alih-alih menyala terang. Karena constrain(), min(), max(), dan abs() didefinisikan sebagai makro di Uno, jangan taruh x++ atau pemanggilan fungsi lain di dalam kurungnya; ekspresinya bisa dievaluasi lebih dari sekali dan memberi hasil yang tidak terduga. Untuk pengkabelan LDR, lihat sensor cahaya LDR.

tone() dan noTone(): membuat suara dengan buzzer

tone(pin, frequency, duration) menghasilkan gelombang kotak dengan duty cycle 50% di sebuah pin dan membuat buzzer pasif atau speaker kecil berbunyi pada frekuensi itu. Durasinya dalam milidetik dan opsional; tanpa durasi suaranya berlanjut sampai kamu memanggil noTone(pin). Detail penting: tone() tidak menunggu; perintah ini memulai suara lalu langsung lanjut ke baris berikutnya. Jadi ketika kamu memainkan nada satu per satu, kamu butuh delay() yang minimal sepanjang nadanya setelah setiap pemanggilan tone(), kalau tidak kamu hanya mendengar nada terakhir.

C++ (Arduino IDE)
1const int BUZZER_PIN = 8;   // pasif buzzer'ın + ucu / passive buzzer + leg
2
3void setup() {
4  int notalar[] = {262, 294, 330, 349, 392};   // Do Re Mi Fa Sol (Hz) / C D E F G (Hz)
5  for (int i = 0; i < 5; i++) {
6    tone(BUZZER_PIN, notalar[i], 200);         // 200 ms çal / play for 200 ms
7    delay(250);                                // tone() beklemez, sen bekle / tone() does not wait, so you do
8  }
9  noTone(BUZZER_PIN);                          // sesi kapat / stop the sound
10}
11
12void loop() {
13}
  • Batas frekuensi: Di Uno nada di bawah 31 Hz tidak bisa dihasilkan dan batas atasnya 65.535 Hz; rentang yang berguna dengan buzzer kira-kira 100–5000 Hz.
  • Satu suara dalam satu waktu: Hanya satu pin yang bisa memainkan nada dalam satu waktu; untuk membuat suara di pin lain kamu harus menghentikan yang sebelumnya dulu dengan noTone().
  • Bentrokan PWM: Di Uno tone() memakai Timer2, jadi analogWrite() di pin 3 dan 11 terganggu selama suara berbunyi.
  • Buzzer aktif: Karena punya osilator sendiri, frekuensinya tidak bisa diubah dengan tone(); cukup nyalakan dan matikan buzzer aktif dengan digitalWrite(). Untuk perbedaannya, lihat Apa Itu Buzzer?.

pulseIn(): mengukur panjang pulsa

pulseIn(pin, HIGH) menunggu pin menjadi HIGH, mengukur berapa lama ia tetap HIGH, dan mengembalikan hasilnya dalam mikrodetik; perintah ini bisa mengukur pulsa sepanjang 10 µs sampai 3 menit. Pemakaiannya yang paling terkenal adalah sensor jarak ultrasonik HC-SR04: sensor mengeluarkan pulsa sepanjang waktu yang dibutuhkan suara untuk pergi dan kembali. Suara merambat di udara sekitar 343 m/dtk, atau 0,0343 cm/µs; karena jalurnya bolak-balik, jarak = durasi × 0.0343 / 2.

C++ (Arduino IDE)
1const int TRIG_PIN = 9;
2const int ECHO_PIN = 10;
3
4void setup() {
5  Serial.begin(9600);
6  pinMode(TRIG_PIN, OUTPUT);
7  pinMode(ECHO_PIN, INPUT);
8}
9
10void loop() {
11  digitalWrite(TRIG_PIN, LOW);
12  delayMicroseconds(2);
13  digitalWrite(TRIG_PIN, HIGH);            // 10 µs tetik darbesi / 10 µs trigger pulse
14  delayMicroseconds(10);
15  digitalWrite(TRIG_PIN, LOW);
16
17  unsigned long sure = pulseIn(ECHO_PIN, HIGH, 30000UL);   // en fazla 30 ms bekle / wait at most 30 ms
18  if (sure == 0) {
19    Serial.println(F("Menzil dışı / out of range"));
20  } else {
21    float mesafe = sure * 0.0343 / 2.0;    // ses hızı 343 m/s, gidiş-dönüş / speed of sound 343 m/s, round trip
22    Serial.print(mesafe, 1);
23    Serial.println(F(" cm"));
24  }
25  delay(100);
26}

Parameter ketiga, timeout, sangat penting. Tanpa itu, pulseIn() menunggu 1 detik ketika tidak ada pulsa yang datang dan mengembalikan 0; jika kabel sensor lepas, seluruh program macet satu detik di setiap putaran loop. Timeout 30000 µs sesuai dengan sekitar 5 meter, yang cukup untuk jangkauan 4 meter HC-SR04. Untuk pengkabelan dan akurasi sensornya, lihat sensor jarak HC-SR04.

attachInterrupt(): bereaksi seketika dengan interupsi

attachInterrupt(digitalPinToInterrupt(pin), function, mode) menjalankan fungsi yang kamu berikan tepat ketika sebuah pin berubah, apa pun yang sedang dikerjakan loop() pada momen itu. Fungsi ini disebut interrupt service routine (ISR). Mode-nya bisa bernilai empat: RISING terpicu pada perpindahan LOW ke HIGH, FALLING pada perpindahan HIGH ke LOW, CHANGE pada setiap perubahan, dan LOW selama pin tetap LOW. Di Uno dan Nano hanya pin D2 dan D3 yang bisa memicu interupsi dengan cara ini; di Mega kamu bisa memakai pin 2, 3, 18, 19, 20, dan 21. Ini ideal agar tidak melewatkan encoder yang berputar cepat, pulsa anemometer, atau tekanan tombol yang sangat singkat.

C++ (Arduino IDE)
1const int BUTON_PIN = 2;            // Uno'da kesme pinleri: 2 ve 3 / interrupt pins on the Uno: 2 and 3
2volatile unsigned long sayac = 0;   // ISR'de değişen değişken volatile olmalı / variables changed in an ISR must be volatile
3
4void say() {                        // kesme fonksiyonu (ISR): kısa tut / interrupt service routine: keep it short
5  sayac++;
6}
7
8void setup() {
9  Serial.begin(9600);
10  pinMode(BUTON_PIN, INPUT_PULLUP);
11  attachInterrupt(digitalPinToInterrupt(BUTON_PIN), say, FALLING);   // HIGH'dan LOW'a geçişte / on a HIGH-to-LOW edge
12}
13
14void loop() {
15  noInterrupts();                   // 4 baytlık değeri güvenle kopyala / copy the 4-byte value safely
16  unsigned long kopya = sayac;
17  interrupts();
18
19  Serial.print(F("Basma sayısı / presses: "));
20  Serial.println(kopya);
21  delay(500);
22}
Deklarasikan setiap variabel yang kamu ubah di dalam ISR sebagai volatile, dan buat fungsinya sesingkat mungkin. Di dalam ISR delay() tidak bekerja, millis() tidak maju, dan Serial.print() bisa membuat program macet; cukup perbarui flag atau penghitung dan kerjakan tugas sebenarnya di loop(). Tombol mekanik memantul, jadi penghitung bisa naik beberapa kali untuk satu tekanan; solusi pantulan dan detail lengkap tentang interupsi ada di interupsi Arduino.

random() dan randomSeed(): menghasilkan angka acak

random(max) mengembalikan bilangan bulat acak antara 0 dan max−1, dan random(min, max) antara min dan max−1; batas atasnya tidak termasuk dalam hasil. Karena itu kamu menulis random(1, 7) untuk dadu 1 sampai 6. Arduino tidak menghasilkan keacakan sejati; ia menghitung deret angka dengan rumus tetap, jadi jika kamu tidak memanggil randomSeed(), kamu akan melihat angka yang sama dengan urutan yang sama setiap kali board menyala. Memakai noise dari pin analog yang tidak tersambung sebagai seed menyelesaikan ini dalam praktik:

C++ (Arduino IDE)
1void setup() {
2  Serial.begin(9600);
3  randomSeed(analogRead(A3));     // boştaki A3 pininin gürültüsü / noise from the unconnected A3 pin
4}
5
6void loop() {
7  int zar = random(1, 7);         // 1-6 arası; üst sınır dahil değil / 1 to 6; the upper bound is exclusive
8  Serial.print(F("Zar / dice: "));
9  Serial.println(zar);
10  delay(1000);
11}

Perintah Arduino di ESP32: apa yang perlu diperhatikan

ESP32 diprogram di Arduino IDE dengan perintah yang sama, dan sebagian besar kode di artikel ini langsung berjalan begitu kamu mengubah nomor pin. Namun karena hardware-nya berbeda, beberapa perintah berperilaku berbeda. Perbedaan terpenting adalah tegangannya: pin ESP32 bekerja di 3,3 V, digitalWrite(pin, HIGH) mengeluarkan 3,3 V, dan sinyal 5 V tidak boleh disambung langsung ke pin. Untuk mengenal board ini lebih baik, lihat Apa Itu ESP32?.

PerintahArduino UnoESP32
digitalWrite(pin, HIGH)5 V3,3 V
analogRead()10 bit, 0–1023, A0–A512 bit, 0–4095; dengan Wi-Fi menyala, hanya pin ADC1 (GPIO 32–39)
analogWrite()Hanya pin ~ (3, 5, 6, 9, 10, 11), 490/980 HzHampir semua GPIO yang bisa menjadi output; atur frekuensinya dengan ledcAttach(pin, freq, resolution)
attachInterrupt()Hanya D2 dan D3Semua GPIO; tambahkan IRAM_ATTR ke ISR
tone()Memakai Timer2, mengganggu PWM di 3 dan 11Berjalan di hardware LEDC
Serial.begin()Biasanya 9600Biasanya 115200 (pesan boot juga memakai kecepatan ini)
delay()Membuat prosesor sepenuhnya sibuk menungguMenyerahkan waktunya ke FreeRTOS; Wi-Fi tetap berjalan di latar belakang
C++ (Arduino IDE)
1const int POT_PIN = 34;     // ADC1 pini, Wi-Fi açıkken de okur / ADC1 pin, works with Wi-Fi on
2const int LED_PIN = 2;      // çoğu DevKit'te dahili LED / onboard LED on most DevKits
3const int BUTON_PIN = 4;    // butonun diğer ucu GND / other button leg to GND
4
5volatile bool basildi = false;
6
7void IRAM_ATTR butonISR() { // ESP32'de ISR IRAM'e yerleşmeli / on the ESP32 the ISR should live in IRAM
8  basildi = true;
9}
10
11void setup() {
12  Serial.begin(115200);
13  pinMode(BUTON_PIN, INPUT_PULLUP);
14  attachInterrupt(digitalPinToInterrupt(BUTON_PIN), butonISR, FALLING);   // her GPIO kesme destekler / every GPIO supports interrupts
15}
16
17void loop() {
18  int ham = analogRead(POT_PIN);                     // 0-4095 (12 bit)
19  analogWrite(LED_PIN, map(ham, 0, 4095, 0, 255));   // 8 bit PWM / 8-bit PWM
20  if (basildi) {
21    basildi = false;
22    Serial.println("Butona basıldı / button pressed");
23  }
24  Serial.println(ham);
25  delay(200);
26}

Karena analogRead() mengembalikan 0–4095 di ESP32, rentang map() berubah menyesuaikan. IRAM_ATTR di depan ISR menaruh kode di memori internal yang cepat; tanpa itu, dalam situasi tertentu board bisa memulai ulang dengan “Guru Meditation Error”. Pembacaan analog ESP32 tidak linear di dekat ujung rentang (sekitar 0 V dan 3,3 V); jika kamu butuh pengukuran yang lebih akurat, fungsi analogReadMilliVolts() mengembalikan nilai terkalibrasi dalam milivolt.

Raspberry Pi Pico: padanan MicroPython untuk perintah Arduino

Jika kamu memprogram Raspberry Pi Pico dengan Arduino IDE (core arduino-pico), setiap perintah di artikel ini bekerja dengan nama yang sama; analogRead() bawaannya mengembalikan 10 bit dan analogWrite() menghasilkan PWM 1 kHz. Namun kebanyakan orang memakai Pico dengan MicroPython. Di sana perintah ditulis dengan objek dari modul machine dan time; logikanya sama, hanya sintaksnya yang berubah. Pin Pico juga 3,3 V, dan input analognya adalah pin GP26, GP27, dan GP28. Untuk memulai, lihat Apa Itu Raspberry Pi Pico?.

Perintah ArduinoPadanan MicroPythonCatatan
pinMode(15, OUTPUT)led = Pin(15, Pin.OUT)Objek Pin dibuat sekali
pinMode(14, INPUT_PULLUP)btn = Pin(14, Pin.IN, Pin.PULL_UP)Resistor pull-up internal
digitalWrite(15, HIGH)led.value(1)led.on() juga bisa
digitalRead(14)btn.value()Mengembalikan 0 atau 1
analogRead(A0)ADC(26).read_u16()Mengembalikan 0–65535
analogWrite(15, 128)PWM(Pin(15)).duty_u16(32768)Duty dari 0 sampai 65535
delay(500)time.sleep_ms(500)time.sleep(0.5) juga bisa
millis()time.ticks_ms()Pakai time.ticks_diff() untuk selisih
Serial.println(x)print(x)Muncul di shell Thonny
tone(pin, 440)pwm.freq(440) dan pwm.duty_u16(32768)Matikan suaranya dengan duty_u16(0)
pulseIn(pin, HIGH, 30000)machine.time_pulse_us(pin, 1, 30000)Mengembalikan nilai negatif ketika timeout
attachInterrupt(...)btn.irq(trigger=Pin.IRQ_FALLING, handler=f) (interupsi tepi turun)f menerima objek pin sebagai parameter
random(1, 7)random.randint(1, 6)Batas atas termasuk
map() / constrain()Tidak bawaan, kamu menulisnya sendiriUntuk constrain: min(max(x, 0), 255)
MicroPython
1from machine import Pin, ADC, PWM
2import time
3
4led = PWM(Pin(15))                       # pinMode + analogWrite karşılığı / pinMode + analogWrite equivalent
5led.freq(1000)                           # 1 kHz PWM
6buton = Pin(14, Pin.IN, Pin.PULL_UP)     # INPUT_PULLUP karşılığı / INPUT_PULLUP equivalent
7pot = ADC(26)                            # GP26 = ADC0
8
9def map_deger(x, giris_min, giris_max, cikis_min, cikis_max):   # Arduino map() karşılığı / Arduino map() equivalent
10    return (x - giris_min) * (cikis_max - cikis_min) // (giris_max - giris_min) + cikis_min
11
12onceki = time.ticks_ms()                 # millis() karşılığı / millis() equivalent
13while True:
14    ham = pot.read_u16()                 # 0-65535 (analogRead)
15    led.duty_u16(ham)                    # parlaklık / brightness (analogWrite)
16    if buton.value() == 0:               # digitalRead; basılı = 0 / pressed = 0
17        print("Butona basıldı / button pressed")
18    if time.ticks_diff(time.ticks_ms(), onceki) >= 1000:   # saniyede bir / once a second
19        onceki = time.ticks_ms()
20        print("Yüzde / percent:", map_deger(ham, 0, 65535, 0, 100))
21    time.sleep_ms(50)                    # delay(50)

Seperti terlihat di tabel, random.randint(1, 6) di MicroPython menyertakan batas atas dan memberi hasil yang sama dengan random(1, 7) di Arduino; time.ticks_diff() memberi keamanan yang sama terhadap kembali-ke-nol seperti pengurangan millis(). Perbedaan kecil seperti inilah yang paling membingungkan ketika berpindah di antara kedua platform. Untuk perintah dasar MicroPython lainnya, lihat dasar-dasar MicroPython.

Ide proyek yang bisa kamu buat dengan perintah-perintah ini

  • Lampu lalu lintas: Nyalakan tiga LED berurutan dengan pinMode(), digitalWrite(), dan delay(); kami menjelaskannya langkah demi langkah di Lampu Lalu Lintas Arduino.
  • Dadu digital: Hasilkan angka 1 sampai 6 dengan random() dan, ketika tombol ditekan, tampilkan hasilnya dengan LED atau di display 7-segmen.
  • Sensor parkir: Ukur jarak dengan pulseIn(), ubah menjadi jeda bunyi dengan map(), dan bunyikan peringatan dengan tone().
  • Lampu tidur otomatis: Baca tingkat cahaya dengan analogRead() dan atur kecerahan analogWrite() dengan map() dan constrain().
  • Remote lewat port serial: Kendalikan LED, relay, atau motor servo dengan perintah dari komputermu memakai Serial.read().
  • Tes reaksi: Nyalakan LED pada momen acak dengan random() dan ukur waktu reaksimu menekan tombol sampai milidetik dengan attachInterrupt() dan millis().

Kesalahan umum dan cara memperbaikinya

KesalahanGejalaSolusi
pinMode() terlupaLED sangat redup atau sama sekali tidak menyalaTulis pinMode(pin, OUTPUT) di setup()
Tombol tanpa resistor dalam mode INPUTdigitalRead() mengembalikan 0 dan 1 secara acakPakai INPUT_PULLUP; ketika ditekan terbaca LOW
Salah ketik nama perintah“'digitalwrite' was not declared in this scope”Perhatikan huruf besar dan kecil: digitalWrite
Baud rate tidak cocokKarakter sampah di Serial MonitorSamakan kecepatan Serial Monitor dengan Serial.begin()
analogWrite() di pin tanpa PWMLED hanya menyala penuh atau mati totalPakai pin bertanda ~ (3, 5, 6, 9, 10, 11)
millis() disimpan di intPengaturan waktu rusak setelah sekitar 33 detikPakai unsigned long
Dadu dengan random(1, 6)Angka 6 tidak pernah keluarTulis random(1, 7); batas atasnya tidak termasuk
Mengharapkan desimal dari map()Hasilnya selalu bilangan bulat, perubahan kecil hilangTulis rumus float sendiri jika perlu
pulseIn() tanpa timeoutSetiap putaran loop macet 1 detik ketika sensor tidak adaBerikan 30000 sebagai parameter ketiga
delay() atau Serial di dalam ISRProgram macet atau berperilaku anehHanya ubah flag volatile di dalam ISR
Jika kamu tidak yakin persis apa yang dilakukan sebuah perintah, tulis sketch uji kecil dan cetak hasilnya dengan Serial.println(); di Arduino IDE 2 kamu juga bisa klik kanan nama perintah dan memilih “Go to Definition” untuk melihat kode sumbernya. Jika kodemu tidak mau dikompilasi, baris pertama pesan error biasanya menunjuk ke masalahnya; pesan yang paling umum beserta solusinya ada di error kompilasi Arduino.

Perintah-perintah di artikel ini adalah batu bata dari kebanyakan proyek yang akan kamu buat dengan Arduino; sisanya kebanyakan adalah fungsi tambahan yang disediakan library. Mencoba setiap perintah sekali di rangkaian kecilnya sendiri dan melihat hasilnya di Serial Monitor membuat pelajarannya jauh lebih melekat daripada menghafalnya. Di aplikasi BlueGrays kamu bisa menemukan proyek yang memakai perintah-perintah ini, seperti menyalakan LED, mengendalikan LED dengan tombol, mengukur cahaya dengan LDR, mengatur frekuensi buzzer, mengukur jarak dengan HC-SR04, dan proyek dadu, langkah demi langkah dengan skema rangkaian dan kode yang diberi komentar.

Pertanyaan umum

Perintah Arduino apa yang paling sering dipakai?

Yang paling sering dipakai adalah pinMode(), digitalWrite(), digitalRead(), analogRead(), analogWrite(), delay(), millis(), Serial.begin(), dan Serial.println(). Tambahkan map() untuk menskalakan nilai, tone() untuk suara, pulseIn() untuk sensor jarak, dan attachInterrupt() untuk interupsi, dan kamu bisa menulis hampir semua proyek pemulamu.

Perintah Arduino ditulis dalam bahasa apa?

Kode Arduino dibangun di atas C dan C++; core Arduino menambahkan fungsi siap pakai seperti pinMode() dan digitalWrite() ke bahasa itu. Perintahnya dalam bahasa Inggris, membedakan huruf besar dan kecil, dan setiap pernyataan diakhiri titik koma. ESP32 dan Raspberry Pi Pico juga bisa diprogram dengan MicroPython jika kamu lebih suka.

Apa bedanya digitalWrite dan analogWrite?

digitalWrite() mengatur pin ke salah satu dari dua keadaan saja: HIGH (5 V di Uno) atau LOW (0 V). analogWrite() menyalakan dan mematikan pin dengan sangat cepat untuk membuat sinyal PWM dari 0 sampai 255, sehingga kamu bisa mengatur kecerahan LED atau kecepatan motor. Di Uno, analogWrite() hanya bekerja di pin bertanda ~.

Apa arti void setup dan void loop?

setup() adalah fungsi yang berjalan sekali ketika board menyala atau di-reset; persiapan seperti pinMode() dan Serial.begin() masuk ke sini. loop() adalah fungsi yang berulang selamanya setelah setup() selesai. Kata void di depannya berarti fungsi-fungsi ini tidak mengembalikan nilai.

Apa bedanya Serial.print dan Serial.println?

Serial.print() mencetak data dan membiarkan kursor di baris yang sama, jadi data berikutnya langsung ditambahkan di belakangnya. Serial.println() mengirim karakter akhir baris (\r\n) setelah mencetak, jadi data berikutnya dimulai di baris baru. Untuk menampilkan beberapa nilai berdampingan di satu baris, pakai print() dulu dan println() di akhir.

Apa fungsi map di Arduino?

map() mengubah angka dari satu rentang ke rentang lain secara proporsional; misalnya, mengubah nilai 0–1023 dari analogRead() ke rentang 0–255 untuk analogWrite() atau ke 0–180 derajat untuk servo. Fungsi ini hanya bekerja dengan bilangan bulat dan tidak membatasi hasilnya, jadi dianjurkan untuk menggabungkannya dengan constrain() agar input di luar rentang bisa ditangani.

Lihat semua proyek
LED Berkedip
#1Pemula

LED Berkedip

"Halo" pertama di dunia elektronika: menyalakan dan mematikan satu LED. Arduino menyalakan dan mematikan LED dengan jeda singkat, sehingga cahayanya berkedip cepat. Kamu melihat dengan cara paling sed

4.6(188)
1127
Kendali LED dengan Tombol Tekan (Tekan)
#9Pemula

Kendali LED dengan Tombol Tekan (Tekan)

Persis seperti bel pintu: lampu tetap menyala selama kamu menekan, dan mati ketika kamu melepasnya. Arduino terus mendengarkan tombol; selama ditekan LED menyala, dan begitu jarimu terangkat LED mati.

4.8(113)
229
Mengukur Intensitas Cahaya dengan LDR
#11Pemula

Mengukur Intensitas Cahaya dengan LDR

Ingin melihat seberapa terang kamarmu dalam bentuk angka? LDR, komponen kecil yang bereaksi terhadap cahaya, mengukur cahaya di sekitarnya, dan Arduino menulis nilainya ke layar komputermu setiap sete

4.6(81)
139
Mengatur Frekuensi Buzzer
#14Menengah

Mengatur Frekuensi Buzzer

Kamu mengendalikan suara buzzer dengan empat tombol: satu memulai suara, satu membungkamnya, dan dua lainnya membuatnya lebih tinggi atau lebih rendah. Tahan tombol naik atau turun dan nadanya berubah

4.6(69)
118
Pengukuran Jarak HC-SR04 (Tampilan Serial)
#27Pemula

Pengukuran Jarak HC-SR04 (Tampilan Serial)

Sensor HC-SR04 bekerja persis seperti kelelawar yang mencari jalan dalam gelap: ia mengirim suara yang tidak bisa kamu dengar, mendengarkan pantulannya, dan mengukur seberapa jauh benda di depannya. A

4.6(46)
71
Efek LED Knight Rider dengan Kecepatan yang Bisa Diatur
#8Menengah

Efek LED Knight Rider dengan Kecepatan yang Bisa Diatur

Cahaya berlari dari satu ujung enam LED ke ujung lainnya, berbalik, lalu berlari kembali. Putar kenop potensiometer dan kamu langsung mengubah kecepatan larinya: dengan kenop di satu ujung cahayanya h

4.5(60)
120
Menggerakkan Motor Servo dengan Potensiometer
#36Pemula
Premium

Menggerakkan Motor Servo dengan Potensiometer

Ketika kamu memutar kenop potensiometer, lengan motor servo ikut berputar: satu ujung kenop berarti nol derajat, ujung lainnya berarti setengah putaran. Arduino terus membaca posisi kenop dan servo la

4.6(37)
52
Proyek Dadu
#79Menengah
Premium

Proyek Dadu

Tidak ada lagi dadu yang hilang ketika main board game: setiap kali kamu menekan tombol, angka acak dari 1 sampai 6 muncul di layar 7 segmen. Setiap tekanan memberi tepat satu hasil, dan hasilnya juga

5.0(48)
67