Membaca 40 Sensor ADC Menggunakan Arduino Uno dengan IC Multiplekser

Kali ini saya akan menulis sebuah tutorial tentang cara membaca banyak sensor menggunakan Arduino. Pada topik ini saya menggunakan Arduino Uno sebagai board mikrokontrolernya. Keterbatasan jumlah pin pada Arduino Uno mengharuskan kita mencari cara agar bisa membaca banyak sensor, tetapi hanya dengan menggunakan sedikit pin.  Berdasarkan dataset Arduino Uno  memiliki jumlah pin Analog (I/O) sebanyak 6 pin yaitu A0 – A5 dengan tingkat resolusi 10 bit. Sedangkan pin input Analog yang paling banyak tersedia pada Arduino Mega sebanyak 15 pin yaitu A0-A14 dengan tingkat resolusi sama.

Baca juga: Membaca 24 Sensor Suhu LM35 dengan 3 Multiplekser Berbasis Atmega 16

Pembacaan sensor dalam jumlah banyak seperti ini sangat mendukung dalam bidang aplikasi IoT (Internet of Things) yang sedang trend saat ini. Dimana dengan menggunakan Arduino sebagai aplikasi dari pembacaan sensor akan jauh lebih murah dan ekonomis serta memiliki standard perusahaan.

Gambar 1. Jumlah pin I/O masing-masing jenis Arduino

Arduino

Secara definisi Arduino adalah pengendali mikro single-board yang bersifat sumber terbuka (open source), diturunkan dari Wiring platform, dirancang untuk memudahkan penggunaan elektronik dalam berbagai bidang. Perangkat kerasnya memiliki prosesor Atmel AVR dan softwarenya memiliki bahasa pemrograman sendiri[2]. Berikut adalah gambar dari board arduino Uno yang menjadi bahasan dalam tulisan ini.

Gambar 2. Papan Arduino Uno R3

Di pasaran ada banyak jenis Arduino yang dapat kita pilih untuk proyek yang akan kita kerjakan baik untuk tujuan hobi ataupun mengerjakan tugas kuliah bahkan untuk tugas akhir. Kelebihan Arduino dibandingkan dengan mikrokontroller lainnya misalnya jenis AVR ATMega 8/16/32/128 adalah sudah siap pakai dan memiliki standar perusahaan. Sedangkan pada AVR ATMega 8/16/32/128 kita harus membuat board dan menambahkan komponen-komponen lainnya agar dapat diprogram sesuai kebutuhan. Pemakaian Arduino pun lebih mudah dibandingkan dengan jenis AVR lainnya. Kemudian software (perangkat lunak) Arduino IDE yang digunakan untuk memprogramnya pun tersedia gratis. Hingga sejauh ini Arduino IDE yang siap di download sudah mencapai versi 1.8.10[3] dan gratis.

Multiplexer

Multiplexer adalah rangkaian logika kombinasional yang dirancang untuk mengalihkan salah satu dari beberapa jalur input ke satu jalur keluaran output[3]. Secara mudahnya adalah dengan input yang banyak kemudian dapat keluar dari satu output keluaran, yang mana jalur input dipilih satu persatu untuk bisa melalui jalur keluaran tanpa mengalami percampuran informasi atau data yang dibawa. Analoginya kira-kira seperti ini agar dapat memahami kinerja dari multiplekser secara mudahnya kita ambil kasus keran air, yang mana pada sebuah keran air ada 10 pipa berbeda yang menjadi input dan pada pipa keluaran hanya ada satu pipa. Lalu secara teknis pipa keluaran tadi akan diinput dari 10 pipa input secara bergantian tanpa bercampur satu sama lain. Jadi, jika pipa input 1 open, maka 9 pipa lainnya akan dimatikan, jika pipa 2 open, maka semua pipa selain pipa 2 akan ditutup, begitu seterusnya secara bergantian.

Biasanya, multiplexer atau disebut juga dengan data selector memiliki jumlah 2n input data dan sejumlah input “kontrol” yang sesuai dengan jumlah input data. Misalnya ada 2n dengan n=3, dan dinotasikan menjadi 23 yaitu 8. Jumlah n adalah sebagai input kontrol dan 8 sebagai input data. Secara lebih jelasnya dapat dilihat pada gamabr 3 dibawah ini:

Gambar 3. Rangkaian Multiplekser 4-to-1 (4 input) mengguanakan gerbang NAND beserta dengan tabel kebenarannya[3].

