Senin, 05 Oktober 2026

PENGAPLIKASIAN ESP UNTUK MONITORING SUHU KE DALAM LOCAL WEB

Disusun Oleh:

Muhamad Rizaldhani Darmawan24051204004
Novanda Ega Arenta24051204030
Muhammad Fiqih Mu'azaidin24051204031
I Made Nandana Devadatta Giri24051204090
BAB I
PENDAHULUAN

1.1.  Latar Belakang

Suhu merupakan salah satu parameter lingkungan yang sangat penting untuk dipantau dalam berbagai sektor, seperti perindustrian, perkantoran, server, hingga lingkup rumah tangga. Pada kenyataannya, pemantauan suhu secara manual seringkali tidak efisien dan kurang akurat apabila data dibutuhkan secara terus-menerus.

Perkembangan teknologi membuka peluang untuk mengatasi permasalahan tersebut melalui sistem otomatisasi dan monitoring jarak jauh berbasis mikrokontroler. Salah satu penerapannya adalah sistem monitoring suhu yang memanfaatkan sensor suhu untuk membaca kondisi secara real-time, kemudian memprosesnya menggunakan mikrokontroler berfasilitas Wi-Fi dari keluarga ESP (seperti ESP8266 atau ESP32) untuk menampilkannya pada sebuah antarmuka halaman web lokal (Local Web).

Berdasarkan latar belakang tersebut, kelompok kami merancang dan melakukan pengujian sistem monitoring suhu berbasis web lokal menggunakan mikrokontroler ESP. Sistem ini diharapkan dapat menjadi solusi yang praktis untuk memantau suhu ruangan secara nirkabel melalui peramban (browser) di perangkat apapun tanpa memerlukan pengkabelan yang rumit.

1.2.  Rumusan Masalah

  1. Bagaimana merancang sistem monitoring suhu menggunakan mikrokontroler ESP dan sensor suhu?
  2. Bagaimana cara kerja sensor suhu dalam membaca kondisi lingkungan dan mengirimkan data tersebut ke mikrokontroler?
  3. Bagaimana mikrokontroler ESP dapat dikonfigurasi sebagai Web Server lokal untuk menampilkan data suhu secara real-time?
  4. Bagaimana hasil pengujian antarmuka Local Web saat diakses melalui perangkat dalam satu jaringan?

1.3.  Tujuan Laporan

  1. Merancang sistem monitoring suhu nirkabel menggunakan modul ESP dan sensor suhu (seperti DHT11/DHT22).
  2. Memahami prinsip kerja sensor suhu serta cara pembacaan data digital melalui program Arduino IDE.
  3. Menerapkan pemrograman web server sederhana (HTML/C++) pada ESP untuk mengelola permintaan HTTP dari client.
  4. Menguji keberhasilan sistem dengan memantau tampilan antarmuka web melalui alamat IP yang diberikan pada jaringan lokal.

1.4.  Manfaat Penulisan

Penyusunan laporan praktikum ini diharapkan dapat memberikan manfaat yang komprehensif, baik secara teoritis maupun praktis, di antaranya adalah:

  1. Bagi mahasiswa, laporan ini menjadi sarana untuk memperdalam pemahaman mengenai konsep Internet of Things (IoT), komunikasi nirkabel berbasis Wi-Fi, dan implementasi Web Server pada mikrokontroler.
  2. Bagi dunia pendidikan, laporan ini dapat dijadikan referensi maupun bahan pembelajaran untuk praktikum sejenis, khususnya yang berkaitan dengan sistem pemantauan jarak jauh.
  3. Bagi masyarakat umum, konsep yang dibahas dalam laporan ini dapat dikembangkan lebih lanjut menjadi perangkat Smart Home yang membantu memantau kenyamanan suhu ruangan secara praktis lewat smartphone.
BAB II
TINJAUAN PUSTAKA

2.1.  Dasar Teori

A. Internet of Things (IoT)

