Komponen · 14 mnt baca

Panduan Sensor Hujan Arduino: Pengkabelan, Kode, dan Jendela Otomatis

Sensor hujan dengan Arduino: pengkabelan FC-37/YL-83, output AO dan DO, mengatur ambang, mencegah korosi, alarm buzzer, jendela servo, serta kode ESP32 dan Pico.

Sensor hujan membuat Arduino-mu bisa mendeteksi tetesan hujan dan melaporkan “hujan mulai turun” dalam hitungan milidetik, dan ini salah satu sensor termurah sekaligus paling seru yang bisa kamu beli. Sensor ini terdiri dari pad pendeteksi yang menangkap air dan sebuah board kecil dengan komparator LM393, dan terhubung ke Arduino hanya dengan empat kabel. Pengingat untuk mengangkat jemuran sebelum basah kuyup, jendela atau kanopi yang menutup sendiri ketika hujan mulai turun, sistem kebun yang melewatkan penyiraman di hari hujan, dan stasiun cuaca kecil, semuanya berawal dari modul ini.

Di panduan ini kamu akan mempelajari apa isi modul sensor hujan yang dijual dengan nama FC-37, YL-83, dan MH-RD, perbedaan output analog (AO) dan digital (DO), cara mengatur ambang dengan potensiometer, dan topik yang paling sering diabaikan: cara mencegah pad terkena korosi. Setelah itu, langkah demi langkah, kita akan membuat alarm hujan dengan tingkat intensitas di Arduino, penutup jendela otomatis dengan motor servo, notifikasi ponsel dengan ESP32, dan contoh MicroPython untuk Raspberry Pi Pico.

Modul sensor hujan (FC-37 / YL-83) dengan board kontrol LM393
Kit sensor hujan: di kiri pad pendeteksi YL-83 dengan jalur-jalur yang saling menyisip, di kanan board kontrol dengan komparator LM393, potensiometer sensitivitas, serta LED PWR dan DO, dengan kabel penghubung di antara keduanya.

Apa itu sensor hujan dan bagaimana cara kerjanya?

Pad pendeteksi punya dua jalur konduktif yang saling menyisip seperti gigi dua sisir tanpa pernah bersentuhan. Ketika pad kering, hambatan di antara keduanya berada di kisaran megaohm, jadi rangkaiannya praktis terbuka. Ketika setetes hujan jatuh melintasi dua jalur, air membentuk jembatan di antara keduanya dan hambatannya turun. Makin banyak tetesan yang jatuh dan makin luas bagian pad yang basah, makin rendah hambatannya. Di board kontrol, pad membentuk pembagi tegangan bersama sebuah resistor, 10 kΩ pada kebanyakan model: dengan pad kering, tegangan di pin AO mendekati tegangan catu (VCC), dan tegangan itu turun seiring pad makin basah. Kamu bisa mencoba bagaimana output berubah dengan berbagai nilai hambatan memakai kalkulator pembagi tegangan.

LM393 di board adalah IC komparator yang membandingkan dua tegangan. Satu input menerima tegangan dari pad, dan input lainnya menerima tegangan referensi yang kamu atur dengan potensiometer. Begitu tegangan pad turun di bawah referensi, yaitu ketika air yang terdeteksi sudah cukup, output DO menjadi LOW dan LED DO di board menyala. LM393 punya output open-collector; berkat resistor pull-up di board, DO tetap HIGH ketika tidak hujan. LED yang satunya (PWR) hanya menunjukkan bahwa modul mendapat daya.

FiturNilai
Pad pendeteksiSekitar 5,4 × 4 cm; jalur saling menyisip di atas FR4, berlapis nikel pada kebanyakan model
Board kontrolSekitar 3 × 1,5 cm, komparator LM393
Tegangan catu3,3–5 V
ArusSekitar 8 mA (pada 5 V dengan kedua LED menyala)
Output analog (AO)Antara 0 V dan VCC; turun seiring pad makin basah
Output digital (DO)HIGH ketika kering, LOW begitu ambang terlampaui
IndikatorLED PWR (daya) dan LED DO (hujan terdeteksi)
PengaturanPotensiometer sensitivitas (hanya mengubah ambang DO)
Koneksi2 pin di sisi pad (arah tidak berpengaruh), 4 pin di sisi Arduino: VCC, GND, DO, AO

FC-37, YL-83, dan MH-RD: apakah ada bedanya?

Singkatnya, tidak. FC-37, YL-83, dan MH-RD adalah nama yang diberikan produsen berbeda untuk rangkaian yang sama; semuanya terdiri dari pad pendeteksi dan board kontrol LM393, dan semuanya bekerja dengan kode yang sama. Perbedaannya biasanya ada pada ukuran pad, sedikit perubahan pola jalur, dan kualitas lapisan logamnya. Board kontrolnya hampir identik dengan yang dipakai pada sensor kelembapan tanah, jadi board kedua modul bisa saling ditukar. Dua pin antara pad dan board tidak punya kutub plus atau minus, jadi tidak masalah ke arah mana kabelnya kamu colokkan. Ketika pad aus seiring waktu, kamu cukup mengganti pad-nya saja.

Output analog (AO) vs digital (DO)

Output mana yang kamu pakai tergantung proyekmu. DO hanya mengatakan “hujan” atau “tidak hujan”; ambangnya kamu atur dengan potensiometer di board, dan satu digitalRead() di Arduino sudah cukup. Sebaliknya, AO memberimu angka dari 0 sampai 1023 yang menunjukkan seberapa basah pad, sehingga kamu bisa membedakan gerimis dari hujan deras, mengubah ambang di kode, dan memutuskan kapan hujan mulai atau berhenti dengan melihat pembacaan berturut-turut. Kamu juga bisa memakai kedua output sekaligus.

FiturDO (digital)AO (analog)
Informasi yang diberikanHujan / tidak hujanSeberapa basah pad (0–1023 di Uno)
Pengaturan ambangPotensiometer di boardDi kode, sesukamu
Pin ArduinoPin digital mana sajaPin analog (A0–A5)
Membedakan intensitasTidakYa (gerimis, hujan, hujan deras)
Bisa dipakai dengan interruptYaTidak
Paling cocok untukAlarm sederhana, sinyal bangun (wake-up)Pengukuran tingkat, otomatisasi dengan histeresis

