ESP8266 bekerja pada tegangan 3.3V, jadi seluruh I/O bekerja pada tegangan yang sama. Seluruh pin tidak 5V tolerant, memberikan tegangan lebih dari 3.6V pada pin akan membuat chip “bermasalah”. Arus maksimum yang dapat ditarik dari setiap pin GPIO adalah 12 mA. On board LED terhubung dengan GPIO2 dan GPIO16.
ESP8266 memiliki 17 pin GPIO (0-16) namun hanya 11 pin yang dapat digunakan, karena 6 pin (GPIO6 – GPIO11) terhubung dengan chip flash memory. Jika mencoba menggunakan satu dari pin-pin ini, program akan crash.
Pin GPIO1 (TX0) dan GPIO3 (RX0) digunakan untuk komunikasi secara serial dengan komputer melalui USB.
Modul ESP memeriksa pin GPIO0, GPIO2 dan GPIO15 setiap kali boot, berdasarkan mode-mode berikut:
Silahkan mempelajari catatan terkait dengan boot messsage dan mode boot yang terdapat pada link berikut.
Catatan: kita tidak perlu menambahkan pull-up eksternal pada GPIO2 karena pull-up internal di-enable saat boot.
- GPIO15 selalu pulled low, jadi kita tidak dapat menggunakan internal pull-up resistor. Hal ini harus diperhatikan ketika menggunakan GPIO15 sebagai input untuk membaca sebuah saklar atau menghubungkannya ke divais dengan output open-collector / open-drain seperti I2C.
- GPIO0 pulled high selama operasi normal, jadi tidak dapat menggunakannnya sebagai input Hi-Z.
- GPIO2 tidak dapat low pada saat boot, jadi tidak dapat menghubungkannya dengan switch (active high).
ESP8266 dapat mengalami gagal boot jika beberapa pin pulled LOW atau HIGH:
- GPIO16 (D0): pin HIGH saat BOOT dan jatuh ke ~1 Volt.
- GPIO0 (D3): boot failure jika pulled LOW
- GPIO2 (D4): osilasi dan kemudian HIGH setelah ~ 100 ms, boot failure jika pulled LOW
- GPIO15 (D8): boot failure jika pulled HIGH
- GPIO3 (RX): LOW selama ~ 50 ms kemudian pin HIGH
- GPIO1 (TX): LOW selama ~ 50 ms, kemudian HIGH, boot failure jika pulled LOW
- GPIO10 (SD3): pin HIGH saat BOOT
- GPIO9 (SD2): pin HIGH saat BOOT
Pengertian pin HIGH saat BOOT di atas adalah, pin mengeluarkan sinyal 3.3V ketika ESP8266 boot. Hal ini akan menjadi masalah ketika ada sejumlah periferal active HIGH yang terhubung dengan GPIO-GPIO tersebut. GPIO lainnya, kecuali GPIO5 dan GPIO4, memiliki output LOW saat boot, yang akan menjadi masalah jika terhubung dengan periferal active LOW. Anda dapat membaca artikel ini yang meng-investigasi kondisi dan perilaku setiap GPIO pada saat boot.
GPIO4 (D2) dan GPIO5 (D1) adalah GPIO paling aman jika kita ingin mengoperasikan relay. Kedua pin tersebut sering digunakan untuk komunikasi I2C (Pin SCL dan SDA). Pin lainnya, GPIO14 (D5), GPIO12 (D6) dan GPIO13 (D7). Ketiganya juga aman untuk operasi input dan output. Ketiganya terhubung ke jalur SPI (Pin SCLK, MISO dan MOSI). Ketika menggunakan periferal SPI, pin CS dapat menggunakan GPIO15 (D8), namun perlu hati-hati karena proses boot akan gagal jika pin ini pulled HIGH.
Jadi, dengan memahami karakter dari pin GPIO yang ada, maka kita dapat merangkai dengan aman, terhindar dari hal-hal yang tidak diharapkan. Untuk opsi yang lebih leluasa, bisa mempertimbangkan ESP32, karena memiliki GPIO yang lebih banyak.
Pinout NodeMCU memiliki label D0 – D8, RX serta TX. Namun ketika memrogramnya menggunakan Arduino IDE, label yang tertera tidak sesuai dengan nomor GPIO.
NodeMCU memiliki pemetaan pin yang sedikit aneh. Nomor pin yang tertera pada board tidak sesuai dengan nomor GPIO ESP8266. Berikut adalah konstanta yang kami definisikan untuk memudahkan penggunaan:
#define PIN_WIRE_SDA (4)
#define PIN_WIRE_SCL (5)
static const uint8_t SDA = PIN_WIRE_SDA;
static const uint8_t SCL = PIN_WIRE_SCL;
static const uint8_t LED_BUILTIN = 16;
static const uint8_t BUILTIN_LED = 16;
static const uint8_t D0 = 16;
static const uint8_t D1 = 5;
static const uint8_t D2 = 4;
static const uint8_t D3 = 0;
static const uint8_t D4 = 2;
static const uint8_t D5 = 14;
static const uint8_t D6 = 12;
static const uint8_t D7 = 13;
static const uint8_t D8 = 15;
static const uint8_t D9 = 3;
static const uint8_t D10 = 1;
Diagram rangkaian dari NodeMCU memberikan informasi yang lebih jelas terkait hubungan antara NodeMCU dengan GPIO ESP8266. Jangan pernah menggunakan GPIO0 (D3) sebagai pin input, pin ini adalah flash button. Jika memiliki kondisi LOW pada saat power ON, akan menempatkan ESP dalam programming mode.
Pin VU adalah pin USB 5V, hanya bekerja ketika NodeMCU dicatu melalui port micro USB. Pin VIN adalah pin untuk mencatu NodeMCU menggunakan catu daya eksternal (7V – 12V).
Untuk meng-enable PWM pada pin tertentu, gunakan analogWrite(pin, value); di mana pin adalah digital pin, dan value adalah angka antara 0 – 1023. Untuk mengubah bit depth dari output PWM, gunakan analogWriteRange(newRange); Frekuensi PWM dapat diubah menggunakan analogWriteFreq(newFreq); newFreq antara 100 – 1000 Hz.
Untuk input analog, hanya terdapat satu kanal pada pin A0, 0 = 0V, 1023 = 1V). ESP dapat menggunakan ADC-nya untuk mengukur tegangan catu. Untuk melakukan hal ini, sertakan ADC_MODE(ADC_VCC); pada bagian atas dari sketch, dan gunakan ESP.getVcc(); untuk mendapatkannya. Jika menggunakannya untuk membaca tegangan catu, pin analog tidak dapat dihubungkan dengan divais.
Untuk menggunakan UART0 (TX=GPIO1, RX=GPIO3) dapat menggunakan obyek Serial seperti pada Arduino: Serial.begin(baud); Untuk menggunakan pin alternatif (TX=GPIO15, RX=GPIO13) gunakan Serial.swap(); setelah Serial.begin(); Untuk menggunakan UART1 (TX=GPIO2) gunakan obyek Serial1.
Satu yang harus diingat adalah ketika menulis program untuk ESP8266 dimana sketch harus berbagi sumber daya (waktu CPU dan memori) dengan WiFi dan TCP-stacks (software yang berjalan di background dan menangani seluruh fungsi WiFi dan mengelola TCP stack). Jika kode yang kita susun eksekusinya terlalu lama dan “tidak memberi kesempatan” TCP stacks untuk melakukan tugasnya, maka akan terjadi crash dan kita dapat kehilangan data. Yang terbaik adalah menjaga waktu eksekusi dalam loop dalam beberapa ratus milidetik.
Setiap kali main loop diulang, sketch yang kita susun memberi kesempatan kepada WiFi dan TCP untuk menangani semua WiFi dan TCP request. Jika loop lebih lama dari ini (blocking loop), kita harus secara eksplisit memberi waktu CPU kepada WiFi / TCP stack, dengan menyertakan delay(0); atau yield(); Jika tidak, network communication tidak akan bekerja sebagaimana mestinya, dan jika lebih lama dari 3 detik, soft WDT (Watch Dog Timer) akan me-reset ESP. Jika soft WDT di-disable, setelah sedikit lebih dari 8 detik, hardware WDT akan me-reset chip.
pinMode(12, INPUT_PULLUP);
while (digitalRead(12) == HIGH)
yield(); // Do (almost) nothing -- yield to allow ESP8266 background functions
Serial.println("Button is pressed!"); // Print button pressed message.
Dari pespektif mikrokontroler, 3 detik adalah waktu yang panjang (240 juta siklus clock). Jadi, selain kita melakukan proses yang ekstrim atau mengirim string yang sangat panjang melalui Serial, kita tidak akan melewati batas ini. Perlu diingat bahwa menambahkan yield(); dalam loop dapat memerlukan waktu lebih dari 100 ms, tergantung situasi saat itu.
void delay(unsigned long ms) { uint32_t start = micros(); while (ms > 0) { yield(); while ( ms > 0 && (micros() - start) >= 1000) { ms--; start += 1000; } } }