#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED width, in pixels
#define SCREEN_HEIGHT 64 // OLED height, in pixels
// create an OLED display object connected to I2C
Adafruit_SSD1306 lcd(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define btnUP 4
#define btnOK 3
#define Out1 8
#define Out2 9
#define OutPWM 10
boolean statusBtnUP = false;
boolean statusAkhirBtnUP = false;
boolean UP = false;
boolean statusBtnOK = false;
boolean statusAkhirBtnOK = false;
boolean OK = false;
int halaman = 1;
int menuItem = 1;
int dutyCycle = 0;
int incrementValue = 10;
//inisiasi input dan output
void setup() {
Serial.begin(9600);
if (!lcd.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
while (1);
}
lcd.clearDisplay();
lcd.setTextSize(1.5);
lcd.setTextColor(WHITE);
lcd.setCursor(30, 20);
lcd.println("MOTOR DRIVER");
lcd.display();
delay(2000);
pinMode (btnUP,INPUT);
pinMode (btnOK,INPUT);
pinMode (Out1,OUTPUT);
pinMode (Out2,OUTPUT);
pinMode (OutPWM,OUTPUT);
}
void loop() {
tampil();
statusBtnUP = digitalRead(btnUP);
statusBtnOK = digitalRead(btnOK);
saatUpDitekan();
saatOkDitekan();
// untuk button up
if (UP && halaman == 1) {
UP = false;
menuItem ++;
if (menuItem > 4)menuItem = 1;
}
//untuk back
if(UP && (halaman == 2||halaman == 3||halaman == 4)){
UP= false;
halaman =1;
motorStop();
}
// untuk button ok
if (OK) {
OK = false;
if (halaman == 1 && menuItem == 1) {
halaman = 2;
} else if (halaman == 1 && menuItem == 2) {
halaman = 3;
} else if (halaman == 1 && menuItem == 3) {
halaman = 4;
} else if (halaman == 1 && menuItem == 4) {
halaman = 5;
}
}
Serial.println(menuItem);
delay(100);
}
//--------------------------------------------------------------------------------
void saatUpDitekan() {
if (statusBtnUP != statusAkhirBtnUP) {
if (statusBtnUP == 0) {
UP = true;
}
delay(50);
}
statusAkhirBtnUP = statusBtnUP;
}
void saatOkDitekan() {
if (statusBtnOK != statusAkhirBtnOK) {
if (statusBtnOK == 0) {
OK = true;
}
delay(50);
}
statusAkhirBtnOK = statusBtnOK;
}
//----------------------------------------------------------------------------
//semua yang tampil di lcd ada di fungsi ini
void tampil() {
if (halaman == 1) {
lcd.clearDisplay();
lcd.setTextSize(1);
lcd.setTextColor(WHITE);
lcd.setCursor(30, 0);
lcd.print("MAIN MENU");
if (menuItem == 1) {
lcd.setCursor(5, 17);
lcd.setTextColor(WHITE);
lcd.print("> Motor CW");
} else {
lcd.setCursor(5, 17);
lcd.setTextColor(WHITE);
lcd.print(" Motor CW");
}
if (menuItem == 2) {
lcd.setCursor(5, 27);
lcd.setTextColor(WHITE);
lcd.print("> Motor CCW");
} else {
lcd.setCursor(5, 27);
lcd.setTextColor(WHITE);
lcd.print(" Motor CCW");
}
if (menuItem == 3) {
lcd.setCursor(5, 37);
lcd.setTextColor(WHITE);
lcd.print("> Motor Fr-Rv");
} else {
lcd.setCursor(5, 37);
lcd.setTextColor(WHITE);
lcd.print(" Motor Fr-Rv");
}
if (menuItem == 4) {
lcd.setCursor(1, 47);
lcd.setTextColor(WHITE);
lcd.print("> Speed Control");
} else {
lcd.setCursor(1, 47);
lcd.setTextColor(WHITE);
lcd.print(" Speed Control");
}
}
else if (halaman == 2) {
PWM_motorCW();
lcd.clearDisplay();
lcd.setTextSize(1);
lcd.setTextColor(WHITE);
lcd.setCursor(25, 25);
lcd.print("Motor ON CW");
} else if (halaman == 3) {
lcd.clearDisplay();
lcd.setTextSize(1);
lcd.setTextColor(WHITE);
lcd.setCursor(10, 15);
lcd.print("Motor ON CCW");
lcd.setCursor(30, 35);
lcd.print("PWM = ...");
} else if (halaman == 4) {
lcd.clearDisplay();
lcd.setTextSize(1);
lcd.setTextColor(WHITE);
lcd.setCursor(0, 25);
lcd.print("Motor Foward Reverse ON");
} else if (halaman == 5) {
motorVariabel();
lcd.clearDisplay();
lcd.setTextSize(1);
lcd.setTextColor(WHITE);
lcd.setCursor(1, 25);
lcd.print(string("Speed: ") + dutyCycle);
int buttonState = digitalRead(btnUP);
if (buttonState == LOW) {
dutyCycle += incrementValue;
if (dutyCycle > 255) {
dutyCycle = 255;
}
}
}
lcd.display();
}
void PWM_motorCW(){
analogWrite(OutPWM, 200);
digitalWrite(Out1,HIGH);
digitalWrite(Out2, LOW);
delay(1000);
}
void PWM_motorCCW(){
analogWrite(OutPWM, 200);
digitalWrite(Out1,HIGH);
digitalWrite(Out2, LOW);
delay(1000);
}
void PWM_motorFrRv(){
analogWrite(OutPWM, 200);
digitalWrite(Out1,HIGH);
digitalWrite(Out2, LOW);
delay(1000);
analogWrite(OutPWM, 100);
digitalWrite(Out1,LOW);
digitalWrite(Out2, HIGH);
delay(1000);
}
void motorVariabel(){
for (dutyCycle = 0; dutyCycle<255;dutyCycle++)
analogWrite(OutPWM,dutyCycle);
digitalWrite(Out1,HIGH);
digitalWrite(Out2,LOW);
delay(1000);
}
void motorStop(){
analogWrite(OutPWM, dutyCycle);
digitalWrite(Out1, LOW);
digitalWrite(Out2, LOW);
}