#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Ubah alamat LCD I2C dan ukuran menjadi 4x20
LiquidCrystal_I2C lcd(0x27, 20, 4);
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {32, 33, 25, 26}; // Keypad pin baris
byte colPins[COLS] = {27, 14, 12, 13}; // Keypad pin kolom
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
const int relayPin1 = 15; // Pin untuk relay 1
const int relayPin2 = 16; // Pin untuk relay 2
const int relayPin3 = 17; // Pin untuk relay 3
const int relayPin4 = 18; // Pin untuk relay 4
const int weightSensorPin = A0; // Pin untuk sensor berat
const int doorSwitchPin = 19; // Pin untuk magnetic door switch
bool isCOD = false;
int nominalCOD = 0;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(relayPin1, OUTPUT);
pinMode(relayPin2, OUTPUT);
pinMode(relayPin3, OUTPUT);
pinMode(relayPin4, OUTPUT);
pinMode(doorSwitchPin, INPUT_PULLUP); // Menggunakan pull-up internal untuk magnetic door switch
lcd.clear();
lcd.print("PROTOTYPE");
lcd.setCursor(0, 1);
lcd.print("PENERIMA PAKET");
delay(2000); // Menampilkan alamat selama 2 detik
askForPackage();
}
void loop() {
char key = keypad.getKey();
if (key) {
handleKeypad(key);
}
}
void handleKeypad(char key) {
switch (key) {
case 'A': // Pilihan A
lcd.clear();
lcd.print("Pilihan A");
isCOD = true;
askForNominalCOD();
//openRelay1();
break;
case 'B': // Pilihan B
lcd.clear();
lcd.print("Pilihan B");
isCOD = false;
openRelay1();
waitForDoorClose();
break;
case 'C': // Batal (Cancel)
lcd.clear();
lcd.print("Batal");
isCOD = false;
askForPackage();
break;
case 'D': // Kirim (Submit)
lcd.clear();
lcd.print("Kirim");
if (isCOD) {
lcd.println(" Nominal COD");
openRelay1();
waitForDoorClose();
}
break;
case '0'...'9':
if (isCOD) {
int number = key - '0';
nominalCOD = nominalCOD * 10 + number;
lcd.print(number);
}
break;
default:
break;
}
}
void askForPackage() {
lcd.clear();
lcd.print("Apakah akan");
lcd.setCursor(0, 1);
lcd.print("mengirimkan paket?");
lcd.setCursor(0, 2);
lcd.print("A: Paket COD");
lcd.setCursor(0, 3);
lcd.print("B: Paket non-COD");
}
void askForCOD() {
lcd.clear();
lcd.print("Apakah COD?");
}
void askForNominalCOD() {
lcd.clear();
lcd.print("Nominal COD:");
}
void openRelay1() {
digitalWrite(relayPin1, HIGH);
}
void closeRelay1() {
digitalWrite(relayPin1, LOW);
}
void waitForDoorClose() {
lcd.clear();
lcd.print("Masukkan Paket dan");
lcd.setCursor(0, 1);
lcd.print("Tutup Kembali Pintu");
// Tunggu sampai pintu terbuka (door switch LOW)
while (digitalRead(doorSwitchPin) == HIGH) {
// Do nothing, just wait
}
// Tunggu sampai pintu tertutup kembali (door switch HIGH)
while (digitalRead(doorSwitchPin) == LOW) {
// Do nothing, just wait
}
lcd.clear();
lcd.print("Pintu tertutup");
closeRelay1();
delay(2000); // Berikan jeda sejenak sebelum kembali ke menu utama
askForPackage();
}