Pengkabelan sensor hujan: Arduino Uno, ESP32, dan Pico

Pin modul / komponenArduino UnoESP32Raspberry Pi Pico
VCCD7 (agar modul diberi daya hanya selama mengukur) atau 5VGPIO 25 atau 3V3GP15 atau 3V3(OUT)
GNDGNDGNDGND
AOA0GPIO 34 (ADC1)GP26 (ADC0)
DOD2Opsional (mis. GPIO 27)GP14
Buzzer aktif (+)D8OpsionalGP13
Kabel sinyal servoD9OpsionalGP16
Pin ESP32 dan Raspberry Pi Pico hanya tahan maksimal 3,3 V. Jika modul kamu beri daya dari 5V, VIN, atau VBUS pada board ini, output AO dan DO naik ke 5 V ketika pad kering dan bisa merusak pin input. Beri daya modul dari 3,3 V atau lewat pin GPIO. Di ESP32, selalu hubungkan AO ke salah satu pin ADC1 (GPIO 32–39); pin ADC2 tidak bisa dibaca selama Wi-Fi menyala.

Kamu mungkin sudah memperhatikan bahwa di tabel, VCC dihubungkan ke pin digital, bukan ke 5V. Modul ini hanya menarik sekitar 8 mA pada 5 V, jadi pin Arduino bisa memberinya daya dengan mudah (batas yang disarankan 20 mA per pin). Dengan begitu, modul hanya kamu nyalakan selama beberapa milidetik ketika mengukur dan tetap mati di sisa waktunya. Kita akan melihat kenapa ini sangat penting di bagian korosi. Pin Pico secara default diatur ke kekuatan drive 4 mA; karena modul hanya menarik beberapa mA pada 3,3 V, itu biasanya cukup, tetapi jika pembacaanmu tidak stabil, kamu bisa memberi daya modul dari pin 3V3(OUT).

Mengatur sensitivitas: menyetel ambang dengan potensiometer

  1. Lap pad sampai kering lalu beri daya modul; LED PWR harus menyala dan LED DO mati.
  2. Putar potensiometer perlahan dengan obeng kecil sampai LED DO menyala. Jika LED sudah menyala dengan pad kering, putar ke arah sebaliknya.
  3. Kembalikan ke titik tepat di mana LED padam. Inilah pengaturan paling sensitif yang masih membuat DO tetap HIGH dengan pad kering.
  4. Putar sedikit lagi ke arah yang sama untuk menyisakan margin keamanan; kalau tidak, udara lembap atau embun pun bisa memicu alarm.
  5. Teteskan dua atau tiga tetes air dari jarimu ke pad. LED DO harus menyala; jika tidak, naikkan sensitivitasnya sedikit.
  6. Keringkan pad dan perhatikan berapa lama LED baru padam; ini memberimu gambaran berapa lama sistemmu harus menunggu sebelum memutuskan “hujan sudah berhenti”.
Jika kamu menguji dengan air keran, jangan terlalu percaya pada hasilnya: mineral terlarut di air keran biasanya membuatnya beberapa kali lebih konduktif daripada air hujan. Ambang yang bekerja sempurna dengan air keran mungkin bereaksi terlambat terhadap gerimis sungguhan. Pengaturan paling akurat didapat dengan membaca nilai nyata di Serial Monitor pada hari hujan pertama; sampai hari itu tiba, menyemprotkan butiran halus ke pad dengan botol semprot meniru hujan jauh lebih baik daripada menaruhnya di bawah keran.

Langkah demi langkah: pembacaan pertamamu dengan Arduino

  1. Hubungkan VCC modul ke D7, GND ke GND, AO ke A0, dan DO ke D2. Colokkan pad ke board dengan kabel dua kawat.
  2. Buka kode di bawah di Arduino IDE, pilih Arduino Uno sebagai board, lalu upload.
  3. Buka Serial Monitor pada 9600 baud dan catat nilai AO dengan pad kering.
  4. Teteskan beberapa tetes air ke pad, lalu lebih banyak lagi, dan catat nilai AO setiap kali.
  5. Catat juga nilainya ketika pad basah sepenuhnya; nilai-nilai ini akan menjadi konstanta DRY dan WET yang kamu pakai di sketch berikutnya.
C++ (Arduino IDE)
1// Yağmur sensörü: AO ve DO okuma / Rain sensor: reading AO and DO
2const int SENSOR_POWER = 7;   // modülün VCC'si bu pinden beslenir / module VCC is fed from this pin
3const int RAIN_AO = A0;       // analog çıkış / analog output
4const int RAIN_DO = 2;        // dijital çıkış / digital output
5
6void setup() {
7  Serial.begin(9600);
8  pinMode(SENSOR_POWER, OUTPUT);
9  digitalWrite(SENSOR_POWER, LOW);  // başlangıçta kapalı / off at start-up
10  pinMode(RAIN_DO, INPUT);
11}
12
13void loop() {
14  digitalWrite(SENSOR_POWER, HIGH);             // modülü aç / power the module
15  delay(50);                                    // değerin oturmasını bekle / let the reading settle
16  int analogValue = analogRead(RAIN_AO);        // 0-1023: kuruyken yüksek / high when dry
17  bool raining = digitalRead(RAIN_DO) == LOW;   // yağmurda DO = LOW / DO goes LOW in rain
18  digitalWrite(SENSOR_POWER, LOW);              // modülü kapat / power it off
19
20  Serial.print(F("AO: "));
21  Serial.print(analogValue);
22  Serial.print(F("  DO: "));
23  Serial.println(raining ? F("YAGMUR / RAIN") : F("KURU / DRY"));
24  delay(2000);                                  // 2 sn'de bir ölç / measure every 2 s
25}

Sebelum setiap pengukuran, kode menyetel D7 ke HIGH untuk memberi daya modul, menunggu 50 ms agar kapasitor di board terisi dan pembacaan stabil, membaca AO dan DO, lalu langsung mematikan modul. Dengan begitu, modul hanya mendapat daya selama 50 ms dari setiap loop 2 detik, atau 2,5% dari waktunya. Karena DO menjadi LOW ketika hujan, kita menulis kondisinya sebagai digitalRead(RAIN_DO) == LOW. Kata-kata bahasa Turki dalam pesan yang dicetak (seperti YAGMUR dan KURU) ditulis tanpa karakter khusus karena beberapa terminal menampilkan karakter tersebut secara rusak.

