# 01 - Berkenalan dengan ESP 32 - LED berkedip

# A. Berkenalan dengan ESP32

Memahami sedikit seluk beluk apa itu ESP32

# Salam kenal, aku ESP 32

<p class="callout success">dibuat untuk tugas mata kuliah EL5057 Sistem Penginderaan</p>

Halo teman-teman, mari berkenalan dengan mikrokontroler **ESP32**. jadi, apasih sebenarnya ESP32? ESP 32 adalah mikrokontroler serbaguna yang memiliki dua inti prosesor untuk kinerja yang cepat dan efisien. Dengan kemampuan WiFi dan Bluetooth terintegrasi, ESP32 memungkinkan pengembang untuk membuat proyek-proyek IoT yang terhubung ke internet tanpa perlu tambahan perangkat keras. Kelebihan ESP32 terletak pada fleksibilitasnya; dapat diprogram menggunakan Arduino IDE, MicroPython, atau bahasa pemrograman lainnya. Dengan dukungan sensor yang beragam, ESP32 memungkinkan pembuatan proyek-proyek yang mencakup pengukuran suhu, kendali perangkat, dan pengiriman data ke cloud. Kesederhanaan penggunaan dan ukurannya yang kecil membuat ESP32 menjadi pilihan populer untuk berbagai aplikasi, mulai dari perangkat pintar hingga robotika, memberikan para pengembang alat yang kuat untuk mewujudkan ide-ide kreatif mereka dengan mudah.