Jenis IC (Intergrated Circuits, sirkuit terpadu) yang tersedia dipasaran ada banyak untuk multiplekser misalnya IC CD4051 dengan 23 atau 8-to-1, dan IC CD74HC4067 dengan 24 atau 16-to-1. Dan, ada banyak jenis IC lain yang dapat digunakan sebagai IC multiplekser. Kita pun dapat dengan mudah menemukannya dipasar toko elektronika.

Penerapan pada Arduino dengan Menggunakan Simulasi Proteus

Oke, langsung saja kita menuju aplikasi pemrogramannya. Pembuatan skema rangkaian menggunakan software Proteus dan pemrograman menggunakan software Arduino IDE. Berikut skema rangkaian yang saya buat:

Gambar 4. Skema rangkaian MUX 40 input sensor menggunakan Arduino UNO.

Dan, berikut ada sourcode program yang saya buat, programnya sangat sederhana karena memang untuk menjelaskan kinerja dari MUX jadi tidak menggunakan program yang lebih rumit.

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

//Mux control pins
int s0 = 2;
int s1 = 3;
int s2 = 4;

int sensor[40];
int data[40];

void setup(){
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);

lcd.begin(20,4);

//Serial.begin(9600);
}
void loop(){

data_adc();

}

void data_adc()
{

lcd.clear();
lcd.setCursor(3,0);lcd.print(“40 ADC use MUX”);
digitalWrite(s0, LOW);digitalWrite(s1, LOW);digitalWrite(s2, LOW);sensor[0] = analogRead(A0);if(sensor[0]>512){ data[0]=1; }else{ data[0]=0; }lcd.setCursor(0,1);lcd.print(data[0]);
digitalWrite(s0, HIGH);digitalWrite(s1, LOW);digitalWrite(s2, LOW);sensor[1] = analogRead(A0);if(sensor[1]>512){ data[1]=1; }else{ data[1]=0; }lcd.setCursor(1,1);lcd.print(data[1]);
digitalWrite(s0, LOW);digitalWrite(s1, HIGH);digitalWrite(s2, LOW);sensor[2] = analogRead(A0);if(sensor[2]>512){ data[2]=1; }else{ data[2]=0; }lcd.setCursor(2,1);lcd.print(data[2]);
digitalWrite(s0, HIGH);digitalWrite(s1, HIGH);digitalWrite(s2, LOW);sensor[3] = analogRead(A0);if(sensor[3]>512){ data[3]=1; }else{ data[3]=0; }lcd.setCursor(3,1);lcd.print(data[3]);
digitalWrite(s0, LOW);digitalWrite(s1, LOW);digitalWrite(s2, HIGH);sensor[4] = analogRead(A0);if(sensor[4]>512){ data[4]=1; }else{ data[4]=0; }lcd.setCursor(4,1);lcd.print(data[4]);
digitalWrite(s0, HIGH);digitalWrite(s1, LOW);digitalWrite(s2, HIGH);sensor[5] = analogRead(A0);if(sensor[5]>512){ data[5]=1; }else{ data[5]=0; }lcd.setCursor(5,1);lcd.print(data[5]);
digitalWrite(s0, LOW);digitalWrite(s1, HIGH);digitalWrite(s2, HIGH);sensor[6] = analogRead(A0);if(sensor[6]>512){ data[6]=1; }else{ data[6]=0; }lcd.setCursor(6,1);lcd.print(data[6]);
digitalWrite(s0, HIGH);digitalWrite(s1, HIGH);digitalWrite(s2, HIGH);sensor[7] = analogRead(A0);if(sensor[7]>512){ data[7]=1; }else{ data[7]=0; }lcd.setCursor(7,1);lcd.print(data[7]);

Baca juga:

digitalWrite(s0, LOW);digitalWrite(s1, LOW);digitalWrite(s2, LOW);sensor[8] = analogRead(A1);if(sensor[8]>512){ data[8]=1; }else{ data[8]=0; }lcd.setCursor(8,1);lcd.print(data[8]);
digitalWrite(s0, HIGH);digitalWrite(s1, LOW);digitalWrite(s2, LOW);sensor[9] = analogRead(A1);if(sensor[9]>512){ data[9]=1; }else{ data[9]=0; }lcd.setCursor(9,1);lcd.print(data[9]);
digitalWrite(s0, LOW);digitalWrite(s1, HIGH);digitalWrite(s2, LOW);sensor[10] = analogRead(A1);if(sensor[10]>512){ data[10]=1; }else{ data[10]=0; }lcd.setCursor(10,1);lcd.print(data[10]);
digitalWrite(s0, HIGH);digitalWrite(s1, HIGH);digitalWrite(s2, LOW);sensor[11] = analogRead(A1);if(sensor[11]>512){ data[11]=1; }else{ data[11]=0; }lcd.setCursor(11,1);lcd.print(data[11]);
digitalWrite(s0, LOW);digitalWrite(s1, LOW);digitalWrite(s2, HIGH);sensor[12] = analogRead(A1);if(sensor[12]>512){ data[12]=1; }else{ data[12]=0; }lcd.setCursor(12,1);lcd.print(data[12]);
digitalWrite(s0, HIGH);digitalWrite(s1, LOW);digitalWrite(s2, HIGH);sensor[13] = analogRead(A1);if(sensor[13]>512){ data[13]=1; }else{ data[13]=0; }lcd.setCursor(13,1);lcd.print(data[13]);
digitalWrite(s0, LOW);digitalWrite(s1, HIGH);digitalWrite(s2, HIGH);sensor[14] = analogRead(A1);if(sensor[14]>512){ data[14]=1; }else{ data[14]=0; }lcd.setCursor(14,1);lcd.print(data[14]);
digitalWrite(s0, HIGH);digitalWrite(s1, HIGH);digitalWrite(s2, HIGH);sensor[15] = analogRead(A1);if(sensor[15]>512){ data[15]=1; }else{ data[15]=0; }lcd.setCursor(15,1);lcd.print(data[15]);

digitalWrite(s0, LOW);digitalWrite(s1, LOW);digitalWrite(s2, LOW);sensor[16] = analogRead(A2);if(sensor[16]>512){ data[16]=1; }else{ data[16]=0; }lcd.setCursor(16,1);lcd.print(data[16]);
digitalWrite(s0, HIGH);digitalWrite(s1, LOW);digitalWrite(s2, LOW);sensor[17] = analogRead(A2);if(sensor[17]>512){ data[17]=1; }else{ data[17]=0; }lcd.setCursor(17,1);lcd.print(data[17]);
digitalWrite(s0, LOW);digitalWrite(s1, HIGH);digitalWrite(s2, LOW);sensor[18] = analogRead(A2);if(sensor[18]>512){ data[18]=1; }else{ data[18]=0; }lcd.setCursor(18,1);lcd.print(data[18]);
digitalWrite(s0, HIGH);digitalWrite(s1, HIGH);digitalWrite(s2, LOW);sensor[19] = analogRead(A2);if(sensor[19]>512){ data[19]=1; }else{ data[19]=0; }lcd.setCursor(19,1);lcd.print(data[19]);
digitalWrite(s0, LOW);digitalWrite(s1, LOW);digitalWrite(s2, HIGH);sensor[20] = analogRead(A2);if(sensor[20]>512){ data[20]=1; }else{ data[20]=0; }lcd.setCursor(0,2);lcd.print(data[20]);
digitalWrite(s0, HIGH);digitalWrite(s1, LOW);digitalWrite(s2, HIGH);sensor[21] = analogRead(A2);if(sensor[21]>512){ data[21]=1; }else{ data[21]=0; }lcd.setCursor(1,2);lcd.print(data[21]);
digitalWrite(s0, LOW);digitalWrite(s1, HIGH);digitalWrite(s2, HIGH);sensor[22] = analogRead(A2);if(sensor[22]>512){ data[22]=1; }else{ data[22]=0; }lcd.setCursor(2,2);lcd.print(data[22]);
digitalWrite(s0, HIGH);digitalWrite(s1, HIGH);digitalWrite(s2, HIGH);sensor[23] = analogRead(A2);if(sensor[23]>512){ data[23]=1; }else{ data[23]=0; }lcd.setCursor(3,2);lcd.print(data[23]);

digitalWrite(s0, LOW);digitalWrite(s1, LOW);digitalWrite(s2, LOW);sensor[24] = analogRead(A3);if(sensor[24]>512){ data[24]=1; }else{ data[24]=0; }lcd.setCursor(4,2);lcd.print(data[24]);
digitalWrite(s0, HIGH);digitalWrite(s1, LOW);digitalWrite(s2, LOW);sensor[25] = analogRead(A3);if(sensor[25]>512){ data[25]=1; }else{ data[25]=0; }lcd.setCursor(5,2);lcd.print(data[25]);
digitalWrite(s0, LOW);digitalWrite(s1, HIGH);digitalWrite(s2, LOW);sensor[26] = analogRead(A3);if(sensor[26]>512){ data[26]=1; }else{ data[26]=0; }lcd.setCursor(6,2);lcd.print(data[26]);
digitalWrite(s0, HIGH);digitalWrite(s1, HIGH);digitalWrite(s2, LOW);sensor[27] = analogRead(A3);if(sensor[27]>512){ data[27]=1; }else{ data[27]=0; }lcd.setCursor(7,2);lcd.print(data[27]);
digitalWrite(s0, LOW);digitalWrite(s1, LOW);digitalWrite(s2, HIGH);sensor[28] = analogRead(A3);if(sensor[28]>512){ data[28]=1; }else{ data[28]=0; }lcd.setCursor(8,2);lcd.print(data[28]);
digitalWrite(s0, HIGH);digitalWrite(s1, LOW);digitalWrite(s2, HIGH);sensor[29] = analogRead(A3);if(sensor[29]>512){ data[29]=1; }else{ data[29]=0; }lcd.setCursor(9,2);lcd.print(data[29]);
digitalWrite(s0, LOW);digitalWrite(s1, HIGH);digitalWrite(s2, HIGH);sensor[30] = analogRead(A3);if(sensor[30]>512){ data[30]=1; }else{ data[30]=0; }lcd.setCursor(10,2);lcd.print(data[30]);
digitalWrite(s0, HIGH);digitalWrite(s1, HIGH);digitalWrite(s2, HIGH);sensor[31] = analogRead(A3);if(sensor[31]>512){ data[31]=1; }else{ data[31]=0; }lcd.setCursor(11,2);lcd.print(data[31]);

digitalWrite(s0, LOW);digitalWrite(s1, LOW);digitalWrite(s2, LOW);sensor[32] = analogRead(A4);if(sensor[32]>512){ data[32]=1; }else{ data[32]=0; }lcd.setCursor(12,2);lcd.print(data[32]);
digitalWrite(s0, HIGH);digitalWrite(s1, LOW);digitalWrite(s2, LOW);sensor[33] = analogRead(A4);if(sensor[33]>512){ data[33]=1; }else{ data[33]=0; }lcd.setCursor(13,2);lcd.print(data[33]);
digitalWrite(s0, LOW);digitalWrite(s1, HIGH);digitalWrite(s2, LOW);sensor[34] = analogRead(A4);if(sensor[34]>512){ data[34]=1; }else{ data[34]=0; }lcd.setCursor(14,2);lcd.print(data[34]);
digitalWrite(s0, HIGH);digitalWrite(s1, HIGH);digitalWrite(s2, LOW);sensor[35] = analogRead(A4);if(sensor[35]>512){ data[35]=1; }else{ data[35]=0; }lcd.setCursor(15,2);lcd.print(data[35]);
digitalWrite(s0, LOW);digitalWrite(s1, LOW);digitalWrite(s2, HIGH);sensor[36] = analogRead(A4);if(sensor[36]>512){ data[36]=1; }else{ data[36]=0; }lcd.setCursor(16,2);lcd.print(data[36]);
digitalWrite(s0, HIGH);digitalWrite(s1, LOW);digitalWrite(s2, HIGH);sensor[37] = analogRead(A4);if(sensor[37]>512){ data[37]=1; }else{ data[37]=0; }lcd.setCursor(17,2);lcd.print(data[37]);
digitalWrite(s0, LOW);digitalWrite(s1, HIGH);digitalWrite(s2, HIGH);sensor[38] = analogRead(A4);if(sensor[38]>512){ data[38]=1; }else{ data[38]=0; }lcd.setCursor(18,2);lcd.print(data[38]);
digitalWrite(s0, HIGH);digitalWrite(s1, HIGH);digitalWrite(s2, HIGH);sensor[39] = analogRead(A4);if(sensor[39]>512){ data[39]=1; }else{ data[39]=0; }lcd.setCursor(19,2);lcd.print(data[39]);
lcd.setCursor(0,3);lcd.print(“By: Wayan Dadang”);
delay(200);

}

Selesai program, lalu compile untuk melihat apakah ada error atau tidaknya dan kemudian jika tidak ada tinggal upload ke Arduino teman-teman dan jika menggunakan software simulasi proteus tinggal upload ke proteus. Dan, berikut video demonya.

Selesai, dan semoga bermanfaat, jika ada pertanyaan silakan sampaikan di kolom komentar.

Refrensi:

  1. Arduino, analogRead (https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/) diakses pada 16 September 2019
  2. Wikipedia, Arduino (https://id.wikipedia.org/wiki/Arduino) diakses pada 16 September 2019
  3. Electonics Tutorials, The Multiplexer (https://www.electronics-tutorials.ws/combination/comb_2.html) diakses pada 26 Oktober 2019

Wayan Dadang

Lulusan S1 Teknik Elektro Universitas Sriwijaya, menekuni Kecerdasan Buatan, Machine Learning, Deep Learning, Sistem Kontrol, dan Robotika. Mencintai kegiatan membaca Paper Sains, Belajar, Menulis, dan Riset.
Wayan Dadang
Artikel Berhubungan:

Sponsor Warstek.com:

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *