Pada Arduino terdapat beberapa mekanisme input di antaranya:
- input digital dengan fungsi digitalRead()
- input analog dengan fungsi analogRead()
- input data serial dengan class Serial, fungsinya di antaranya Serial.read()
- input digital dengan interupsi melalui fungsi attachInterrupt()
Di antara mekanisme input tersebut, yang mudah dipakai adalah digitalRead() dan analogRead(). Pada tulisan ini dibahas contoh sederhana untuk memakai input interupsi.
Deskripsi perangkat keras:
- Board prosesor menggunakan Arduino Nano v.3
- Input dari sebuah switch push button, active low (dihubungkan ke GND)
- Input dari switch dihubungkan ke pin 2
- Jumlah penekanan switch dikirim dengan port serial
- Power supply didapat dari USB
Catatan
- Pada Arduino Nano hanya pin 2 dan pin 3 saja yang dapat dipakai untuk input interupsi. Pada program ini yang dipakai adalah pin 2.
Cara kerja perangkat lunak
- Setiap kali switch ditekan, maka pin 2 akan menjadi low
- Setiap kali pin 2 low, akan muncul interupsi
- Interupsi menyebabkan fungsi
impulse
() dipanggil, yang akan menaikkan nilai variabel counter. - Pada main loop, isi dari variabel counter dikirim setiap 1 detik.
Berikut ini contoh software yang menggunakan interupsi untuk input.
// ide dari http://www.rhelectronics.net/store/radiation-detector-geiger-counter-diy-kit-second-edition.html
unsigned long counts; //variable for GM Tube events
unsigned long previousMillis; //variable for time measurement
void impulse() { // dipanggil setiap ada sinyal FALLING di pin 2
counts++;
}
#define LOG_PERIOD 1000 // cetak tiap detik
void setup() { //setup subprocedure
counts = 0;
Serial.begin(9600);
pinMode(2, INPUT); // tidak perlu sebenarnya, untuk jaga-jaga saja.
digitalWrite(2, HIGH); // mengaktifkan internal pull up resistor
attachInterrupt(digitalPinToInterrupt(2), impulse, FALLING); //define external interrupts
Serial.println("Start counter");
}
void loop() { //main cycle
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > LOG_PERIOD) {
previousMillis = currentMillis;
Serial.println(counts);
counts = 0;
}
}
Pada referensi fungsi attachInterrupt() terdapat contoh program yang menggunakan interupsi, namun di situ belum menggunakan port serial u untuk mengirim data, sehingga hasil penekanan tombol susah diamati.
Berikut ini foto percobaan dengan Arduino Nano dan sebuah switch push button.
Berikut ini contoh data yang dikirim melalui port serial, berisi jumlah penekanan tombol.
Referensi
- Penghitung sinyal Geiger Counter http://www.rhelectronics.net/store/radiation-detector-geiger-counter-diy-kit-second-edition.html
- Referensi fungsi attachInterrupt()