---
# System prepended metadata

title: 'Go Hard or Go Home - Raindrop, Temperature, and Humidity Sensor.'

---

# Cara Membuat Sensor Hujan dan Kelembapan Menggunakan ESP32, DHT22, dan Sensor Raindrops #



:::info
:bulb: Dikarenakan keterbatasan ilmu penulis, proyek ini masih belum sempurna pada beberapa bagian terutama visualisasi Node-RED. 
:::
Tujuan dari proyek ini adalah untuk memenuhi tugas besar kelas IoT Universitas Telkom semester ganjil 2023

Kelompok: 2GH (go hard or go home)

Anggota:
1. Muhammad Ismail Ibadurrahman 1103204239

## Ringkasan Singkat Proyek ##
Proyek ini akan merangkai rangkaian sederhana arduino yang menggunakan ESP32 Devkits 1, DHT22, dan Raindrops Sensor. Kombinasi dari DHT22 yang berkerja sebagai sensor suhu dan kelembapan serta  Raindrops yang berkerja sebagai sensor intensitas tetes hujan. Memonitor keadaan sekitar (suhu, kelembapan, dan intensitas hujan) kemudian data tersebut dikirim ke Broker. 
Kemudian, data yang di *publish* ke Broker akan di *fetch* oleh Node-Red untuk kontrol jarak jauh.


Estimasi pengerjaan proyek (tidak termasuk bug fixing):
sekitar 2-3 jam

## Capaian ##
#### **Alasan pemilihan topik proyek:** ####
Alat pendeteksi kelembapan dan intensitas hujan memiliki banyak manfaat, terutama dalam bidang meteorologi, pertanian, dan pemantauan lingkungan. 

#### **Tujuan proyek:** ####

Alat ini membantu dalam pemantauan lingkungan untuk mengukur kelembapan udara dan intensitas hujan. Informasi ini dapat digunakan untuk memahami kondisi lingkungan.
Informasi kelembapan dan intensitas hujan penting untuk meningkatkan akurasi prediksi cuaca. Hal ini dapat membantu dalam perencanaan pergi ke suatu tempat, ataupun peringatan dini terhadap bencana alam seperti banjir.

#### **Hal yang didapatkan dari proyek:** ####
Proyek ini memberikan kami konsep dasar dari IoT, cara memprogramnya, dan merangkai rangkaian IoT. Proyek ini juga disisi lain menjadi contoh dalam penggunaan IoT untuk memecahkan suatu persoalan sehari-hari serta pengimplementasian pada suatu model bisnis.

## Alat dan Bahan ##



| Komponen | Fungsi   | Harga    |
| -------- | -------- | -------- |
| ESP32 DEVKITV1 + Kabel USB Mikro    | Mikrokontroler, pengambilan data, dan transfer data     | Rp71.000     |
| DHT22 AM2302     | Sensor suhu dan kelembapan     | Rp25.500     |
| Kabel Jumper Kit     | Penghubung antar komponen IoT     | Rp9.500     |
| Breadboard Mini     | Wadah rangkaian komponen IoT     | Rp7.800     |
| Raindrop Sensor     | Sensor hujan     | Rp6.000     |