Internet of Things (IoT) merupakan konsep yang menghubungkan berbagai perangkat fisik dengan jaringan internet atau jaringan lokal (LAN) sehingga perangkat tersebut dapat saling bertukar data dan dipantau secara jarak jauh. Dalam konteks proyek ini, konsep IoT diterapkan melalui mikrokontroler yang mengumpulkan data suhu dari lingkungan fisik, lalu mendistribusikannya melalui jaringan Wi-Fi agar dapat dipantau melalui peramban web (browser). (Nayyar & Puri, 2026) .

B. Mikrokontroler ESP32

ESP32 adalah mikrokontroler berbiaya rendah dan hemat daya yang dikembangkan oleh Espressif Systems. Modul ini sangat populer untuk proyek IoT karena sudah terintegrasi dengan fitur komunikasi nirkabel Wi-Fi dan Bluetooth. Pada proyek ini, ESP32 berfungsi sebagai pusat kendali utama (otak) yang bertugas mengambil data dari sensor, menampilkannya ke layar LCD, serta bertindak sebagai Local Web Server untuk melayani permintaan dari pengguna (client). (Espressif Systems, 2026) .

C. Sensor DHT11 (Suhu dan Kelembapan)

DHT11 adalah sensor digital yang memiliki fungsi ganda, yaitu mengukur suhu udara (dalam derajat Celsius) dan tingkat kelembapan relatif lingkungan sekitar (dalam persen). Sensor ini menghasilkan sinyal keluaran digital murni yang langsung dapat dibaca oleh pin mikrokontroler tanpa memerlukan konversi analog ke digital (ADC). (Aosong, 2026) .

D. LCD 16x2 dengan Modul I2C

Liquid Crystal Display (LCD) 16x2 adalah layar elektronik yang mampu menampilkan 16 karakter dalam 2 baris. Pada proyek ini, LCD digabungkan dengan modul I2C (Inter-Integrated Circuit). Penggunaan modul I2C sangat mengefisienkan jumlah pin yang digunakan; dari yang awalnya membutuhkan banyak pin digital, menjadi hanya membutuhkan 4 pin saja, yaitu VCC, GND, SDA (Data), dan SCL (Clock). (NXP Semiconductors, 2026) .

E. Local Web Server

Web Server adalah perangkat lunak (atau sistem pada mikrokontroler) yang berfungsi untuk menerima permintaan (HTTP request) dari peramban web klien dan mengirimkan kembali (HTTP response) berupa berkas HTML, JSON, atau data lainnya. Dalam jaringan lokal (Local Web), sistem ini hanya dapat diakses oleh perangkat-perangkat (seperti laptop atau smartphone) yang terhubung pada jaringan Wi-Fi (SSID) yang sama dengan ESP32.

2.2.  Komponen

Berikut adalah rincian komponen perangkat keras (hardware) dan perangkat lunak (software) yang digunakan dalam implementasi kedua sistem simulasi berbasis Cirkit Designer ini:

NoKomponenFungsi
1ESP8266 / ESP32Sebagai mikrokontroler utama yang memproses data sensor dan menjalankan Local Web Server.
2Sensor Suhu DHT11Membaca suhu lingkungan sekitarnya dan mengirimkan nilai digital ke ESP.
3LCD 16 x 2Menghubungkan seluruh komponen pada rangkaian (ESP ke Sensor).
4BreadboardSebagai papan sirkuit untuk menyusun komponen secara sementara tanpa penyolderan.
5Kabel Data USBMenyuplai daya ke modul ESP dan digunakan untuk mengunggah program dari komputer ke board.
6LCD 16x2 Modul I2CMedia output visual pada perangkat keras untuk menampilkan data suhu, kelembapan, pesan kegagalan sensor, hingga alamat IP secara langsung.
BAB III
PEMBAHASAN

3.1.  Penjelasan Simulasi

Rangkaian sistem monitoring suhu dan kelembapan

Sistem IoT yang dibuat merupakan alat monitoring suhu dan kelembapan menggunakan ESP32, sensor DHT11, dan LCD 16×2 dengan modul I2C. Sistem ini juga dilengkapi dengan koneksi WiFi dan web server sehingga data hasil pembacaan sensor dapat ditampilkan melalui browser pada perangkat yang berada dalam jaringan yang sama.

Cara kerja sistem dimulai ketika ESP32 dinyalakan. Pada tahap awal, ESP32 melakukan inisialisasi komunikasi I2C untuk LCD, sensor DHT11, serta koneksi WiFi. LCD digunakan sebagai media untuk menampilkan informasi secara langsung pada perangkat, sedangkan WiFi digunakan agar ESP32 dapat menyediakan halaman monitoring berbasis web.

Setelah sensor DHT11 aktif, ESP32 melakukan pembacaan suhu dan kelembapan secara berkala setiap 2 detik. Data yang berhasil dibaca disimpan ke dalam variabel program dan ditampilkan pada LCD dalam bentuk nilai suhu dalam derajat Celsius dan kelembapan dalam persen. Selain itu, ESP32 menjalankan WebServer pada port 80. Ketika pengguna membuka alamat IP ESP32 melalui browser, ESP32 mengirimkan halaman web monitoring yang menampilkan nilai serta grafik perubahan data.

Halaman web mengambil data terbaru dari ESP32 melalui endpoint /data menggunakan metode fetch() dengan format JSON sehingga dapat dibaca oleh JavaScript pada halaman web. Browser melakukan permintaan data setiap 3 detik, kemudian memperbarui nilai suhu, kelembapan, waktu pembaruan, dan grafik.

Sistem ini memiliki dua mekanisme pertahanan (penanganan error):

  1. Pengecekan Sensor: Apabila hasil pembacaan sensor berupa NaN, sistem menganggap sensor gagal dibaca. LCD akan menampilkan pesan "Gagal membaca sensor DHT11", sedangkan halaman web akan menunjukkan status bahwa sensor mengalami masalah.
  2. Koneksi Ulang WiFi: Apabila koneksi WiFi terputus, sistem akan mencoba menghubungkan kembali ESP32 ke jaringan setiap 10 detik sehingga sistem tetap berjalan tanpa perlu melakukan restart secara manual.

Secara keseluruhan, alur kerja pemrosesan data adalah:

  1. DHT11 → ESP32 → LCD (Untuk monitoring langsung).
  2. DHT11 → ESP32 → WiFi → Web Server → Browser (Untuk monitoring nirkabel).

3.2.  Kode Program

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <WiFi.h>
#include <WebServer.h>

// ====== UBAH BAGIAN INI ======
const char* WIFI_SSID = "NAMA_WIFI_ANDA";
const char* WIFI_PASS = "PASSWORD_WIFI_ANDA";
// =============================

#define DHT_PIN 13
#define DHT_TYPE DHT11
#define I2C_SDA 21
#define I2C_SCL 22

const unsigned long INTERVAL_BACA = 2000;
const unsigned long INTERVAL_RECONNECT = 10000;

