You are on page 1of 13

//Library

#include <PWM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);

//led indikator
int led1 = 45;
int led2 = 47;
int led3 = 49;
int led4 = 51;
int led5 = 53;

//Rotary 1
int CLK1 = 35;
int DT1 = 37;
int SW1 = 33;

//Rotary 2
int CLK2 = 43;
int DT2 = 41;
int SW2 = 39;

//Multiplexer
int s0 = 7;
int s1 = 8;
int s2 = 9;
int s3 = 10;
int muxCh = 0;

//input PWM
long pwm = 11;

//Program Menu
int menu1 = 1;
int menu2 = 1;
int page = 1;
int CLK1state;
int CLK1Laststate;

// Rotary 1 Pengaturan Dutycycle


int statusCLK1;
int laststatusCLK1;
int DTC = 0;
int count1 = 0;
float convertion = 0;

// Rotary 2 Pengaturan Frekuensi


int statusCLK2;
int laststatusCLK2;
long count2 = 0;
long scale = 1000;
long Frequency = 0;
long freq = 0;

void setup(){
//LCD
//Serial.begin(9600);
lcd.begin();
lcd.backlight();

//Multiplexer
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);

//Rotary 1 DTC Setting


pinMode(CLK1, INPUT);
pinMode(DT1, INPUT);
pinMode(SW1, INPUT);

//Rotary 2 Frequency Setting


pinMode(CLK2, INPUT);
pinMode(DT2, INPUT);
pinMode(SW2, INPUT);

//Input PWM
pinMode(pwm, OUTPUT);
InitTimersSafe();

//Program Menu
CLK1Laststate = digitalRead(CLK1);
startModule();
}

void loop(){
menuPage();
swState();
lcdPage1();
lcdPage2();
lcdPage3();
lcdPage4();
setMultiplexer();
bugFix();
//debuging();
}

//Pembukaan
void startModule(){
lcd.setCursor(2,0);
lcd.print("Modul Praktikum");
lcd.setCursor(5,1);
lcd.print("Penyakelaran");
lcd.setCursor(3,2);
lcd.print("BJT, MOSFET, IGBT");
delay(2000);
lcd.clear();
// lcd.setCursor(8,0);
// lcd.print("Oleh");
// lcd.setCursor(2,1);
// lcd.print("Novan Enardo Wijanarko");
// lcd.setCursor(6,2);
// lcd.print("16 642 026");
// lcd.setCursor(1,3);
// lcd.print("TEKNIK ELEKTRO 2020");
// delay(1000);
// lcd.clear();
}
//void debuging(){
// Serial.print(page);

// Serial.print(menu1);
// Serial.println(menu2);
// Serial.println(muxCh);
// Serial.print(DTC);
// Serial.println(Frequency);
// Serial.println(convertion);
//}

//----------------------PROGRAM MENU-------------------------//
//Selektor Menu
void selector(){
menu1 = constrain(menu1, 1, 5);
menu2 = constrain(menu2, 1, 2);
CLK1state = digitalRead(CLK1);
if(CLK1state != CLK1Laststate)
{
if(!digitalRead(DT1) != CLK1state){
if(page == 1){
menu1++;
}
if(page == 2){
menu2++;
}
while(!digitalRead(CLK1));

} else {
if(page == 1){
menu1--;
}
if(page == 2){
menu2--;
}

while(!digitalRead(DT1));
}
}
CLK1Laststate = CLK1state;
}

