Sedikit Pengenalan

Dengan perkembangan teknologi yang semakin maju, diharapkan dapat membantu kehidupan manusia. Khususnya dalam kegiatan rumah tangga. Salah satunya dalam sistem otomatisasi. Dengan segala hal yang bersifat otomatis, tentunya dapat membantu memudahkan kerja kita untuk melakukan suatu pekerjaan. Kedepanya diharapkan banyak bermunculan produk-produk atau project Arduino mampu memenuhi hal tersebut.

Pada artikel ini, saya akan membagikan satu project Arduino. Berikut ini adalah Project Arduino Sistem Jemuran Otomatis dengan Sensor Hujan dan Cahaya. Dengan memanfaatkan inputan dari sensor Air Hujan dan sensor Cahaya (LDR), untuk membaca beberapa kondisi alam, seperti siang, malam, mendung, dan hujan. Kemudian memudian digunakan untuk memberikan tugas pada sebuah Aktuator, untuk menggerakan pintu (pintu jemuran), menjadi posisi terbuka atau tertutup (sesuai dengan kondisi sensor).

Berikut kita bahas referensi pembuatanya. Sebagai catatan disini saya tidak membahas sampai detail demo alatnya, karena tidak sempat membuat videonya, alatnya keburu dikirim (orderan orang) :D. Ok langsung saja kepembahasan.

DIAGRAM BLOK

Dari diagram blok diatas, saya menggunakan Arduino Nano sebagai mirkokontrollernya. Kemudian terdapat 3 buah inputan, tombol, sensor cahaya (LDR), dan sensor hujan (sensor air). 2 buah output berupa driver motor dengan menggunakan Relay DPDT, untuk mengatur putaran motor dua arah dan penambahan Mosfet IRF540 (Type-N), untuk mengatur kecepatan motor.

SKEMATIK & PCB LAYOUT

Semua komponen yang digunakan dapat dilihat dari desain diatas, untuk melihat lebih jelasnya dapat download file desainya di tag Download dibawah.

ILUSTRASI ALAT

Dari ilustrasi alat diatas, sensor cahaya & hujan ditempakan pada luar ruangan jemuran untuk membaca data kondisi cuaca. Pada rangkaian skema diatas saya sengaja memberikan dua buah motor, jikalau menggunakan lebih dari satu pintu jemuran.

PEMROGRAMAN ARDUINO

//==================================================
#include <EEPROM.h>                                 // Library EEPROM

// Definisikan PIN, agar lebih mudah
#define WATER        A5
#define LDR          A4
#define BUP          A0
#define BDN          A1
#define RLY1         4
#define RLY2         12
#define PWM1         3
#define PWM2         11

#define delayMotor   1000    // Delay 1000 ms untuk nyala motor
#define batasCahaya  30      // Batas persentase Data Cahaya < 30 = Mendung
#define batasHujan   30      // Batas persentase Data Cahaya > 30 = Hujan

#define TUTUP        0
#define BUKA         1


// Deklarasi Variable
int hujan, cahaya, spd, jemuran;
int  toleransi   = 2;             // Toleransi untuk jaga-jaga naik turunya data terlalu cepat.
byte speedMotor  = 100;           // kecepatan awal motor, jika tidak disimpan di EEPROM
String stats;                     // Status Serial Debug     
//==================================================
void setup() {
  Serial.begin(9600);       // Aktifkan Serial Monitoring

  // Ubah mode PIN
  pinMode(BUP, INPUT_PULLUP);
  pinMode(BDN, INPUT_PULLUP);
  pinMode(RLY1, OUTPUT);
  pinMode(RLY2, OUTPUT);
  pinMode(PWM1, OUTPUT);
  pinMode(PWM2, OUTPUT);
}

//==================================================
void loop() {
  speedMotor = EEPROM.read(0);
  cahaya     = 100 - map(analogRead(LDR), 0, 1023, 0, 100);     // mapping data, untuk diubah
  hujan      = 100 - map(analogRead(WATER), 0, 1023, 0, 100);   // contoh 0 s/d 1023, menjadi
  spd        = map(speedMotor, 0, 255, 0, 100);                 // 0 s/d 100  persen

  DEBUG();

  if (digitalRead(BUP) == LOW) speedMotor++;                // Tombol + Kecepatan Motor
  if (digitalRead(BDN) == LOW) speedMotor--;                // Tombol - Kecepatan Motor
  EEPROM.write(0, speedMotor);

  // Kondisi CAHAYA = Mendung / Malam dan HUJAN = BASAH
  if (cahaya < (batasCahaya - toleransi) and hujan > (batasHujan + toleransi) and jemuran == BUKA) {
    motorTutup();
    stats = "TUTUP, MENDUNG, BASAH";
  }
  // Kondisi CAHAYA = Siang dan HUJAN = BASAH
  else if (cahaya > (batasCahaya + toleransi) and hujan > (batasHujan + toleransi) and jemuran == BUKA) {
    motorTutup();
    stats = "TUTUP, SIANG, BASAH";
  }
  // Kondisi CAHAYA = Mendung dan HUJAN = KERING
  else if (cahaya < (batasCahaya - toleransi) and hujan < (batasHujan - toleransi) and jemuran == BUKA) {
    motorTutup();
    stats = "TUTUP, MENDUNG, KERING";
  }
  // Kondisi CAHAYA = Siang dan HUJAN = KERING
  else if (cahaya > (batasCahaya + toleransi) and hujan < (batasHujan - toleransi) and jemuran == TUTUP) {
    motorBuka();
    stats = "BUKA, SIANG, KERING";
  }
  delay(100);
}

//==================================================
void DEBUG() {
  Serial.print("CAHAYA : ");
  Serial.print(cahaya);
  Serial.print(" %   , ");
  Serial.print("HUJAN : ");
  Serial.print(hujan);
  Serial.print(" %   , ");
  Serial.print("SPEED : ");
  Serial.print(spd);
  Serial.print(" %   , ");
  Serial.print("STATUS : ");
  Serial.println(stats);
}

//==================================================
void motorBuka() {
  digitalWrite(RLY1, BUKA);            // Relay Aktif = Arah motor Buka
  digitalWrite(RLY2, BUKA);
  analogWrite(PWM1, speedMotor);       // Sinyal PWM untuk kecepatan motor
  analogWrite(PWM2, speedMotor);
  delay(delayMotor);                   // Jeda motor untuk menyala sampai jemuran terbuka
  digitalWrite(RLY1, LOW);             // Matikan Relay
  digitalWrite(RLY2, LOW);
  analogWrite(PWM1, 0);                // Matikan Sinyal PWM = Motor Berhenti
  analogWrite(PWM2, 0);
  jemuran = BUKA;
}

//==================================================
void motorTutup() {
  digitalWrite(RLY1, TUTUP);            // Relay Mati = Arah motor TUTUP
  digitalWrite(RLY2, TUTUP);
  analogWrite(PWM1, speedMotor);       // Sinyal PWM untuk kecepatan motor
  analogWrite(PWM2, speedMotor);
  delay(delayMotor);                   // Jeda motor untuk menyala sampai jemuran terbuka
  digitalWrite(RLY1, LOW);             // Matikan Relay
  digitalWrite(RLY2, LOW);
  analogWrite(PWM1, 0);                // Matikan Sinyal PWM = Motor Berhenti
  analogWrite(PWM2, 0);
  jemuran = TUTUP;
}

PEMBAHASAN PROGRAM

Saya tidak akan membahas detailnya, cuma sekilas saja. Karena sudah saya jelaskan pada komentar setiap baris kotak. Dari program diatas didapatkan data berikut melalui Serial Monitoring:

Dari data diatas dapat kita buat keputusan dengan menggunakan perintah (if..then), untuk digunakan sebagai pengendali kondisi pintu (arah putar motor). Saya sengaja membuat 2 driver motor pada rangkaian atau desain PCB diatas, karena kebutuhan project saya menggunakan 2 buah pintu.

Ok sekian dulu project ini, jika kurang lengkap saya sudah membuka diskusi pada forum grub diskusi Facebook, silahkan join pada menu forum diskusi diatas. Semoga bermanfaat.

DOWNLOAD FILE