Selasa, 05 Maret 2019

MENGGABUNGKAN SKETCH PROGRAM ARDUINO LCD 16X2, PIR SENSOR, RTC, SIM800 DAN MODUL MP3

Udah lama g update blog, maaf ya bro/sis. Kali ini kita langsung pada contoh ke aplikasi counter orang masuk pada suatu ruangan yang di lengkapi suara sapaan. Jadi sekarang kita udah mulai menjurus nih ke alat tugas akhir. Kayaknya bisa di aplikasiin ke perpustakaan, caffe, toko, atau semacamnya lah.

Kerja alatnya, jika sensor PIR mendeteksi orang di sisi pintu masuk, maka modul MP3 akan mengeluarkan suara “selamat datang”, dan counter orang pun ditambah, dan ditampilkan di LCD. Dan apabila sensor PIR mendetesi orang disisi pintu keluar modul MP3 akan memplay file “selamat jalan”. Dan laporan pun di kirim setiap jam tertentu melalui SMS ke nomor pemilik tempat, pada program ini kita atur aja dikirim setiap jam 12 siang dan 9 malam.

Yuk kita mulai…
Intip dulu gambar rangkaiannya…
















komponen yag kita perlukan :
1. Arduino Uno
2. LCD 16x2
3. SIM800
4. Sensor PIR 2pcs
5. Modul RTC
6. Modul MP3 (DFMiniPlayer)
7. Modul Amplifier PAM8403
8. Modul DC-DC StepDown LM2596
9. Dan komponen pendukung lainnya (dapat dilihat di gambar)

Kita kumpulin dulu programnya atu2 yuk. Program yang menggunakan library semua kita kumpulin, untuk kemudian kita satuin.

1. Modul LCD
Mungkin masih ada yang belum mengetahui cara penulisan nilai atau tulisan di LCD karakter 16x2 atau 20x4. bisa disimak di link berikut.


#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print(millis() / 1000);
}

Program diatas adalah program HelloWord bawaan arduino IDE. Kita ambil dikit ya.

2. Modul RTC (DS1307)
Modul RTC yang kita gunakan disini adalah versi yang paling murah yaitu DS1307. librarynya dapat di download disini
Samplenya di ambil seperti dibawah ini. Tapi biar penjelasannya g penjang kali, langsung Uda ambil intinya aja ya. Kali bro/sis dapat liat bagian mana yang Uda ambil dan bagian mana yang uda buang dengan membandingkannya dengan program asli bawaan library.

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

void setup () {
  while (!Serial); // for Leonardo/Micro/Zero

  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
  }
  //hilangkan garis miring 2 ini untuk mengaktifkan codingnya
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // bagian ini uda robah tanpatnya. Bagian ini mencocokkan waktu RTC dengan jam komputer
  //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); // bagian ini uda robah tanpatnya. Bagian ini utk menset waktu sesuai dengan yang kita inginkan
}

void loop () {
    DateTime now = rtc.now();
    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.println();
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    delay(1000);
}

3. Modul MP3(DFMiniPlayer)
Modul MP3 membuat alat kita terlihat keren. Alatnya bisa bicara bro/sis… :D. 
Padahal cuma memplay file suara aja kok. Kita pakai library juga utk memakai modul MP3 ini. Uda copy-in koding “GetStarted” dan uda bikinin lebih simpel, jadi kita ambil yang pentingnya aja, biar g panjang banget tutorialnya nanti.

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

void loop()
{
  static unsigned long timer = millis();
  
  if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }
}

4. Modul SIM800
Itu aja tuh modul yang pakai library. Selebihnya koding g pakai library, alias di ketikin manual. Untuk modul SIM800 programnya pakai AT command. AT command??? AT command adalah program standart untuk modul radio. Udah di tetapkan oleh para ahli semenjak 1000thn SM. Jadi siapa aja yang bikin modul yang bekerja menggunakan radio utk pegoperasiannya menggunakan perintah AT command.

5. Modul PIR
Modul ini sebagai input buat alat kita. Jika sensor mendeteksi orang maka output akan mengeluarkan logika 1, dan sebaliknya.

6. Modul amplifier (PAM8403)
Modul ini hanya sebagai penguat suara keluaran modul MP3. berarti modul ini tidak memerlukan pemprogramman dalam pengoperasiannya.

