ARITHMETIC AND LOGIC INSTRUCTIONS




1. pendahuluan[Kembali]

    Dalam bab ini, kita membahas instruksi aritmetika dan logika. Instruksi aritmetika mencakup penjumlahan, pengurangan, perkalian, pembagian, perbandingan, negasi, penambahan (increment), dan pengurangan (decrement). Instruksi logika mencakup AND, OR, Exclusive-OR, NOT, pergeseran (shift), rotasi (rotate), serta perbandingan logis (TEST).

    Bab ini juga membahas instruksi mulai dari prosesor 80386 hingga Core2, seperti XADD, SHRD, SHLD, pengujian bit (bit test), dan pemindaian bit (bit scan). Bab ini ditutup dengan pembahasan mengenai instruksi perbandingan string, yang digunakan untuk memindai data dalam bentuk tabel maupun membandingkan bagian-bagian data di memori. Kedua tugas perbandingan ini dapat dilakukan secara efisien dengan instruksi string scan (SCAS) dan string compare (CMPS).

    Jika Anda terbiasa dengan mikroprosesor 8-bit, Anda akan menyadari bahwa set instruksi pada 8086 hingga Core2 lebih unggul dibandingkan sebagian besar mikroprosesor 8-bit, karena sebagian besar instruksinya memiliki dua operand, bukan hanya satu. Bahkan jika ini adalah pengalaman pertama Anda dengan mikroprosesor, Anda akan dengan cepat memahami bahwa mikroprosesor ini memiliki kumpulan instruksi aritmetika dan logika yang sangat kuat sekaligus mudah digunakan.

2. Tujuan bab[Kembali]

  1. Menggunakan instruksi aritmetika dan logika untuk menyelesaikan operasi aritmetika biner, BCD, dan ASCII sederhana.
  2. Menggunakan AND, OR, dan Exclusive-OR untuk melakukan manipulasi bit biner.
  3. Menggunakan instruksi shift dan rotate.
  4. Menjelaskan cara kerja instruksi mulai dari 80386 hingga Core2, seperti exchange and add, compare and exchange, double-precision shift, bit test, dan bit scan.
  5. Memeriksa isi suatu tabel untuk menemukan kecocokan dengan menggunakan instruksi string.

3. ADDITION, SUBTRACTION, AND COMPARISON[Kembali]

  1. Addition
       Instruksi penjumlahan (ADD) muncul dalam berbagai bentuk pada mikroprosesor. Bagian ini menjelaskan penggunaan instruksi ADD untuk penjumlahan biner 8-bit, 16-bit, dan 32-bit. Bentuk kedua dari penjumlahan, yang disebut add-with-carry, diperkenalkan melalui instruksi ADC. Terakhir, terdapat instruksi increment (INC). Increment merupakan bentuk khusus dari penjumlahan yang menambahkan angka 1 pada suatu bilangan. Pada Bagian 5–3, bentuk-bentuk penjumlahan lain dibahas, seperti penjumlahan BCD dan ASCII. Selain itu, juga dijelaskan instruksi XADD, yang terdapat pada prosesor 80486 hingga Pentium 4.

    Tabel 5–1 menunjukkan mode pengalamatan yang tersedia untuk instruksi ADD (mode pengalamatan ini mencakup hampir semua yang telah dijelaskan pada Bab 3). Namun, karena terdapat lebih dari 32.000 variasi instruksi ADD dalam set instruksi, tidak mungkin untuk mencantumkannya semua dalam tabel tersebut. Satu-satunya bentuk penjumlahan yang tidak diizinkan adalah memory-to-memory dan penggunaan segment register. Segment register hanya dapat dipindahkan (moved), dimasukkan ke stack (pushed), atau diambil dari stack (popped).

    Perlu dicatat bahwa, seperti pada semua instruksi lainnya, register 32-bit hanya tersedia mulai dari prosesor 80386 hingga Core2. Pada mode 64-bit di prosesor Pentium 4 dan Core2, register 64-bit juga digunakan untuk operasi penjumlahan.

Penjumlahan Register.

Contoh 5–1 menunjukkan urutan instruksi sederhana yang menggunakan penjumlahan register untuk menjumlahkan isi dari beberapa register. Pada contoh ini, isi dari AX, BX, CX, dan DX dijumlahkan untuk membentuk hasil 16-bit yang disimpan di dalam register AX.

EXAMPLE 5–1
0000  03  C3         ADD AX,BX
0002  03  C1         ADD AX,CX
0004  03  C2         ADD AX,DX

Setiap kali instruksi aritmetika dan logika dijalankan, isi dari flag register akan berubah. Perlu diperhatikan bahwa isi dari interrupt flag, trap flag, dan flag lainnya tidak berubah akibat instruksi aritmetika maupun logika. Hanya flag yang terletak pada 8 bit paling kanan dari flag register serta overflow flag yang mengalami perubahan. Flag-flag pada bagian kanan ini menunjukkan hasil dari operasi aritmetika atau logika.

Instruksi ADD, misalnya, akan mengubah isi dari sign flag, zero flag, carry flag, auxiliary carry flag, parity flag, dan overflow flag. Sementara itu, bit-bit flag tidak mengalami perubahan pada sebagian besar instruksi pemindahan data yang telah dibahas pada Bab 4.

Penjumlahan Immediate.

Penjumlahan immediate digunakan ketika data konstan atau data yang sudah diketahui ditambahkan. Contoh penjumlahan immediate 8-bit ditunjukkan pada Contoh 5–2. Pada contoh ini, register DL terlebih dahulu diisi dengan nilai 12H menggunakan instruksi immediate move. Selanjutnya, nilai 33H ditambahkan ke 12H di dalam register DL melalui instruksi immediate addition. Setelah penjumlahan, hasilnya (45H) masuk ke dalam register DL dan flag mengalami perubahan sebagai berikut:

                                                Z = 0 1result not zero2P = 0

                                                C = 0 1no carry2

                                                A = 0 1no half-carry2

                                                S = 0 1result positive2

                                                P = 0 1odd parity2

                                                O = 0 1no overflow2

Contoh 5–2

0000   B2   12                      MOV DL,12H

0002   80   C2   33                 ADD DL,33H

Penjumlahan Memory-ke-Register. Misalkan suatu aplikasi membutuhkan data dari memori untuk ditambahkan ke dalam register AL. Contoh 5–3 menunjukkan contoh yang menambahkan dua byte data berurutan, yang disimpan pada lokasi offset segmen data NUMB dan (lokasi berikutnya), ke dalam register AL.

EXAMPLE 5–3

0000 BF 0000 R         MOV DI,OFFSET NUMB         ;address NUMB

0003 B0 00                 MOV AL,0                                  ;clear sum

0005 02 05                 ADD AL,[DI]                                 ;add NUMB

0007 02 45 01            ADD AL,[DI+1]                             ;add NUMB+1

Instruksi pertama memuat register destination index (DI) dengan alamat offset NUMB. Register DI, yang digunakan pada contoh ini, berfungsi untuk mengakses data di segmen data yang dimulai dari lokasi memori NUMB. Setelah nilai penjumlahan dihapus (diinisialisasi menjadi nol), instruksi ADD AL,[DI] akan menambahkan isi dari lokasi memori NUMB ke dalam register AL.

Selanjutnya, instruksi ADD AL,[ ] menambahkan isi dari lokasi memori NUMB ditambah 1 byte ke dalam register AL. Setelah kedua instruksi ADD dijalankan, hasil akhirnya akan muncul di dalam register AL sebagai jumlah dari isi NUMB ditambah isi dari lokasi berikutnya.

Penjumlahan Array. 

Array memori adalah daftar data yang tersusun secara berurutan. Misalkan sebuah array data (ARRAY) berisi 10 byte, dengan penomoran elemen dari 0 hingga 9. Contoh 5–4 menunjukkan bagaimana cara menjumlahkan isi dari elemen array ke-3, ke-5, dan ke-7.