Kondisi padPerkiraan AO (Uno, 5 V)DO (board yang sudah disetel)
Kering dan bersih1000–1023HIGH
Beberapa tetes750–950HIGH atau LOW tergantung pengaturan
Gerimis, sebagian pad basah500–750LOW
Hujan lebat300–500LOW
Basah sepenuhnya, air keran150–350LOW

Angka-angka ini hanya panduan kasar; ukuran pad, kondisi lapisan logam, kemurnian air, dan debu di pad semuanya mengubahnya secara nyata. Bahkan nilai modul yang sama pun bergeser setelah pad berada di luar ruangan selama beberapa bulan. Karena itu, di sketch berikutnya kita tidak memakai nilai mentah secara langsung, tetapi mengubahnya menjadi persentase kebasahan dari 0 sampai 100 dengan nilai kering (DRY) dan basah (WET) yang kamu ukur sendiri; setelah itu kamu cukup memperbarui dua konstanta ini tanpa menyentuh ambangnya.

Alarm hujan Arduino: tingkat intensitas dan buzzer

Sekarang mari ubah pengukuran ini menjadi alarm yang berguna. Kode mengambil 8 pembacaan AO berturut-turut, merata-ratakannya, mengubah hasilnya menjadi persentase kebasahan dengan map(), dan memasukkannya ke salah satu dari empat tingkat: kering, gerimis, hujan, dan hujan deras. Ketika hujan makin lebat, buzzer aktif berbunyi sebanyak nomor tingkatnya: sekali untuk gerimis, dua kali untuk hujan, dan tiga kali untuk hujan deras. Hubungkan kaki plus buzzer ke D8 dan kaki minusnya ke GND; perbedaan buzzer aktif dan pasif bisa kamu temukan di Apa Itu Buzzer?.

C++ (Arduino IDE)
1// Yağmur şiddeti seviyeleri ve sesli alarm / Rain intensity levels and audible alarm
2const int SENSOR_POWER = 7;     // modülün VCC'si / module VCC
3const int RAIN_AO = A0;         // analog çıkış / analog output
4const int BUZZER = 8;           // aktif buzzer / active buzzer
5const int DRY = 1015;           // kuru panel değeri / dry pad reading (kendin ölç / measure yours)
6const int WET = 350;            // tamamen ıslak panel / fully wet pad (kendin ölç / measure yours)
7
8const char* const LEVEL_NAMES[] = {"Kuru / Dry", "Ciseleme / Drizzle", "Yagmur / Rain", "Saganak / Downpour"};
9int lastLevel = 0;
10
11int readWetness() {
12  digitalWrite(SENSOR_POWER, HIGH);
13  delay(50);
14  long sum = 0;
15  for (int i = 0; i < 8; i++) sum += analogRead(RAIN_AO);  // 8 ölçümün ortalaması / average of 8 readings
16  digitalWrite(SENSOR_POWER, LOW);
17  return constrain(map(sum / 8, DRY, WET, 0, 100), 0, 100);  // % ıslaklık / % wetness
18}
19
20void beep(int count) {
21  for (int i = 0; i < count; i++) {
22    digitalWrite(BUZZER, HIGH);
23    delay(150);
24    digitalWrite(BUZZER, LOW);
25    delay(150);
26  }
27}
28
29void setup() {
30  Serial.begin(9600);
31  pinMode(SENSOR_POWER, OUTPUT);
32  pinMode(BUZZER, OUTPUT);
33}
34
35void loop() {
36  int wet = readWetness();
37  int level;
38  if (wet < 10) level = 0;        // kuru / dry
39  else if (wet < 40) level = 1;   // çiseleme / drizzle
40  else if (wet < 75) level = 2;   // yağmur / rain
41  else level = 3;                 // sağanak / downpour
42
43  Serial.print(F("Islaklik / Wetness: %"));
44  Serial.print(wet);
45  Serial.print(F("  "));
46  Serial.println(LEVEL_NAMES[level]);
47
48  if (level > lastLevel) beep(level);  // şiddet artınca seviye kadar bip / beep once per level when it gets heavier
49  lastLevel = level;
50  delay(3000);                         // 3 sn'de bir ölç / measure every 3 s
51}

Persentase di sini menunjukkan seberapa luas bagian pad yang basah; ini bukan pengukuran curah hujan dalam milimeter per jam seperti yang dipakai ahli meteorologi. Meski begitu, dalam praktik ini sangat berguna: gerimis ringan hanya menjembatani beberapa jalur, sedangkan hujan deras menutupi hampir seluruh permukaan. Kamu bisa mengubah batas tingkat (10, 40, dan 75) sesuai pengamatanmu sendiri. Karena buzzer hanya berbunyi ketika tingkatnya naik, kamu tidak akan mendengar bunyi bip setiap 3 detik selama hujan tetap di tingkat yang sama.

Korosi: kenapa pad berkarat, dan bagaimana membuatnya awet?

