Dalam matematika, bilangan prima adalah bilangan asli yang lebih besar dari angka1, yang faktor pembaginya adalah 1
dan bilangan itu sendiri. 2 dan 3 adalah bilangan prima. 4 bukan
bilangan prima karena 4 bisa dibagi 2. Sepuluh bilangan prima yang
pertama adalah 2, 3, 5, 7, 11, 13, 17, 19, 23 dan 29. (https://id.wikipedia.org/wiki/Bilangan_prima)
Kali ini Saya share code untuk memperoleh 100 bilangan prima pertama dengan menggunakan Scilab. Ada beberapa code yang Saya tampilkan di sini, untuk membandingkan seberapa cepat dan efektif code tersebut untuk memperoleh 100 bilangan prima pertama.
code pertama:
1. Asumsi awal semua bilangan dianggap sebagai bilangan prima.
2. Kemudian bilangan tersebut dicek dengan cara dibagi dengan semua bilangan bulat sebelumnya (yang lebih kecil). Jika sisa pembagian (modulo) ada yang sama dengan nol maka bilangan tersebut bukan bilangan prima. Atau Jika sisa pembagian (modulo) tidak ada yang sama dengan nol maka bilangan tersebut adalah bilangan prima.
3. Step 1 dan 2 dilakukan berulang-ulang sampai diperoleh 100 bilangan prima.
clear clc
tic()
i=1; x=2; prima(i)=x while (i<100) i=i+1; x=x+1; prima(i)=x for j=2:(x-1) sisa=modulo(x,j); if(sisa==0) then i=i-1; break; end end end disp(prima)
disp(toc())
code kedua:
1. Asumsi awal semua bilangan dianggap sebagai bilangan prima.
2. Kemudian bilangan tersebut dicek dengan cara dibagi dengan semua bilangan prima sebelumnya (yang lebih kecil). Jika sisa pembagian (modulo) ada yang sama dengan nol maka bilangan tersebut bukan bilangan prima. Atau Jika sisa pembagian (modulo) tidak ada yang sama dengan nol maka bilangan tersebut adalah bilangan prima.
3. Step 1 dan 2 dilakukan berulang-ulang sampai diperoleh 100 bilangan prima.
clear clc
tic()
i=1; x=2; prima(i)=x while (i<100) i=i+1; x=x+1; prima(i)=x for j=1:(i-1) sisa=modulo(x,prima(j)); if(sisa==0) then i=i-1; break; end end end disp(prima)
disp(toc())
code ketiga:
1. Asumsi awal semua bilangan dianggap sebagai bilangan prima.
2. Kemudian bilangan tersebut dicek dengan cara dibagi dengan semua bilangan prima sebelumnya yang nilainya maksimal setengah dari bilangan yang dicek. Jika sisa pembagian (modulo) ada yang sama dengan nol maka bilangan tersebut bukan bilangan prima. Atau Jika sisa pembagian (modulo) tidak ada yang sama dengan nol maka bilangan tersebut adalah bilangan prima.
3. Step 1 dan 2 dilakukan berulang-ulang sampai diperoleh 100 bilangan prima.
clear clc
tic()
i=1; k=i; x=2; prima(i)=x while (i<100) i=i+1; x=x+1;
if (ceil(x/2)>prima(k)) then //ceil==>pembulatan ke atas k=k+1; end
prima(i)=x for j=1:k sisa=modulo(x,prima(j)); if(sisa==0) then i=i-1; break; end end end disp(prima)
disp(toc())
Hasil:
Berikut screenshot hasil 100 bilangan prima pertama yang diperoleh. (setelah di arrange dalam bentuk matriks 10x10, kalo dalam MATLAB bisa menggunakan fungsi reshape)
Hasil Running 100 bilangan prima pertama (setelah di arrange dalam matriks 10x10)
Perbandingan konsumsi waktu untuk ketiga code tersebut: (aproximately)
code pertama: 5.878969 s
code kedua : 1.398557 s
code ketiga : 0.939001 s
Yang terakhir dibuat dalam bentuk function untuk bisa memperoleh bilangan prima ke n.
dalam bentuk function:
function [y]= bil_prima(ke)
i=1; k=i; x=2; prima(i)=x while (i<ke) i=i+1; x=x+1;
if (ceil(x/2)>prima(k)) then //ceil==>pembulatan ke atas k=k+1; end
prima(i)=x for j=1:k sisa=modulo(x,prima(j)); if(sisa==0) then i=i-1; break; end end end y=prima(ke);
endfunction
cara pemanggilan function:
//cara memanggil function
clear clc
exec('/home/muhammadpuji/Desktop/Scilab/Belajar/05_function_bil_prima.sce', -1) //mengaktifkan function bil_prima(ke)
tic() ke=100; y=bil_prima(ke); disp(strcat(["Bilangan prima ke ",string(ke)," = ",string(y)],"","c"));
Scilab is free and open source software for
numerical computation providing a powerful computing environment for
engineering and scientific applications. Scilab is released as open source under the CeCILL license (GPL compatible), and is available for download free of charge. Scilab is available under GNU/Linux, Mac OS X and Windows XP/Vista/7/8 (see system requirements).
Pada postingan kali ini, Sy share mengenai cara memodifikasi isi file tertentu (misal txt). Kasus awalnya adalah terkadang kita memiliki file dengan isi yang bercampur antara header (judul file) dengan isi file (bagian utama) dari file itu sendiri. Sedangkan untuk proses (misal pengolahan data) yang diperlukan hanya bagian utama dari isi file tersebut saja, sehingga bagian header malah akan mengganggu proses pengolahan data tersebut.
Contoh isi file yang bercampur antara bagian isi dengan header
Oleh karena itu perlu dilakukan penghilangan bagian header dari file itu sendiri. Secara sederhana hal ini dapat dilakukan dengan mengetahui bahwa bagian header selalu di awali dengan non number (bisa huruf atau spasi - bukan number).
Inti dari kode yang Sy buat disini adalah dilakukan pembacaan file yang akan di edit, pembacaan dilakukan baris by baris. Yang mana pada masing masing baris akan dilakukan pengecekan apakah pada bagian pertamanya berupa number atau non number. Dan jika pada bagian pertamanya berupa non number maka baris tersebut akan dicopy ke file baru (file baru untuk menyimpan hasil editan). Hal ini dilakukan sampai akhir baris dari file tersebut.
Berikut adalah source code menggunakan Scilab + GUI.
Desain GUI menggunakan guibuilder (Atoms tambahan di Scilab)
Source code 1
Source code 2
Berikut adalah tampilan saat running:
Tampilan awal
Select file
Loading file
Processing file
Finish
Program ini akan sangat membantu untuk mengedit file dengan jumlah baris yang sangat banyak. Kalo sedikit kan tinggal didelete biasa.hehehe
Berikut adalah hasil output file setelah diedit menggunakan program di atas:
Sherlock
Holmes is getting paranoid about Professor Moriarty, his arch-enemy.
All his efforts to subdue Moriarty have been in vain. These days
Sherlock is working on a problem with Dr. Watson. Watson mentioned that
the CIA has been facing weird problems with their supercomputer, 'The
Beast', recently.
This afternoon, Sherlock received a note from Moriarty, saying that he
has infected 'The Beast' with a virus. Moreover, the note had the number
N printed on it. After doing some calculations, Sherlock figured out that the key to remove the virus is the largest Decent Number having N digits.
A Decent Number has the following properties:
3, 5, or both as its digits. No other digit is allowed.
Number of times 3 appears is divisible by 5.
Number of times 5 appears is divisible by 3.
Meanwhile, the counter to the destruction of 'The Beast' is running
very fast. Can you save 'The Beast', and find the key before Sherlock? Input Format
The 1st line will contain an integer T, the number of test cases. This is followed by T lines, each containing an integer N. i.e. the number of digits in the number. Output Format
Largest Decent Number having N digits. If no such number exists, tell Sherlock that he is wrong and print −1. Constraints 1≤T≤20 1≤N≤100000
Sample Input
4
1
3
5
11
Sample Output
-1
555
33333
55555533333
Explanation
For N=1, there is no such number.
For N=3, 555 is the only possible number.
For N=5, 33333 is the only possible number.
For N=11, 55555533333 and all permutations of these digits are valid numbers; among them, the given number is the largest one.
Solusi
Setelah beberapa kali coba dan gagal akhirnya berikut ini adalah kode yang diterima (accepted).
#include <iostream> using namespace std;
int main(){ int T; long int N, buff_N, jumlah_3, jumlah_5; bool isTrue;
} return 0; } Penjelasan source code: Intinya nilai N akan dikurangi dengan angka 5 secara terus menerus apabila N bukan kelipatan dari 3 dan nilai N lebih besar dari 0. Jika ternyata hasil akhirnya tidak 0 (kurang dari 0) berarti salah (isTrue=false).
Berikut adalah penggunaan Arduino dengan komunikasi serial. Yang mana perintah dikirim dari pc melalui komunikasi serial. Perintah yang dikirim oleh pc memiliki format "data_1""separator""data_2". Disini separator yang digunakan adalah tanda "+". Misalnya pc mengirimkan perintah "12+3" maka Arduino harus memisahkan perintah tersebut menjadi data_1 dan data_2. Pada percobaan kali ini data_1 dan data_2 kemudian dijumlahkan.
Berikut adalah sourcecode yang digunakan:
/* Author: Muhammad Nurul Puji muhammadpuji.its@gmail.com 16 Feb 2015 */
while(Serial.available()) { //blok untuk menerima perintah serial buff_char = Serial.read(); buff_string.concat(buff_char); delay(1); //delay ini sangat penting }
if(buff_string != ""){ buff_data_1=(splitValue(buff_string, '+', 0)); //memisahkan string data dengan string separator "+" buff_data_2=(splitValue(buff_string, '+', 1));
//char buff[buff_data_1.length()]; //mengubah string ke float //buff_data_1.toCharArray(buff,buff_data_1.length()+1); //data_1=atof(buff); data_1=buff_data_1.toInt(); //cara singkat mengubah string ke number
//buff[buff_data_2.length()]; //mengubah string ke float //buff_data_2.toCharArray(buff,buff_data_2.length()+1); //data_2=atof(buff); data_2=buff_data_2.toInt(); //cara singkat mengubah string ke number
total = data_1 + data_2;
Serial.print("Perintah awal adalah "); Serial.print(buff_string); //bukan println karena perintah dikirim setelah ditekan enter Serial.print("Data 1 = "); Serial.println(data_1); Serial.print("Data 2 = "); Serial.println(data_2); Serial.print("Total data adalah "); Serial.println(total); Serial.println("");
buff_string=""; } }
//Function untuk memisahkan data dengan separator String splitValue(String data, char separator, int index){ int found = 0; int strIndex[]={0, -1}; int maxIndex = data.length()-1; for(int i=0; i<=maxIndex && found<=index; i++){ if(data.charAt(i) == separator || i==maxIndex){ found++; strIndex[0] = strIndex[1]+1; strIndex[1] = (i == maxIndex) ? i+1 : i; } } return found>index ? data.substring(strIndex[0], strIndex[1]) : ""; }
Referensi: dari postingan - postingan sebelumnya........... -- Semoga bermanfaat
Ini adalah posting lanjutan dari Signal Signal Generator DDS A9850 dan Frekuensi Meter. Dengan Saya tambahkan bagian untuk dapat merubah frekuensi secara serial melalui serial monitor pada Arduino sehingga frekuensi dapat diatur lebih fleksibel tanpa bolak balik upload program.
Berikut definisi variable yang perlu ditambahkan pada source code sebelumnya:
Berikut modifikasi souce code (pengganti) yang berada pada bagian void loop(). Sedangkan yang lain masih tetap sama dengan source code sebelumnya.
void loop() {
//lcd.clear();
//cek perintah serial while(Serial.available()) { buff_char = Serial.read(); buff_string.concat(buff_char); //menggabungkan variabel buff_char ke variable buff_string }
//merubah tipe data string ke float (tipe data float = double) char buf[buff_string.length()]; buff_string.toCharArray(buf,buff_string.length()+1); float buff_data=atof(buf); //buff_data akan nol pada loop berikutnya jika tidak ada perintah //(karena buff_string dikosongkan "" diakhir loop)
//cek jika ada permintaan perubahan frekuensi if (buff_data>0) sendFrequency(buff_data);
Berawal dari mencoba mempraktekkan teori cara kerja (scan) pembacaan keypad, sehingga Sy bisa share hasilnya disini. :)
Salah satu perangkat yang sering dibutuhkan pada aplikasi mikrokontroler adalah kemampuan berinteraksi dengan pengguna peralatan tersebut. Salah satu cara berinteraksi dengan pengguna adalah dengan menggunakan keypad. Di sini akan kita pelajari tentang pemrograman keypad 3x4 pada mikrokontroler AVR128 dengan menggunakan Code Vision.
Berikut adalah contoh gambar fisik keypad yang sering digunakan:
Keypad tersebut memiliki konfigurasi internal berupa skema berbentuk matrix baris (ROW) dan kolom (COL) sebagai berikut:
Pada mikrokontroler setiap COLOM keypad akan dihubungkan dengan pin "output" mikrokontroler. Sedangkan pada setiap ROW keypad akan dihubungkan dengan pin "input" mikrokontroler.
Salah satu cara untuk membaca data dari matrix keypad adalah dengan teknik scanning,
dimana baris atau kolom selalu discan untuk mendeteksi tombol yang
ditekan. Caranya yaitu dengan memberikan status ‘0’ (low) pada salah satu pin COL (dan yg lain kondisi HIGH)
secara bergantian, lalu pin ROW dideteksi apakah ada salah satunya yang
berkondisi ‘0’ (low). Berikut ilustrasi urutan scaning dan pembacaan keypad:
Apabila Kolom 1 diberi logika ‘0’, kolom kedua
dan kolom ketiga diberi logika ‘1’ maka program akan mengecek tombol 1, 4, 7,
dan *, sehingga apabila salah satu baris berlogika '0' maka ada tombol yang ditekan.
Apabila Kolom 2 diberi logika ‘0’, kolom pertama
dan kolom ketiga diberi logika ‘1’ maka program akan mengecek tombol 2, 5, 8,
dan 0, sehingga apabila salah satu baris berlogika '0' maka ada tombol yang
ditekan.
Apabila Kolom 3 diberi logika ‘0’, kolom pertama
dan kolom kedua diberi logika ‘1’ maka program akan mengecek tombol 3, 6, 9,
dan #, sehingga apabila salah satu baris berlogika '0' maka ada tombol yang
ditekan.
Cara ini dilakukan secara terus menerus sehingga setiap kali keypad ditekan maka akan langsung terdeteksi posisi tombol yang ditekan.
Kali ini Sy akan mencontohkan pemrograman keypad dan menampilkannya pada LCD 16x2 sehingga mudah mengecek tombol yang ditekan. LCD Sy hubungkan dengan PORTC sedangkan Keypad Sy hubungkan dengan PORTE, dengan konfigurasi keypad sebagai Berikut
Pada program kali ini Sy membuat procedure bernama keypad(), yang kemudian prosedur keypad() tersebut akan dieksekusi oleh Timer0 secara terus menerus dan akan mengupdate posisi tombol yg ditekan (bila ada). Penggunaan Timer ini cukup penting karena Timer bisa bekerja secara paralel dengan program utama pada mikrokontroler itu sendiri. (Tolong dicross cek apabila salah).
Berikut adalah coding untuk konfigurasinya:
#include <alcd.h> #include <stdio.h>
unsigned char text[16],nilai_keypad; /*kalo ada yg tdk sesuai pada saat awal sebelum ada tombol yg ditekan maka perlu inisialisasi nilai_keypad=13 (angka diluar range angka yang benar)*/
ETIMSK=0x00; // Alphanumeric LCD initialization // Connections are specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTC Bit 0 // RD - PORTC Bit 2 // EN - PORTC Bit 1 // D4 - PORTC Bit 4 // D5 - PORTC Bit 5 // D6 - PORTC Bit 6 // D7 - PORTC Bit 7 // Characters/line: 16 lcd_init(16);
// Global enable interrupts #asm("sei")
Program Procedure keypad()
unsigned char keypad(){ unsigned char x,i,j; bit y; x=0b01000000; for (i=0;i<3;i++) { PORTE =~((x>>i) & 0x70); for (j=0;j<4;j++) { y=(PINE >> j) & 0x1; if(y==0) return((i+1)+(3*j));
//rumus ini untuk menentukan posisi sesuai baris dan kolom } } }
Scaning keypad() pada Timer0 supaya dilakukan scan terus menerus
// Timer 0 output compare interrupt service routine interrupt [TIM0_COMP] void timer0_comp_isr(void) { // Place your code here nilai_keypad=keypad(); }
Program utama sekaligus mengecek apakah benar nilai_keypad selalu discan oleh Timer0
while (1) { // Place your code here lcd_gotoxy(0,0); lcd_putsf("* Program Utama "); lcd_gotoxy(0,0); lcd_putsf("**--Cek--** "); //mengecek apakah nilai_keypad selalu update lcd_gotoxy(0,1); if(nilai_keypad<10){ sprintf(text,"%u",nilai_keypad); lcd_puts(text);} else if(nilai_keypad==10) lcd_putsf("*"); else if(nilai_keypad==11) lcd_putsf("0"); else if(nilai_keypad==12) lcd_putsf("#"); }
Alhamdulillah akhirnya berhasil jg menerapkan teori keypad ini.. hehe simple tapi harus teliti memang..
Catatan: Procedure keypad() bisa dieksekusi langsung di program utama tanpa menggunakan Timer. Sy hanya mengetes kinerja Timer saja..
Panel bagian dalam elevator memiliki
tombol untuk menuju ke lantai yang akan dituju dan tombol buka pintu untuk
menahan pintu tetap terbuka bila diperlukan pada saat elevator dalam keadaan
berhenti. Gambar 1. berikut ilustrasi panel bagian dalam elevator:
Gambar 1. Ilustrasi Panel Bagian Dalam
Elevator Lima Lantai
2. Panel Bagian Luar Elevator pada
Setiap Lantai Gedung
Panel bagian luar elevator pada setiap
lantai gedung memilik tombol untuk request masuk ke elevator, sehingga
penumpang bisa memanggil (request) elevator dan masuk elevator. Ilustrasi panel
bagian luar pada setiap lantai dapat dilihat pada Gambar 2. berikut:
Gambar 2. Ilustrasi Panel Bagian Luar
Elevator pada Setiap Lantai Gedung
3. Indikator
Posisi Elevator
Elevator juga dilengkapi indikator
posisi elevator (bisa berupa seven segment atau perangkat display lain),
sehingga posisi elevator bisa diketahui ada pada lantai berapa dan apakah
sedang naik atau turun. Gambar 3. berikut mengilustrasikan indikator posisi
elevator:
Gambar 3. Ilustrasi Indikator Posisi Elevator
STATE DIAGRAM ELEVATOR (ILUSTRASI)
Pada Gambar 4. berikut
mengilustrasikan state diagram cara kerja dari elevator lima lantai. Elevator
ini bergerak berdasarkan perintah atau request baik dari dalam elevator maupun
dari luar elevator (pada setiap lantai). Kemudian elevator akan membandingkan
posisi elevator (saat ini) dengan lantai yang akan dituju sesuai request,
sehingga elevator akan bisa menentukan arah geraknya (naik atau turun).
Gambar 4. Ilustrasi State Diagram
Elevator Lima Lantai
DESIGN TINA
Berikut
adalah penerapan design pada simulator TINA:
Gambar 6. Simulasi Design Elevator
Menggunakan Software TINA
VIDEO SIMULASI
SOURCE CODE
Source code dicompile dengan program Quartus. Berikut
source code VHDL dari state diagram elevator lima lantai:
--Bismillah --Coba Elevator --Originally Designed by: Muhammad Nurul Puji (muhammadpuji.its@gmail.com)
--Student of University of Indonesia (UI) library ieee; use ieee.std_logic_1164.all;
entity cobaelevator is port (clk : in std_logic; --untuk maintenance (tombol stop) manual_bukapintu : in std_logic; --dari dalam (atau luar (diseri dgn luar atau diseri dengan sensor)) elevator (hanya pada saat berhenti) in1, in2, in3, in4, in5 : in std_logic; --dari dalam elevator (untuk tujuan mau kelantai berapa?)
in1naik, in2naik, in3naik, in4naik, in5naik : in std_logic; --dari masing-masing lantai (diluar elevator) in1turun, in2turun, in3turun, in4turun, in5turun : in std_logic; --dari masing-masing lantai (diluar elevator)
a1, a2, a3, a4, a5, a6, a7: out std_logic; --untuk menunjukkan posisi elevator melalui seven segmen motornaik, motorturun, tutuppintu: out std_logic; --untuk mekanik motor dan pintu bukapintu: out std_logic); --harusnya pake buffer tapi di Tina tdk bisa (jadi untuk simulasi tetap pake out). Buffer digunakan sbg buffer supaya bisa di read and write (untuk cek apa masih terbuka) end cobaelevator;
architecture behavior of cobaelevator is constant timetutuppintu: integer := 3; --untuk tutup pintu otomatis constant timepintuselesaimenutup: integer :=2; --waktu pintu untuk selesai menutup constant time_nx_state: integer := 4; --waktu yg dibutuhkan untuk naik satu lantai
signal permintaan : std_logic_vector (0 to 4) :="00000"; signal arahelevator : integer range 0 to 2 :=0; signal signalmotornaik : std_logic :='0'; signal signalmotorturun : std_logic :='0'; signal signalnaikturunpenumpang : std_logic:='0'; signal signalstatus : std_logic:='1';
type status is (lantai1, lantai2, lantai3, lantai4, lantai5); --penentuan signal dari masing-masing posisi lantai signal pr_state, nx_state: status;
begin
utama: process (clk, manual_bukapintu, in1, in2, in3, in4, in5, in1naik, in2naik, in3naik, in4naik, in5naik, in1turun, in2turun, in3turun, in4turun, in5turun) variable digit1 : std_logic_vector (6 downto 0); ----------untuk Seven Segment------ variable count: integer range 0 to (time_nx_state + timetutuppintu + timepintuselesaimenutup); variable bufferbukapintu: std_logic; --harusnya menggunakan buffer untuk bukapintu, tapi di Tina tdk bisa. Jadi menggunakan variable ini
------------Variable ini untuk Arah Elevator--------------------- variable posisi : integer range 0 to 4; variable tempnaik, tempturun : integer range -4 to 4 :=0; --karena ada kemungkinan bernilai negatif (tetapi yg dipake cuma positif) variable temp : integer range 1 to 2 :=1; ------------End Variable Arah Elevator---------------------------
begin if (clk'event and clk='1') then ------------------Cek Permintaan---------------- permintaan(0)<= permintaan(0) or in1 or in1naik or in1turun; permintaan(1)<= permintaan(1) or in2 or in2naik or in2turun; permintaan(2)<= permintaan(2) or in3 or in3naik or in3turun; permintaan(3)<= permintaan(3) or in4 or in4naik or in4turun; permintaan(4)<= permintaan(4) or in5 or in5naik or in5turun;
------------Begin Arah Elevator----------------------- case pr_state is when lantai1 => posisi :=0; when lantai2 => posisi :=1; when lantai3 => posisi :=2; when lantai4 => posisi :=3; when lantai5 => posisi :=4; end case;
for i in 1 to 4 loop -- i harus dalam range konstanta if permintaan(i)= '1' then tempnaik:=i-posisi; else null; end if; end loop; for i in 3 downto 0 loop -- i harus dalam range konstanta if permintaan(i)= '1' then tempturun:=posisi-i; else null; end if; end loop;
if tempnaik=0 and tempturun=0 then --saat posisi lantai sama dengan permintaan arahelevator<=0; elsif temp=1 then arahelevator <= 1; --naik if tempnaik < 1 then temp :=2 ; else null; end if; elsif temp= 2 then --turun arahelevator <= 2; if tempturun <1 then temp:=1; else null; end if; else null; end if; --------------End Arah Elevator------------------------------
-----------------Bagian Utama------------------------------ count:=count + 1; if (manual_bukapintu='1' and signalmotornaik = '0' and signalmotorturun = '0') then --untuk menahan pintu tetap terbuka saat elevator berhenti bukapintu<='1'; bufferbukapintu:='1'; tutuppintu <= '0'; count:=0; elsif (signalnaikturunpenumpang='1') then if (count < timetutuppintu) then motornaik<=signalmotornaik; motorturun<=signalmotorturun; bukapintu <= '1'; bufferbukapintu:='1'; tutuppintu <= '0'; elsif (count < (timetutuppintu + timepintuselesaimenutup) ) then bukapintu<='0'; bufferbukapintu:='0'; tutuppintu<='1'; else tutuppintu <='0'; pr_state<=nx_state; if signalstatus='1' then signalstatus<='0'; else signalstatus<='1'; end if; count:=0; end if; else --jika tidak ada naik turun penumpang maka lift tdk berhenti if (count < timepintuselesaimenutup) then --untuk mengatasi kondisi setelah manual_bukapintu. karena akan lari ke sini, sehingga harus ditutup pintunya if (bufferbukapintu = '1') then bukapintu <= '0'; bufferbukapintu:='0'; tutuppintu <= '1'; else count:=timepintuselesaimenutup; end if; elsif (count < timepintuselesaimenutup + time_nx_state) then tutuppintu <= '0'; motornaik<=signalmotornaik; motorturun<=signalmotorturun; else pr_state<=nx_state; if signalstatus='1' then signalstatus<='0'; else signalstatus<='1'; end if; count:=0; end if; end if;
-------------Begin Display Seven Segment-------------- case pr_state is when lantai1 => digit1 := "1111001"; if permintaan(0)='1' then ----------bila lantai sdh sama dengan yang diminta maka permintaan pada lantai tsb di nol kan permintaan(0)<='0'; else null; end if; when lantai2 => digit1 := "0100100"; if permintaan(1)='1' then permintaan(1)<='0'; else null; end if; when lantai3 => digit1 := "0110000"; if permintaan(2)='1' then permintaan(2)<='0'; else null; end if; when lantai4 => digit1 := "0011001"; if permintaan(3)='1' then permintaan(3)<='0'; else null; end if; when lantai5 => digit1 := "0010010"; if permintaan(4)='1' then permintaan(4)<='0'; else null; end if; when others => null; end case; a1<=digit1(0); a2<=digit1(1); a3<=digit1(2); a4<=digit1(3); a5<=digit1(4); a6<=digit1(5); a7<=digit1(6); -------------------End Display Seven Segment------------------ end if; end process utama;
step: process (pr_state, signalstatus) begin --------------Begin Penentuan Perubahan State---------------- case pr_state is when lantai1 => if (permintaan(0)='1') then --berhenti dan buka pintu hanya apabila ada permintaan pada lantai tsb nx_state <= pr_state; signalmotornaik <= '0'; signalmotorturun <= '0'; signalnaikturunpenumpang<='1'; else signalnaikturunpenumpang<='0'; if arahelevator=1 then --1 berarti naik nx_state<=lantai2; signalmotornaik <= '1'; signalmotorturun <= '0'; else nx_state<=pr_state; --lantai 1 hanya bisa naik atau diam signalmotornaik <= '0'; signalmotorturun <= '0'; end if; end if; when lantai2 => if (permintaan(1)='1') then nx_state <= pr_state; signalmotornaik <= '0'; signalmotorturun <= '0'; signalnaikturunpenumpang<='1'; else signalnaikturunpenumpang<='0'; if arahelevator=1 then --1 berarti naik nx_state<=lantai3; signalmotornaik <= '1'; signalmotorturun <= '0'; elsif arahelevator=2 then --2 berarti turun nx_state<=lantai1; signalmotornaik <= '0'; signalmotorturun <= '1'; else nx_state<=pr_state; signalmotornaik <= '0'; signalmotorturun <= '0'; end if; end if; when lantai3 => if (permintaan(2)='1') then --berhenti dan buka pintu hanya apabila ada permintaan pada lantai tsb nx_state <= pr_state; signalmotornaik <= '0'; signalmotorturun <= '0'; signalnaikturunpenumpang<='1'; else signalnaikturunpenumpang<='0'; if arahelevator=1 then --1 berarti naik nx_state<=lantai4; signalmotornaik <= '1'; signalmotorturun <= '0'; elsif arahelevator=2 then --2 berarti turun nx_state<=lantai2; signalmotornaik <= '0'; signalmotorturun <= '1'; else nx_state<=pr_state; signalmotornaik <= '0'; signalmotorturun <= '0'; end if; end if; when lantai4 => if (permintaan(3)='1') then --berhenti dan buka pintu hanya apabila ada permintaan pada lantai tsb nx_state <= pr_state; signalmotornaik <= '0'; signalmotorturun <= '0'; signalnaikturunpenumpang<='1'; else signalnaikturunpenumpang<='0'; if arahelevator=1 then --1 berarti naik nx_state<=lantai5; signalmotornaik <= '1'; signalmotorturun <= '0'; elsif arahelevator=2 then --2 berarti turun nx_state<=lantai3; signalmotornaik <= '0'; signalmotorturun <= '1'; else nx_state<=pr_state; signalmotornaik <= '0'; signalmotorturun <= '0'; end if; end if; when lantai5 => if (permintaan(4)='1') then --berhenti dan buka pintu hanya apabila ada permintaan pada lantai tsb nx_state <= pr_state; signalmotornaik <= '0'; signalmotorturun <= '0'; signalnaikturunpenumpang<='1'; else signalnaikturunpenumpang<='0'; if arahelevator=2 then --2 berarti turun nx_state<=lantai4; signalmotornaik <= '0'; signalmotorturun <= '1'; else nx_state<=pr_state; signalmotornaik <= '0'; signalmotorturun <= '0'; end if; end if; end case; --------------------------End Penentuan Perubahan State----------------------- end process step;