Pada contoh ini, register AL terlebih dahulu dihapus (diisi dengan 0), sehingga dapat digunakan untuk menampung hasil penjumlahan. Selanjutnya, register SI diisi dengan nilai 3 untuk pertama kali mengakses elemen array ke-3. Instruksi ADD AL,ARRAY[SI] kemudian menambahkan isi dari elemen array ke-3 ke dalam jumlah yang tersimpan di AL.

Instruksi berikutnya menambahkan elemen array ke-5 dan ke-7 ke dalam jumlah di AL, dengan menggunakan nilai 3 pada SI ditambah displacement 2 untuk mengakses elemen ke-5, serta displacement 4 untuk mengakses elemen ke-7.

EXAMPLE 5–4

0000 B0 00                 MOV AL,0                             ;clear sum

0002 BE 0003             MOV SI,3                             ;address element 3

0005 02 84 0000 R      ADD AL,ARRAY[SI]         ;add element 3

0009 02 84 0002 R        ADD AL,ARRAY[SI+2]     ;add element 5

000D 02 84 0004 R         ADD AL,ARRAY[SI+4]     ;add element 7

Misalkan sebuah array data berisi bilangan 16-bit yang akan dijumlahkan untuk membentuk hasil penjumlahan 16-bit di dalam register AX. Contoh 5–5 menunjukkan urutan instruksi yang ditulis untuk prosesor 80386 dan yang lebih baru, dengan menggunakan bentuk pengalamatan scaled-index untuk menjumlahkan elemen ke-3, ke-5, dan ke-7 dari suatu area memori bernama ARRAY.

Pada contoh ini, EBX diisi dengan alamat ARRAY, sedangkan ECX berfungsi menyimpan nomor elemen array. Perhatikan bagaimana faktor skala (scaling factor) digunakan untuk mengalikan isi register ECX dengan 2 agar dapat mengakses data berupa word. (Ingat bahwa word terdiri dari 2 byte.)

Penjumlahan Increment. 

Instruksi increment (INC) digunakan untuk menambahkan nilai 1 ke sebuah register atau lokasi memori. Instruksi INC dapat menambahkan 1 ke semua register atau lokasi memori, kecuali pada segment register. Tabel 5–2 menggambarkan beberapa bentuk instruksi increment yang tersedia pada prosesor 8086 hingga Core2. Sama seperti instruksi lain yang telah dibahas sebelumnya, tidak mungkin untuk menampilkan semua variasi instruksi INC, karena jumlahnya sangat banyak.

Pada increment memori tidak langsung (indirect memory increment), ukuran data harus dijelaskan dengan menggunakan direktif BYTE PTR, WORD PTR, DWORD PTR, atau QWORD PTR

Assembler tidak dapat menentukan apakah, misalnya, instruksi INC [DI] merupakan increment dengan ukuran byte, word, atau doubleword. Instruksi INC BYTE PTR [DI] secara jelas menunjukkan bahwa data memori berukuran byte; instruksi INC WORD PTR [DI] menunjukkan bahwa data memori berukuran word; sedangkan instruksi INC DWORD PTR [DI] menunjukkan bahwa data memori berukuran doubleword. Pada operasi mode 64-bit pada prosesor Pentium 4 dan Core2, instruksi INC QWORD PTR [RSI] menunjukkan bahwa data memori berukuran quadword.

Contoh 5–6 menunjukkan bagaimana memodifikasi Contoh 5–3 untuk menggunakan instruksi increment dalam pengalamatan NUMB dan lokasi setelahnya. Pada contoh ini, instruksi INC DI mengubah isi dari register DI dari alamat offset NUMB ke alamat offset berikutnya. Kedua urutan program yang ditunjukkan pada Contoh 5–3 dan Contoh 5–6 sama-sama menjumlahkan isi dari NUMB dan lokasi berikutnya. Perbedaannya terletak pada cara pembentukan alamat melalui isi register DI dengan menggunakan instruksi increment.

EXAMPLE 5–6

0000 BF 0000 R             MOV DI,OFFSET NUMB             ;address NUMB

0003 B0 00                     MOV AL,0                                     ;clear sum

0005 02 05                      ADD AL,[DI]                                 ;add NUMB

0007 47                             INC DI                                          ;increment DI

0008 02 05                         ADD AL,[DI]                                ;add NUMB+1

Instruksi increment memengaruhi bit-bit flag, seperti halnya sebagian besar operasi aritmetika dan logika lainnya. Perbedaannya adalah instruksi increment tidak memengaruhi carry flag. Carry tidak berubah karena instruksi increment sering digunakan dalam program yang bergantung pada isi dari carry flag.

Perlu diperhatikan bahwa instruksi increment digunakan hanya untuk menunjuk ke elemen memori berikutnya dalam array data berukuran byte. Jika data yang diakses berukuran word, lebih baik menggunakan instruksi ADD DI,2 untuk memodifikasi pointer DI, dibandingkan menggunakan dua kali instruksi INC DI. Untuk array doubleword, gunakan instruksi ADD DI,4 untuk memodifikasi pointer DI.

Dalam beberapa kasus, carry flag harus dipertahankan, yang dapat berarti bahwa dua atau empat instruksi INC mungkin muncul dalam sebuah program untuk memodifikasi sebuah pointer.

Pengurangan

Banyak bentuk instruksi pengurangan (SUB) terdapat dalam set instruksi. Bentuk-bentuk ini menggunakan mode pengalamatan apa pun dengan data 8-, 16-, atau 32-bit. Bentuk khusus dari pengurangan (decrement, atau DEC) mengurangkan nilai 1 dari suatu register atau lokasi memori. Bagian 5–3 menunjukkan bagaimana data BCD dan ASCII dikurangkan. Sama seperti pada penjumlahan, angka yang lebih besar dari 16-bit atau 32-bit kadang-kadang harus dikurangkan. Instruksi subtract-with-borrow (SBB) digunakan untuk melakukan jenis pengurangan ini. Pada prosesor 80486 hingga Core2, set instruksi juga mencakup instruksi compare and exchange. Dalam mode 64-bit pada Pentium 4 dan Core2, pengurangan 64-bit juga tersedia.

Tabel 5–4 mencantumkan beberapa mode pengalamatan yang diizinkan dengan instruksi pengurangan (SUB). Ada lebih dari 1000 kemungkinan instruksi pengurangan, terlalu banyak untuk dicantumkan di sini. Satu-satunya jenis pengurangan yang tidak diizinkan adalah pengurangan memory-to-memory dan pengurangan register segmen. Seperti instruksi aritmetika lainnya, instruksi pengurangan memengaruhi bit-bit flag.

Pengurangan Register. Contoh 5–9 menunjukkan urutan instruksi yang melakukan pengurangan register. Contoh ini mengurangkan isi 16-bit dari register CX dan DX dari isi register BX. Setelah setiap pengurangan, mikroprosesor memodifikasi isi dari flag register. Flag berubah pada sebagian besar operasi aritmetika dan logika.

CONTOH 5–9

0000 2B D9 SUB BX,CX 0002 2B DA SUB BX,DX

Pengurangan Immediate. Sama seperti pada penjumlahan, mikroprosesor juga mengizinkan operand immediate untuk pengurangan data konstan. Contoh 5–10 menyajikan urutan instruksi pendek yang mengurangkan 44H dari 22H. Di sini, pertama kita memuat nilai 22H ke dalam register CH menggunakan perintah immediate move.



Selanjutnya, instruksi SUB, menggunakan data immediate 44H, mengurangkan 44H dari 22H.

Setelah pengurangan, selisihnya (0DEH) dipindahkan ke dalam register CH. Flag berubah sebagai berikut untuk pengurangan ini:

CONTOH 5–10

0000 B5 22 MOV CH,22H 0002 80 ED 44 SUB CH,44H

Kedua carry flag (C dan A) menyimpan borrow setelah sebuah pengurangan, bukan carry seperti pada penjumlahan. Perhatikan pada contoh ini tidak terjadi overflow. Contoh ini mengurangkan 44H (68 desimal) dari 22H (34 desimal), menghasilkan 0DEH (–34 desimal). Karena hasil bertanda 8-bit yang benar adalah –34, maka tidak ada overflow pada contoh ini. Overflow 8-bit hanya terjadi jika hasil bertanda lebih besar dari +127 atau lebih kecil dari –128.