Masalah terbesar sensor hujan adalah keausan seiring waktu. Ketika arus searah (DC) dialirkan ke pad terus-menerus, air di antara jalur bertindak sebagai elektrolit dan elektrolisis dimulai: logam pada jalur yang terhubung ke sisi positif perlahan larut, lapisan nikel menipis, dan tembaga di bawahnya berubah gelap atau kehijauan. Akibatnya, hambatan pad kering turun, pembacaan bergeser, dan akhirnya jalurnya putus. Pad yang dibiarkan di luar ruangan dengan 5 V terus-menerus bisa aus secara nyata dalam beberapa minggu. Kabar baiknya: keausan sebanding dengan lamanya pad mendapat daya, dan lamanya waktu itu ada di tanganmu.

  • Beri daya hanya selama mengukur: Ambil VCC dari pin digital dan nyalakan modul hanya 50 ms per pembacaan. Pada sistem yang mengukur setiap 2 detik, pad mendapat daya 2,5% dari waktunya, yang memperlambat keausan sekitar 40 kali.
  • Ukur lebih jarang: Hujan tidak berubah dalam hitungan detik. Untuk proyek jendela atau notifikasi, satu pembacaan setiap 5–30 detik sudah cukup; sistem yang mengukur setiap 30 detik membuat pad hanya mendapat daya sekitar 0,2% dari waktunya.
  • Tukar polaritas (lanjutan): Jika pad kamu hubungkan langsung ke dua pin digital dan kamu tukar ujung mana yang HIGH pada setiap pembacaan, keausan terbagi rata di kedua jalur. Dengan metode ini kamu tidak memakai board kontrol; pembagi tegangan kamu buat sendiri dengan resistor, dan kamu mengambil satu pembacaan di setiap arah.
  • Jaga pad tetap bersih: Debu, serbuk sari, dan kotoran burung menaikkan konduktivitas dan menurunkan pembacaan kering. Bersihkan pad sesekali dengan alkohol isopropil dan sikat lembut; amplas atau spons abrasif akan menggores lapisannya.
  • Lindungi board, bukan pad: Masukkan board kontrol ke kotak tahan air atau beri lapisan conformal coating. Jangan pernah menutup pad dengan pernis, silikon, atau selotip; air harus menyentuh jalurnya.
  • Siapkan pad cadangan: Pad adalah komponen habis pakai yang murah. Ketika pembacaan bergeser secara nyata atau jalurnya menggelap, cukup ganti pad lalu ukur ulang DRY dan WET.

Aplikasi sensor hujan yang paling populer adalah sistem yang menutup jendela, kanopi, atau atap rumah kaca sendiri ketika hujan mulai turun. Kamu bisa membuatnya pada maket dengan motor servo SG90. Ada dua aturan penting di sini. Yang pertama adalah konfirmasi: satu tetesan atau serangga yang hinggap di pad tidak boleh menutup jendela, jadi kita menunggu 3 pembacaan basah berturut-turut sebelum menutup. Yang kedua adalah histeresis: ketika hujan berhenti, pad tidak langsung kering dan nilainya naik-turun di sekitar ambang. Agar jendela tidak terus-menerus membuka dan menutup, kita memakai dua ambang terpisah untuk “hujan” dan “kering”, dan jendela hanya dibuka setelah pad tetap kering selama 10 menit tanpa terputus. Untuk pengkabelan servo dan kontrol sudut, lihat Apa Itu Motor Servo?.

Motor servo SG90
Motor servo SG90
Buzzer aktif
Buzzer aktif
C++ (Arduino IDE)
1// Yağmurda pencereyi servo ile kapatan sistem / Closes a window with a servo when it rains
2#include <Servo.h>
3
4const int SENSOR_POWER = 7;     // modülün VCC'si / module VCC
5const int RAIN_AO = A0;         // analog çıkış / analog output
6const int BUZZER = 8;           // aktif buzzer / active buzzer
7const int SERVO_PIN = 9;        // servo sinyal kablosu / servo signal wire
8
9const int DRY = 1015;           // kuru panel / dry pad (kendin ölç / measure yours)
10const int WET = 350;            // ıslak panel / wet pad (kendin ölç / measure yours)
11const int RAIN_ON = 25;         // %25 ve üstü: yağıyor / 25% and above: raining
12const int RAIN_OFF = 8;         // %8 ve altı: panel kurudu / 8% and below: pad is dry
13const int CONFIRM_COUNT = 3;    // art arda 3 ıslak ölçüm / 3 wet readings in a row
14const unsigned long SAMPLE_MS = 2000UL;   // 2 sn'de bir ölç / measure every 2 s
15const unsigned long DRY_MS = 600000UL;    // 10 dk kuru kalmalı / must stay dry for 10 min
16
17const int OPEN_ANGLE = 90;      // pencere açık / window open
18const int CLOSED_ANGLE = 0;     // pencere kapalı / window closed
19
20Servo windowServo;
21bool closed = false;
22int wetCount = 0;
23unsigned long lastSample = 0;
24unsigned long drySince = 0;
25
26int readWetness() {
27  digitalWrite(SENSOR_POWER, HIGH);
28  delay(50);                                              // değerin oturmasını bekle / let it settle
29  int raw = analogRead(RAIN_AO);
30  digitalWrite(SENSOR_POWER, LOW);
31  return constrain(map(raw, DRY, WET, 0, 100), 0, 100);  // % ıslaklık / % wetness
32}
33
34void beep(int count) {
35  for (int i = 0; i < count; i++) {
36    digitalWrite(BUZZER, HIGH);
37    delay(150);
38    digitalWrite(BUZZER, LOW);
39    delay(150);
40  }
41}
42
43void setup() {
44  Serial.begin(9600);
45  pinMode(SENSOR_POWER, OUTPUT);
46  pinMode(BUZZER, OUTPUT);
47  windowServo.write(OPEN_ANGLE);   // attach'tan önce açı ver, servo zıplamasın / set the angle before attach to avoid a jump
48  windowServo.attach(SERVO_PIN);
49}
50
51void loop() {
52  unsigned long now = millis();
53  if (now - lastSample < SAMPLE_MS) return;   // ölçüm zamanı gelmedi / not time to measure yet
54  lastSample = now;
55
56  int wet = readWetness();
57  Serial.print(F("Islaklik / Wetness: %"));
58  Serial.println(wet);
59
60  if (wet >= RAIN_ON) {
61    drySince = now;                            // kuruma sayacını sıfırla / reset the drying timer
62    if (wetCount < CONFIRM_COUNT) wetCount++;
63    if (!closed && wetCount >= CONFIRM_COUNT) {
64      closed = true;
65      beep(3);
66      windowServo.write(CLOSED_ANGLE);         // pencereyi kapat / close the window
67      Serial.println(F("Yagmur: pencere kapandi / Rain: window closed"));
68    }
69  } else {
70    wetCount = 0;
71    if (wet > RAIN_OFF) {
72      drySince = now;                          // ara bölge kuru sayılmaz / the middle zone does not count as dry
73    } else if (closed && now - drySince >= DRY_MS) {
74      closed = false;
75      windowServo.write(OPEN_ANGLE);           // 10 dk kuruysa aç / open after 10 dry minutes
76      Serial.println(F("Kuru: pencere acildi / Dry: window opened"));
77    }
78  }
79}
KonstantaFungsinyaNilai awal
DRY / WETPembacaan pad kering dan basah yang kamu ukur sendiri1015 / 350
RAIN_ONPada persentase ini atau lebih tinggi, dihitung sebagai “hujan”25%
RAIN_OFFPada persentase ini atau lebih rendah, dihitung sebagai “kering”8%
CONFIRM_COUNTJumlah pembacaan basah berturut-turut yang dibutuhkan untuk menutup jendela3 (sekitar 6 detik)
DRY_MSBerapa lama pad harus tetap kering sebelum jendela dibuka10 menit
OPEN_ANGLE / CLOSED_ANGLESudut servo pada posisi terbuka dan tertutup90° / 0°
SG90 bisa menarik beberapa ratus mA ketika bergerak; jika kamu memakai lebih dari satu servo atau servo besar seperti MG996R, beri daya dari catu 5 V terpisah, bukan dari pin 5V Arduino, dan hubungkan ground-nya bersama. Servo saja tidak cukup untuk jendela atau kanopi sungguhan: kamu butuh motor bergearbox atau aktuator linear, limit switch di kedua ujung, dan perlindungan agar tidak ada yang terjepit. Kode ini untuk mempelajari logika yang mengendalikan mekanismenya dan mencobanya pada maket.