//Tampilan Menu
void lcdPage1(){

if((page == 1) && (menu1 == 1)


if((page == 1) && (menu1 == 1)){
lcd.setCursor(1,0);
lcd.print(">NPN");
lcd.setCursor(12,0);
lcd.print(" PNP");
lcd.setCursor(1,1);
lcd.print(" N-MOS");
lcd.setCursor(12,1);
lcd.print(" P-MOS");
lcd.setCursor(1,2);
lcd.print(" IGBT");
lcd.setCursor(0,3);
lcd.print("OK");

if((page == 1) && (menu1 == 2)){


lcd.setCursor(1,0);
lcd.print(" NPN");
lcd.setCursor(12,0);
lcd.print(">PNP");
lcd.setCursor(1,1);
lcd.print(" N-MOS");
lcd.setCursor(12,1);
lcd.print(" P-MOS");
lcd.setCursor(1,2);
lcd.print(" IGBT");
lcd.setCursor(0,3);
lcd.print("OK");

}
if((page == 1) && (menu1 == 3)){
lcd.setCursor(1,0);
lcd.print(" NPN");
lcd.setCursor(12,0);
lcd.print(" PNP");
lcd.setCursor(1,1);
lcd.print(">N-MOS");
lcd.setCursor(12,1);
lcd.print(" P-MOS");
lcd.setCursor(1,2);
lcd.print(" IGBT");
lcd.setCursor(0,3);
lcd.print("OK");

}
if((page == 1) && (menu1 == 4)){
lcd.setCursor(1,0);
lcd.print(" NPN");
lcd.setCursor(12,0);
lcd.print(" PNP");
lcd.setCursor(1,1);
lcd.print(" N-MOS");
lcd.setCursor(12,1);
lcd.print(">P-MOS");
lcd.setCursor(1,2);
lcd.print(" IGBT");
lcd.setCursor(0,3);
lcd.print("OK");

}
if((page == 1) && (menu1 == 5)){
lcd.setCursor(1,0);
lcd.print(" NPN");
lcd.setCursor(12,0);
lcd.print(" PNP");
lcd.setCursor(1,1);
lcd.print(" N-MOS");
lcd.setCursor(12,1);
lcd.print(" P-MOS");
lcd.setCursor(1,2);
lcd.print(">IGBT");
lcd.setCursor(0,3);
lcd.print("OK");
}

void lcdPage2(){
if((page == 2) && (menu2 == 1)){
lcd.setCursor(0,0);
lcd.print("Skala");
lcd.setCursor(0,1);
lcd.print(">kHz");
lcd.setCursor(0,2);
lcd.print(" Hz");
lcd.setCursor(0,3);
lcd.print("OK");
lcd.setCursor(16,3);
lcd.print("BACK");

if((page == 2) && (menu2 == 2)){


lcd.setCursor(0,0);
lcd.print("Skala");
lcd.setCursor(0,1);
lcd.print(" kHz");
lcd.setCursor(0,2);
lcd.print(">Hz");
lcd.setCursor(0,3);
lcd.print("OK");
lcd.setCursor(16,3);
lcd.print("BACK");
}

}
void lcdPage3(){
if((page == 3) && (menu1 == 1)){
lcd.setCursor(0,0);
lcd.print(" NPN");
lcd.setCursor(0,1);
lcd.print("DTC :");
lcd.setCursor(17,1);
lcd.print("%");
lcd.setCursor(0,2);
lcd.print("Freq:");
if(menu2 == 1){
lcd.setCursor(17,2);
lcd.print("kHz");

}
if(menu2 == 2){
lcd.setCursor(17,2);
lcd.print("Hz");

}
lcd.setCursor(0,3);
lcd.print("OK");
}
if((page == 3) && (menu1 == 2)){
lcd.setCursor(0,0);
lcd.print(" PNP");
lcd.setCursor(0,1);
lcd.print("DTC :");
lcd.setCursor(17,1);
lcd.print("%");
lcd.setCursor(0,2);
lcd.print("Freq:");
if(menu2 == 1){
lcd.setCursor(17,2);
lcd.print("kHz");

}
if(menu2 == 2){
lcd.setCursor(17,2);
lcd.print("Hz");

}
lcd.setCursor(0,3);
lcd.print("OK");

if((page == 3) && (menu1 == 3)){


lcd.setCursor(0,0);
lcd.print("NMOS");
lcd.setCursor(0,1);
lcd.print("DTC :");
lcd.setCursor(17,1);
lcd.print("%");
lcd.setCursor(0,2);
lcd.print("Freq:");
if(menu2 == 1){
lcd.setCursor(17,2);
lcd.print("kHz");

}
if(menu2 == 2){
lcd.setCursor(17,2);
lcd.print("Hz");

}
lcd.setCursor(0,3);
lcd.print("OK");

}
if((page == 3) && (menu1 == 4)){
lcd.setCursor(0,0);
lcd.print("PMOS");
lcd.setCursor(0,1);
lcd.print("DTC :");
lcd.setCursor(17,1);
lcd.print("%");
lcd.setCursor(0,2);
lcd.print("Freq:");
if(menu2 == 1){
lcd.setCursor(17,2);
lcd.print("kHz");

}
if(menu2 == 2){
lcd.setCursor(17,2);
lcd.print("Hz");

}
lcd.setCursor(0,3);
lcd.print("OK");

if((page == 3) && (menu1 == 5)){


lcd.setCursor(0,0);
lcd.print("IGBT");
lcd.setCursor(0,1);
lcd.print("DTC :");
lcd.setCursor(17,1);
lcd.print("%");
lcd.setCursor(0,2);
lcd.print("Freq:");
if(menu2 == 1){
lcd.setCursor(17,2);
lcd.print("kHz");

}
if(menu2 == 2){
lcd.setCursor(17,2);
lcd.print("Hz");

}
lcd.setCursor(0,3);
lcd.print("OK");
}

void lcdPage4(){
if((page == 4) && (menu1 == 1)){
inputPWM();
npnBJT();

}
if((page == 4) && (menu1 == 2)){
inputPWM();
pnpBJT();

}
if((page == 4) && (menu1 == 3)){
inputPWM();
nMOSFET();

}
if((page == 4) && (menu1 == 4)){
inputPWM();
pMOSFET();
}
if((page == 4) && (menu1 == 5)){
inputPWM();
IGBT();

//Menghilangkan Bug pada tampilan LCD


void bugFix(){
if(page == 1){
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(5,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(7,1);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print(" ");
lcd.setCursor(6,2);
lcd.print(" ");
lcd.setCursor(14,2);
lcd.print(" ");
lcd.setCursor(16,3);
lcd.print(" ");

if((page == 2) && (menu1 <= 5)){


lcd.setCursor(12,0);
lcd.print(" ");
lcd.setCursor(4,1);
lcd.print(" ");
lcd.setCursor(7,1);
lcd.print(" ");
lcd.setCursor(12,1);
lcd.print(" ");
lcd.setCursor(3,2);
lcd.print(" ");
lcd.setCursor(6,2);
lcd.print(" ");
lcd.setCursor(14,2);
lcd.print(" ");
count1 = 0;
count2 = 0;

if((page == 3) && (menu1 <= 5)){


lcd.setCursor(4,0);
lcd.print(" ");
lcd.setCursor(7,1);
lcd.print(" ");

}
if((page == 4) && (menu1 <= 5)){
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(14,1);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print(" ");
lcd.setCursor(14,2);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print(" ");

void npnBJT(){
//multiplexer ch11
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);

//kondisi led1
digitalWrite(led1, HIGH);

void pnpBJT(){
//multiplexer ch12
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);

//kondisi led2
digitalWrite(led2, HIGH);

void nMOSFET(){
//multiplexer ch13
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);

//kondisi led3
digitalWrite(led3, HIGH);

void pMOSFET(){
//multiplexer ch14
digitalWrite(s0, LOW);
digitalWrite(s1, HIGH);
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);

//kondisi led4
digitalWrite(led4, HIGH);
}

void IGBT(){
//multiplexer ch15
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);

//kondisi led5
digitalWrite(led5, HIGH);
}

//-------------------PENGATURAN ROTARY KHUSUS-----------------//


//Pengaturan SW pada Rotary1 dan Rotary2
void swState(){
page = constrain(page, 1, 4);
if(!digitalRead(SW1)){
page++;
while(!digitalRead(SW1));
}

if(!digitalRead(SW2)){
page--;
convertion = 0;
DTC = 0;
Frequency = 0;
//kondisi output PWM
digitalWrite(pwm, LOW);
//kondisi led
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);

while(!digitalRead(SW2));
}
}

void menuPage(){
if(page == 1){
selector();

}
if(page == 2){
selector();
}

if(page == 3){
setPWM();
setDTC();
setFrequency();
}
if(page == 4){
lcd.setCursor(7,1);
lcd.print("RUN");
}
}

//-------------------------PROGRAM PENGATURAN------------------//
//Pengaturan Channel pada Multiplexer
void setMultiplexer(){
muxCh = menu1 + 10;
if((page == 4) && (menu1 == 1)){
readMux(muxCh);
}
if((page == 4) && (menu1 == 2)){
readMux(muxCh);
}
if((page == 4) && (menu1 == 3)){
readMux(muxCh);
}
if((page == 4) && (menu1 == 4)){
readMux(muxCh);
}
if((page == 4) && (menu1 == 5)){
readMux(muxCh);
}
}

int readMux(int channel){


int controlPin[] = {s0, s1, s2, s3};

int muxChannel[16][4]={
{0,0,0,0}, //channel 0
{1,0,0,0}, //channel 1
{0,1,0,0}, //channel 2
{1,1,0,0}, //channel 3
{0,0,1,0}, //channel 4
{1,0,1,0}, //channel 5
{0,1,1,0}, //channel 6
{1,1,1,0}, //channel 7
{0,0,0,1}, //channel 8
{1,0,0,1}, //channel 9
{0,1,0,1}, //channel 10
{1,1,0,1}, //channel 11
{0,0,1,1}, //channel 12
{1,0,1,1}, //channel 13
{0,1,1,1}, //channel 14
{1,1,1,1} //channel 15
};

//loop through the 4 sig


for(int i = 0; i < 4; i ++){
digitalWrite(controlPin[i], muxChannel[channel][i]);
}

//read the value at the SIG pin


int val = analogRead(pwm);

//return the value


return val;
}
int val = readMux(muxCh);

void inputPWM(){
SetPinFrequency(pwm, Frequency);
pwmWrite(pwm, convertion);

void setPWM(){
//Tampilan Nilai Dutycycle dan Frekuensi
//Duty Cycle
lcd.setCursor(14,1);
if (DTC < 100) {
lcd.print(" ");

}
if (DTC < 10){
lcd.print(" ");

}
lcd.print(DTC);
//Frequency
lcd.setCursor(14,2);
if (freq < 100) {
lcd.print(" ");

}
if (freq < 10){
lcd.print(" ");

}
lcd.print(freq);

void setDTC(){
if(menu1 >= 1){
count1 = constrain(count1, 0, 100);
DTC = count1;
convertion = ((DTC*255)/100);

}
statusCLK1 = digitalRead(CLK1);
if(statusCLK1 !=laststatusCLK1)
{
if(digitalRead(DT1) != statusCLK1){
count1--;

}
else
{
count1++;
}
}
laststatusCLK1 = statusCLK1;
}

void setFrequency(){
if(menu2 == 1){
Frequency = (count2*scale);
Frequency = constrain(Frequency, 0, 100000);
freq = Frequency / 1000;
}

if(menu2 == 2){
Frequency = count2;
Frequency = constrain(Frequency, 0, 100);
freq = Frequency;
}

statusCLK2 = digitalRead(CLK2);
if(statusCLK2 !=laststatusCLK2)
{
if(digitalRead(DT2) != statusCLK2){
count2--;
}
else
{
count2++;
}
}
laststatusCLK2 = statusCLK2;
}

You might also like