Pengurangan Decrement

Pengurangan decrement (DEC) mengurangkan 1 dari sebuah register atau isi suatu lokasi memori. Tabel 5–5 mencantumkan beberapa instruksi decrement yang menggambarkan decrement register dan memori.

Instruksi decrement pada data memori tak langsung memerlukan BYTE PTR, WORD PTR, DWORD PTR, atau QWORD PTR, karena assembler tidak dapat membedakan apakah lokasi yang dialamatkan register indeks berisi sebuah byte, word, atau doubleword. Sebagai contoh, DEC [SI] bersifat ambigu karena assembler tidak dapat menentukan apakah lokasi yang ditunjuk oleh SI adalah byte, word, atau doubleword. Dengan menggunakan DEC BYTE PTR [SI], DEC WORD PTR [DI], atau DEC DWORD PTR [SI], maka hal tersebut menjadi jelas.



Pengurangan dengan Borrow

Instruksi subtraction-with-borrow (SBB) berfungsi sama seperti pengurangan biasa, kecuali bahwa carry flag (C), yang menyimpan borrow, juga dikurangkan dari hasil selisih. Penggunaan paling umum dari instruksi ini adalah untuk pengurangan dengan lebar lebih dari 16-bit pada mikroprosesor 8086–80286 atau lebih dari 32-bit pada 80386–Core2.

Pengurangan lebar (wide subtraction) membutuhkan agar borrow dapat dipropagasikan melalui proses pengurangan, sama seperti penjumlahan lebar (wide addition) yang mempropagasikan carry. Tabel 5–6 mencantumkan beberapa instruksi SBB dengan komentar yang menjelaskan operasinya. Sama seperti instruksi SUB, SBB juga memengaruhi flag. Perhatikan bahwa instruksi pengurangan immediate dari memori dalam tabel ini membutuhkan arahan BYTE PTR, WORD PTR, DWORD PTR, atau QWORD PTR.

Ketika bilangan 32-bit yang disimpan pada register BX dan AX dikurangkan dari bilangan 32-bit yang disimpan pada register SI dan DI, carry flag mempropagasikan borrow di antara dua pengurangan 16-bit tersebut. Carry flag menyimpan borrow untuk pengurangan. Gambar 5–2 menunjukkan bagaimana borrow dipropagasikan melalui carry flag (C) dalam tugas ini. Contoh 5–11 menunjukkan bagaimana pengurangan ini dilakukan oleh sebuah program.

Pada pengurangan lebar, data 16-bit atau 32-bit yang paling rendah (least significant) dikurangkan dengan instruksi SUB.


 Semua data berikutnya dan yang lebih signifikan dikurangkan dengan menggunakan instruksi SBB. Contoh ini menggunakan instruksi SUB untuk mengurangkan DI dari AX, kemudian menggunakan SBB untuk melakukan subtraction-with-borrow SI dari BX.

CONTOH 5–11

0000 2B C7 SUB AX,DI 0002 1B DE SBB BX,SI

Perbandingan

Instruksi perbandingan (CMP) adalah sebuah pengurangan yang hanya mengubah bit-bit flag; operand tujuan tidak pernah berubah. Perbandingan berguna untuk memeriksa seluruh isi dari sebuah register atau lokasi memori terhadap nilai lain. Instruksi CMP biasanya diikuti oleh instruksi conditional jump, yang menguji kondisi bit-bit flag.

Tabel 5–7 mencantumkan berbagai instruksi perbandingan yang menggunakan mode pengalamatan yang sama seperti instruksi penjumlahan dan pengurangan yang telah dijelaskan sebelumnya. Sama seperti instruksi lainnya, bentuk perbandingan yang tidak diizinkan adalah memory-to-memory dan segment register compare.

Contoh 5–12 menunjukkan sebuah perbandingan yang diikuti oleh instruksi conditional jump. Pada contoh ini, isi dari register AL dibandingkan dengan 10H. Instruksi conditional jump yang sering mengikuti perbandingan adalah JA (jump above) atau JB (jump below). Jika JA mengikuti perbandingan, maka loncatan akan terjadi jika nilai dalam AL lebih besar dari 10H. Jika JB mengikuti perbandingan, maka loncatan akan terjadi jika nilai dalam AL lebih kecil dari 10H.

Dalam contoh ini, instruksi JAE mengikuti perbandingan. Instruksi ini menyebabkan program melanjutkan ke lokasi memori SUBER jika nilai dalam AL sama dengan atau lebih besar dari 10H. Ada juga instruksi JBE (jump below or equal) yang dapat mengikuti perbandingan untuk melakukan loncatan jika hasilnya lebih kecil atau sama dengan 10H.

Bab-bab selanjutnya akan memberikan detail tambahan tentang instruksi CMP dan instruksi conditional jump.

CONTOH 5–12

0000 3C 10 CMP AL,10H ; membandingkan AL dengan 10H 0002 73 1C JAE SUBER ; jika AL bernilai 10H atau lebih

Compare and Exchange (Hanya pada Prosesor 80486–Core2)

Instruksi compare and exchange (CMPXCHG), yang hanya terdapat pada set instruksi prosesor 80486 hingga Core2, membandingkan operand tujuan dengan akumulator. Jika keduanya sama, operand sumber disalin ke operand tujuan; jika tidak sama, operand tujuan disalin ke akumulator. Instruksi ini berfungsi dengan data 8-, 16-, atau 32-bit.

Instruksi CMPXCHG CX,DX adalah contoh dari compare and exchange. Instruksi ini pertama-tama membandingkan isi CX dengan AX. Jika CX sama dengan AX, maka DX disalin ke AX; jika CX tidak sama dengan AX, maka CX disalin ke AX. Instruksi ini juga dapat membandingkan AL dengan data 8-bit dan EAX dengan data 32-bit jika operannya berupa data 8- atau 32-bit.

Pada prosesor Pentium hingga Core2, tersedia instruksi CMPXCHG8B yang membandingkan dua quadword. Ini adalah satu-satunya instruksi manipulasi data baru yang disediakan dalam Pentium–Core2 dibandingkan dengan versi mikroprosesor sebelumnya. Instruksi compare-and-exchange-8-bytes membandingkan nilai 64-bit yang terdapat dalam EDX:EAX dengan angka 64-bit yang berada di memori.

Sebagai contoh: CMPXCHG8B TEMP. Jika TEMP sama dengan EDX:EAX, maka TEMP diganti dengan nilai yang terdapat di ECX:EBX; jika TEMP tidak sama dengan EDX:EAX, maka angka yang terdapat di TEMP dimuat ke dalam EDX:EAX. Bit flag Z (zero) menunjukkan bahwa nilainya sama setelah perbandingan.

Instruksi ini memiliki bug yang dapat menyebabkan sistem operasi mengalami crash. Informasi lebih lanjut tentang kelemahan ini dapat diperoleh di www.intel.com. Terdapat juga instruksi CMPXCHG16B yang tersedia pada prosesor Pentium 4 ketika dijalankan dalam mode 64-bit.


PERKALIAN DAN PEMBAGIAN

Hanya mikroprosesor modern yang memiliki instruksi perkalian dan pembagian. Mikroprosesor 8-bit generasi awal tidak dapat melakukan perkalian atau pembagian tanpa menggunakan sebuah program yang melakukan perkalian atau pembagian dengan serangkaian operasi pergeseran (shift) dan penjumlahan atau pengurangan. Karena produsen mikroprosesor menyadari kekurangan ini, mereka menambahkan instruksi perkalian dan pembagian ke dalam set instruksi mikroprosesor generasi yang lebih baru.

Prosesor Pentium–Core2 memiliki rangkaian khusus yang dapat melakukan operasi perkalian hanya dalam satu periode clock, sedangkan pada mikroprosesor Intel generasi awal diperlukan lebih dari 40 periode clock untuk menyelesaikan perkalian yang sama.

Perkalian

