#include <Keypad.h>
#include <Stepper.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
// Keypad
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
uint8_t colPins[COLS] = {30, 32, 34, 36}; // Pins connected to C1, C2, C3, C4
uint8_t rowPins[ROWS] = {22, 24, 26, 28}; // Pins connected to R1, R2, R3, R4
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Motor Stepper
const int stepsPerRevolution = 100; // Step Motor
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// RTC
RTC_DS1307 rtc;
// Lampu
const int merah = 7;
int kuningPin = 6;
int biru = 5;
int hijau = 4;
// Push Button
int Pb_merah = 14;
int Pb_biru = 15;
int Pb_hijau = 16;
int Pb_kuning = 17;
// Lain-lain
String inputString = "";
bool motorBergerak = false; // Deklarasi variabel motorBergerak
void led(int jumlah) {
for (int i = 1; i <= jumlah; i++) {
digitalWrite(biru, HIGH);
delay(500);
digitalWrite(biru, LOW);
delay(500);
}
}
void mode1(int jumlah) {
for (int i = 1; i <= jumlah; i++) {
myStepper.step(50);
delay(2000);
myStepper.step(-50);
delay(200);
}
}
void mode2(int jumlah) {
for (int i = 1; i <= jumlah; i++) {
myStepper.step(50);
delay(2000);
myStepper.step(50);
delay(2000);
myStepper.step(50);
delay(2000);
myStepper.step(50);
delay(2000);
}
}
void mode3(int jumlah) {
for (int i = 1; i <= jumlah; i++) {
myStepper.step(50);
delay(2000);
myStepper.step(50);
delay(2000);
myStepper.step(50);
delay(2000);
myStepper.step(50);
delay(2000);
}
}
void stopMotor() {
myStepper.setSpeed(0);
myStepper.step(0);
motorBergerak = false;
Serial.println("Motor dihentikan.");
}
void startMotor() {
myStepper.setSpeed(50);
myStepper.step(50);
motorBergerak = true;
Serial.println("Motor mulai bergerak.");
}
void resumeMotor() {
myStepper.setSpeed(50);
myStepper.step(50);
motorBergerak = true;
Serial.println("Motor dilanjutkan.");
}
void resetMotor() {
stopMotor();
delay(1000);
startMotor();
inputString = "";
lcd.clear();
Serial.println("Motor di-reset.");
}
void setup() {
pinMode(merah, OUTPUT);
pinMode(kuningPin, OUTPUT);
pinMode(biru, OUTPUT);
pinMode(hijau, OUTPUT);
pinMode(Pb_merah, INPUT_PULLUP);
pinMode(Pb_kuning, INPUT_PULLUP);
pinMode(Pb_biru, INPUT_PULLUP);
pinMode(Pb_hijau, INPUT_PULLUP);
lcd.init();
lcd.backlight();
rtc.begin();
lcd.setCursor(0, 0);
lcd.println("Selamat Datang");
delay(500);
lcd.clear();
Serial.begin(115200);
}
void loop() {
char key = keypad.getKey();
lcd.setCursor(0, 0);
lcd.println("Inputkan angka: ");
if (key != NO_KEY) {
inputString += key;
Serial.println(key);
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(inputString);
if (key == 'A') {
Serial.println("Tombol A ditekan. Motor berputar 90 derajat ke arah kanan.");
myStepper.setSpeed(50);
int steps = stepsPerRevolution / 2;
myStepper.step(steps);
Serial.println("Motor berputar selesai.");
} else if (key == 'B') {
mode2(10);
} else if (key == 'C') {
mode3(2);
} else if (key == 'D') {
Serial.println("Tombol D ditekan. Masukkan kecepatan motor (tekan '#' untuk selesai)");
int count = 0;
while (true) {
key = keypad.getKey();
if (key >= '0' && key <= '9') {
Serial.print(key);
lcd.setCursor(0, 1);
lcd.print(key);
count = count * 10 + (key - '0');
} else if (key == '#') {
break;
}
}
Serial.println("Masukkan gerakan motor (tekan '#' untuk selesai)");
int customMovement = 0;
while (true) {
key = keypad.getKey();
if (key >= '0' && key <= '9') {
Serial.print(key);
lcd.setCursor(0, 1);
lcd.print(key);
customMovement = customMovement * 10 + (key - '0');
} else if (key == '#') {
break;
}
}
for (int i = 0; i < count; i++) {
digitalWrite(merah, HIGH);
delay(500);
digitalWrite(kuningPin, HIGH);
delay(500);
digitalWrite(biru, HIGH);
delay(500);
digitalWrite(hijau, HIGH);
delay(500);
digitalWrite(hijau, LOW);
delay(500);
digitalWrite(biru, LOW);
delay(500);
digitalWrite(kuningPin, LOW);
delay(500);
digitalWrite(merah, LOW);
delay(500);
}
for (int i = 0; i < customMovement; i++) {
myStepper.step(50);
delay(2000);
}
int newSpeed = map(count, 0, 9, 0, 255);
myStepper.setSpeed(newSpeed);
Serial.print("Kecepatan motor diatur ke: ");
Serial.println(newSpeed);
lcd.clear();
}
}
// Logika tombol push
if (digitalRead(Pb_merah) == LOW) {
stopMotor();
}
if (digitalRead(Pb_hijau) == LOW) {
if (!motorBergerak) {
resumeMotor();
}
}
if (digitalRead(Pb_kuning) == LOW) {
if (!motorBergerak) {
startMotor();
}
}
if (digitalRead(Pb_biru) == LOW) {
resetMotor();
}
}