Sabtu, 10 Februari 2018

MENGGABUNGKAN BEBERAPA SKETCH PROGRAM ARDUINO 3 (MODUL MP3 DAN BUTTON)

Modul MP3 yang banyak beredar di sekitar kita adalah modul DFPlayer Mini. Penggunaan librarynya pun gampang. Bro and bray dapat download di https://github.com/DFRobot/DFRobotDFPlayerMini Kendalanya juga g banyak. Kita langsung cobain yuk...
Salah satu sample librarynya seperti di bawah.
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
  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){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  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.
  }
 
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}

Dari sepanjang sample library di atas kita cuma ambil beberapa sketch program saja untuk memplay file MP3 di dalam memory yang kita selipkan dimodulnya, yaitu deklarasi program dan setup. Ijinkan Uda memenggal programnya ya...

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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo")); //Pesan ini tampilkan saat inisialisasi modul oleh ardino. Pesan ini tampil di Serial Monitor arduino IDE
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); //Pesan ini tampilkan saat inisialisasi modul oleh ardino. Pesan ini tampil di Serial Monitor arduino IDE
 
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:")); //ini untuk menampilkan pesan saat modul tidak terbaca oleh ardino. Pesan ini tampil di Serial Monitor arduino IDE
    Serial.println(F("1.Please recheck the connection!")); //ini untuk menampilkan pesan saat modul tidak terbaca oleh ardino. Pesan ini tampil di Serial Monitor arduino IDE
    Serial.println(F("2.Please insert the SD card!")); //ini untuk menampilkan pesan saat modul tidak terbaca oleh ardino. Pesan ini tampil di Serial Monitor arduino IDE
    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online.")); //Pesan ini tampilkan jika ardino berhasil membaca modul MP3 secara serial. Pesan ini tampil di Serial Monitor arduino IDE

 
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3. “Intinya adalah ini!!!”
}

void loop()
{
  static unsigned long timer = millis();
 
  if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }
 
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}


Setelah dapat intinya, yuk dibikin lebih simple lagi

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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
 
  if (!myDFPlayer.begin(mySoftwareSerial)) { 
    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini Siap digunakan.")); //*Pesan ini tampilkan jika ardino berhasil membaca modul MP3 secara serial. Pesan ini tampil di Serial Monitor arduino IDE
 
  myDFPlayer.volume(20);  //Set volume value. From 0 to 30
}

void loop()
{
  myDFPlayer.play(1);  //Play the first mp3. “Intinya adalah ini!!!”
  delay(3000);  //undur looping program selama 3 detik (3000 mili detik)
}

Nah kita cukup mengganti nomornya ke file yang akan kita play di dalam sketch program kita. Misalnya kita membaca temperatur dari angka yang di dapat dari sensor temperatur. Atau membaca tegangan di pin analog. Atau menyebutkan “welcome” saat alat pertama kali di nyalakan. Bro and bray tentu lebih bisa berkreasi sesuai dengan yang diinginkan. Sebelumnya pada postingan menggabungkan-beberapa-sketch-program 1 kita membahas tentang penggabungan modul MP3, sensor Suhu DHT11, Modul LCD 20x4, dan sensor PIR dan memplay file temperatur yang terbaca serta penambahan pernak-pernik suaranya. Mungkin sekarang kita buat contoh yang lebih simple. Memplay file x saat tombol x di tekan. 
Persiapannya adalah rekam lah suara dari 1 sampai 5 dan masing-masing file di tempatkan pada nomornya. File suara “satu” di simpan pada file 001. Begitu selanjutnya.  Kemudian pada file 006 rekamlah suara “tombol yang ditekan adalah”. Sekarang pasang sesuai pin yang kita deklarasikan. 
Sebenarnya memang sedikit lebih enak jika di jelasin dengan gambar. Yaitu bagian antara pin Tx Arduino dengan pin Rx Modul MP3 dipasang resistor antara 2K2 - 4K7, tujuannya agar suara krek..krek..krek.. di speakernya ilang. Tapi sayang kompi Uda lagi sakit, pemulihannya lama kayaknya xixixixi(gambarnya menyusul ya bro and sis)

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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

