#include <SoftwareSerial.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include <Stepper.h>
//Deklarasi pin Sensor Ultrasonik
#define TRIG_PIN 9
#define ECHO_PIN 8
#define speaker 0
// Deklarasi pin sensor IR dan motor N20
const int pinSensorIR1 = 2;
const int pinSensorIR2 = 13;
//const int pinMotorA1 = 3;
//const int pinMotorB1 = 4;
//const int pinMotorA2 = 5;
//const int pinMotorB2 = 6;
//Deklarasi variabel ntuk menyimpan nilai sensor IR
int nilaiSensorIR1;
int nilaiSensorIR2;
//Deklarasi variabel untuk menentukan arah gerakan motor
int arahMotor = 0;
//Deklarasi variabel untuk menentukan jarak sensor ultrasonik
long duration;
int distance = 0;
//Deklarasi pin Sensor Warna TCS3200
#define outPin 7
#define s0 3
#define s1 4
#define s2 5
#define s3 6
boolean DEBUG = true;
// Variables
int red, grn, blu;
String nominal ="";
long startTiming = 0;
long elapsedTime =0;
//Deklasari pin DFPlayer Mini
SoftwareSerial mp3Serial(10,11); //tx,rx
DFRobotDFPlayerMini mp3;
// Mengatur jumlah langkah dalam satu rotasi motor driver
const int stepMotor = 100;
const int rpmMotor = 60;
// Menginisialisasikan motor driver dengan nama myMotor ke pin arduino 8 - 11
Stepper myMotor(stepMotor, 22, 23, 24, 25);
// Inisialisasi Relay
const int relayPin =10; // Pin untuk relay
bool relayClosed = false;
void setup(){
Serial.begin(9600);
Wire.begin();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(speaker, OUTPUT);
// Inisialisasi pin sensor IR dan motor N20 sebagai input/output
pinMode(pinSensorIR1, INPUT);
pinMode(pinSensorIR2, INPUT);
//pinMode(pinMotorA1, OUTPUT);
//pinMode(pinMotorB1, OUTPUT);
//pinMode(pinMotorA2, OUTPUT);
//pinMode(pinMotorB2, OUTPUT);
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(outPin, INPUT); //out from sensor becomes input to arduino
// Setting frequency scaling to 100%
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
mp3Serial.begin(9600);
mp3.begin(mp3Serial);
mp3.volume(22);
delay(1000);
// Inisialisasi Relay
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW); // Relay terbuka awalnya
//Keadaan awal motor dalam keadaan mati
//digitalWrite(pinMotorA1, LOW);
//digitalWrite(pinMotorB1, LOW);
//digitalWrite(pinMotorA2, LOW);
//digitalWrite(pinMotorB2, LOW);
}
void loop(){
digitalWrite (TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration*0.034/2;
Serial.print("Jarak : ");
Serial.print(distance);
Serial.println(" cm");
if (distance <= 50 && distance > 40)
{
Serial.println("Anda berada dekat dengan sistem pendeteksi uang. Jika ingin menggunakan sistem, Silahkan siapkan uang Anda");
delay(1000);
mp3.play(17); // Anda berada dekat dengan sistem
delay(8000);
}
else if (distance <= 40 && distance >= 10 ) // Hanya menampilkan jarak jika jaraknya kurang dari 300 cm / 3 meter
{
Serial.println("Rentangkan tangan Anda Ke depan dan gerakkan tangan Anda mendekatti sistem, hingga Anda merasakan adanya permukaan kasar. Setelah itu masukkan uang sejajar dengan permukaan kasar");
delay(1000);
mp3.play(16); //rentangkan tangan, cari permukaan kasar, dan masukkan uang
delay(14000);
}
UangMasuk();
if(DEBUG)printData();
elapsedTime = millis()-startTiming;
}
void UangMasuk(){
nilaiSensorIR1 = digitalRead(pinSensorIR1);
nilaiSensorIR2 = digitalRead(pinSensorIR2);
//menentukan arah gerakan motor berdasarkan nilai sensor IR
if(nilaiSensorIR1 == LOW) {
//digitalWrite(pinMotorA1, LOW);
//digitalWrite(pinMotorB1, HIGH);
//digitalWrite(pinMotorA2, LOW);
//digitalWrite(pinMotorB2, HIGH);
//delay(50);
Serial.println("Uang masuk ke dalam sistem");
delay(1000);
putarMotor(10, true);
// Menutup relay ketika portal terbuka
digitalWrite(relayPin, HIGH);
relayClosed = true;
//Deteksi Nominal Uang
getColor();
} else {
//digitalWrite(pinMotorA1, LOW);
//digitalWrite(pinMotorB1, LOW);
//digitalWrite(pinMotorA2, LOW);
//digitalWrite(pinMotorB2, LOW);
//delay(100);
// Membuka relay ketika portal tertutup
Serial.println("Uang Belum Terdeteksi");
delay(1000);
digitalWrite(relayPin, LOW);
relayClosed = false;
}
if(nilaiSensorIR2 == LOW) {
//digitalWrite(pinMotorA1, HIGH);
//digitalWrite(pinMotorB1, LOW);
//digitalWrite(pinMotorA2, HIGH);
//digitalWrite(pinMotorB2, LOW);
//delay(50);
Serial.println("Uang sudah dideteksi dan akan dikeluarkan");
delay(1000);
putarMotor(10, false);
} else {
//digitalWrite(pinMotorA1, LOW);
//digitalWrite(pinMotorB1, LOW);
//digitalWrite(pinMotorA2, LOW);
//digitalWrite(pinMotorB2, LOW);
//delay(100);
Serial.println("Uang Belum Terdeteksi");
delay(1000);
}
}
// Membuat function memutar motor selama x detik
void putarMotor(int durasi, bool arah) {
// Untuk mengetahui banyak rotasi dalam satu detim dapat dihitung dari nilai rpm bagi 60
// karena rpm adalah banyak rotasi dalam satu menit
int rotasiSedetik = rpmMotor / 60;
// Maka banyak rotasi yang dilakukan adalah durassi (detik) * banyak rotasi sedetik * stepMotor(satu rotasi)
int jumlahRotasi = durasi * rotasiSedetik * stepMotor;
// tentukan arah putaran, jika true searah +, jika flase berlawanan (-)
jumlahRotasi = arah ? jumlahRotasi : -jumlahRotasi;
// putar motor
myMotor.step(jumlahRotasi);
}
/* read RGB components */
void readRGB(){
red = 0, grn=0, blu=0;
int n = 10;
for (int i = 0; i < n; ++i){
//read red component
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
red = red + pulseIn(outPin, LOW);
//read green component
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
grn = grn + pulseIn(outPin, LOW);
//let's read blue component
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
blu = blu + pulseIn(outPin, LOW);
}
red = red/n;
grn = grn/n;
blu = blu/n;
}
/***************************************************
* Showing captured data at Serial Monitor
****************************************************/
void printData(void){
Serial.print("red= ");
Serial.print(red);
Serial.print(" green= ");
Serial.print(grn);
Serial.print(" blue= ");
Serial.print(blu);
Serial.print (" - ");
Serial.println (nominal);
delay(1000);
}
void getColor(){
readRGB();
if(red>=26 && red<=40 && grn>=31 && grn<=44 && blu>=29 && blu<=42) {
nominal = "Rp100.000"; mp3.play(14);}
else if(red>=28 && red<=35 && grn>=26 && grn<=30 && blu>=22 && blu<=29) {
nominal = "Rp50.000"; mp3.play(13);}
else if(red>=26 && red<=34 && grn>=23 && grn<=31 && blu>=24 && blu<=31) {
nominal = "Rp20.000"; mp3.play(12);}
else if(red>=23 && red<=28 && grn>=22 && grn<=31 && blu>=20 && blu<=29) {
nominal = "Rp10.000"; mp3.play(11);}
else if(red>=19 && red<=29 && grn>=20 && grn<=31 && blu>=22 && blu<=33) {
nominal = "Rp5.000"; mp3.play(10);}
else nominal = "Nominal Uang Tidak Terdeteksi";
}