Perkalian dilakukan pada byte, word, atau doubleword, dan dapat berupa bilangan bulat bertanda (IMUL) maupun bilangan bulat tak bertanda (MUL). Perlu dicatat bahwa hanya prosesor mulai dari 80386 hingga Core2 yang dapat mengalikan doubleword 32-bit.

Hasil dari sebuah perkalian selalu berupa produk dengan lebar ganda (double-width product). Jika dua bilangan 8-bit dikalikan, hasilnya adalah produk 16-bit; jika dua bilangan 16-bit dikalikan, hasilnya adalah produk 32-bit; dan jika dua bilangan 32-bit dikalikan, hasilnya adalah produk 64-bit. Dalam mode 64-bit pada prosesor Pentium 4, dua bilangan 64-bit dapat dikalikan untuk menghasilkan produk 128-bit.

Beberapa flag bit (overflow dan carry) akan berubah ketika instruksi perkalian dieksekusi dan menghasilkan keluaran yang dapat diprediksi. Flag lainnya juga ikut berubah, tetapi hasilnya tidak dapat diprediksi sehingga tidak digunakan.

Dalam perkalian 8-bit, jika 8 bit paling signifikan dari hasil bernilai nol, maka kedua flag C dan O bernilai nol. Flag ini menunjukkan apakah hasilnya berukuran 8-bit (C=0) atau 16-bit (C=1). Dalam perkalian 16-bit, jika 16 bit paling signifikan dari hasil bernilai nol, maka …

TABEL 5–8 Contoh instruksi perkalian 8-bit

Assembly LanguageOperasi
MUL CLAL dikalikan dengan CL; hasil perkalian tak bertanda (unsigned) berada di AX
IMUL DHAL dikalikan dengan DH; hasil perkalian bertanda (signed) berada di AX
IMUL BYTE PTR[BX]AL dikalikan dengan isi byte dari lokasi memori segmen data yang dialamatkan oleh BX; hasil perkalian bertanda berada di AX
MUL TEMPAL dikalikan dengan isi byte dari lokasi memori segmen data TEMP; hasil perkalian tak bertanda berada di AX


Jika hasil perkalian adalah 0, maka kedua flag C dan O akan bernilai nol. Pada perkalian 32-bit, baik C maupun O menunjukkan bahwa 32 bit paling signifikan dari hasil perkalian bernilai nol.




Perkalian 8-Bit

Pada perkalian 8-bit, multiplicand (bilangan yang dikalikan) selalu berada di register AL, baik untuk operasi bertanda (signed) maupun tak bertanda (unsigned). Multiplier (bilangan pengali) bisa berupa register 8-bit apa pun atau lokasi memori.

Perkalian immediate tidak diizinkan, kecuali jika instruksi signed immediate multiplication khusus (yang akan dibahas lebih lanjut dalam bagian ini) digunakan dalam program. Instruksi perkalian hanya memuat satu operand karena operand tersebut selalu dikalikan dengan isi dari register AL.

Sebagai contoh, instruksi MUL BL akan mengalikan isi tak bertanda dari AL dengan isi tak bertanda dari BL. Setelah perkalian, hasil tak bertanda disimpan di AX—sebuah hasil dengan lebar ganda (double-width product). Tabel 5–8 menggambarkan beberapa instruksi perkalian 8-bit.

Misalkan BL dan CL masing-masing berisi dua bilangan 8-bit tak bertanda, dan bilangan tersebut harus dikalikan untuk menghasilkan produk 16-bit yang disimpan di DX. Prosedur ini tidak dapat dilakukan dengan satu instruksi saja, karena untuk perkalian 8-bit, hanya register AL yang dapat digunakan sebagai operand tetap.

Contoh 5–13 menunjukkan sebuah program singkat yang menghasilkan hal tersebut. Contoh ini memuat data 5 ke dalam register BL dan data 10 ke dalam CL. Produk perkalian (50) dipindahkan ke DX dari AX setelah perkalian, menggunakan instruksi MOV DX,AX.

CONTOH 5–13

0000 B3 05 MOV BL,5 ; muat data 0002 B1 0A MOV CL,10 0004 8A C1 MOV AL,CL ; posisikan data 0006 F6 E3 MUL BL ; kalikan 0008 8B D0 MOV DX,AX ; pindahkan hasil perkalian

Untuk perkalian bertanda (signed multiplication), hasilnya dalam bentuk biner jika positif, dan dalam bentuk komplemen dua (two’s complement) jika negatif. Bentuk ini sama dengan yang digunakan mikroprosesor untuk menyimpan semua bilangan bertanda positif maupun negatif. Jika program pada Contoh 5–13 mengalikan dua bilangan bertanda, maka instruksi MUL hanya diganti dengan IMUL.

Perkalian 16-Bit

Perkalian word (16-bit) sangat mirip dengan perkalian byte. Perbedaannya adalah bahwa AX berisi multiplicand, bukan AL, dan hasil 32-bit muncul di DX–AX, bukan hanya di AX. Register DX selalu berisi 16 bit paling signifikan dari hasil perkalian, sedangkan AX berisi 16 bit paling rendah. Sama seperti perkalian 8-bit, pilihan pengali (multiplier) terserah pada pemrogram. Tabel 5–9 menunjukkan beberapa instruksi perkalian 16-bit yang berbeda.

Perkalian Immediate 16-Bit Khusus

Mikroprosesor 8086/8088 tidak dapat melakukan perkalian immediate. Mulai dari 80186 hingga Core2, hal ini bisa dilakukan dengan menggunakan versi khusus dari instruksi perkalian.

Perkalian immediate ini harus berupa perkalian bertanda (signed multiplication), dan format instruksinya berbeda karena memuat tiga operand. Operand pertama adalah register tujuan 16-bit; operand kedua adalah register atau lokasi memori …

Operand kedua adalah register atau lokasi memori yang berisi bilangan 16-bit (multiplicand), dan operand ketiga adalah data immediate 8-bit atau 16-bit yang digunakan sebagai pengali (multiplier).

Instruksi IMUL CX,DX,12H mengalikan 12H dengan DX dan menyimpan hasil kali bertanda 16-bit ke dalam CX. Jika data immediate berupa 8-bit, maka data tersebut akan diperluas tanda (sign-extended) menjadi bilangan 16-bit sebelum perkalian dilakukan.

Contoh lainnya adalah IMUL BX,NUMBER,1000H, yang mengalikan NUMBER dengan 1000H dan menyimpan hasilnya ke dalam BX. Baik tujuan (destination) maupun multiplicand harus berupa bilangan 16-bit. Walaupun ini termasuk perkalian immediate, keterbatasan yang dimilikinya membuat penggunaannya tidak terlalu luas—terutama karena hanya berlaku untuk perkalian bertanda (signed multiplication) dan hasilnya terbatas pada 16-bit.

Perkalian 32-Bit

Pada 80386 dan yang lebih baru, perkalian 32-bit dimungkinkan karena prosesor ini memiliki register 32-bit. Sama seperti pada perkalian 8- dan 16-bit, perkalian 32-bit dapat berupa signed ataupun unsigned, dengan menggunakan instruksi IMUL dan MUL.

Dalam perkalian 32-bit, isi dari EAX dikalikan dengan operand yang ditentukan dalam instruksi. Hasilnya (64-bit) disimpan dalam pasangan register EDX:EAX, di mana EAX menyimpan 32-bit paling rendah dari hasil perkalian. Tabel 5–10 menunjukkan beberapa instruksi perkalian 32-bit yang tersedia pada 80386 dan seterusnya.

Perkalian 64-Bit

Hasil perkalian 64-bit pada Pentium 4 muncul dalam pasangan register RDX:RAX sebagai hasil 128-bit. Meskipun perkalian sebesar ini relatif jarang digunakan, Pentium 4 dan Core2 dapat melakukannya, baik pada bilangan bertanda (signed) maupun tak bertanda (unsigned). Tabel 5–11 menunjukkan beberapa contoh instruksi perkalian presisi tinggi ini.







Sistem Pemantauan dan Pengendali Kualitas Udara 

serta Keamanan Kebakaran Otomatis   

pada  Gudang Penyimpanan Bahan Kimia Industri


1. Pendahuluan
[Kembali]