## Merangkai Rangkaian ##
![image](https://hackmd.io/_uploads/HkyYBmr_p.png)
Gambar 1 : Wiring ESP32 to Raindrop Sensor
![image](https://hackmd.io/_uploads/H10sB7Hdp.png)
Gambar 2 : Wiring ESP32 to DHT22


Kurang lebih *wiring* nya adalah kombinasi dari 2 *wiring* diatas, berikut milik saya: ![image](https://hackmd.io/_uploads/rJ_H8mSOa.png)

## Pemilihan Platform ##
Platform yang digunakan untuk proyek ini adalah Node-RED dan Arduino IDE. Node-RED adalah platform pemrograman visual open-source yang dirancang untuk menghubungkan perangkat keras, perangkat lunak, dan layanan online dalam lingkungan Internet of Things(IoT). Arduino IDE adalah *software* untuk melakukan penulisan program, compile serta upload program ke board arduino. Platform ini memungkinkan pengguna untuk mengolah atau memvisualisasikan data lebih efisien.

## Source Code ##


```
// Library untuk environment wifi, mqtt
#include <WiFi.h>
#include <PubSubClient.h>

// Ini library untuk DHT
#include <DHT.h>
#define DHT_SENSOR_PIN  21
#define DHT_SENSOR_TYPE DHT22

// Deklarasi variabel untuk prep WiFi
const char* ssid = "cyber";
const char* password = "12345678";

// Deklarasi kredensial variable untuk prep MQTT
const char *mqtt_broker = "broker.emqx.io";
const char *topic_mqtt = "kelasiotesp/SUPERMAN/rainhumidity";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;

DHT dht_sensor(DHT_SENSOR_PIN, DHT_SENSOR_TYPE);

// Ini library untuk Raindrop Sensor
#define POWER_PIN 32
#define DO_PIN 13
#define AO_PIN 36

// Library untuk WiFi
WiFiClient espClient;
PubSubClient client(espClient);

void callback(char* topic, byte* message, unsigned int length);

void setup() {
  Serial.begin(9600);
  dht_sensor.begin();

  pinMode(POWER_PIN, OUTPUT);
  pinMode(DO_PIN, INPUT);

  setup_wifi();
  client.setServer(mqtt_broker, mqtt_port);
  client.setCallback(callback);

  while (!client.connected()) {
    String client_id = "esp32-client-";
    client_id += String(WiFi.macAddress());
    Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());
    if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
      Serial.println("Public emqx mqtt broker connected");
    } else {
      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);
    }
  }
}

void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* message, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;

  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();
}

void loop() {
  // DHT Sensor
  float humidity = dht_sensor.readHumidity();
  float temperature = dht_sensor.readTemperature();

  Serial.println("----------------DHT22 Sensor----------------");
  if (!isnan(humidity) && !isnan(temperature)) {
    Serial.print("Humidity: ");
    Serial.print(humidity);
    client.publish(topic_mqtt, String(humidity).c_str(), true);
    Serial.print("% | Temperature: ");
    Serial.print(temperature);
    client.publish(topic_mqtt, String(temperature).c_str(), true);
    Serial.println("°C");
  } else {
    Serial.println("Failed to read from DHT22 sensor");
  }

  // Raindrop Sensor
  digitalWrite(POWER_PIN, HIGH);
  delay(10);

  int rain_state = digitalRead(DO_PIN);
  int rain_value = analogRead(AO_PIN);

  digitalWrite(POWER_PIN, LOW);

  Serial.println("----------------Raindrop Sensor----------------");
  if (rain_state == HIGH) {
    Serial.println("Rain not detected");
    Serial.println(rain_value);
    client.publish(topic_mqtt, String(rain_value).c_str(), true);
  } else {
    Serial.println("Rain detected");
    Serial.println(rain_value);
    client.publish(topic_mqtt, String(rain_value).c_str(), true);
  }

  delay(2000);
  client.loop();
}
```
## Pengiriman Data/Konektivitas ##
Pada proyek ini, mikrokontroler mengambil data dari sensor setiap 2 detik. Data yang didapat dari sensor *Raindrops* dan DHT22, kemudian dikirim menggunakan ESP32 yang sudah disetup untuk berkomunikasi ke internet via WiFi module dan menggunakan protokol pengiriman MQTT atau bisa disebut juga Message Queuing Telemetry Transport. Data di ambil kembali oleh Node-RED lalu diolah menggunakan *Graphical User Interface* sehingga desain bisa di baca secara visual dan lebih efisien.

![image](https://hackmd.io/_uploads/HyeYK4B_T.png)
Gambar 3: Node-RED tersambung dengan broker
![image](https://hackmd.io/_uploads/BynTYES_T.png)
Gambar 4: Flow node Node-Red


## Menampilkan Data
![image](https://hackmd.io/_uploads/SJa-iErO6.png)
Gambar 5: Tampilan *serial monitor* pada Arduino IDE

![image](https://hackmd.io/_uploads/ryXOjVSOa.png)

Gambar 6: Visual data pada *Dashboard* Node-RED dari data yang diolah hasil *subscribe* pada *broker*

## Finalisasi ##

![image](https://hackmd.io/_uploads/BJhyT4SOa.png)


Gambar 7: Raindrops, Temperature, and Humidity

Untuk skala prototype, alat ini sudah bisa digunakan untuk mengetahui intensitas hujan, temperature, dan kondisi kelembapan pada lingkungan. *Raindrops board sensor* dapat diteteskan/dibasahi untuk menguji atau men-*trigger* adanya perubahan dalam pembacaan data. DHT22 Temperature & Humidity juga akan bereaksi ketika terdapat kelembapan/suhu yang berubah terhadap lingkungan. Namun alat ini belum dinilai bisa diterapkan di kehidupan nyata tanpa adanya *case* yang melindungi komponen lain dari hujan, karna hanya modul *raindrops* saja yang *water resistant*.

## Kesimpulan ##
Dengan adanya proyek ini penulis jadi memahami bagaimana cara merancang, menguji, dan mengolah data dalam konteks IoT. Perpaduan antara mikrokontroler dan sensor dapat dinilai efisien ketika bisa menjadi solusi dari suatu kebutuhan. Sensor Raindrop dan DHT22 merupakan kombinasi yang cukup bagus dikarenakan fungsinya yang saling melengkapi.