Notifikasi hujan ke ponselmu dengan ESP32

Untuk tahu bahwa hujan mulai turun ketika kamu sedang tidak di rumah, kamu bisa memakai ESP32. Kode di bawah mengirim pesan “angkat jemuran” lewat Telegram ketika hujan mulai, dan pesan “hujan sudah berhenti” begitu pad kering selama 15 menit. Kamu perlu menginstal library UniversalTelegramBot dan ArduinoJson dari Library Manager. Cara membuat bot dan menemukan chat ID-mu kami jelaskan langkah demi langkah di bot Telegram ESP32.

C++ (Arduino IDE)
1// ESP32 yağmur bildirimi (Telegram) / ESP32 rain notification (Telegram)
2#include <WiFi.h>
3#include <WiFiClientSecure.h>
4#include <UniversalTelegramBot.h>        // ArduinoJson kütüphanesi de gerekir / also needs the ArduinoJson library
5
6const char* WIFI_SSID = "WIFI_ADI";      // Wi-Fi ağının adı / your Wi-Fi name
7const char* WIFI_PASS = "WIFI_SIFRESI";  // Wi-Fi şifren / your Wi-Fi password
8#define BOT_TOKEN "1234567890:ABCdefGhIJKlmNoPQRstuVWXyz"  // BotFather'dan / from BotFather
9#define CHAT_ID "123456789"              // senin chat ID'n / your chat ID
10
11const int SENSOR_POWER = 25;             // modülün VCC'si (3,3 V) / module VCC (3.3 V)
12const int RAIN_AO = 34;                  // ADC1 pini, Wi-Fi ile çalışır / ADC1 pin, works with Wi-Fi
13const int DRY = 4095;                    // kuru panel / dry pad (kendin ölç / measure yours)
14const int WET = 1500;                    // ıslak panel / wet pad (kendin ölç / measure yours)
15const int RAIN_ON = 25;                  // %25 ve üstü: yağıyor / 25% and above: raining
16const int RAIN_OFF = 8;                  // %8 ve altı: kuru / 8% and below: dry
17const unsigned long SAMPLE_MS = 5000UL;  // 5 sn'de bir ölç / measure every 5 s
18const unsigned long DRY_MS = 900000UL;   // 15 dk kuru: yağmur bitti / 15 dry minutes: rain is over
19
20WiFiClientSecure client;
21UniversalTelegramBot bot(BOT_TOKEN, client);
22
23bool raining = false;
24int wetCount = 0;
25unsigned long lastSample = 0;
26unsigned long drySince = 0;
27
28int readWetness() {
29  digitalWrite(SENSOR_POWER, HIGH);
30  delay(50);                             // değerin oturmasını bekle / let it settle
31  int raw = analogRead(RAIN_AO);         // 0-4095
32  digitalWrite(SENSOR_POWER, LOW);
33  return constrain(map(raw, DRY, WET, 0, 100), 0, 100);
34}
35
36void connectWiFi() {
37  WiFi.mode(WIFI_STA);
38  WiFi.begin(WIFI_SSID, WIFI_PASS);
39  unsigned long start = millis();
40  while (WiFi.status() != WL_CONNECTED && millis() - start < 15000) {  // en fazla 15 sn bekle / wait up to 15 s
41    delay(500);
42  }
43}
44
45void notify(const String& text) {
46  if (WiFi.status() != WL_CONNECTED) connectWiFi();  // bağlantı koptuysa yeniden bağlan / reconnect if dropped
47  if (WiFi.status() == WL_CONNECTED) {
48    bot.sendMessage(CHAT_ID, text, "");
49  }
50}
51
52void setup() {
53  Serial.begin(115200);
54  pinMode(SENSOR_POWER, OUTPUT);
55  digitalWrite(SENSOR_POWER, LOW);
56  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);  // api.telegram.org kök sertifikası / root certificate
57  connectWiFi();
58  notify("Yagmur sensoru devrede / Rain sensor is online");
59}
60
61void loop() {
62  unsigned long now = millis();
63  if (now - lastSample < SAMPLE_MS) return;
64  lastSample = now;
65
66  int wet = readWetness();
67  Serial.printf("Islaklik / Wetness: %%%d\n", wet);
68
69  if (!raining) {
70    wetCount = (wet >= RAIN_ON) ? wetCount + 1 : 0;
71    if (wetCount >= 2) {                 // art arda 2 ıslak ölçüm (~10 sn) / 2 wet readings in a row (~10 s)
72      raining = true;
73      drySince = now;
74      String msg = "Yagmur basladi, camasirlari topla! / It's raining, bring in the laundry! %";
75      msg += wet;
76      notify(msg);
77    }
78  } else {
79    if (wet > RAIN_OFF) {
80      drySince = now;                    // hâlâ ıslak / still wet
81    } else if (now - drySince >= DRY_MS) {
82      raining = false;
83      wetCount = 0;
84      notify("Yagmur durdu / The rain has stopped");
85    }
86  }
87}