Dalam lingkungan industri, terutama di area seperti gudang penyimpanan bahan kimia, pabrik kimia, atau ruangan yang memiliki risiko kebakaran tinggi, pengendalian kualitas udara dan sistem keamanan menjadi aspek yang sangat krusial. Suhu yang tidak terkontrol, kelembaban yang tinggi, atau keberadaan gas berbahaya dalam konsentrasi tertentu dapat memicu reaksi kimia berbahaya, merusak peralatan, hingga menyebabkan ancaman serius terhadap keselamatan pekerja. Sayangnya, sistem pemantauan dan pengendalian yang masih bersifat manual atau pasif sering kali terlambat dalam merespons perubahan kondisi lingkungan yang cepat dan dinamis.

Untuk menjawab tantangan tersebut, diperlukan sebuah sistem otomatis yang mampu memantau kondisi lingkungan secara real-time serta merespons dengan cepat dan tepat terhadap perubahan parameter kritis. Sistem ini harus dapat mendeteksi suhu, kelembaban, serta keberadaan gas berbahaya, lalu mengendalikan perangkat seperti kipas, ventilasi, dan sistem pendingin secara otomatis. Selain itu, penyampaian informasi kepada operator juga penting, sehingga sistem ini idealnya dilengkapi dengan antarmuka seperti LCD  untuk menampilkan status lingkungan serta memberikan peringatan dini apabila kondisi tidak aman terdeteksi.

Tugas besar ini mengusung judul "Sistem Pemantauan dan Pengendali Kualitas Udara serta Keamanan Kebakaran Otomatis pada Gudang Penyimpanan Bahan Kimia Industri" yang bertujuan merancang dan mengimplementasikan solusi berbasis mikrokontroler untuk menciptakan lingkungan penyimpanan yang aman dan terkendali. Dengan pendekatan otomatisasi ini, diharapkan dapat meningkatkan efektivitas pengawasan lingkungan, memperkecil risiko kecelakaan kerja, serta mendukung sistem keselamatan industri secara menyeluruh.


2. Tujuan [Kembali]
  1. Merancang sistem pemantauan otomatis yang mampu mendeteksi suhu, kelembaban, dan konsentrasi gas berbahaya secara real-time di lingkungan gudang penyimpanan bahan kimia industri.
  2. Mengembangkan sistem pengendali otomatis untuk mengaktifkan kipas, ventilasi, dan sistem pendingin berdasarkan parameter lingkungan yang terdeteksi.
  3. Menyediakan antarmuka informasi visual melalui LCD untuk menampilkan status lingkungan serta memberikan peringatan dini terhadap potensi bahaya kebakaran atau gangguan kualitas udara.
3. Alat dan Bahan [Kembali]

3.1 Alat


· Breadboard

 

· Kabel USB

 

· Kabel Jumper 


    3.2 Bahan

    

· Resistor



 

· Rapberry Pi Pico





· Komponen Input

 

1. dht22



2.  MQ-135






3.   Flame Sensor

  







         

· Komponen Output

1.   Kipas DC  5V



2.   LCD

 

3.  Pompa 5 volt






4.   Relay

 

                        5. Buzzer




4. Dasar Teori [Kembali]

a. PWM (Pulse Width Modulation)

PWM atau kepanjangan Pulse Width Modulation, dalam bahasa Indonesia biasa disebut Modulasi Lebar Pulsa. Pada prinsipnya, PWM adalah salah satu teknik modulasi yang mengubah lebar pulsa (pulse width) dengan nilai frekuensi dan amplitudo (tinggi pulsa) yang tetap. PWM Signal ini digunakan menghasilkan sinyal analog dari perangkat Digital yang salah satu contohnya adalah dari Mikrokontroler.

Pembagian Pin PWM:




 

Setiap Board Arduino memiliki pin PWM dan nilai frekuensi yang berbeda-beda. Karena pada percobaan nanti kita akan menggunakan board arduino nano, maka gunakan salah satu dari pin berikut 3, 5, 6, 9, 10, 11.

PWM pada arduino bekerja pada frekuensi 500Hz, artinya 500 siklus/ketukan dalam satu detik. Untuk setiap siklus, kita bisa memberi nilai dari 0 hingga 255. Ketika kita memberikan angka 0, berarti pada pin tersebut tidak akan pernah bernilai 5 volt (pin selalu bernilai 0 volt). Sedangkan jika kita memberikan nilai 255, maka sepanjang siklus akan bernilai 5 volt (tidak pernah 0 volt). Jika kita memberikan nilai 127 (kita anggap setengah

dari 0 hingga 255, atau 50% dari 255), maka setengah siklus akan bernilai 5 volt, dan setengah siklus lagi akan bernilai 0 volt. Sedangkan jika jika memberikan 25% dari 255 (1/4 * 255 atau 64), maka 1/4 siklus akan bernilai 5 volt, dan 3/4 sisanya akan bernilai 0 volt, dan ini akan terjadi 500 kali dalam 1 detik.

b. ADC (Analog to Digital Converter)

ADC atau Analog to Digital Converter merupakan salah satu perangkat elektronika yang digunakan sebagai penghubung dalam pemrosesan sinyal analog oleh sistem digital. Fungsi utama dari fitur ini adalah mengubah sinyal masukan yang masih dalam bentuk sinyal analog menjadi sinyal digital dengan bentuk kode-kode digital. Ada 2 faktor yang perlu diperhatikan pada proses kerja ADC yaitu kecepatan sampling dan resolusi. Kecepatan sampling menyatakan seberapa sering perangkat mampu mengkonversi sinyal analog ke dalam bentuk sinyal digital dalam selang waktu yang tertentu. Biasa dinyatakan dalam sample per second (SPS). Sementara Resolusi menyatakan tingkat ketelitian yang dimilliki. Pada Arduino, resolusi yang dimiliki adalah 10 bit atau rentang nilai digital antara 0 - 1023. Dan pada Arduino tegangan referensi yang digunakan adalah 5 volt, hal ini berarti ADC pada Arduino mampu menangani sinyal analog dengan tegangan 0 - 5 volt. Pada Arduino, menggunakan pin analog input yang diawali dengan kode A( A0- A5 padaArduino Uno). Fungsi untuk mengambil data sinyal input analog menggunakan analogRead(pin);

 


c. Mikrokontroler

Mikrokontroler adalah suatu chip berupa IC (Integrated Circuit) yang dapat menerima sinyal input, mengolahnya dan memberikan sinyal output sesuai dengan program yang diisikan ke dalamnya. Sinyal input mikrokontroler berasal dari sensor yang merupakan informasi dari lingkungan sedangkan sinyal output ditujukan kepada aktuator yang dapat memberikan efek ke lingkungan. Jadi secara sederhana mikrokontroler dapat diibaratkan sebagai otak dari suatu perangkat/produk yang mempu berinteraksi dengan lingkungan sekitarnya. Mikrokontroler pada dasarnya adalah komputer dalam satu chip, yang di dalamnya terdapat mikroprosesor, memori, jalur Input/Output (I/O) dan perangkat pelengkap lainnya. Kecepatan pengolahan data pada mikrokontroler lebih rendah jika dibandingkan dengan PC. Pada PC kecepatan mikroprosesor yang digunakan saat ini telah mencapai orde GHz, sedangkan kecepatan operasi mikrokontroler pada umumnya berkisar antara 1 – 16 MHz. Begitu juga kapasitas RAM dan ROM pada PC yang bisa mencapai orde Gbyte, dibandingkan dengan mikrokontroler yang hanya berkisar pada orde byte/Kbyte.

Meskipun kecepatan pengolahan data dan kapasitas memori pada mikrokontroler jauh lebih kecil jika dibandingkan dengan komputer personal, namun kemampuan mikrokontroler sudah cukup untuk dapat digunakan pada banyak aplikasi terutama karena ukurannya yang kompak. Mikrokontroler sering digunakan pada sistem yang tidak terlalu kompleks dan tidak memerlukan kemampuan komputasi yang tinggi.

 


d. Komunikasi