7. Modul DC-DC stepdown LM2596
Modul ini adalah regulator tegangan. Fungsinya menurunkan tegangan DC inputnya. Modul ini bisa di set tegangan outputnya dengan memutar trimmer potensiometer yang ada di modul tersebut. Modul ini pun tidak memerlukan bahasa pemprograman dalam pengoperasianya.

8. Komponen pendukung
Komponen ini sebenarnya untuk power supply dan komponen pendukung bekerjanya modul2 arduino.

Yuk kita gabungin…

1. Bagian deklarasi
Kita ambil dulu bagian deklarasi dari masing2 program. Bagian deklarasi biasanya berada di sebelum “void setup”. yuk copy-in semuanya.

#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

Ada baiknya bagian ini kita susun… misalnya pemanggilan library sama2 library aja dulu. Walaupun sebenarnya g masalah. Jadinya seperti ini.

#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

RTC_DS1307 rtc;

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

2. Bagian setup program
Bagian ini ditandai dengan tulisan “void setup” pada program tersebut. Kita ambil mulai dari “void setup”.  Isinya dimulai dari buka kurung kurawal sampai dengan tutup kurung kurawal. Void setup merupakan program yang hanya di baca sekali oleh micrcontrollerya. Kenapa perlu void setup? Karena bagian ini di gunakan untuk menset parameter dari program atau modul yang kita gunakan. Misal nya saja program untuk setup volume pada modul MP3. kita hanya perlu menset volume sekali saja kan… atau menset waktu pada RTC. Tentu saja kita menset waktu pada RTC sekali saja.  

void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");
}

void setup () {
  while (!Serial); // for Leonardo/Micro/Zero

  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
  }
  //hilangkan garis miring 2 ini untuk mengaktifkan codingnya
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // bagian ini uda robah tanpatnya. Bagian ini mencocokkan waktu RTC dengan jam komputer
  //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); // bagian ini uda robah tanpatnya. Bagian ini utk menset waktu sesuai dengan yang kita inginkan
}

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

Kemudian kita jadiin 1 void setup. Karena g bisa ada lebih dari 1 void setup dalam satu program.

void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");

  while (!Serial); // for Leonardo/Micro/Zero

  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
   }

   if (! rtc.isrunning()) {
   Serial.println("RTC is NOT running!");
   }
   //hilangkan garis miring 2 ini untuk mengaktifkan codingnya
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // bagian ini uda robah tanpatnya. Bagian ini mencocokkan waktu RTC dengan jam komputer
   //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); // bagian ini uda robah tanpatnya. Bagian ini utk menset waktu sesuai dengan yang kita inginkan

  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
  Serial.println(F("Unable to begin:"));
  Serial.println(F("1.Please recheck the connection!"));
  Serial.println(F("2.Please insert the SD card!"));
  while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

3. Bagian looping program
Bagian ini lah yang dibaca berulang2 kali oleh microcontrollernya. Ada yang bilang ini main program.

void loop() {
  lcd.setCursor(0, 1);
  lcd.print(millis() / 1000);
}

void loop () {
    DateTime now = rtc.now();
    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.println();
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    delay(1000);
}

void loop()
{
  static unsigned long timer = millis();
  
  if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }
}

Seperti diatas looping juga harus 1 di dalam program.

void loop() {
  lcd.setCursor(0, 1);
  lcd.print(millis() / 1000);

  DateTime now = rtc.now();
    
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.println();
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
  delay(1000);

 static unsigned long timer = millis();
  
  if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }
}

Penggabungan Semua Program
Saatnya menggabungkan deklarasi, setup sama main program

#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

RTC_DS1307 rtc;

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");

  while (!Serial); // for Leonardo/Micro/Zero

  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
  }
   //hilangkan garis miring 2 ini untuk mengaktifkan codingnya
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // bagian ini uda robah tanpatnya. Bagian ini mencocokkan waktu RTC dengan jam komputer
   //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); // bagian ini uda robah tanpatnya. Bagian ini utk menset waktu sesuai dengan yang kita inginkan

  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

* Pencocokan PIN
Pin program bawaan arduino IDE tentu tidak sama dengan gambar rangkaian yang kita buat. Maka dari padanya kita cocokkan dulu bro/sis.
Arduino
Rangkaian
4
LCD-D7
5
LCD-D6
6
LCD-D5
7
LCD-D4
11
LCD-E
12
LCD-RS
2
TX-MP3
3
RX-MP3
8
TX-SIM800
9
RX-SIM800
SDA/A4
SDA-RTC
SCL/A5
SCL-RTC
A0
PIR masuk
A1
PIR keluar