ADC ESP32 punya resolusi 12-bit, jadi nilainya berkisar dari 0 sampai 4095, dan dengan modul diberi daya 3,3 V, pad kering biasanya terbaca sangat dekat dengan 4095; meski begitu, kamu tetap sebaiknya mengukur nilai DRY dan WET sendiri. Karena pengiriman pesan bisa memakan waktu satu atau dua detik, interval pengukuran kami biarkan 5 detik, dan kami memakai flag raining agar satu kali hujan yang sama tidak memicu pesan bertubi-tubi. Jika ingin menjalankan sistem dengan baterai, kamu bisa memasukkan ESP32 ke mode deep sleep di antara pembacaan, dan jika kamu memakai Home Assistant, datanya bisa kamu kirim lewat MQTT.

Sensor hujan dengan Raspberry Pi Pico dan MicroPython

Logikanya sama di Raspberry Pi Pico. Beri daya modul 3,3 V lewat GP15, lalu hubungkan AO ke GP26, DO ke GP14, buzzer aktif ke GP13, dan kabel sinyal servo ke GP16. ADC Pico mengembalikan nilai dari 0 sampai 65535 dengan read_u16(). Kode di bawah berbunyi bip tiga kali ketika mendeteksi hujan dan menarik kanopi dengan servo; begitu pad kering selama 10 menit, kanopi dibuka lagi.