DHT dht(DHT_PIN, DHT_TYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
WebServer server(80);

float suhuTerakhir = 0;
float lembapTerakhir = 0;
bool sensorOK = false;
unsigned long terakhirBaca = 0;
unsigned long terakhirReconnect = 0;

const char HALAMAN[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Monitoring Suhu dan Kelembapan</title>
<style>
  * { box-sizing: border-box; }
  body { margin:0; font-family:system-ui,Arial,sans-serif; background:#f1f5f9; color:#0f172a; }
  main { max-width:800px; margin:0 auto; padding:16px; }
  header { display:flex; flex-wrap:wrap; justify-content:space-between; align-items:center; gap:8px; }
  h1 { font-size:1.3rem; margin:0; }
  .badge { padding:6px 12px; border-radius:999px; font-size:.85rem; font-weight:600; color:#fff; }
  .online { background:#16a34a; }
  .offline { background:#dc2626; }
  .cards { display:grid; grid-template-columns:1fr 1fr; gap:12px; margin-top:16px; }
  .card { background:#fff; border-radius:12px; padding:20px; text-align:center; box-shadow:0 1px 4px rgba(0,0,0,.08); }
  .label { margin:0; color:#64748b; }
  .value { margin:8px 0 0; font-size:2.6rem; font-weight:700; }
  .value small { font-size:1.1rem; color:#64748b; }
  .update { color:#64748b; font-size:.9rem; }
  .chart-box { background:#fff; border-radius:12px; padding:16px; box-shadow:0 1px 4px rgba(0,0,0,.08); }
  canvas { width:100%; height:220px; display:block; }
  .legend { font-size:.85rem; margin:0 0 8px; }
  @media (max-width:480px) { .value { font-size:2rem; } }
</style>
</head>
<body>
<main>
  <header>
    <h1>Monitoring Suhu dan Kelembapan</h1>
    <span id="status" class="badge offline">Menunggu data...</span>
  </header>

  <section class="cards">
    <div class="card"><p class="label">Suhu</p><p class="value"><span id="temp">--</span><small> &deg;C</small></p></div>
    <div class="card"><p class="label">Kelembapan</p><p class="value"><span id="hum">--</span><small> %</small></p></div>
  </section>

  <p class="update">Update terakhir: <span id="time">-</span></p>

  <section class="chart-box">
    <p class="legend"><span style="color:#ef4444">&#9632; Suhu (&deg;C)</span> &nbsp; <span style="color:#3b82f6">&#9632; Kelembapan (%)</span></p>
    <canvas id="chart"></canvas>
  </section>
</main>

<script>
var MAX_TITIK = 40;
var elTemp = document.getElementById("temp");
var elHum = document.getElementById("hum");
var elTime = document.getElementById("time");
var elStatus = document.getElementById("status");
var canvas = document.getElementById("chart");
var dataSuhu = [];
var dataLembap = [];

function setStatus(ok, teks) {
  elStatus.textContent = teks;
  elStatus.className = "badge " + (ok ? "online" : "offline");
}

function garis(ctx, data, warna, w, h, pad) {
  if (data.length < 2) return;
  var min = Math.min.apply(null, data) - 1;
  var max = Math.max.apply(null, data) + 1;
  ctx.strokeStyle = warna;
  ctx.lineWidth = 2;
  ctx.beginPath();
  for (var i = 0; i < data.length; i++) {
    var x = pad + i * (w - 2 * pad) / (MAX_TITIK - 1);
    var y = h - pad - (data[i] - min) / (max - min) * (h - 2 * pad);
    if (i === 0) ctx.moveTo(x, y); else ctx.lineTo(x, y);
  }
  ctx.stroke();
}

function gambarGrafik() {
  var dpr = window.devicePixelRatio || 1;
  var w = canvas.clientWidth;
  var h = 220;
  canvas.width = w * dpr;
  canvas.height = h * dpr;
  var ctx = canvas.getContext("2d");
  ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
  ctx.clearRect(0, 0, w, h);

  ctx.strokeStyle = "#e2e8f0";
  ctx.lineWidth = 1;
  for (var i = 0; i <= 4; i++) {
    var gy = 20 + i * (h - 40) / 4;
    ctx.beginPath(); ctx.moveTo(20, gy); ctx.lineTo(w - 20, gy); ctx.stroke();
  }
  garis(ctx, dataSuhu, "#ef4444", w, h, 20);
  garis(ctx, dataLembap, "#3b82f6", w, h, 20);
}

async function ambilData() {
  try {
    var res = await fetch("/data", { cache: "no-store" });
    var d = await res.json();

    if (d.temperature === null) {
      setStatus(false, "Sensor gagal dibaca");
      return;
    }

    elTemp.textContent = d.temperature.toFixed(1);
    elHum.textContent = d.humidity.toFixed(1);
    elTime.textContent = new Date().toLocaleString("id-ID");
    setStatus(true, "Online");

    dataSuhu.push(d.temperature);
    dataLembap.push(d.humidity);
    if (dataSuhu.length > MAX_TITIK) { dataSuhu.shift(); dataLembap.shift(); }

    try { gambarGrafik(); } catch (e) { console.error(e); }
  } catch (e) {
    setStatus(false, "Error: " + e.message);
    console.error(e);
  }
}

ambilData();
setInterval(ambilData, 3000);
</script>
</body>
</html>
)rawliteral";

void handleRoot() {
  server.send_P(200, "text/html; charset=utf-8", HALAMAN);
}

void handleData() {
  String json;
  if (sensorOK) {
    json = "{\"temperature\":" + String(suhuTerakhir, 1) +
           ",\"humidity\":" + String(lembapTerakhir, 1) + "}";
  } else {
    json = "{\"temperature\":null,\"humidity\":null}";
  }
  server.sendHeader("Cache-Control", "no-store");
  server.send(200, "application/json", json);
}

void tampilLCD() {
  if (!sensorOK) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Gagal membaca");
    lcd.setCursor(0, 1);
    lcd.print("sensor DHT11");
    return;
  }
  lcd.setCursor(0, 0);
  lcd.print("Suhu: ");
  lcd.print(suhuTerakhir, 1);
  lcd.write((uint8_t)223);
  lcd.print("C  ");

  lcd.setCursor(0, 1);
  lcd.print("Lembap: ");
  lcd.print(lembapTerakhir, 1);
  lcd.print("%  ");
}

void setup() {
  Serial.begin(115200);
  Wire.begin(I2C_SDA, I2C_SCL);
  dht.begin();

  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.print("Menyambung WiFi");

  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);

  int percobaan = 0;
  while (WiFi.status() != WL_CONNECTED && percobaan < 30) {
    delay(500);
    Serial.print(".");
    percobaan++;
  }

  lcd.clear();
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("\nWiFi terhubung!");
    Serial.print("Buka di browser: http://");
    Serial.println(WiFi.localIP());
    lcd.setCursor(0, 0);
    lcd.print("Buka di browser:");
    lcd.setCursor(0, 1);
    lcd.print(WiFi.localIP());
    delay(4000);
  } else {
    Serial.println("\nWiFi gagal, akan dicoba lagi di loop.");
    lcd.print("WiFi gagal");
    delay(1500);
  }
  lcd.clear();

  server.on("/", handleRoot);
  server.on("/data", handleData);
  server.begin();
  Serial.println("Web server berjalan.");
}

void loop() {
  server.handleClient();

  unsigned long sekarang = millis();

  if (WiFi.status() != WL_CONNECTED && sekarang - terakhirReconnect >= INTERVAL_RECONNECT) {
    terakhirReconnect = sekarang;
    Serial.println("WiFi terputus, mencoba reconnect...");
    WiFi.disconnect();
    WiFi.begin(WIFI_SSID, WIFI_PASS);
  }

  if (sekarang - terakhirBaca >= INTERVAL_BACA) {
    terakhirBaca = sekarang;

    float lembap = dht.readHumidity();
    float suhu = dht.readTemperature();

    if (isnan(lembap) || isnan(suhu)) {
      sensorOK = false;
      Serial.println("Gagal membaca DHT11!");
    } else {
      sensorOK = true;
      suhuTerakhir = suhu;
      lembapTerakhir = lembap;
      Serial.printf("Suhu: %.1f C | Lembap: %.1f %%\n", suhu, lembap);
    }
    tampilLCD();
  }
}

3.3.  Penjelasan Alur Kerja Program

Penjelasan alur kerja sistem monitoring

Sistem monitoring ini dikendalikan oleh mikrokontroler ESP32 dengan program yang disusun menggunakan framework Arduino IDE. Berikut adalah penjelasan alur kerja program berdasarkan kode yang digunakan:

  1. Inisialisasi Perangkat dan Jaringan: Saat sistem dinyalakan (setup()), ESP32 menginisialisasi komunikasi I2C untuk layar LCD, sensor DHT11, dan mulai mencoba terhubung ke jaringan Wi-Fi lokal menggunakan parameter WIFI_SSID dan WIFI_PASS. Jika berhasil, LCD akan menampilkan alamat IP yang didapat dari router.
  2. Pembacaan Sensor secara Berkala: Di dalam fungsi utama (loop()), ESP32 diatur menggunakan fungsi millis() untuk membaca data dari sensor DHT11 setiap 2000 milidetik (2 detik) tanpa menghentikan proses lain (non-blocking delay). Data yang dibaca mencakup suhu (°C) dan kelembapan (%).
  3. Pembaruan Tampilan LCD: Setiap kali data suhu dan kelembapan berhasil diperbarui, ESP32 memanggil fungsi tampilLCD() untuk mencetak data terbaru secara fisik ke layar LCD I2C 16x2. Jika sensor gagal terbaca, layar akan menampilkan pesan "Gagal membaca sensor DHT11".
  4. Penanganan Server Lokal (Local Web Server): ESP32 secara aktif menjalankan fungsi server.handleClient().
  5. Jika klien (browser) mengakses alamat root (/), ESP32 mengirimkan halaman HTML lengkap dengan CSS dan JavaScript bawaan (disimpan di variabel PROGMEM) untuk membuat antarmuka dashboard monitoring.
  6. Browser yang sudah memuat halaman HTML tersebut akan mengeksekusi JavaScript untuk mengirim permintaan otomatis ke alamat /data setiap 3 detik. ESP32 merespon rute /data dengan mengirimkan file berformat JSON berisi angka suhu dan kelembapan terkini. Data JSON ini kemudian diubah oleh JavaScript menjadi tampilan angka real-time dan grafik (chart) pada halaman peramban web.
BAB IV
PENUTUP

4.1.  Kesimpulan

Berdasarkan hasil perancangan dan implementasi yang telah dilakukan, dapat disimpulkan bahwa alat monitoring suhu dan kelembapan berbasis Internet of Things (IoT) berhasil dirancang dan berfungsi sesuai dengan logika program. Sistem ini memanfaatkan ESP32 sebagai pusat pengendali dan komunikasi, sensor DHT11 untuk mengukur kondisi suhu dan kelembapan, serta LCD I2C untuk menampilkan hasil pengukuran secara langsung di lokasi fisik.

Selain itu, ESP32 juga berhasil berfungsi ganda sebagai web server yang mendistribusikan data pembacaan sensor melalui jaringan WiFi. Hal ini memungkinkan pengguna untuk memantau kondisi lingkungan secara real-time melalui browser pada perangkat apa pun yang terhubung dalam satu jaringan. Penggunaan mekanisme pembacaan berkala, peringatan kegagalan sensor, serta fitur reconnect WiFi otomatis membuat sistem ini handal untuk melakukan monitoring secara terus-menerus tanpa memerlukan banyak intervensi manual.

4.2.  Saran

Sistem ini masih memiliki potensi untuk dikembangkan lebih lanjut agar lebih optimal. Beberapa saran untuk pengembangan ke depannya adalah:

  1. Integrasi ke Layanan Cloud : Saat ini sistem masih menggunakan Local Web Server sehingga pemantauan terbatas pada satu area WiFi yang sama. Ke depannya, sistem dapat dihubungkan ke platform IoT berbasis cloud (seperti Blynk, ThingSpeak, atau Firebase) agar data lingkungan dapat dipantau dari mana saja di seluruh dunia menggunakan koneksi internet.
  2. Sistem Peringatan Proaktif: Dapat ditambahkan fitur notifikasi atau peringatan otomatis (misalnya melalui Telegram Bot atau Email ) apabila suhu atau kelembapan ruangan terdeteksi melewati ambang batas aman ( threshold ), sehingga langkah pencegahan dapat segera diambil.
  3. Penggunaan Casing Pelindung: Untuk implementasi nyata di lapangan, disarankan menggunakan casing khusus (misalnya dari bahan akrilik atau 3D print ) untuk melindungi komponen ESP32, LCD, dan jalur kabel dari debu, cipratan air, atau korsleting, namun tetap memberikan ruang sirkulasi udara yang cukup bagi sensor DHT11.
BAB V
DAFTAR PUSTAKA

Arduino. (2026). Arduino Reference: WiFi and WebServer Library . Diakses dari https://www.arduino.cc/reference/en/

Espressif Systems. (2026). ESP32 Series Datasheet dan Hardware Design Guidelines . Diakses dari https://www.espressif.com/en/support/documents/technical-documents

Mouser Electronics / Aosong. (2026). DHT11 Humidity & Temperature Sensor Datasheet . Diakses dari https://www.mouser.com/datasheet/2/737/dht11-956283.pdf

Nayyar, A., & Puri, V. (2026). Internet of Things (IoT) Concept and Its Applications . Jurnal Teknik Informatika dan Sistem Cerdas.

NXP Semiconductors. (2026). I2C-bus specification and user manual . Diakses dari https://www.nxp.com/docs/en/user-manual/UM10204.pdf

BAB VI
LAMPIRAN

Tidak ada komentar:

Posting Komentar