🌤️ Membuat Weather Station dengan NodeMCU & OLED: Studi Kasus Pangandaran (Solusi API Key Error)
📖 Daftar Isi
📍 1. Pendahuluan
Pernahkah Anda ingin mengetahui suhu dan kondisi cuaca terkini di Pangandaran secara real-time tanpa membuka ponsel? Dengan kombinasi NodeMCU ESP8266 (mikrokontroler murah dengan WiFi) dan OLED display 0.96 inci, Anda bisa membuat stasiun cuaca mini sendiri. Alat ini akan mengambil data cuaca langsung dari internet melalui API OpenWeatherMap, lalu menampilkannya di layar OLED. Artikel ini tidak hanya menyajikan kode lengkap, tetapi juga membahas tuntas masalah umum error 401 Invalid API Key yang sering dialami pemula.
🛠️ 2. Komponen & Skema Koneksi
Komponen yang dibutuhkan sangat sederhana dan mudah ditemukan:
- NodeMCU ESP8266 (board dengan chip ESP-12E)
- OLED Display 0.96" SSD1306 (komunikasi I2C)
- Kabel jumper Female-to-Female (4 buah)
- Power bank atau kabel USB (untuk catu daya)
Skema Koneksi I2C (4 kabel):
| OLED Pin | NodeMCU Pin | Keterangan |
|---|---|---|
| GND | GND | Ground |
| VCC | 3.3V | Power 3.3 Volt |
| SDA | D2 (GPIO4) | Data I2C |
| SCL | D1 (GPIO5) | Clock I2C |
🔑 3. Mendapatkan API Key OpenWeatherMap
OpenWeatherMap menyediakan data cuaca gratis (60 kali/menit) dengan registrasi. Langkah-langkahnya:
- Buka OpenWeatherMap API
- Klik "Sign Up" dan buat akun (email & password)
- Verifikasi email melalui tautan yang dikirimkan
- Login ke akun, lalu buka menu "API Keys" (https://home.openweathermap.org/api_keys)
- Salin API key default (campuran huruf dan angka)
❌ 4. Mengatasi Error 401 "Invalid API Key"
Error ini adalah kendala paling umum saat pertama kali mencoba. Berikut penyebab dan solusinya:
{"cod":401, "message": "Invalid API key. Please see https://openweathermap.org/faq#error401"}
Penyebab Error 401:
- API key salah ketik — pastikan tidak ada spasi atau karakter tambahan.
- API key belum diaktifkan — OpenWeatherMap membutuhkan waktu 2-6 jam setelah verifikasi email untuk mengaktifkan key baru.
- Akun belum diverifikasi — cek email dan klik tautan verifikasi.
- Menggunakan key dari akun yang berbeda — key bersifat privat per akun.
Langkah Verifikasi API Key (Sebelum Upload ke NodeMCU):
Uji key terlebih dahulu di browser dengan URL berikut (ganti KUNCI_ANDA):
https://api.openweathermap.org/data/2.5/weather?lat=-7.6956&lon=108.6500&units=metric&appid=KUNCI_ANDA
Jika berhasil, browser akan menampilkan data JSON cuaca Pangandaran. Jika error 401, tunggu 2-6 jam atau cek kembali key Anda.
💻 5. Kode Program Lengkap (Arduino IDE)
Berikut kode yang sudah diuji coba untuk lokasi Pangandaran. Ganti YOUR_API_KEY dengan API key asli Anda yang sudah aktif.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
// ==================== KONFIGURASI OLED ====================
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// ==================== KONFIGURASI WIFI ====================
const char* ssid = "7G"; // Ganti dengan SSID WiFi Anda
const char* password = "forget22"; // Ganti password WiFi Anda
// ==================== API KEY OPENWEATHERMAP ====================
// Dapatkan dari: https://home.openweathermap.org/api_keys
const char* apiKey = "YOUR_API_KEY"; // <-- -="" 0="" 0x3c="" 10="" 25="" 30="" 40="" 80="" angandaran="" api="" apikey="" apisuccess="false;" asli="" assword="" attempts="" bool="" client.available="" client.connect="" client.print="" client="" close="" const="" cuaca="===================" data...="" delay="" dengan="" deskripsi="" display.begin="" display.cleardisplay="" display.display="" display.print="" display.println="" display.setcursor="" display.settextcolor="" display.settextsize="" ek="" else="" engambil="" enghubungkan...="" enghubungkan="" feelslike="0;" float="" for="" gagal="" ganti="" host.c_str="" host="" http="" i="" if="" ifi.status="" ifi="" inisialisasi="" int="" isi.length="" isi="" judul.length="" judul="" kecepatanangin="0;" kelembaban="0," key="" kondisi="" konek="" koneksi="" koordinat="" lasterror="" lastupdate="0;" latitude="" lon=" + String(longitude,4) +
" long="" longitude="108.6500;" menit="" millis="" n="" ngagal="" nwifi="" ok="" oled="" onnection:="" ost:="" pangandaran="==" password="" path="" r="" return="" rror="" serial.begin="" serial.print="" serial.println="" setup="" ssid="" station="" string="" suhu="0," tampilkanpesan="" tekanan="0;" terhubung="" timeout="" tring="" ukses="" units="metric&appid=" unsigned="" updateinterval="600000;" updateweatherdata="" variabel="" void="" weather="" while="" wifi.begin="" wifi="" wificlient="" wl_connected=""> 10000) {
lastError = "Timeout API";
tampilkanPesan("Error", lastError);
client.stop();
return;
}
delay(100);
}
String response = "";
while (client.available()) response += (char)client.read();
client.stop();
if (response.indexOf("401") > 0) {
lastError = "API Key Invalid!";
tampilkanPesan("Error", "Cek API Key");
return;
}
int jsonStart = response.indexOf("{");
if (jsonStart == -1) {
lastError = "Response invalid";
tampilkanPesan("Error", lastError);
return;
}
String jsonString = response.substring(jsonStart);
DynamicJsonDocument doc(4096);
DeserializationError error = deserializeJson(doc, jsonString);
if (error) {
lastError = "Parse JSON gagal";
tampilkanPesan("Error", lastError);
return;
}
suhu = doc["main"]["temp"];
feelsLike = doc["main"]["feels_like"];
kelembaban = doc["main"]["humidity"];
kondisi = doc["weather"][0]["main"].as();
deskripsi = doc["weather"][0]["description"].as();
tekanan = doc["main"]["pressure"];
kecepatanAngin = doc["wind"]["speed"];
apiSuccess = true;
Serial.println("Cuaca Pangandaran: " + String(suhu) + "°C, " + kondisi);
}
void tampilkanCuaca() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(28, 0);
display.println("PANGANDARAN");
display.drawLine(0, 10, 128, 10, SSD1306_WHITE);
// Ikon sederhana
display.fillCircle(20, 32, 10, SSD1306_WHITE);
display.fillCircle(20, 32, 8, SSD1306_BLACK);
display.setTextSize(2);
display.setCursor(48, 20);
display.print(int(suhu));
display.cp437(true);
display.write(167);
display.print("C");
display.setTextSize(1);
display.setCursor(48, 40);
display.print("RH: ");
display.print(kelembaban);
display.print("%");
display.setCursor(4, 54);
display.print(kondisi);
display.display();
}
void tampilkanDetail() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(2, 2);
display.print("Suhu: "); display.print(suhu,1); display.write(167); display.print("C");
display.setCursor(2, 14);
display.print("Kelembaban: "); display.print(kelembaban); display.print("%");
display.setCursor(2, 26);
display.print("Angin: "); display.print(kecepatanAngin,1); display.print(" m/s");
display.setCursor(2, 38);
display.print("Tekanan: "); display.print(tekanan); display.print(" hPa");
display.setCursor(2, 50);
if(deskripsi.length()>16) deskripsi = deskripsi.substring(0,14);
display.print(deskripsi);
display.display();
}
void loop() {
unsigned long now = millis();
if (now - lastUpdate > updateInterval || lastUpdate == 0) {
updateWeatherData();
lastUpdate = now;
}
if (apiSuccess) {
tampilkanCuaca();
delay(6000);
tampilkanDetail();
delay(5000);
} else {
tampilkanPesan("Error", lastError);
delay(30000);
updateWeatherData();
lastUpdate = millis();
}
} -->
Library yang Diperlukan (Install via Library Manager):
- Adafruit SSD1306 — driver untuk OLED
- Adafruit GFX — library grafis
- ArduinoJson — parsing data JSON (versi 6.x)
⚙️ 6. Cara Kerja Program
- Koneksi WiFi — NodeMCU terhubung ke jaringan internet.
- HTTP Request ke API — Mengirim request GET ke OpenWeatherMap dengan koordinat Pangandaran.
- Parsing JSON — Data suhu, kelembaban, kondisi diekstrak dari respons.
- Tampilan OLED — Dua halaman bergantian setiap 6 detik (halaman utama dan detail).
- Update Otomatis — Data diperbarui setiap 10 menit.
🖥️ 7. Tampilan OLED
Halaman 1 (Cuaca Utama): Menampilkan nama kota (PANGANDARAN), suhu besar, kelembaban, dan kondisi cuaca singkat.
Halaman 2 (Detail): Menampilkan suhu, kelembaban, kecepatan angin, tekanan udara, dan deskripsi cuaca lengkap.
Suhu: 29°C | Kelembaban: 78% | Angin: 3.2 m/s | Tekanan: 1011 hPa | Kondisi: Light Rain
📝 8. Kesimpulan
Proyek Weather Station dengan NodeMCU dan OLED sangat memungkinkan untuk dibuat sendiri dengan biaya terjangkau. Kendala utama biasanya terletak pada aktivasi API Key OpenWeatherMap yang membutuhkan waktu 2-6 jam. Dengan mengikuti panduan di atas, Anda dapat memantau cuaca Pangandaran secara real-time dari rumah. Kembangkan lebih lanjut dengan menambahkan sensor lokal atau menyimpan data ke database. Selamat berkarya!