const int tombol1 = 2;
const int tombol2 = 3;
const int tombol3 = 4;
const int tombol4 = 5;
const int tombol5 = 6;

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
 
  if (!myDFPlayer.begin(mySoftwareSerial)) { 
    while(true){
      delay(0);
    }
  }
  Serial.println(F("DFPlayer Mini Siap digunakan."));   
  myDFPlayer.volume(20);   

  pinMode(tombol1, INPUT);
  pinMode(tombol2, INPUT);
  pinMode(tombol3, INPUT);
  pinMode(tombol4, INPUT);
  pinMode(tombol5, INPUT);
}

void loop()
{
  if (digitalRead(tombol1) == HIGH) // jika tombol 1 di pencet maka
    {     
      myDFPlayer.play(6);  //play file 006 yang rekamannya “ tombol yang di tekan adalah”
      delay(3000);                 // tunggu 3 detik atau di set sendiri. Maksudnya sampai file 006 selesai di putar.
      myDFPlayer.play(1);  // kemudian play file 001 yang isi rekamannya “satu”
      delay(1000);                  // tunda 1 detik
    }
  if (digitalRead(tombol2) == HIGH// keterangannya sama dengan di atas hanya yang di play adalah file 002 yang isi rekamannya “dua”. Begitu selanjutnya
    {     
      myDFPlayer.play(6); 
      delay(3000);
      myDFPlayer.play(2); 
      delay(1000);
    }

  if (digitalRead(tombol3) == HIGH)
    {     
      myDFPlayer.play(6); 
      delay(3000);
      myDFPlayer.play(3); 
      delay(1000);
    }

  if (digitalRead(tombol4) == HIGH)
    {     
      myDFPlayer.play(6); 
      delay(3000);
      myDFPlayer.play(4); 
      delay(1000);
    }

  if (digitalRead(tombol5) == HIGH)
    {     
      myDFPlayer.play(6); 
      delay(3000);
      myDFPlayer.play(5); 
      delay(1000);
    }
  delay(10);
}

Begitulah penggunaan modul MP3 yang lebih tepat guna pada arduino(aduh bahasamu Udaaaa... xixixixi).

baca juga: Menggabungkan Beberapa Sketch Program Arduino 2

Sekiranya ada pertanyaan atau pun saran bisa diisi dikolom komentar deh. Jika ada pertanyaan seputar modul MP3 dan kendalanya juga boleh kok isi di kolom komentar, Uda pasti dengan senang hati membantu 


Kamis, 01 Februari 2018

MENGGABUNGKAN BEBERAPA SKETCH PROGRAM ARDUINO 2 (MODUL PIR, DHT11, RELAY, MP3)

Sepertinya banyak yang pengen tau nih cara gabungin sketch program arduino. Baru contoh Menggabungkan Beberapa Sketch Program Arduino 1 ya. Kayaknya contohnya masih kurang deh. Nih uda kasih lagi contoh yang ke dua. Misalnya uda punya dua sensor nih, satu nya sensor PIR satunya lagi sensor temperatur. Langsung aja kita ambil dari contoh yang pernah uda bikin.
Yang pertama untuk sensor PIR deh. Berikut sketchnya...

const int PIRSensor = A0;
int nilaiPIRSensor    = 0;

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

void loop()
{
   nilaiPIRSensor = digitalRead(PIRSensor);
    Serial.print(“nilaiPIRSensor:”);
    Serial.println(nilaiPIRSensor);
}

Yang kedua kita ambil dari examplenya librarynya arduino untuk sensor DHT11 yang populer. Uda punya library DHT11 yang dapat di download disini. Kali aja ada yang belum tau cara nambahin library di arduino IDE ya. Lain kali Uda bikini bahasan khusunya deh. Simplenya aja ya bagi yang belum tau, buka Arduino IDE nya, klik sketch, dibawahnya ada include library, disampingnya ada add .ZIP library. Nantinya bakal keluar jendela baru, pilih deh file ZIP librarynya. Tinggal klik Open jadi deh. Ups... lanjut....
Nih contoh dari library

#include < SimpleDHT.h >

//variables for storing values
int pinDHT11 = 2;
SimpleDHT11 dht11;

{
  Serial.begin(115200);
}

void loop()
{
  // start working...
  Serial.println("=================================");
  Serial.println("Sample DHT11...");

  // read without samples.
  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
    return;
  }

  Serial.print("Sample OK: ");
  Serial.print((int)temperature); Serial.print(" *C, ");
  Serial.print((int)humidity); Serial.println(" H");
 
  // DHT11 sampling rate is 1HZ.
  delay(1500);
}

Sebenarnya dari sample diatas ada sedikit masalah tentang variable nilai temperaturnya dan kelembabannya. Variable tersebut di tarok di looping program. Lha apa lagi sih Uda.... jadi variabel yang Uda maksud adalah penamaan register biar kitanya tidak bingung nantinya... Aduuuhhh tambah bingung Udaaaaa... jadi variable tersebut untuk menyimpan nilai atau angka dari pembacaan temperatur dan kelembabannya. Kalau kita Cuma pakai untuk menampilkan nilai yang dibaca ini melalui “Serial Monitor” dari arduino IDE nya. Kalau kita mau gabungin untuk menyalakan kipas ya harusnya kita tarok penamaan variabelnya di pernyataan atau deklarasi program. Jadi programnya kita robah sedikit ya menjadi.

#include < SimpleDHT.h >
SimpleDHT11 dht11;

//variables for storing values
int pinDHT11 = 2;
int temperature = 0;
int humidity = 0;

{
  Serial.begin(115200);
}

void loop()
{
  // start working...
  Serial.println("=================================");
  Serial.println("Sample DHT11...");

  // read without samples.
  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
    return;
  }

  Serial.print("Sample OK: ");
  Serial.print(temperature);
  Serial.print(" *C, ");
  Serial.print(humidity);
  Serial.println(" H");
 
  // DHT11 sampling rate is 1HZ.
  delay(1500);
}


Kita ambil examplenya LiquidCrystal lagi ya. Yang paling familiar aja deh “HelloWord” wusshhhh....
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup()
{
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop()
{
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}

Lanjuuuuttt....
Sekarang kita asumsiin kita punya LCD 20x4 harus robah yang mana ya dari contoh library diatas?
Coba tukar di bagian “void setup()” pada “lcd.begin(16, 2);” menjadi “lcd.begin(20, 4);”

Sekarang kita mau nyalain kipas angin setelah temperatur terbaca 32°C. Berarti kita butuh satu modul lagi nih. Modul relay deh pada tau dong relay itu buat apaan... buat nyambungin antara arduino dengan kipas angin 220VAC. Gitu deh kira2..
 Modul relay tersebut aktif malah kalau di kasih logika LOW, freak kata anak2 jaman now. Xixixix...

Cara nyalainnya gimana Uda? Ya seperti contoh sketch blink yang ada di arduino, yuk intip.
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

Maksudnya gimana Uda...???
Jadi LED_BUILTIN yang tercantum dalam UU.... eh terpasang pada pin 13 akan nyala jika dikasih HIGH, dan mati jika dikasih LOW.  Kita asumsiin sama lah dengan modul relay yang akan kita tambahin di rangkaian kita nantinya. Bedanya pin kita tarok dimana dan aktifnya kalau dikasih LOW.

Tapi uda bermaksud lain. Bagaimana kalau program tersebut kita play di MP3 player. Sepertinya MP3 player arduino yang banyak beredar di pasaran adalah DFPlayerMini, yang librarynya dapat kita download di https://github.com/DFRobot/DFRobotDFPlayerMini. kita ambil ya sample programnya.

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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
  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){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  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.
  }
 
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}

Ini uda ambil dari example get started nya library DFRobotDFplayerMini. Mau kita apakan ya example-example yang kita ambil???

Gini deh... bagaimana kalau setelah temperatur tercapai di atas 30°C. Kipasnya nyala. sekalian Mp3 menyebut (play) “kipas nyala om...”, dan jika temperatur di bawah 30 kipas mati dan MP3 juga memplay file kipas mati. Sensor di sketch paling atas adalah sensor PIR. Jika terdeteksi gerakan, maka modul MP3 memplay file “temperatur sekarang adalah:”, “angka temperaturnya” dan “status kipas”. Semuanya juga di tampilkan di LCD 20x4.

Yuk mulai...
Pertama kita ambil semua inisialisasi dari setiap example program. Bagi yang belum tau. Inisialisasi adalah pernyataan atau deklarasi program supaya gampang dalam pendefinisiannya.... aaaaahhhhh ribet amat. Kita g perlu teori cuy. Kita butuh langsung praktek aja. Yuuuuukkkkk.............

Yang pertama mengkopi bagian library dari setiap modulnya.

#include <SimpleDHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

Ok siap. Selanjutnya deklarasi variable yang di gunakan. Langsung Uda gabung sama librarynya ya biar jelas apa yang udah kita gabungin

#include <SimpleDHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SimpleDHT11 dht11;

const int PIRSensor = A0;
int nilaiPIRSensor    = 0;
int pinDHT11 = 2;
int temperature = 0;
int humidity = 0;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial mySoftwareSerial(9, 10); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

sip, ready.. sekarang penggabungan bagian setup program

#include <SimpleDHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SimpleDHT11 dht11;

const int PIRSensor = A0;
int nilaiPIRSensor    = 0;
int pinDHT11 = 6; //pin 2 terpakai untuk LCD kita pindah ke pin 6 ya
int temperature = 0;
int humidity = 0;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  Serial.begin(9600);
  lcd.begin(20, 4);
  // Print a message to the LCD.
 lcd.print("hello, world!"); // ganti aja isinya sama yang kita suka aja misalnya ”tamperatur kontrol”

  mySoftwareSerial.begin(9600);
  Serial.begin(115200); //pengaktifan serial yang ini kita hapus ya, biar g bentrok ama yang atas. Kita butuhnya cuman 1 kok (di penyempurnaan di bawah)
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
  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){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
 
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

Penyempurnaan tulisan pada setup biar cocok

#include <SimpleDHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SimpleDHT11 dht11;

const int PIRSensor = A0;
int nilaiPIRSensor    = 0;
int pinDHT11 = 2;
int temperature = 0;
int humidity = 0;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  Serial.begin(9600);
  lcd.begin(20, 4);
  // Print a message to the LCD.
  lcd.print("hello, world!"); // ganti aja isinya sama yang kita suka aja misalnya ”tamperatur kontrol”
  lcd.print(" Temperatur kontrol "); // ganti aja isinya sama yang kita suka aja misalnya ”tamperatur kontrol”                                         
  lcd.setCursor(0, 1); // tambahin tulisannya di baris kedua
  lcd.print("  kipas angin bro   ”);
  lcd.setCursor(0, 2); // tambahin tulisannya di baris ketiga
  lcd.print("      bikinan       ”);
  lcd.setCursor(0, 3); // tambahin tulisannya di baris ketiga
  lcd.print("  sendiri lhoo...   ”);

  mySoftwareSerial.begin(9600);
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
  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){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
 
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
  delay(3000); // biar tampil tulisan LCD nya agak lamaan dikit
}

Selanjutnya kita gabungin looping programnya...
Tapi kali ini kita tidak memperbaikinya lagi, kita hanya ambil inti dari program tersebut. Soalnya jadi kepanjangan bahasnnya... xixixixi....

#include <SimpleDHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SimpleDHT11 dht11;

const int PIRSensor = A0;
const int  pinDHT11 = 2;
const int pinKipas = 7;
int nilaiPIRSensor    = 0;
int temperature = 0;
int temperatur = 0;
int humidity = 0;
int mp3Kipas = 0;
String statusKipas = “”; //penambahan variable untuk penulisan status kipas di LCD
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial mySoftwareSerial(9, 10); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  Serial.begin(9600);
  lcd.begin(20, 4);
  // Print a message to the LCD.
  lcd.print("hello, world!"); // ganti aja isinya sama yang kita suka aja misalnya ”tamperatur kontrol”
  lcd.print(" Temperatur kontrol "); // ganti aja isinya sama yang kita suka aja misalnya ”tamperatur kontrol”                                         
  lcd.setCursor(0, 1); // tambahin tulisannya di baris kedua
  lcd.print("  kipas angin bro   ”);
  lcd.setCursor(0, 2); // tambahin tulisannya di baris ketiga
  lcd.print("      bikinan       ”);
  lcd.setCursor(0, 3); // tambahin tulisannya di baris ketiga
  lcd.print("  sendiri lhoo...   ”);

  mySoftwareSerial.begin(9600);
 
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
 
  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){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
 
  myDFPlayer.volume(20);  //Set volume value. From 0 to 30
  myDFPlayer.play(93);  //Play the first mp3
  delay(3000); // biar tampil tulisan LCD nya agak lamaan dikit
}

void loop()
{
  //pertama kita atur dulu tampilan di LCDnya
  lcd.clear(); //untuk membersihkan tulisan sebelumnya yang melekat pada LCD
  lcd.setCursor(0, 0);
  lcd.print(“Kipas Kontrol”);
  lcd.setCursor(0, 1);
  lcd.print(“temperatur: ”);
  lcd.print(temperature);
  lcd.setCursor(0, 2);
  lcd.print(“kelembaban: ”);
  lcd.print(humidity);
  lcd.setCursor(0, 3);
  lcd.print(“kipas: ”);
  lcd.print(statusKipas);

  nilaiPIRSensor = digitalRead(PIRSensor);
  Serial.print(“nilaiPIRSensor:”);

  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
    return;
  }

  Serial.print("Sample OK: ");
  Serial.print(temperature);
  Serial.print(" *C, ");
  Serial.print(humidity);
  Serial.println(" H");
 
  temperatur = temperature; //kita masukkan isi variable temperature ke variabel temperatur
  if (temperatur > 30) //logika pengaturan kipas angin dengan aktif low
  {
    digitalWrite (pinKipas, LOW);
    statusKipas = “nyala”;
    mp3Kipas = 91;
  }
  else
  {
    digitalWrite (pinKipas, HIGH);
    statusKipas = “mati”;
    mp3Kipas = 92;
  }

  if(nilaiPIRSensor == 1)
  {
    myDFPlayer.play(94);
    myDFPlayer.play(temperatur);
    myDFPlayer.play(mp3Kipas);
  }
}

Sekarang rekam suara per file. “satu” simpan di file 001 dengan format mp3, selanjutnya “dua” dan simpan di file 002, dan selanjutnya sampai 50. Dengan asumsi temperatur tertinggi hanya sampai 50. Atau sekiranya bro dan bray betah silahkan sampai 90. File 091 isi dengan suara “kipas nyala”, file 092 isi dengan suara “kipas mati”, dan file 093 dengan suara “mesin pengatur kipas otomatis”. Satu lagi, rekam juga MP3 dengan suara "temperatur sekarang adalah" dan simpan di file 094.
Masukkan ke memory dan rangkai sesuai dengan program yang kita buat. Sayang Uda tidak punya program gambar rangkaian di laptop. Lain kali kita update ya gambar rangkaiannya.
Pin yang kita pakai pada arduino yaitu
Pin A0 ke PIR Sensor
Pin 2  ke LCD D7
Pin 3 ke LCD D6
Pin 4 ke LCD D5
Pin 5 ke LCD D4
Pin 6 ke DHT11. Silahkan googling dulu deh mengenai cara pemasangannya. Tutornya nyusul ya bray
Pin 9 ke DFPlayer mini TX
Pin 10 ke DFPlayer mini RX
Pin 11 ke LCD E
Pin 12 ke LCD RS

Satu lagi hal penting nih. Kalau bro dan sis ngopiin koding di atas di jamin error deh. Jadi harus di modif dikit soal penulisan tanda kutip dua (“). Di hapus trus di ketik ulang lagi, atau bisa download di disini Semoga berhasil yaaa.....

Seandainya masih kurang, klik lagi link ini deh brai untuk contoh ke 3

Sekiranya ada kendala dalam rangkaian atau programnya bisa tanya langsung deh di kolom komentar. Uda pasti denga senang hati menjawabnya.