[![image.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/LGiimage.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/LGiimage.png)

Jadi, bayangkan ESP32 seperti otak kecil yang super pintar untuk proyek-proyek elektronik kamu. Ini adalah mikrokontroler canggih yang bisa melakukan banyak hal seru. Jadi, apa yang bikin ESP32 istimewa?

<div class="w-full text-token-text-primary" data-testid="conversation-turn-3" id="bkmrk-dua-dalam-satu%3A-esp3" style="text-align: justify;"><div class="px-4 py-2 justify-center text-base md:gap-6 m-auto"><div class="flex flex-1 text-base mx-auto gap-3 md:px-5 lg:px-1 xl:px-5 md:max-w-3xl group"><div class="relative flex w-full flex-col agent-turn"><div class="flex-col gap-1 md:gap-3"><div class="flex flex-grow flex-col max-w-full"><div class="min-h-[20px] text-message flex flex-col items-start gap-3 whitespace-pre-wrap break-words [.text-message+&]:mt-5 overflow-x-auto" data-message-author-role="assistant" data-message-id="dedb5e4e-86ac-46ee-8cf8-0e0fc003b675"><div class="markdown prose w-full break-words dark:prose-invert dark">1. **Dua dalam Satu:** ESP32 sebenarnya seperti paket hemat, karena seolah-olah kamu mendapatkan dua mikrokontroler dalam satu! Ada dua inti prosesor di dalamnya, yang artinya ESP32 bisa melakukan beberapa tugas sekaligus tanpa jadi lelet.
2. **WiFi dan Bluetooth:** Nah, ESP32 juga punya kemampuan WiFi dan Bluetooth bawaan. Bayangkan kamu bisa membuat gadget yang bisa terhubung ke internet tanpa perlu mikrokontroler ekstra. Seru, kan?
3. **Luar Biasa Ringkas:** Meskipun kecil, ESP32 itu luar biasa hebat. Kamu bisa pakai ini untuk buat perangkat pintar, seperti sensor suhu yang bisa dikontrol dari jauh, atau mungkin robot mini yang bisa diarahkan pakai smartphone.
4. **Sahabat Programmer:** ESP32 juga sangat ramah buat para programmer. Kamu bisa pakai Arduino IDE atau bahkan MicroPython untuk membuat programnya. Jadi, meskipun kamu bukan ahli, kamu bisa tetap membuat proyek seru dengan ESP32.
5. **Banyak Fitur Keren:** Sensor, koneksi ke internet, kemampuan pengolahannya, semuanya lengkap di ESP32. Kamu bisa mengukur suhu, mengontrol perangkat, bahkan memonitor data dan mengirimnya ke cloud. Gila, kan?

</div></div></div></div></div></div></div></div>Jadi, singkatnya, ESP32 itu seperti sihir untuk dunia elektronik. Kamu bisa berkreasi tanpa batas dan membuat proyek-proyek seru dengan mudah. Nah, biasanya ESP32 yang dijual di pasaran sudah termasuk dengan *development board* nya agar kita bisa langsung pakai untuk pemrograman. Contoh *dev-board* nya adalah sebagai berikut.

[![image.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/8eCimage.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/8eCimage.png)

# Spesifikasi ESP32

<p class="callout success">dibuat untuk tugas mata kuliah EL5057 Sistem Penginderaan</p>

Mari mengenal lebih detail ESP32 ini, dari namanya sih sepertinya singkatan dari nama perusahaan yang membungkus chipset ini kedalam satu chip yaitu ESPRESSIF. Espressif Systems adalah perusahaan semikonduktor yang berkantor pusat di Tiongkok, yang terkenal dengan pengembangan mikrokontroler, khususnya seri ESP8266 dan ESP32 yang sangat populer di komunitas elektronika dan *Internet of Things* (IoT). Didirikan pada tahun 2008, Espressif fokus pada inovasi dalam desain chip nirkabel dan sistem chip terintegrasi untuk aplikasi WiFi dan Bluetooth. Produk unggulan mereka, seperti ESP8266 dan ESP32, telah memainkan peran penting dalam mendorong pertumbuhan ekosistem IoT dan DIY (*Do It Yourself*).

Berdasarkan data dari laman resmi Espressif System tentang chipset ESP32 ([https://esp32.net](https://esp32.net)), berikut adalah blok fungsi (*function block*) lengkap dari ESP32 yang akan kita gunakan untuk belajar pemrograman mikrokontroler.

[![Screenshot 2024-03-03 at 09.37.29.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-03-at-09-37-29.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/screenshot-2024-03-03-at-09-37-29.png)

Nah, terlihat sangat lengkap sekali bukan, walaupun ukurannya sekecil kotak penghapus, ternyata kelengkapannya sangat mirip dengan personal computer yang kita punya. Berikut adalah fitur-fitur tambahan dari ESP32 yang sudah tertanam dalam SoC (*System on Chip*).

---

##### Wi-Fi

- 802.11b/g/n
- 802.11n (2.4 GHz), up to 150 Mbps
- WMM
- TX/RX A-MPDU, RX A-MSDU
- Immediate Block ACK
- Defragmentation
- Automatic Beacon monitoring (hardware TSF)
- 4 × virtual Wi-Fi interfaces
- Simultaneous support for Infrastructure Station, SoftAP, and Promiscuous modes Note that when ESP32 is in Station mode, performing a scan, the SoftAP channel will be changed.
- Antenna diversity

---

##### Bluetooth<sup>®</sup>

- Compliant with Bluetooth v4.2 BR/EDR and Bluetooth LE specifications
- Class-1, class-2 and class-3 transmitter without external power amplifier
- Enhanced Power Control
- +9 dBm transmitting power
- NZIF receiver with –94 dBm Bluetooth LE sensitivity
- Adaptive Frequency Hopping (AFH)
- Standard HCI based on SDIO/SPI/UART
- High-speed UART HCI, up to 4 Mbps
- Bluetooth 4.2 BR/EDR and Bluetooth LE dual mode controller
- Synchronous Connection-Oriented/Extended (SCO/eSCO)
- CVSD and SBC for audio codec
- Bluetooth Piconet and Scatternet
- Multi-connections in Classic Bluetooth and Bluetooth LE
- Simultaneous advertising and scanning

---

##### CPU and Memory

- Xtensa® single-/dual-core 32-bit LX6 microprocessor(s)
- CoreMark® score: 
    - 1 core at 240 MHz: 504.85 CoreMark; 2.10 CoreMark/MHz
    - 2 cores at 240 MHz: 994.26 CoreMark; 4.14 CoreMark/MHz
- 448 KB ROM
- 520 KB SRAM
- 16 KB SRAM in RTC
- QSPI supports multiple flash/SRAM chips

---

##### Clocks and Timers

- Internal 8 MHz oscillator with calibration
- Internal RC oscillator with calibration
- External 2 MHz ~ 60 MHz crystal oscillator (40 MHz only for Wi-Fi/Bluetooth functionality)
- External 32 kHz crystal oscillator for RTC with calibration
- Two timer groups, including 2 × 64-bit timers and 1 × main watchdog in each group
- One RTC timer
- RTC watchdog

---

##### Advanced Peripheral Interfaces

- 34 × programmable GPIOs 
    - 5 strapping GPIOs
    - 6 input-only GPIOs
    - 6 GPIOs needed for in-package flash/PSRAM (ESP32-D0WDR2-V3, ESP32-U4WDH)
- 12-bit SAR ADC up to 18 channels
- 2 × 8-bit DAC • 10 × touch sensors
- 4 × SPI
- 2 × I2S
- 2 × I2C
- 3 × UART
- 1 host (SD/eMMC/SDIO)
- 1 slave (SDIO/SPI)
- Ethernet MAC interface with dedicated DMA and IEEE 1588 support
- TWAI®, compatible with ISO 11898-1 (CAN Specification 2.0)
- RMT (TX/RX)
- Motor PWM
- LED PWM up to 16 channels

---

##### Power Management

- Fine-resolution power control through a selection of clock frequency, duty cycle, Wi-Fi operating modes, and individual power control of internal components
- Five power modes designed for typical scenarios: Active, Modem-sleep, Light-sleep, Deep-sleep, Hibernation
- Power consumption in *Deep-sleep* mode is **10 µA**
- Ultra-Low-Power (ULP) coprocessors
- RTC memory remains powered on in Deep-sleep mode

---

Nah, satu lagi saya tambahkan disini adalah data konsumsi daya dari **ESP32**. <span style="color: rgb(224, 62, 45);">Kenapa konsumsi daya penting?</span>, karena sistem IoT yang dipasang di lapangan biasanya menggunakan baterai sehingga dengan mendesain ESP32 agar irit daya, menjadikan alat IoT kita tahan lama. Berikut adalah tabel konsumsi daya dari ESP32.

[![Screenshot 2024-03-03 at 10.11.19.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-03-at-10-11-19.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/screenshot-2024-03-03-at-10-11-19.png)

# ESP 32 pinout

---

#### <span style="color: rgb(35, 111, 161);">**ESP-32 Devkit V1 Pinout 30 Pin**</span>  


[![image.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/EMDimage.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/EMDimage.png)

---

#### <span style="color: rgb(35, 111, 161);">**ESP-32 Devkit V1 Pinout 38 Pin**</span>

[![image.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/yrDimage.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/yrDimage.png)

# B. Menginstall IDE ESP32

<p class="callout success">dibuat dalam rangka tugas mata kuliah EL5057 Sistem Penginderaan</p>

Sebelum kita bermain-main membuat beberapa program sederhana dengan **ESP32**, terlebih dahulu harus kita siapkan suatu lingkungan (*environment*) pemrograman yang akan kita gunakan, atau istilah kerennya **IDE (*Integrated Development Environment*)** atau dalam bahasa artinya sebuah lingkungan pengembangan terpadu. Biasanya kita dapat menggunakan beberapa IDE, namun yang umumnya orang gunakan adalah **Arduino IDE**, kenapa menggunakan Arduino IDE? ya simpel saja sih, banyak tutorial yang tersedia, jadi ketika mengalami error, dapat mencari solusinya dengan mudah. dan juga Arduino ini kan berasal dari suatu komunitas, nah biasanya kalau berbasis komunitas pengembangannya lebih cepat dan *troubleshooting-*nya juga banyak.

---

**Apa itu Arduino IDE?**

Arduino IDE adalah IDE yang dikembangkan oleh komunitas Arduino untuk mendukung pengembangan perangkat lunak pada platform Arduino. Arduino sendiri adalah platform perangkat keras terbuka yang digunakan untuk membuat berbagai proyek elektronika. Arduino IDE menyediakan antarmuka yang ramah pengguna dan mudah digunakan, cocok untuk pemula maupun pengembang berpengalaman. Dengan Arduino IDE, pengguna dapat menulis kode, menguploadnya ke papan Arduino mereka, dan menjalankan program dengan mudah. Selain itu, Arduino IDE mendukung berbagai papan Arduino yang berbeda, membuatnya menjadi pilihan populer di kalangan hobiis dan pengembang DIY.

> apakah bisa menggunakan Arduino IDE untuk ESP32?
> 
> **jawabannya adalah bisa,** karena Arduino IDE hanya sebagai compiler yang akan mengubah baris kode kita kedalam bahasa mesin, nah proses compiler dalam melakukan tugasnya dikelola oleh suatu fungsi yang di desain untuk chipset ESP32. atau **gampangannya, Arduino IDE hanya pabriknya saja, sementara mesin di dalamnya diganti untuk memproduksi program ESP32.**

---

##### **Menginstal Arduino IDE**

Sebelum melakukan instalasi Arduino IDE ke dalam komputer kita, ada beberapa yang harus disiapkan, atau bahasa kerennya ada *minimum requirement* yang harus dipenuhi seperti ditampilkan pada tabel berikut.

<table border="1" id="bkmrk-no.-perangkat-ketera" style="border-collapse: collapse; width: 100%; height: 169.391px;"><colgroup><col style="width: 29.5426%;"></col><col style="width: 70.4574%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Requirement**</td><td style="height: 29.7969px;">**Keterangan**</td></tr><tr style="height: 81.7969px;"><td style="height: 81.7969px;">Komputer/ Laptop/ PC

</td><td style="height: 81.7969px;"><p class="callout warning">Periksa, jenis operating system yang digunakan dan arsitektur komputer yang digunakan</p>

</td></tr><tr style="height: 57.7969px;"><td style="height: 57.7969px;">Koneksi internet

</td><td style="height: 57.7969px;">Karena kita harus mengunduh installer dari laman Arduino, maka dibutuhkan koneksi internet yang stabil.</td></tr></tbody></table>

> disini saya menggunakan laptop Macbook Air dengan *opearting system* **MacOs Sonoma versi 14.2.1**
> 
> bagi teman-teman yang menggunakan operating lainnya, akan dijelaskan di laman selanjutnya

---

**Langkah 1** | Download aplikasi Arduin IDE, dengan mengakses laman berikut.

- Alamat url : **[https://www.arduino.cc/en/software](https://www.arduino.cc/en/software)**

<div drawio-diagram="34"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1709438306.png" alt=""/></div>

- Pilih *operating system* yang digunakan, jika menggunkan Macbook, maka pilih macOS, karena saya menggunakan Macbook Air dengan prosesor Intel, maka saya pilih pada bagian yang ditandai merah diatas.

---

**Langkah 2 |** Instalasi Arduino IDE ke komputer kita.

<details id="bkmrk-file-installer-versi"><summary>File installer versi MacOs</summary>

File installer versi MacOS, menggunakan file yang berekstensi \*.dmg, untuk membukanya cukup melakukan klik dua kali pada file yang dimaksud, dan ikuti langkah-langkah selanjutnya.

File Arduino IDE versi 2.3.2 memiliki ukuran 182MB, sehingga pastikan kuota internet anda cukup.

</details>[![insatller.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/insatller.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/insatller.png)

- Install dengan melakukan drag icon **Arduino IDE.app** ke folder **Applications.**

---

**Langkah 3 |** Inisialisasi awal aplikasi **Arduino IDE.** Proses ini bertujuan untuk memasukan *repositori* **ESP32** kedalam IDE. Secara lengkap prosesnya adalah sebagai berikut:

[![Screenshot 2024-03-03 at 11.22.14.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-03-at-11-22-14.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/screenshot-2024-03-03-at-11-22-14.png)

diatas adalah antarmuka aplikasi Arduino IDE, untuk menggunakannya sebagai IDE ESP32 perlu beberapa konfigurasi, seperti memasukan repositori ESP32 dan mendownload compiler boardnya, agar Arduino IDE faham jika akan digunakan untuk programming pada mikrokontroler ESP32.

---

**1.** Buka menu pengaturan pada aplikasi Arduino IDE, dengan cara menekan top menu **Arduino IDE &gt; Settings..**

<div drawio-diagram="39"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1709441503.png" alt=""/></div>

---

**2.** Memasukan link repositori kedalam parameter pengaturan **Additional board manager URLs** di laman dialog Arduino IDE, dengan cara copy-paste link berikut kedalam form pengaturan.

```
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json
```

<div drawio-diagram="40"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1709442051.png" alt=""/></div>

  
**3.** Mengunduh **board ESP32**, dengan cara buka top-menu **tools &gt; board &gt; boards manager.**

<div drawio-diagram="41"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1709444285.png" alt=""/></div>

Setelah tampil laman dialog, kemudian ketik ESP32 pada *field* **BOARDS MANAGER** untuk mencari repositori board ESP32, setelah ketemu kemudian klik **download** untuk mengunduh ke dalam Arduino IDE.

<div drawio-diagram="42"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1709444600.png" alt=""/></div>

---

<p class="callout info">Sebelum memulai pemrograman, pastikan terlebih dahulu untuk mengecek kesamaan ***board*** di IDE dan ***dev-board*** ESP32 yang kita gunakan.</p>

> saya menggunakan **dev-board ESP-32 versi 1,** sehingga board IDE yang digunakan adalah **DOIT ESP32 DEVKIT V1**

Cara untuk mengecek kesesuaian board IDE adalah dengan cara menekan dropdown menu bertuliskan **Select Board,** kemudian pada kotak dialog **Board** cari dengan mengetikan **DOIT**, kemudian pilih **DOIT ESP32 DEVKIT V1.**

<div drawio-diagram="43"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1709445644.png" alt=""/></div>

---

**Langkah 4 |** Mendownload driver USB ke UART. Seperti kita ketahui sebelumnya, bahwa ESP32 berkomunikasi dengan beberapa cara, namun untuk kepentingan upload *binary* file ke register diperlukan antarmuka UART. Disebabkan, sebagian besar komputer yang ada dipasaran menggunakan protokol komunikasi USB (*Universal Serial Bus*), maka diperlukan konverter USB to UART. Nah, untungnya sebagian besar dev-board sudah dilengkapi dengan konverter USB-UART yang dihandle oleh chipset, biasanya berjenis CP2101 or CH340.

<table border="1" id="bkmrk-cp2102-https%3A%2F%2Fwww.s" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 19.3211%;"></col><col style="width: 80.8025%;"></col></colgroup><tbody><tr><td>**CP2102**</td><td>[https://www.silabs.com/interface/usb-bridges/classic/device.cp2101?tab=specs](https://www.silabs.com/interface/usb-bridges/classic/device.cp2101?tab=specs) </td></tr><tr><td>**CH340**</td><td>[https://sparks.gogo.co.nz/ch340.html](https://sparks.gogo.co.nz/ch340.html) </td></tr></tbody></table>

---

### Kode ESP 32 - SIMS

---

<p class="callout info">Kode Untuk Water Quality Sensor (Edited 09 Juli 2024 - 21:41)</p>

```c++
/* Prgrammed for ESP32 Modul Kontroller Power */
/* Edited 9 Juli 2024 21:24 */
/*
   Kaki RTC Default :
     SCL RTC -> 22
     SDA RTC -> 21
*/



#include "RTClib.h"
RTC_DS3231 rtc;

const int relayPin = 18; // Pin relay on di kaki 18 
const int mpin = 5; // pin untuk maintenance
const int buzerPin = 2; // pin buzzer ada di kaki nomor 2
int relayState = 0;
int btnState = 0;
int maintenanceState = 0;

void setup() {
  Serial.begin(115200);
  delay(5000);

  if (! rtc.begin()) {
    Serial.println("Tidak tersambung di RTC");
    Serial.flush();
    while (1) delay(10);
  }

  if (rtc.lostPower()) {
    Serial.println("Konfigurasi ulang timer");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  pinMode(relayPin, OUTPUT);
  pinMode(buzerPin, OUTPUT);
  pinMode(mpin, INPUT);

  // Inisiasi pin maintennance ke high
  digitalWrite(relayPin, HIGH);
}

/* ---------- Deklarasi fungsi - fungsi ------------------- */

void printWaktu(int dt){
  // Fungsi cetak waktu untuk mengepring time dari DS3231
  DateTime now = rtc.now();
  Serial.println();
  Serial.print(now.hour(), DEC);
  Serial.print(":");
  Serial.print(now.minute(), DEC);
  Serial.print(":");
  Serial.print(now.second(), DEC);
  Serial.print(":");
  Serial.print(" ");
  Serial.print(now.day(), DEC);
  Serial.print("/");
  Serial.print(now.month(), DEC);
  Serial.print("/");
  Serial.print(now.year(), DEC);
  delay(dt);
}

void beep_buz(int t, int lama) {
  // Funsi untuk menyalakan beep
  for (int i = 1 ; i <= t ; ++i) {
    digitalWrite(buzerPin, HIGH);
    delay(lama);
    digitalWrite(buzerPin, LOW);
    delay(lama);
  }
}

void relayOn(int set) {
  // Fungsi untuk menyalakan relay
    delay(1000);
    beep_buz(2,100);
    digitalWrite(relayPin, LOW);
    delay(set);
    digitalWrite(relayPin, HIGH);
    beep_buz(1,1500);
    delay(1000);
}

void cekWaktu(int waktu){
  // Fungsi timer untuk otomatisasi
  Serial.println("Proses Cek waktu");
  DateTime now = rtc.now();
  Serial.print("Menit menunjukan nilai : ");
  Serial.println(now.minute());
  switch (now.minute()) {
    case 30:
      Serial.println("Perintah relay ON");
      relayOn(waktu);
    case 0:
      Serial.println("Perintah relay ON");
      relayOn(waktu);
      break;
  }
  Serial.println();
}

void isMaintennance() {
  // Disable maintenance mode
  if (maintenanceState == 1) {
    Serial.println("Kode ini harusnya tidak ter-eksekusi");
    Serial.println("Maintenance mode");
    digitalWrite(relayPin, LOW);
  } else {
    printWaktu(1000);
    cekWaktu(300000);
  }
}

/* Eksekusi program utama */
void loop(){
  isMaintennance();
}
```

# C. Membuat internal LED ESP32 berkedip (blinking)

Proyek kali ini kita akan coba membuat LED internal ESP32 berkedip (*blinking*) berdasarkan interval waktu yang akan kita set dalam *script* di **Arduino IDE.**

<p class="callout success">*weekly project 01 - EL5057 Sensing* System | **Sandi Wibowo - Smart X** </p>

---

##### **Pendahuluan**  


Dalam praktik pemrograman ESP32 untuk membuat LED internal berkedip, kita akan belajar memahami konsep dasar mikrokontroler, penggunaan *Integrated Development Environment* (IDE) seperti Arduino IDE, dan konfigurasi pin pada ESP32. Proses ini melibatkan penyiapan proyek, pengaturan pin, dan penulisan kode sederhana untuk mengontrol LED internal. Melalui langkah-langkah di dalam blog ini, kita bersama-sama akan belajar memahami tentang siklus looping program pada mikrokontroler `void loop() {...}`, memberikan dasar yang kuat untuk pengembangan proyek IoT lebih lanjut dengan ESP32.

---

##### **Kebutuhan** (*requirements*)

Kebutuhan perangkat keras yang harus disiapkan adalah seperti yang disajikan dalam tabel berikut.

<table border="1" id="bkmrk-komputer-%C2%A0-%C2%A0-dev-boa" style="border-collapse: collapse; width: 100%; height: 117.391px;"><colgroup><col style="width: 24.1115%;"></col><col style="width: 75.8885%;"></col></colgroup><tbody><tr style="height: 57.7969px;"><td style="height: 57.7969px;">[![4.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/4.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/4.png)

</td><td style="height: 57.7969px;">**Komputer**

Komputer digunakan untuk membuat script code Arduino IDE yang akan diupload ke dalam Mikrokontroller ESP 32

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">[![1.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/1.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/1.png)

</td><td style="height: 29.7969px;">**Dev-board ESP3**

Digunakan sebagai chipset yang akan diprogram.

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**[![2.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/f8r2.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/f8r2.png)**

</td><td style="height: 29.7969px;">**Kabel data (micro usb)**

Kabel micro usb digunakan untuk interface dari komputer ke dev-board.

</td></tr><tr><td>[![3.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/3.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/3.png)

</td><td>**USB Hub to type-c**

Karena kita menggunakan MacBook Air dengan interface usb type-c, maka dibutuhkan USB untuk meaghubungkan Mikrokontroler denga laptop.

</td></tr></tbody></table>

---

##### **Wiring diagram**

Wiring diagram untuk proyek kita kali ini cukup mudah, yaitu hanya mengkoneksikan port micro usb di **dev-board** ke komputer atau laptop melalui usb port.

<div drawio-diagram="51"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1709449414.png" alt=""/></div>

---

##### **Coding** (menyiapkan program)

Buka aplikasi Android IDE, pilih *board* **DOIT ESP32 DEVKIT V1**, dan pilot port usb yang terkoneksi dengan *dev-board* ESP32, untuk kasus saya alamat yang terdeteksi adalah **/dev/cu.usbserial-001 Serial Port (USB)**. Secara lengkap seperti ditunjukan pada gambar berikut.

<div drawio-diagram="53"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1709451151.png" alt=""/></div>

---

Kebetulan untuk proyek kita kali ini programnya sudah disediakan di menu example Arduino IDE, jadi tinggal buka code dengan mengklik menu **File &gt; Examples &gt; 01.Basics &gt; Blink**.

<div drawio-diagram="54"><img src="https://blog.sandihex.id/uploads/images/drawio/2024-03/drawing-1-1709451246.png" alt=""/></div>

---

Setelah kode program terbuka di halaman utama, klik tombol **centang** untuk melakukan proses *compile*. Proses *compile* hanya memverifiksi kode program terhadap *chipset* yang dipilih kemudian mengubahnya kedalam binary, namun belum menuliskannya ke dalam register *chipset*. Sedangkan untuk proses menulis hasil compiler, gunakan tombol upload yang berbentuk anak panah ke kanan, proses ini akan langsung mengcompile program dan menuliskannya ke dalam *chipset* ESP 32.

[![project-01-uploading.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/project-01-uploading.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/project-01-uploading.png)

Berikut adalah kode program, dari *basics example* yang ada di Arduino IDE:

```c
void setup() {
  // melakukan inisialisasi LED_BUILTIN sebagai output
  pinMode(LED_BUILTIN, OUTPUT);
}

// fungsi untuk looping 
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // menyalakan LED
  delay(1000);                      // menunggu 1000 milisecond
  digitalWrite(LED_BUILTIN, LOW);   // memattikan LED
  delay(1000);                      // menunggu 1000 milisecond
}
```

---

##### **The result**

Setelah proses *compile* selesai ditunjukan dengan notifikasi **done**, pada pojok kanan bawah. Kemudian tekan tombol **EN** pada **dev-board** ESP32 untuk me-*reset* agar program dieksekusi dari awal.

[![weekly_project01-ezgif.com-optimize.gif](https://blog.sandihex.id/uploads/images/gallery/2024-03/weekly-project01-ezgif-com-optimize.gif)](https://blog.sandihex.id/uploads/images/gallery/2024-03/weekly-project01-ezgif-com-optimize.gif)

---

##### **Penjelasan kode** (*how the code works*)

Development board ESP32 berhasil menyala dan mati dalam interval 1 detik, mari kita pahami baris demi baris kode LED blink diatas. Terdapat dua klaster fungsi pada program diatas yaitu fungsi `void setup() {...}` dan `void loop(){...}`, void setup digunakan untuk melakukan inisiasi program pertama kali, dan dieksekusi sekali dalam siklus program berjalan, dan program didalam bracket ini akan dieksekusi lagi setelah user menghidupan ulang atau mengklik tombol EN/RESET pada dev-board. Sedangkan fungsi `loop()` merupkan fungsi yang akan diulang-ulang dalam siklus program berjalan, biasanya program utama akan diletakan didalam fungsi loop ini.

```c
void setup() {
  // melakukan inisialisasi LED_BUILTIN sebagai output
  pinMode(LED_BUILTIN, OUTPUT);
}
```

Baris kode dari 1 sampai 4 berada dalam klaster fungsi `void setup()` yang berarti baris ini diekseskusi satu kali saat pertama chipset dinyalakan. Kode `pinMode(LED_BUILTIN, OUTPUT);` berarti program menginisiasi bahwa variabel `LED_BUILTIN` di assign sebagai `OUTPUT` atau yang akan diekseskusi sebagai keluaran dari program. `LED_BUILTIN` adalah variabel *default* yang merupakan alias dari salah satu GPIO yang terkoneksi dengan internal LED di *development board* versi 1.

```C
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // menyalakan LED
  delay(1000);                      // menunggu 1000 milisecond
  digitalWrite(LED_BUILTIN, LOW);   // memattikan LED
  delay(1000);                      // menunggu 1000 milisecond
}
```

Baris kode 1 sampai 6, berada dalam klaster fungsi `void loop()` yang menunjukan program ini akan diulang-ulang secara berurutatn dari baris kode 2, 3, 4 dan 5. Baris kode 2, `digitalWrite(LED_BUILTIN, HIGH);` memerintahkan kepada mikrokontroller untuk memberikan daya `HIGH` kepada GPIO yang terpasang LED, dengan perintah ini maka `LED_BUILTIN` akan diberi daya sampai perintah selanjutnya dieksekusi. Baris kode ke 3, `delay(1000)` memberikan instruksi kepada kontroler untuk menahan ekseksui perintah selanjutnya selama 1000 milisecond atau 1 detik. Baris kode ke 4, `digitalWrite(LED_BUILTIN, LOW);` menginstruksikan kepada kontroler untuk memutus daya listrik di pin `LED_BUILTIN` sehingga LED akan mati. Baris kode ke 5, sama seperti baris kode nomor 3.

---

##### **Troubleshooting**

<p class="callout warning">Permasalahan yang terjadi pada saat running program ini biasanya terkait dengan ketidaksesuian antara board di IDE dengan development-board ESP32, Namun demikian ada beberapa troubleshooting yang bisa teman-teman lakukan jika mengalami kendala.</p>

- <span style="color: rgb(186, 55, 42);">**Jika port usb tidak terdeteksi di board managment**</span>, biasanya terjadi karena ketidaksesuaian antara chipset yang digunakan di dev-board dengan driver yang diinstal. Bagi pengguna Macbook untuk mengecek usb mana yang terkoneksi dengan laptop kita bisa menggunakan perintah berikut:

```Bash
$sudo ls -lah /dev/ | grep usb
```

[![Screenshot 2024-03-03 at 18.58.01.png](https://blog.sandihex.id/uploads/images/gallery/2024-03/scaled-1680-/screenshot-2024-03-03-at-18-58-01.png)](https://blog.sandihex.id/uploads/images/gallery/2024-03/screenshot-2024-03-03-at-18-58-01.png)

Dari data diatas, dapat kita ketahui bahwa laptop tersebut terkoneksi dengan usb serial yaitu **cu.usbserial-0001** dan **tty.usbserial-0001.**