MicroPython
1# Raspberry Pi Pico yağmur sensörü + servo tente / Raspberry Pi Pico rain sensor + servo awning
2from machine import Pin, ADC, PWM
3import time
4
5power = Pin(15, Pin.OUT, value=0)   # modülün VCC'si (3,3 V) / module VCC (3.3 V)
6rain_ao = ADC(26)                   # GP26 = ADC0, AO çıkışı / AO output
7rain_do = Pin(14, Pin.IN)           # DO: yağmurda 0 / DO: 0 in rain
8buzzer = Pin(13, Pin.OUT, value=0)  # aktif buzzer / active buzzer
9servo = PWM(Pin(16))
10servo.freq(50)                      # servolar 50 Hz ister / servos expect 50 Hz
11
12DRY, WET = 65000, 24000             # kendi değerlerinle değiştir / replace with your readings
13RAIN_ON, RAIN_OFF = 25, 8           # % eşikler / % thresholds
14DRY_MS = 10 * 60 * 1000             # 10 dk kuru kalmalı / must stay dry for 10 min
15OPEN_ANGLE, CLOSED_ANGLE = 90, 0
16
17def set_angle(deg):
18    us = 544 + deg * (2400 - 544) // 180    # Arduino Servo ile aynı aralık / same range as Arduino Servo
19    servo.duty_u16(us * 65535 // 20000)     # 20 ms periyodun oranı / share of the 20 ms period
20
21def read_sensor():
22    power.value(1)
23    time.sleep_ms(50)                       # değerin oturmasını bekle / let it settle
24    raw = rain_ao.read_u16()                # 0-65535
25    do_wet = rain_do.value() == 0
26    power.value(0)
27    pct = (DRY - raw) * 100 // (DRY - WET)
28    return max(0, min(100, pct)), do_wet
29
30def beep(count):
31    for _ in range(count):
32        buzzer.value(1)
33        time.sleep_ms(150)
34        buzzer.value(0)
35        time.sleep_ms(150)
36
37closed = False
38wet_count = 0
39dry_since = time.ticks_ms()
40set_angle(OPEN_ANGLE)                       # tente açık başlar / awning starts open
41
42while True:
43    wet, do_wet = read_sensor()
44    print("Islaklik / Wetness: %", wet, " DO:", "YAGMUR / RAIN" if do_wet else "KURU / DRY")
45    now = time.ticks_ms()
46    if wet >= RAIN_ON:
47        dry_since = now                     # kuruma sayacını sıfırla / reset the drying timer
48        wet_count += 1
49        if not closed and wet_count >= 3:   # art arda 3 ıslak ölçüm / 3 wet readings in a row
50            closed = True
51            beep(3)
52            set_angle(CLOSED_ANGLE)         # tenteyi kapat / retract the awning
53    else:
54        wet_count = 0
55        if wet > RAIN_OFF:
56            dry_since = now
57        elif closed and time.ticks_diff(now, dry_since) >= DRY_MS:
58            closed = False
59            set_angle(OPEN_ANGLE)           # 10 dk kuruysa aç / open after 10 dry minutes
60    time.sleep(2)

MicroPython tidak punya kelas servo bawaan, jadi sudut kita ubah sendiri menjadi lebar pulsa: servo diposisikan oleh pulsa sepanjang kira-kira 0,5–2,5 ms yang datang setiap 20 ms. Fungsi set_angle() memetakan 0–180 derajat ke rentang 544–2400 mikrodetik yang sama dengan yang dipakai library Servo Arduino, lalu mengubah waktu itu menjadi rasio 0–65535 untuk duty_u16(). Jika kode kamu simpan ke Pico sebagai main.py dengan Thonny, kode itu berjalan otomatis setiap kali Pico menyala.

Pemasangan di luar ruangan: tips penempatan yang tepat

  • Pasang pad dengan posisi miring: Kemiringan 20–45 derajat membuat tetesan mengalir turun dan membantu pad lebih cepat kering setelah hujan berhenti. Pada pad yang datar, air menggenang dan sistem bisa terus mengatakan “hujan” selama berjam-jam.
  • Pilih tempat yang terbuka ke langit: Jangan menaruh pad di bawah teritis atap, pohon, atau AC yang meneteskan air; di tempat seperti itu pad bisa melewatkan hujan sungguhan sekaligus terpicu oleh tetesan nyasar.
  • Simpan elektroniknya di dalam ruangan: Hanya pad yang boleh berada di luar. Masukkan board kontrol dan Arduino ke kotak tahan air, dan tutup lubang masuk kabel dengan cable gland atau silikon.
  • Jaga kabel tetap pendek: Kabel antara pad dan board bisa diperpanjang sampai beberapa meter; pada kabel yang lebih panjang, derau meningkat. Merata-ratakan pembacaan mengurangi fluktuasi ini.
  • Waspadai embun dan kabut: Pada malam yang dingin, uap air yang mengembun di pad bisa menghasilkan pembacaan kebasahan kecil. Ambang RAIN_ON yang sedikit lebih tinggi dan konfirmasi dengan pembacaan berturut-turut mencegah sebagian besar alarm palsu ini.
  • Lambat mendeteksi salju: Salju kering tidak menghantarkan listrik; sensor baru bereaksi setelah salju mencair menjadi air. Di iklim dingin, anggap sensor ini andal hanya untuk hujan.

Sensor hujan vs sensor kelembapan tanah dan sensor level air: perbedaannya

SensorApa yang diukur?OutputPenggunaan umum
Sensor hujan (FC-37, YL-83)Tetesan air yang jatuh di permukaannyaAO dan DOAlarm hujan, otomatisasi jendela dan kanopi
Sensor kelembapan tanahKelembapan di dalam tanahAO dan DO (board LM393 yang sama)Penyiraman tanaman
Sensor level air (jalur paralel)Ketinggian air di dalam wadahAnalog (S)Level tangki dan akuarium
Penakar hujan tipping bucketJumlah curah hujan (mm)Satu pulsa per jungkitanStasiun cuaca
Sensor kelembapan tanah dan board kontrol LM393 yang sama
Sensor kelembapan tanah dan board kontrol LM393 yang sama
Sensor level air
Sensor level air

Sensor hujan tidak bisa menjawab pertanyaan “berapa banyak hujan yang turun?”; untuk itu kamu butuh penakar hujan tipping bucket yang dipakai di stasiun cuaca. Air dari corong mengisi wadah kecil, wadah itu menjungkit pada jumlah tertentu (pada kit stasiun cuaca yang umum, satu jungkitan setara dengan 0,2794 mm hujan), dan pada setiap jungkitan sebuah magnet menutup reed switch sejenak. Arduino menghitung pulsa-pulsa ini dengan interrupt dan mengalikan jumlahnya dengan nilai wadah untuk mendapatkan curah hujan dalam milimeter. Memakai kedua sensor bersamaan juga masuk akal: sensor hujan langsung melaporkan bahwa hujan sudah mulai, sedangkan penakar jungkit mencatat totalnya. Jika kamu ingin mengukur ketinggian air yang terkumpul di sebuah wadah, sensor level air adalah pilihan yang lebih baik.

Ide proyek sensor hujan

  • Peringatan jemuran: Buzzer yang berbunyi dan LED yang menyala ketika hujan mulai turun; dengan ESP32, kamu juga mendapat pesan di ponselmu.
  • Atap rumah kaca pintar: Tutup ventilasi atap dengan servo ketika hujan dan buka untuk sirkulasi udara berdasarkan suhu. Lihat Proyek Rumah Kaca Pintar untuk detailnya.
  • Lewati penyiraman ketika hujan: Cegah sistem penyiraman otomatis yang kamu buat dengan sensor kelembapan tanah menyalakan pompa selama hujan.
  • Stasiun cuaca mini: Tampilkan status hujan di layar OLED bersama suhu, kelembapan, dan tekanan yang kamu ukur dengan BME280.
  • Maket wiper: Proyek seru yang meniru wiper otomatis mobil dengan mengayunkan servo makin cepat seiring hujan makin lebat.
  • Skenario rumah pintar: Untuk sistem yang menutup jendela, menarik kanopi, dan memberi peringatan ketika hujan mulai turun, lihat panduan proyek rumah pintar Arduino.

Kesalahan umum dan cara memperbaikinya

GejalaKemungkinan penyebabSolusi
AO selalu 1023 dan tidak pernah berubahKabel pad lepas atau putus; DO terhubung ke A0, bukan AOPeriksa dua kabel antara pad dan board serta koneksi A0
AO sangat rendah bahkan dengan pad keringPad kotor atau masih basah; ada sesuatu yang menjembatani jalur; pembacaan diambil sebelum modul mendapat dayaBersihkan dan keringkan pad; di kode, baca hanya setelah daya dinyalakan dan ditunggu sebentar
DO tidak pernah berubahPotensiometer diputar habis ke salah satu ujungUlangi langkah pengaturan sensitivitas dari awal
Alarm hujan di cuaca keringEmbun, kabut, pad kotor, atau ambang yang terlalu sensitifNaikkan RAIN_ON, konfirmasi dengan pembacaan berturut-turut, bersihkan pad
Hujan sudah berhenti tetapi sistem masih mengatakan “hujan”Pad dipasang datar dan lambat keringPasang pad miring, sesuaikan RAIN_OFF dan DRY_MS
Pembacaan bergeser dalam beberapa minggu dan jalurnya menggelapKorosi akibat daya yang terus-menerusBeri daya modul dari pin, ukur lebih jarang, ganti pad
Di ESP32, pembacaan kacau ketika Wi-Fi menyalaAO terhubung ke pin ADC2Pindahkan AO ke pin antara GPIO 32 dan 39
Servo bergetar atau Arduino resetArus servo menarik turun jalur 5VBeri daya servo dari catu 5 V terpisah, hubungkan ground-nya, pasang kapasitor 470 µF di jalur catu
Cara termudah menguji sistemmu tanpa menunggu hujan adalah mengusapkan jari basah atau tisu lembap ke jalur-jalur pad. Untuk uji yang lebih realistis, semprot pad beberapa kali dengan botol semprot dari jarak 30–40 cm; di Serial Monitor kamu bisa melihat persentase kebasahan naik lalu perlahan turun seiring pad mengering.

Sensor hujan adalah modul murah tetapi penuh pelajaran yang mengajarkan pembagi tegangan, komparator, histeresis, dan masalah dunia nyata seperti korosi sekaligus. Jika kamu ingat untuk memberi daya pad hanya selama mengukur dan menetapkan ambang dari pembacaanmu sendiri, sensor ini akan melayanimu dalam waktu lama. Di aplikasi BlueGrays kamu akan menemukan proyek langkah demi langkah lengkap dengan diagram rangkaian dan kode yang memakai komponen dari artikel ini, seperti buzzer, motor servo, stasiun penyiraman pintar, dan alarm Telegram ESP32, dan kamu bisa dengan mudah menambahkan sensor hujan ke proyek-proyek itu.

Pertanyaan umum

Bagaimana cara kerja sensor hujan?

Dua jalur konduktif yang saling menyisip di pad pendeteksi saling terisolasi ketika kering. Ketika tetesan hujan menjembatani jalur-jalur itu, hambatan pad turun dan output (AO) pembagi tegangan di board kontrol ikut turun. Komparator LM393 membandingkan tegangan ini dengan ambang yang diatur potensiometer dan menarik output DO ke LOW begitu ambang terlampaui.

Apakah sensor hujan bisa mengukur jumlah curah hujan?

Tidak. Sensor hujan menunjukkan seberapa luas bagian pad yang basah; itu cukup untuk mengetahui bahwa hujan sudah mulai dan kira-kira seberapa lebat, tetapi tidak memberi curah hujan dalam milimeter. Untuk mengukur jumlah hujan, dipakai penakar hujan tipping bucket, yang menghasilkan pulsa lewat reed switch setiap kali wadahnya menjungkit.

Kenapa sensor hujan terkena korosi, dan berapa lama umurnya?

Ketika arus searah dialirkan ke pad terus-menerus, terjadi elektrolisis pada air di antara jalur, dan logam jalur di sisi positif larut. Pad yang dibiarkan di luar ruangan dengan 5 V terus-menerus bisa aus secara nyata dalam beberapa minggu. Jika modul kamu beri daya dari pin digital dan hanya kamu nyalakan beberapa milidetik per pembacaan, pad jauh lebih awet dan sering bekerja tanpa masalah selama berbulan-bulan.

Apakah output sensor hujan LOW atau HIGH ketika hujan?

Pada modul LM393 yang umum, output DO bernilai HIGH ketika kering; output itu menjadi LOW dan LED DO menyala begitu air di pad melewati ambang yang diatur potensiometer. Output AO berada di nilai tertingginya ketika kering dan turun seiring pad makin basah; di Arduino Uno, pad kering biasanya terbaca di atas 1000.

Apakah sensor hujan bisa dipakai dengan ESP32 dan 3,3 V?

Ya, modul ini bekerja pada 3,3 sampai 5 V. Di ESP32 dan Raspberry Pi Pico, sebaiknya beri daya dari 3,3 V agar output AO dan DO juga tidak pernah melebihi 3,3 V. Di ESP32, hubungkan AO ke salah satu pin ADC1 (GPIO 32–39), yang tetap berfungsi selama Wi-Fi menyala.

Apakah sensor hujan bisa mendeteksi salju, embun, atau kabut?

Salju kering tidak menghantarkan listrik, jadi sensor baru mendeteksi salju setelah salju itu mencair. Sebaliknya, embun dan kabut tebal bisa meninggalkan lapisan tipis uap air di pad, sehingga menghasilkan pembacaan kebasahan kecil dan kadang alarm palsu. Untuk mencegahnya, buat ambang sedikit lebih tinggi, konfirmasi alarm dengan beberapa pembacaan berturut-turut, dan pasang pad dengan posisi miring.

Lihat semua proyek
Menggunakan Buzzer
#13Pemula

Menggunakan Buzzer

Pernah penasaran bagaimana bel pintu atau alarm mengeluarkan suaranya? Arduino membuat buzzer kecil berbunyi bip dengan jeda singkat: bip, jeda, bip, jeda. Kamu melihat bagaimana suara dibuat dengan l

4.7(89)
161
Suhu dan Kelembapan dengan DHT11
#55Menengah

Suhu dan Kelembapan dengan DHT11

Seberapa hangat kamarmu, dan apakah udaranya lembap atau kering? Sensor DHT11 mengukur suhu dan kelembapan, dan Arduino menulis nilainya di layar LCD dua baris, diperbarui setiap beberapa detik. Jika

4.7(47)
73
Menggunakan Motor Servo
#35Pemula
Premium

Menggunakan Motor Servo

Lengan motor servo kecil berputar ke tiga posisi bergantian: penuh ke awal, tepat ke tengah, dan penuh ke akhir, menunggu dua detik di setiap perhentian. Arduino memberi tahu motor sudut mana yang har

4.7(48)
67
Stasiun Penyiraman Pintar
#83Mahir
Premium

Stasiun Penyiraman Pintar

Tukang kebun yang menyiram tanamanmu sendiri, supaya tanaman tidak kering ketika kamu berlibur. Sensor kelembapan tanah mengukur seberapa basah tanahnya; ketika kering, Arduino menyalakan pompa air be

5.0(42)
57
Menggunakan Sensor Api
#50Menengah
Premium

Menggunakan Sensor Api

Penjaga kecil yang melihat api lebih dulu darimu, di dapur atau di bengkel. Sensor api menangkap cahaya tak terlihat yang dipancarkan api; selama semuanya aman LED hijau menyala, dan ketika melihat ny

4.6(33)
44
Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)
#145Mahir
Premium

Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)

