Anda di halaman 1dari 10

String inputString;

String command;
boolean stringComplete,setFlag_pompa = false,setFlag_pengencer = false,setFlag_done
= false;
boolean setFlag_keadaan_awal = false,setFlag_suhu =false, setFlag_reset_suhu
=false;

int str=0,stp=0;

int Mem_stp=LOW; � � � � � � � � // Mem_stp adalah


memory flag STOP, jika STOP telah dinyalakan sebelumnya,
// maka Mem_stp akan
HIGH, dan kembali LOW ketika START dinyalakan
// pompa aktif dan akan
kembali LOW saat pompa LOW

int value,
valueSuhu,interval,viskoV,X,a,z,selisih,result,banyakData,counting_timer;
float y1,y2,y3,hasil,totalSuhu,nilaiSuhu;
// value adalah
variabel yang digunakan pada format pengiriman data serial
// viskoV adalah
variabel penyimpan hasil pengukuran lamanya waktu tempuh S1-S2

//Berikut ini adalah semua variabel penyimpan hasil kirim data serial
int target;
int viskoValue;
int temp_max;
int temp_min;

//Berikut ini adalah pin-pin output yang digunakan

int valve_pendingin = 9;
int valve_pengencer = 11;
int pompa=10;
//Berikut ini adalah pin-pin input yang digunakan
int pendeteksi1 = 7;
int pendeteksi2 = 13;

// variabel openyimpan nilai millis sebelumnya


long previousMillis = 0,previousMillis_suhu =0; � � � // penyimpan
nilai millis sebelumnya �
unsigned long currentMillis ; � � //
Penyimpan nilai millis saat ini

void setup(){
�Serial.begin(9600);
�pinMode(pendeteksi1,INPUT);
�pinMode(pendeteksi2,INPUT);
�pinMode(pompa,OUTPUT);
�pinMode(valve_pengencer,OUTPUT);

�pinMode(valve_pendingin,OUTPUT);
�inputString = "";
�stringComplete = false;
�// inisialisasi timer1
�noInterrupts(); � � � � � � �

�TCCR1A = 0;
�TCCR1B = 0;

�TCNT1 = 63535 ; � � � � � �//preload timer = ((2^16bit)-


1)-((16MHz/8prescale)/1000Hz)
�TCCR1B |= (1 << CS11); � �// 8 prescaler
�TIMSK1 |= (1 << TOIE1); � � �// enable timer overflow
interrupt
�interrupts(); �

