Rabu, 08 April 2026

Membuat Weather Station dengan NodeMCU & OLED: Studi Kasus Pangandaran (Solusi API Key Error)

Membuat Weather Station NodeMCU & OLED: Studi Kasus Pangandaran (Solusi API Key Error)

🌤️ Membuat Weather Station dengan NodeMCU & OLED: Studi Kasus Pangandaran (Solusi API Key Error)


PS
Pidin Saripudin, S.Kom

Praktisi IoT & Embedded System | 8+ tahun pengalaman

📅 Publikasi: 7 April 2026 | Diperbarui: 7 April 2026 ⏱️ Estimasi baca: 12 menit 🏷️ #NodeMCU #ESP8266 #WeatherStation #Pangandaran

📍 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.

📌 Lokasi Studi Kasus: Pangandaran, Jawa Barat (Koordinat: -7.6956, 108.6500). Cocok untuk pemantau cuaca pantai selatan Jawa.

🛠️ 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 PinNodeMCU PinKeterangan
GNDGNDGround
VCC3.3VPower 3.3 Volt
SDAD2 (GPIO4)Data I2C
SCLD1 (GPIO5)Clock I2C
⚠️ Catatan: Pastikan alamat I2C OLED adalah 0x3C (default). Jika tidak muncul, gunakan scanner I2C atau coba alamat 0x3D.

🔑 3. Mendapatkan API Key OpenWeatherMap

OpenWeatherMap menyediakan data cuaca gratis (60 kali/menit) dengan registrasi. Langkah-langkahnya:

  1. Buka OpenWeatherMap API
  2. Klik "Sign Up" dan buat akun (email & password)
  3. Verifikasi email melalui tautan yang dikirimkan
  4. Login ke akun, lalu buka menu "API Keys" (https://home.openweathermap.org/api_keys)
  5. 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:

📟 Pesan Error yang Muncul:
{"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):

🔗 Uji Coba URLCopy ke browser
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.

💡 Tips Penting: Jangan membuat banyak API key baru. Cukup gunakan key default yang tertera di dashboard. Key baru juga memerlukan waktu aktivasi yang sama.

💻 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.

📟 Weather_Station_Pangandaran.inoArduino IDE
#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

  1. Koneksi WiFi — NodeMCU terhubung ke jaringan internet.
  2. HTTP Request ke API — Mengirim request GET ke OpenWeatherMap dengan koordinat Pangandaran.
  3. Parsing JSON — Data suhu, kelembaban, kondisi diekstrak dari respons.
  4. Tampilan OLED — Dua halaman bergantian setiap 6 detik (halaman utama dan detail).
  5. 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.

📊 Contoh Data yang Ditampilkan:
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!

© 2026 Pidin Saripudin, S.Kom | Artikel ini dilisensikan untuk edukasi. Dilarang menyalin tanpa izin.

Tidak ada komentar:

Posting Komentar

Membuat Weather Station dengan NodeMCU & OLED: Studi Kasus Pangandaran (Solusi API Key Error)

Membuat Weather Station NodeMCU & OLED: Studi Kasus Pangandaran (Solusi API Key Error) ...