Sistem alarm keamanan pintar yang menyalakan buzzer dan LED ketika sensor PIR mendeteksi gerakan, sekaligus mengirim notifikasi instan ke pemilik lewat Telegram. Cooldown 30 detik membatasi seberapa sering alarm berulang; mekanisme ini tidak memvalidasi deteksi PIR atau menghilangkan pemicu palsu. Cocok untuk rumah, garasi, gudang, atau ruang kerja. Dengan ESP32-CAM bisa ditambahkan notifikasi berfoto; dengan ESP32 DevKit V1 klasik, notifikasinya berupa teks.

0.0(0)
9
HTTPClient + API Cuaca ESP32 (dengan Layar LCD)
#133Mahir
Premium

HTTPClient + API Cuaca ESP32 (dengan Layar LCD)

Di proyek ini, kita memakai ESP32 untuk melakukan panggilan REST API ke API cuaca (wttr.in) lewat internet dengan HTTPClient.h. Kita mengurai respons JSON yang diterima dengan ArduinoJson v7 dan menampilkan kota, suhu, kelembapan, cuaca, dan informasi angin di layar LCD I2C dalam bahasa Turki dan Inggris. wttr.in gratis dan tidak butuh kunci API; kamu cukup memasukkan nama kota apa pun untuk mengambil kondisi cuaca terkini kota itu. Data diperbarui otomatis setiap 30 menit.

4.7(13)
20