Pin2 diatas kita masukkan ke dalam deklarasi program. Untuk penjelasannya mungkin bisa baca2 postingan sebelumnya. Jadi langsung aja ya.. O iya ini langsung dengan penambahan program SIM800 dan PIR ya… sekalian semua parameternya diganti sesuai kebutuhan. Kali aja bro/sis bisa liat bagian mana yang berobah dan bagian mana yang di tambah.

#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

const int rs = 12, en = 11, d4 = 7, d5 = 6, d6 = 5, d7 = 4;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

RTC_DS1307 rtc;

SoftwareSerial mySoftwareSerial(2, 3); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

SoftwareSerial SIM800L(8, 9); // RX | TX

const int PIRMasuk = A0;
const int PIRKeluar = A1 ;
int total         = 0;
String isiSMS     = "";
int jam               = 0;
int menit             = 0;
int detik = 0;

void setup() {
lcd.begin(16, 2);
lcd.print(" counter orang  ");
lcd.setCursor(0, 1);
lcd.print(" counter orang  ");

while (!Serial); // for Leonardo/Micro/Zero

   Serial.begin(57600);
   if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
   }

   if (! rtc.isrunning()) {
   Serial.println("RTC is NOT running!");
   }
   //hilangkan garis miring 2 ini untuk mengaktifkan codingnya
   rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // bagian ini uda robah tanpatnya. Bagian ini mencocokkan waktu RTC dengan jam komputer
   //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); // bagian ini uda robah tanpatnya. Bagian ini utk menset waktu sesuai dengan yang kita inginkan

   mySoftwareSerial.begin(9600);
   Serial.begin(115200);
  
   if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
   Serial.println(F("Unable to begin:"));
   Serial.println(F("1.Please recheck the connection!"));
   Serial.println(F("2.Please insert the SD card!"));
   while(true);
   }
   Serial.println(F("DFPlayer Mini online."));
  
   myDFPlayer.volume(10);  //Set volume value. From 0 to 30
   myDFPlayer.play(1);  //Play the first mp3

   SIM800L.begin(9600);  
   Serial.println("SIM800L started at 9600");
   delay(1000);
   Serial.println("Setup Complete! SIM800L is Ready!");
   
   Serial.println("Set format SMS ke ASCII");
   SIM800L.write("AT+CMGF=1\r\n");
   delay(1000);
}

void loop()
{
  DateTime now = rtc.now();
  jam = now.hour(), DEC;disini
  Serial.print(jam);
  Serial.print(':');
  menit = now.minute(), DEC;
  Serial.print(menit);
  Serial.print(':');
  detik = now.second(), DEC;
  Serial.println(detik);
  
  lcd.clear();
  lcd.print(jam);
  lcd.print(":");
  lcd.print(menit);
  lcd.setCursor(0, 1);
  lcd.print("pengunjung:");
    
  if(digitalRead(PIRMasuk)== HIGH)
  {
    total =+ 1;
    Serial.println(total);
    lcd.setCursor(12, 1);
    lcd.print(total);
    isiSMS = "total pengunjung:  " + total;
    Serial.println(isiSMS);

    myDFPlayer.play(2);
  }

  else if(digitalRead(PIRKeluar)== HIGH)
  {
    myDFPlayer.play(3);
  }

  if(jam == 12 || jam == 21)
  {
    if(menit == 0 && detik < 5)
    {
      kirimSMS();
    }    
  }
  delay(1000);
}

void kirimSMS() {
  Serial.println("SIM800L Set SMS ke Nomor Tujuan");
  SIM800L.write("AT+CMGS=\"085100406332\"\r\n");
  delay(1000);
   
  Serial.println("SIM800L Send SMS content");
  SIM800L.print(isiSMS);
  delay(1000);
   
  Serial.println("Mengirim Char Ctrl+Z / ESC untuk keluar dari menu SMS");
  SIM800L.write((char)26);
  delay(1000);
     
  Serial.println("SMS Selesai Dikirim!");
}

Untuk file suaranya silahkan isi file 1 dengan suara “mesin counter pengunjung”
Untuk file 2 dengan suara “Selamat datang di toko kami”
Untuk file 3 dengan suara “Selamat jalan ya”

Begitu lah kira2 penggabungan program berikutnya dari Uda. Kali aja ada yang nanya silahkan tulis di kolom komentar. Uda akan dengan senang hati menjawabnya