ISR(TIMER1_OVF_vect){ � � � � // interrupt service routine


dilakukan bila timer overflow
� if (stp==0 && str ==1&& setFlag_pompa == false){ // jika
stp/STOP =0 dan str/START =1 dan Memory delay LOW,

// Maka dapat dilakukan pengujian


if(digitalRead(pendeteksi1) == HIGH){
� � �
� � a = HIGH;
// jika sensor atas aktif maka variabel a HIGH
� �
}
if(a == HIGH){
// Jika a HIGH maka akan dilakukan perhitungan timer

TCNT1=63535;
� � � � � � � � � � � � � � � �viskoV++;
� � � � � � � � � �}

� � � � � � � � � �else{
� � � � � � � � � � � � � � � �TCNT1 = 63535;
� � � � � � � � � �}
if(digitalRead(pendeteksi2) == HIGH){ // Jika
sensor bawah aktif maka variabel a LOW
� � � � � � � � � � � � � � �
� � � � � � � � � � � � � � � �a = LOW; � // Jika a LOW maka
timer berhenti menghitung
� � � � � � � � � � � � � � � �viskoValue=viskoV;
� � � � � � � � � � � � � � � �if(z==0 | target==0){

Serial.print("Hasil pengujian
nilai Viskositas saat ini adalah � ");
Serial.print(viskoV);
Serial.println(" � �ms");
� � stp=1;
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � � � � � � � � � � � � � �}
� �}
�}
}

void loop(){ � �
// PROGRAM UTAMA

currentMillis = millis();
// isi variabel currentMillis dengan nilai millis
if(stp==1){
� � � � � � stop(); �
// Jika stop = 1 maka semua akan direstart seperti awalnya
}
else if(str ==0 &&stp ==0){
// Keadaan sewaktu power on, namun belum ada command
setFlag_keadaan_awal = true;
} � � � � � � � � �
penyimpan();
if(str==1 ){
if(Mem_stp==HIGH |setFlag_keadaan_awal == true){
//Jika Mem_stp high,atau keadaan masih awal
digitalWrite(pompa,HIGH);
//maka pompa harus dinyalakan dahulu 1 menit
setFlag_pompa = true;
//Digunakan untuk mencegah crash sensing
� � � � � � � � � �interval = 10000;
jalankan_pompa();
if(setFlag_pompa == false){
setFlag_keadaan_awal = false;
Mem_stp=LOW;
}
}
penyimpan();
selisih = target-viskoV;
� �if(z==1 && viskoV!=0 && target!=0 && a==LOW){
� � � �kontroler();
� � �
� � �} �
� �}
kontrol_temperatur();
}

void stop(){
//RESTART SEMUA KEADAAN KECUALI NILAI PARAMETER YANG TELAH
DISIMPAN
if(Mem_stp==LOW){
Serial.println("Program telah dihentikan ketik 00str1 untuk memulai kembali");
Serial.println("");
Serial.println("");
z=0;
target=0;
result=0;
hasil=0.0;
y1=0.0;
y2=0.0;
y3=0.0;

}
digitalWrite(pompa,LOW);
� �Mem_stp=HIGH;
� �str=0;
setFlag_pompa = false;
setFlag_pengencer = false;

setFlag_done = false;
setFlag_keadaan_awal = false;
setFlag_suhu =false;
� �viskoV=0;
� �digitalWrite(pompa,LOW);
digitalWrite(valve_pengencer,LOW);

TCNT1 = 63535 ;
previousMillis = 0;
previousMillis_suhu =0;
X=0;
selisih=0;

void kontroler(){ // Program untuk menjalankan


valve pengencer

// dan viskoV!=0 yang berarti nilai variabel


viskoV tidak sama dengan 0

// Maka dilakukan proses perbandingan antara


nilai viskoV dengan

// nilai set kekentalan

if(setFlag_done == false ){
� � � � � �if(setFlag_pengencer == false){
// SetFlag_done hanya akan true jika kontroler
selesai dijalankan

if(selisih <=-5 && selisih>=-2436){


float difference = float(selisih);
y1 = ((-1*(difference/2431.0)) - (0.0206)); �
� � � � � � � �}
� � � � � � � �if(selisih >=-292 && selisih<=-140){
� � � � � � � � � �float difference = float(selisih);
� � � � � � � �y2 = ((difference/152.0) +(292.0/152.0));
� � � � �
� � � � � � � �}
� � � � � � � �if(selisih > -140 && selisih < 5){
� � � � � � � � � �float difference = float(selisih);
� � � � � � � �y3 = ((-1.0*selisih/145.0)+(1.0/19.0));
� � � � � �
� � � � � � � �}
� � � � � � � �if(selisih >=-5 && selisih <= 5){
Serial.print("Hasil perhitungan nilai Viskositas saat
ini adalah � ");
Serial.print(viskoV);
Serial.println(" � �ms");
� � � � � � � � � � � � � � � � � � � �stp=1;
� � � � � � � � � �
� � � � � � � �}
� � � � � � � �if(selisih>5) �{

Serial.print("Hasil perhitungan nilai Viskositas saat


ini adalah � ");
Serial.print(viskoV);
Serial.println(" � �ms");
Serial.println("set point lebih kental daripada hasil
pengukuran terkini, tunggu beberapa saat");
� � � � � � � � � � � � � � � � � � � �Serial.println("");
stp=1;

y1=0.0;y2=0.0;y3=0.0;
� � � � � � � �}
� � � � � � � �if(viskoV>=100 && viskoV<=1053){
� � � � � � � � �if(y2==0 && y3==0){
hasil=y1*0.8333;
hasil=hasil*1000.0;
result = int(hasil);
�}
� � � � � � � � �else{
hasil=(((y2*0.5) +(y3 * 0.5) + (y1*0.8333))/
(y1+y2+y3));
hasil=hasil*1000.0;
result = int(hasil);
�}
� � � � � � � �}
� � � � � � � �else if(viskoV>1053 && viskoV<=1345){
� � � � � � � � � if(y2==0 && y3==0){
hasil=y1*0.5;
hasil=hasil*1000.0;
result = int(hasil);
�}
� � � � � � � � �else{
hasil=(((y2*0.3333) +(y3 * 0.3333) + (y1*0.5))/
(y1+y2+y3));
hasil=hasil*1000.0;
result = int(hasil);
�}
� � � � � � � �}
� � � � � � � �else if(viskoV>1345 && viskoV<=3000){
� � � � � � � � � if(y2==0 && y3==0){
hasil=y1*0.3333;
hasil=hasil*1000.0;
result = int(hasil);
�}
� � � � � � � � �else{
hasil=(((y2*0.1667) +(y3 * 0.1667) +
(y1*0.3333))/(y1+y2+y3));
hasil=hasil*1000.0;
result = int(hasil);
�}
� � � � � � � �}
else{
Serial.println("kekentalan tidak termasuk range yaitu
antara 100 ms - 3000 ms");
� � � � � � � � � � � � � � � � � � � �Serial.println("");
}
� � � � � �
� � � � � �}
� � � � � � � �digitalWrite(valve_pengencer,HIGH);
interval = result;
setFlag_pengencer = true;
jalankan_pengencer();
}

//Tanda bahwa kontroler selesai dilakukan


if(setFlag_pengencer == false ){

setFlag_done = true;
//Berikut ini proses menyalakan pompa selama 1 menit

digitalWrite(pompa,HIGH);
� � �//Sebelum dilakukan lagi proses pengujian
interval = 10000;
setFlag_pompa = true;
jalankan_pompa();
[glow=yellow,2,300][b]if(setFlag_pompa == false){
Serial.print("According to fuzzy, the diluent pump will be
switched on for : �");
Serial.print(result);
Serial.println(" � �ms");
Serial.print("the viscosity result is �");
Serial.print(viskoV);
� Serial.println(" � �ms");
� � � � � � � �viskoV =0;
}[/b][/glow]
}

�}

void jalankan_pompa(){ // Program untuk menghidupkan


pompa selama interval tertentu
if(setFlag_pompa == true){
if(previousMillis == 0){
previousMillis=currentMillis;
}
if (currentMillis-previousMillis >= interval){
� � � � � � � � � � � � � � � � � � � �digitalWrite(pompa,LOW);
previousMillis = 0;
setFlag_pompa = false;
setFlag_done = false;

}
}
}

void jalankan_pengencer(){ // Program untuk menghidupkan


valve pengecer dengan interval tertentu
if(setFlag_pengencer == true){
if(previousMillis == 0){
previousMillis=currentMillis;
}
if (currentMillis-previousMillis >= interval){ �
previousMillis = 0;
setFlag_pengencer = false;
digitalWrite(valve_pengencer,LOW);
}
}
}

void kontrol_temperatur(){ // Program untuk melakukan


pendinginan, jika temperatur melebih temp_max
�int sensorValue = analogRead(A0);
�float voltage = sensorValue * (5.0 / 1024.0);

float constanta = ((0.454545+(voltage / 18.15277778)) /5);


float resistance = ((1000 * constanta) /(1-constanta));
float temperature = ((resistance - 100)/0.385);
temperature = temperature - 7,436925128;

if (banyakData <200){
totalSuhu = totalSuhu + temperature;
banyakData++;
}
else{
nilaiSuhu = totalSuhu/200.0; �
banyakData=0;
totalSuhu=0.0;
}

delay (2);
if(temp_min>0 &&temp_max>0){
if(nilaiSuhu>temp_max){
digitalWrite (valve_pendingin,HIGH);
setFlag_suhu = true;
if(counting_timer ==1000){
Serial.print("Hasil pengukuran suhu dalam derajad celcius
saat ini adalah � ");
Serial.println(nilaiSuhu);
counting_timer =0;
}

counting_timer ++;
}

if(setFlag_suhu == true){
if(nilaiSuhu <= temp_min){
digitalWrite (valve_pendingin,LOW);
setFlag_suhu =false;
}
}
}
}

void penyimpan(){ // Program penyimpan data


terkirim
if (stringComplete){
stringComplete = false;
command = "";
getCommand();
getValue ();
doCommand();
inputString="";
}
}

void serialEvent(){ // Program pengambil


data serial
while (Serial.available()){
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n'){
stringComplete = true;
} �
}
}

void getCommand(){ // Program parching


string pengambil command/protokol
command += inputString [2];
command += inputString [3];
command += inputString [4];
}

void getValue(){ // Program parshing pengambil


nilai
X=inputString.length()-6;
value = (inputString[5] - 48);

X--;
if(X!=0){
value = (value * 10) + (inputString[6] - 48);
X--;
}
if(X!=0){
value = (value * 10) + (inputString[7] - 48);
X--;
}
if(X!=0){
value = (value * 10) + (inputString[8] - 48);
X--;
}

if(X!=0){
value = (value * 10) + (inputString[9] - 48);
X--;
}
}

void doCommand (){ // Program untuk


menjalankan command
if (command [0]== 'g'){

if (command [1]== 'a'){


if (command[2] == 'd'){
� � � � � � � � � � � � � � � � � � � � � � � �Serial.print("temperatur minimum �
= �");
Serial.println(temp_min);

}
else if (command[2] == 'p'){
� � � � � � � � � � � � � � � � � � � � � � � �Serial.print("temperatur maximum �=
");
Serial.println(temp_max);

}
}
else if (command [1]== 's'){
if (command[2] == 'v'){
Serial.print("Hasil pengujian nilai Viskositas
saat ini adalah � ");
Serial.print(viskoValue);
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
�Serial.println(" � �ms");
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
�Serial.println("");
}
else if (command[2] == 't'){
Serial.print("Hasil pengukuran suhu dalam derajad
celcius saat ini adalah � ");
Serial.println(nilaiSuhu);
}
else if (command[2] == 'r'){
Serial.print("Target mode kontrol adalah � ");
� � � � � � � � � � � � � � � � � � � � � � � �Serial.print(value);
� � � � � � � � � � � � � � � � � � � � � � � �Serial.println(" �ms");
}
}
}
else if (command [0]== 's'){
if (command [1]== 'k'){
if (command [2]== '1'){

target = value;
� � � � � � � � � � � � � � � � � � � � � � � �Serial.print("Target mode kontrol
adalah � ");
� � � � � � � � � � � � � � � � � � � � � � � �Serial.print(value);
� � � � � � � � � � � � � � � � � � � � � � � �Serial.println(" �ms");
� � � � � � � � � � � � � � � � � � � � � � � �Serial.println("");
}

else if (command [1]== 'a'){


if (command[2] == 'd'){
temp_min = value;
Serial.print("temperatur minimum � = �");
Serial.println(value);
}
else if (command[2] == 'p'){
temp_max = value;
Serial.print("temperatur maximum �= ");
Serial.println(value);
}
}
else if (command [1]== 't'){
if (command[2] == 'r'){
str = value;
� � � � � � � � � Serial.println("Program dimulai silahkan pilih mode setelah
pengujian pertama");
� � � � � � � � � Serial.println("");
if(str==1){
stp=0;
}
}
else if (command[2] == 'p'){
stp = value;
}
}
� � � � � � � � � � � �else if (command [1]== 'm'){
if (command[2] == 'u'){
z=0;
� � � � � � � � � � � � � � � � � � � � � � � �Serial.println("Anda mengoperasikan
mode uji");
� � � � � � � � � � � � � � � � � � � � � � � � Serial.println("");

}
else if (command[2] == 'k'){
z=1;

� � � � � � � � � � � � � � � � � � � � � � � �Serial.println("Anda mengoperasikan
mode kontrol, namun mode kontrol hanya berlaku ");
� � � � � � � � � � � � � � � � � � � � � � � �Serial.println("jika anda telah
memasukkan nilai variabel target");
� � � � � � � � � � � � � � � � � � � � � � � �Serial.println("");

}
}
value = 0;
}
}

Anda mungkin juga menyukai