Kegunaan dasar dari sistem komunikasi adalah menjalankan pertukaran data antara dua pihak. Pada gambar dibawah ini merupakan suatu model komunikasi yang sederhana yaitu komunikasi dua arah. Pada mikrokontroler ada beberapa komunikasi yaitu:

• UART (Universal Asynchronous Receiver-Transmitter) adalah bagian perangkat keras komputer yang menerjemahkan antara bit-bit paralel data dan bit-bit serial. UART biasanya berupa sirkuit terintegrasi yang digunakan untuk komunikasi serial pada komputer atau port serial perangkat peripheral.





Cara kerja komunikasi UART:

Data dikirimkan secara paralel dari data bus ke UART1. Pada UART1 ditambahkan start bit, parity bit, dan stop bit kemudian dimuat dalam satu paket data. Paket data ditransmisikan secara serial dari Tx UART1 ke Rx UART2. UART2 mengkonversikan data dan menghapus bit tambahan, kemudia di transfer secara parallel ke data bus penerima

• Serial Peripheral Interface (SPI) merupakan salah satu mode komunikasi serial synchrounous kecepatan tinggi yang dimiliki oleh ATmega 328. Komunikasi SPI membutuhkan 3 jalur yaituMOSI, MISO, dan SCK. Melalui komunikasi ini data dapat saling dikirimkan baik antara mikrokontroller maupun antara mikrokontroller dengan peripheral lain di luar mikrokontroler. MOSI: Master Output Slave Input Artinya jika dikonfigurasi sebagai master maka pin MOSI sebagai output tetapi jika dikonfigurasi sebagai slave maka pin MOSI sebagai input. MISO: Master Input Slave Output Artinya jika dikonfigurasi sebagai master maka pin MISO sebagai input tetapi jika dikonfigurasi sebagai slave maka pin MISO sebagai output. SCLK: Clock Jika dikonfigurasi sebagai master maka pin CLK berlaku sebagai output tetapi jika

 

dikonfigurasi sebagai slave maka pin CLK berlaku sebagai input. SS/CS: Slave Select/ Chip Select adalah jalur master memilih slave mana yang akan dikirimkan data.


Sinyal clock dialirkan dari master ke slave yang berfungsi untuk sinkronisasi. Master dapat memilih slave mana yang akan dikirimkan data melalui slave select, kemudian data dikirimkan dari master ke slave melalui MOSI. Jika master butuh respon data maka slave akan mentransfer data ke master melalui MISO.

 

• Inter Integrated Circuit atau sering disebut I2C adalah standar komunikasi serial dua arahmenggunakan dua saluran yang didisain khusus untuk mengirim maupun menerima data. Sistem I2C terdiri dari saluran SCL (Serial Clock) dan SDA (Serial Data) yang membawa informasi data antara I2C dengan pengontrolnya.

Pada I2C, data ditransfer dalam bentuk message yang terdiri dari kondisi start, Address Frame, R/W bit, ACK/NACK bit, Data Frame 1, Data Frame 2, dan kondisi Stop. Kondisi start dimana saat pada SDA beralih dari logika high ke low sebelum SCL.Kondisi stop dimana saat pada SDA beralih dari logika low ke high sebelum SCL. R/W bit berfungsi untuk menentukan apakah master mengirim data ke slave atau meminta data dari slave. (logika 0 = mengirim data ke slave, logika 1 = meminta data dari slave) ACK/NACK bit berfungsi sebagai pemberi kabar jika data frame ataupun address frame telahditerima receiver.

 

e. Resistor

 



 

Simbol :



Resistor adalah komponen Elektronika Pasif yang memiliki nilai resistansi atau hambatan tertentu yang berfungsi untuk membatasi dan mengatur arus listrik dalam suatu rangkaian Elektronika (V=I R).

Jenis Resistor yang digunakan disini adalah Fixed Resistor, dimana merupakan resistor dengan nilai tetap terdiri dari film tipis karbon yang diendapkan subtrat isolator kemudian dipotong berbentuk spiral. Keuntungan jenis fixed resistor ini dapat menghasilkan resistor dengan toleransi yang lebih rendah.

Cara menghitung nilai resistor:

Tabel warna



Contoh :

Gelang ke 1 : Coklat = 1

Gelang ke 2 : Hitam = 0

Gelang ke 3 : Hijau   = 5 nol dibelakang angka gelang ke-2; atau kalikan 105

Gelang ke 4 : Perak  = Toleransi 10%

Maka nilai resistor tersebut adalah 10 * 105 = 1.000.000 Ohm atau 1 MOhm dengan toleransi 10%.



 

 


    f. Raspberry Pi Pico

 

Raspberry Pi adalah sebuah komputer mini berukuran kecil yang dikembangkan oleh Raspberry Pi Foundation dengan tujuan utama untuk mendukung pembelajaran komputer dan pemrograman. Meskipun ukurannya hanya sebesar kartu kredit, Raspberry Pi memiliki kemampuan yang cukup untuk menjalankan sistem operasi ringan seperti Raspberry Pi OS dan dapat digunakan untuk berbagai proyek seperti otomasi rumah (smart home), sistem monitoring, robotika, hingga Internet of Things (IoT). Perangkat ini dilengkapi dengan berbagai komponen penting seperti prosesor ARM, RAM, slot microSD untuk penyimpanan, serta antarmuka koneksi seperti USB, HDMI, dan GPIO (General Purpose Input/Output) yang memungkinkan Raspberry Pi terhubung dengan berbagai sensor dan aktuator.

Adapun spesifikasi dari Rapsberry Pi Pico ini adalah sebagai berikut:



Gambar Raspberry Pi Pico

 Spesifikasi Raspberry Pi Pico














 

 

Raspberry Pi Pico sudah dilengkapi dengan rangkaian regulator daya didalamnya, sehingga dapat dicatu dengan sumber daya dengan tegangan yang bervariasi mulai dari 1.8 V hingga 5.5 V. Sehingga dua baterai ukuran AA yang disusun seri, sudah cukup untuk menjalankan board ini. Raspberry Pi Pico memiliki fitur dan fungsionalitas yang kuat dan lebih banyak. Dilihat dari segi programming atau SDK, Raspberry Pi Pico cukup mudah apabila menggunakan bahasa MycroPython untuk setupnya dan untuk contoh program sudah terdapat dokumentasi pada website resmi Raspberry Pi. Sedangkan untuk setup SDK C/C++ Pico masih sulit, karena belum ada IDE dedicated. Selain itu, Raspberry Pi juga tidak memiliki internal Bluethooth dan WiFi yang sangat dibutuhkan untuk project-project Internet of Things.


  g. Flame Sensor


 

             

Sensor api adalah perangkat yang dirancang untuk mendeteksi keberadaan nyala api, umumnya digunakan dalam aplikasi di mana pemantauan dan kontrol nyala api penting untuk keamanan dan operasional. Prinsip kerja umumnya berbasis deteksi sinar inframerah atau ultraviolet yang dihasilkan oleh api. Ketika nyala api hadir, sensor dapat mengidentifikasi radiasi khusus ini, dan sinyal keluarannya dapat digunakan untuk mengaktifkan alarm, mematikan sistem, atau mengendalikan langkah-langkah keselamatan lainnya. Sensor ini penting dalam berbagai aplikasi, termasuk pada sistem pembakaran industri, peralatan pemanas, dan perangkat gas, untuk memastikan kestabilan proses pembakaran dan keamanan.
Pin pada flame sensor :

  1. VCC (Voltage Common Collector) atau VCC: Ini adalah pin daya yang digunakan untuk menyediakan tegangan kerja untuk sensor. Biasanya terhubung ke sumber daya positif.
  2. GND (Ground):

    Pin tanah, yang terhubung ke sumber daya negatif atau ground, untuk menciptakan sirkuit lengkap.
  3. OUT (Output):

    Pin output menghasilkan sinyal yang menunjukkan apakah sensor mendeteksi keberadaan nyala api atau tidak. Sinyal ini dapat digunakan sebagai input untuk sistem kontrol atau mikrokontroler yang mengatur respons sistem terhadap deteksi api.
  4. NC (No Connection):

    Beberapa sensor mungkin memiliki pin yang tidak terhubung untuk meningkatkan fleksibilitas desain atau memiliki opsi tambahan di masa mendatang.

Prinsip kerja

Flame sensor bekerja berdasarkan prinsip deteksi radiasi inframerah atau ultraviolet yang dihasilkan oleh nyala api. Sensor ini dilengkapi dengan fotodetektor sensitif terhadap panjang gelombang khusus yang dihasilkan oleh api. Ketika nyala api hadir, sensor mendeteksi radiasi ini dan menghasilkan sinyal keluaran. Sinyal tersebut kemudian dapat digunakan untuk mengontrol sistem, seperti mematikan peralatan jika nyala api tiba-tiba padam, yang secara signifikan berkontribusi pada keamanan dan stabilitas operasional di berbagai aplikasi, termasuk sistem pembakaran industri, peralatan pemanas, dan perangkat gas.

Grafik respon sensor


   

 

    h. MQ 135



Sensor MQ-135 adalah sensor gas yang mendeteksi berbagai gas berbahaya seperti amonia, karbon monoksida, metana, propana, dan asap rokok. Prinsip kerjanya berdasarkan perubahan resistansi listrik dalam respons terhadap konsentrasi gas tertentu. Ketika gas yang diidentifikasi hadir dalam lingkungan, sensor ini mengalami perubahan resistansi yang dapat diukur. Sensor MQ-135 biasanya digunakan dalam aplikasi keamanan dan pengukuran kualitas udara di dalam ruangan, dan keluaranannya dapat diinterpretasikan untuk memberikan informasi tentang tingkat kebersihan udara serta potensi paparan terhadap gas berbahaya. Pin pada MQ 135


  1. VCC (Voltage Common Collector): Ini adalah pin daya yang digunakan untuk menyediakan tegangan kerja untuk sensor. Biasanya terhubung ke sumber daya positif.
  2. GND (Ground): Pin tanah, yang terhubung ke sumber daya negatif atau ground, untuk menciptakan sirkuit lengkap
  3. OUT (Output): Pin output menghasilkan sinyal analog atau digital yang berkaitan dengan konsentrasi gas yang terdeteksi. Sinyal ini dapat dihubungkan ke mikrokontroler atau sistem pemantauan untuk analisis lebih lanjut atau tindakan respons.
  4. A0 (Analog Output): Beberapa versi sensor MQ-135 memiliki pin tambahan untuk output analog, yang memberikan informasi lebih rinci tentang tingkat konsentrasi gas.
  5. D0 (Digital Output): Jika sensor mendukung output digital, pin ini menghasilkan sinyal logika yang menunjukkan apakah konsentrasi gas telah melebihi ambang batas tertentu.
Prinsip Kerja
Sensor gas MQ-135 bekerja berdasarkan perubahan resistansi gas dalam respons terhadap gas tertentu yang terkandung dalam lingkungan. Sensor ini menggunakan lapisan film logam oksida semikonduktor, seperti SnO2 (timah dioksida), yang memiliki resistansi listrik yang bervariasi tergantung pada jenis dan konsentrasi gas yang bersentuhan dengannya. Ketika sensor terpapar gas tertentu, seperti amonia, karbon monoksida, metana, atau propana, reaksi kimia dengan lapisan semikonduktor menyebabkan perubahan resistansi. Variasi ini kemudian diukur dan diinterpretasikan sebagai sinyal output, yang dapat berupa sinyal analog atau digital. Dengan memonitor perubahan resistansi, sensor MQ-135 dapat memberikan informasi tentang tingkat konsentrasi gas dalam lingkungan, memungkinkan pengguna untuk mendeteksi dan mengukur adanya gas berbahaya.

Grafik Respon sensor

                                        




i. DHT22


 

Sensor DHT22 adalah sensor yang berfungsi untuk mengukur suhu dan kelembaban udara sekaligus, menggunakan termistor tipe NTC (Negative Temperature Coefficient) untuk mengukur suhu, dan sebuah sensor kelembapan resistif untuk mengukur kadar air di udara. Sensor ini juga memiliki chip yang melakukan konversi analog ke digital dan mengeluarkan output dalam format single-wire bi-directional (kabel tunggal dua arah).
1. Spesifikasi dari sensor DHT22:
2. Tegangan operasi: 3.3V hingga 6V
3. Arus: 1.5mA (mengukur) 60uA (siaga)
4. Keluaran: data serial
5. Kisaran suhu: -40°C hingga 80°C
6. Kisaran kelembaban: 0% hingga 100%
7. Resolusi: suhu dan kelembaban keduanya 16-bit
8. Akurasi: ±0.5°C dan ±2%

Grafik Respon








 

    j. LCD

 


Liquid Crystal Display (LCD) adalah sebuah peralatan elektronik yang berfungsi untuk menampilkan output sebuah sistem dengan cara membentuk suatu citra atau gambaran pada sebuah layar. Secara garis besar komponen penyusun LCD terdiri dari kristal cair (liquid crystal) yang diapit oleh 2 buah elektroda transparan dan 2 buah filter polarisasi (polarizing filter).

 

Gambar Penampang komponen penyusun LCD

Keterangan:

1.              Film dengan polarizing filter vertical untuk memolarisasi cahaya yang masuk

2.              Glass substrate yang berisi kolom-kolom elektroda Indium tin oxide (ITO)

3.              Twisted nematic liquid crystal (kristal cair dengan susunan terpilin)

4.              Glass substrate yang berisi baris-baris elektroda Indium tin oxide (ITO)

5.              Film dengan polarizing filter horizontal untuk memolarisasi cahaya yang masuk

6.              Reflektor cahaya untuk memantulkan cahaya yang masuk LCD kembali ke mata pengamat

 

Sebuah citra dibentuk dengan mengombinasikan kondisi nyala dan mati dari pixel-pixel yang menyusun layar sebuah LCD. Pada umumnya LCD yang dijual di pasaran sudah memiliki integrated circuit tersendiri sehingga para pemakai dapat mengontrol tampilan LCD dengan mudah dengan menggunakan mikrokontroler untuk mengirimkan data melalui pin-pin input yang sudah tersedia.

 

 

Kaki-kaki yang terdapat pada LCD 

  

   

     k. Buzzer

 





Buzzer adalah sebuah komponen elektronika yang dapat menghasilkan getaran suara berupa gelombang bunyi. Buzzer akan menghasilkan getaran suara ketika diberikan sejumlah tegangan listrik dengan taraf tertentu sesuai dengan spesifikasi bentuk dan ukuran buzzer itu sendiri. Pada umumnya, buzzer ini sering digunakan sebagai alarm karena penggunaannya yang cukup mudah yaitu dengan memberikan tegangan input maka buzzer akan menghasilkan getaran suara berupa gelombang bunyi yang dapat didengar.

Spesifikasi :

        Nilai tegangan : 6V DC 

        Tegangan pengoperasian : 4 hingga 8V DC

        Arus : ≤30mA

        Keluaran suara pada 10cm : ≥85dB

        Frekuensi resonansi : 2300 ±300Hz

        Nada : Berkelanjutan

        Suhu operasional : -25°C hingga +80°C

        Suhu penyimpanan : -30°C hingga +85°C

        Berat : 2g 

 

l. Pompa DC 5V

  
 
 
 

Motor pump / pompa air adalah alat untuk menggerakan air dari tempat bertekanan rendah ke tempat bertekanan yang lebih tinggi. Pada dasarnya motor pump sama dengan motor DC pada umumnya, hanya saja sudah di-packing sedemikian rupa sehingga dapat digunakan di dalam air. 

Spesifikasi :

  • Panjang kabel USB: 1 Meter
  • Jenis Pompa: Submersible DC
  • Tegangan Kerja: 3 - 5V
  • Batas Tegangan: 2.5 - 6V DC
  • Konsumsi Arus: 120 - 330 mA
  • Konsumsi Daya: 0.4 - 1.5W
  • Kapasitas Pompa: 80 - 120L/H
  • Dimensi Luar: 7.5mm / 0.3"
  • Dimensi Dalam: 4.7mm / 0.18"
  • Diameter Pompa: Kurang lebih 24 mm / 0.95"
  • Panjang Pompa: Kurang lebih 45 mm / 1.8"
  • Tinggi Pompa: Kurang lebih 33 mm / 1.30"
  • Material: Engineering plastic
  • Aktuator: Brushless DC
  • Masa Kerja: 500 jam 

 

m. Relay 5V

 

Relay adalah komponen elektronik berupa saklar elektronik yang digerakkan oleh arus listrik. Secara prinsip, relay merupakan tuas saklar dengan lilitan kawat pada batang besi (solenoid) di dekatnya, ketika solenoid dialiri arus listrik, tuas akan tertarik karena adanya gaya magnet yang terjadi pada solenoid sehingga kontak saklar akan menutup. Pada saat arus dihentikan, gaya magnet akan hilang, tuas akan kembali keposisi semula dan kontak saklar kembali terbuka. Relay biasanya digunakan untuk menggerakkan arus/tegangan yang besar (misalnya peralatan listrik 4 A/AC 220V) dengan memakai arus/tegangan yang kecil (misalnya 0.1 A/12 volt DC).

Relay adalah komponen listrik yang bekerja berdasarkan prinsip induksi medan elektromagnetis. Jika sebuah penghantar sialiri oleh arus listrik, maka disekitar penghantar tersebut timbul medan magnet. Medan magnet yang dihasilkan oleh arus listrik tersebut selanjutnya diinduksikan ke logam ferromagnetis. Penemu relay pertama kali adalah Joseph Henry pada tahun 1835 (Elangsakti,2013)

 
 
5. Percobaan [Kembali]

    a. Prosedur[Kembali]

  • Sediakan alat dan bahan yang diperlukan untuk merangkai project demo
  • Rangkaian alat dan bahan seperti gambar rangkaian di bawah
  • Hubungkan sumber semua alat bahan ke salah satu sumber arduino dan ground semua bahan ke ground salah satu arduino 
  • Jalankan simulasi rangkaian 
  • Jika rangkaian berjalan sesuai dengan kondisi yang diinginkan, maka lanjutkan dengan membuat protype dari project demo 
  • Pahami datasheet masing masing komponen dengan mempertimbangkan tegangan yang digunakan, arus yang diperlukan, terutama spesifikasi masing masing komponen.
  • Rangkai semua alat dan bahan sesuai dengan gambar yang telah dilampirkan. 
  • Pasang dan hubungkan semua alat dan bahan sehingga membentuk rangkaian jadi.

    b. Hardware[Kembali]




    c. Rangkaian Simulasi dan Prinsip Kerja[Kembali] 

        Rangkaian Simulasi Wokwi :

        


        
        Prinsip Kerja Rangkaian :

Raspberry Pi Pico 1 (sebagai Master) secara terus-menerus membaca data dari sensor suhu (DHT22), sensor gas (MQ-135), dan flame sensor. Jika suhu atau konsentrasi gas melebihi ambang batas aman, sistem secara otomatis mengaktifkan kipas ventilasi dan modul filter karbon aktif untuk menyaring dan menyejukkan udara dalam gudang. Jika flame sensor mendeteksi api, sistem akan mematikan kipas, membunyikan buzzer sebagai alarm bahaya, dan langsung mengaktifkan pompa atau solenoid valve untuk menyemprotkan air melalui shower pemadam. Semua informasi lingkungan dan status sistem dikirimkan via komunikasi UART ke Raspberry Pi Pico 2, yang bertugas menampilkan informasi tersebut pada LCD . Seluruh sistem dirancang bekerja secara otomatis dan real-time tanpa intervensi manusia, guna menjaga keselamatan dan kualitas udara di gudang bahan kimia industri.

 


    d. Flowchart dan Listing Program[Kembali]

 

a)      RX 

  


b)   TX     











Listing Program :

a) RX 

from machine import Pin, ADC, UART
import time
import dht

# UART0 on TX=GP0, RX=GP1, baudrate=9600
uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))

flame_sensor = Pin(14, Pin.IN)
mq135 = ADC(Pin(26))
dht_sensor = dht.DHT22(Pin(15))

def adc_to_voltage(adc_value):
return (adc_value / 65535) * 3.3

while True:
flame_detected = flame_sensor.value()

gas_adc = mq135.read_u16()
gas_voltage = adc_to_voltage(gas_adc)

try:
dht_sensor.measure()
temperature = dht_sensor.temperature() # °C
humidity = dht_sensor.humidity() # %
except OSError as e:
temperature = None
humidity = None
print("Failed to read DHT22:", e)

if flame_detected == 0:
print("Flame detected!")
else:
print("Cleared")

print("MQ-135 Voltage: {:.2f} V".format(gas_voltage))

if temperature is not None and humidity is not None:
print("Temp: {:.1f} °C, Humidity: {:.1f} %".format(temperature, humidity))
uart.write("T:{:.1f} H:{:.1f}\n".format(temperature, humidity))
else:
pass
print("")

uart.write("G:{:.3f}\n".format(gas_voltage))
uart.write("F:{}\n".format(flame_detected))

time.sleep(1)


b) TX
from machine import UART, Pin
import time
from machine import I2C
from lcd_api import LcdApi
from pico_i2c_lcd import I2cLcd

I2C_ADDR = 0x27
I2C_NUM_ROWS = 4
I2C_NUM_COLS = 20

# UART0: RX = GP1, TX = GP0
uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))

# LED or buzzer output (e.g., GP16)
relay1 = Pin(16, Pin.OUT)
relay2 = Pin(17, Pin.OUT)
buzzer = Pin(15, Pin.OUT)

# For optional display/debug/logging
temperature = None
humidity = None
flame_value = None

print("Running test_main")
i2c = I2C(1, sda=machine.Pin(18), scl=machine.Pin(19), freq=400000)
lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)

relay1.on()
relay2.on()

gas_voltage = 0

while True:
if uart.any():
data = uart.readline()
if data:
line = data.decode().strip()
try:
if line.startswith("T:") and "H:" in line:
# Parse temperature and humidity
parts = line.split()
temperature = float(parts[0].split(":")[1])
humidity = float(parts[1].split(":")[1])
print("🌡 Temp: {:.1f} °C | 💧 Humidity: {:.1f} %".format(temperature, humidity))

# Tampilkan ke LCD
lcd.clear()
lcd.putstr("T:{:.1f}C H:{:.1f}%".format(temperature, humidity))

elif line.startswith("G:"):
gas_voltage = float(line.split(":")[1])
lcd.move_to(0, 1)
lcd.putstr("G:{:.1f}V".format(gas_voltage))

elif line.startswith("F:"):
# Parse flame status
flame_value = int(line.split(":")[1])
else:
print("⚠️ Unknown message")
except Exception as e:
print("⚠️ Error parsing:", line, "|", e)
else:
pass

if flame_value == 0:
print("🔥 Flame DETECTED from sender!")
relay1.off()
buzzer.on()
lcd.move_to(8, 1)
lcd.putstr("Fire!")
else:
print("Cleared")
relay1.on()
buzzer.off()

if temperature is not None and gas_voltage is not None and humidity is not None:
if temperature > 30 or gas_voltage > 0.8 or humidity > 99:
relay2.off()
else:
relay2.on()
time.sleep(0.1)


    e. Video Demo[Kembali] 






    f. Download File[Kembali]

Download HTML klik disini
Download File Rangkaian klik disini
Download Gambar Rangkaian klik disini
Download Video Simulasi klik disini
  •  Download Library  
Download Library Sensor Flame klik disini
  • Download DataSheet 
Download Datasheet Sensor Flame klik disini
Download Datasheet Resistor klik disini
Download Datasheet Motor DC klik disini
Download Datasheet Buzzer klik disini
Download Datasheet Relay klik disini




temukan pada blog ini

ARITHMETIC AND LOGIC INSTRUCTIONS

[KEMBALI KE MENU SEBELUMNYA] DAFTAR ISI 1. pendahuluan 2. Prinsip Kerja 3. Video Percobaan 4. Analisa 5. Video Penjelasan...