Anda di halaman 1dari 15

Advanced functions

Sejauh ini kita telah membahas tidak hanya struktur dan


sintaks bahasa pemrograman pemrograman Arduino berbasisC, tapi kami juga telah memeriksa banyak fungsi dasar Arduino
perpustakaan untuk membaca dan menulis ke digital dan
analog input dan output pin. Dalam bab ini, kita akan
membangun di atas dasar ini untuk mengejar ketinggalan
dengan beberapa topik yang lebih maju fungsi, termasuk
melihat beberapa fungsi yang kami belum memiliki
kesempatan untuk menutupi sejauh ini dalam buku ini
sekitar. Kami juga akan membahas bagaimana menulis fungsi
kita sendiri, termasuk bagaimana fungsi bekerja, serta
bagaimana menggunakan jenis khusus dari fungsi yang disebut
layanan rutin interupsi yang bekerja dengan pin interrupt
hardware Arduino ini

millis ()
Deskripsi
Mengembalikan jumlah milidetik sejak papan Arduino mulai
menjalankan program saat ini. Jumlah ini akan meluap (kembali
ke nol), setelah sekitar 50 hari.
Parameter
Tak satupun
Pengembalian
Jumlah milidetik sejak program dimulai (unsigned panjang)
Contoh
lama unsigned;
kekosongan setup () {
Serial.begin (9600);
}

kekosongan lingkaran () {
Serial.print ("Waktu:");
Waktu = millis ();
// Mencetak waktu sejak program dimulai
Serial.println (waktu);
// Tunggu sebentar agar tidak mengirim sejumlah besar data
delay (1000);
}
Tip:
Perhatikan bahwa parameter untuk millis adalah unsigned
panjang, kesalahan dapat dihasilkan jika seorang programmer
mencoba untuk melakukan matematika dengan tipe data lain
seperti int.

delay ()
Deskripsi
Jeda program untuk jumlah waktu (dalam miliseconds)
ditetapkan sebagai parameter. (Ada 1000 milidetik dalam satu
detik.)
Sintaksis
delay (ms)
Parameter
ms: jumlah milidetik untuk menghentikan sementara (unsigned
panjang)
Pengembalian

tidak ada
Contoh
int ledPin = 13; // LED terhubung ke pin digital 13
kekosongan setup ()
{
pinMode (ledPin, OUTPUT); // set pin digital sebagai output
}
kekosongan lingkaran ()
{
digitalWrite (ledPin, TINGGI); // set LED pada
delay (1000); // menunggu untuk kedua
digitalWrite (ledPin, LOW); // set LED of
delay (1000); // menunggu untuk kedua

Meskipun mudah untuk membuat LED berkedip dengan


delay () fungsi, dan banyak sketsa menggunakan penundaan
singkat untuk tugas-tugas seperti saklar debouncing,
penggunaan delay () dalam sketsa memiliki kelemahan yang
signifikan. Tidak ada bacaan lain dari sensor, perhitungan
matematis, atau pin manipulasi dapat berlangsung selama
fungsi delay, jadi pada dasarnya, ia membawa sebagian besar
kegiatan lain untuk berhenti. Untuk pendekatan alternatif untuk
mengendalikan waktu melihat millis () fungsi dan sketsa
diletakkan di bawah. Programmer lebih luas biasanya
menghindari penggunaan delay () untuk waktu kejadian lebih
dari 10 dunia milidetik kecuali sketsa Arduino sangat
sederhana.

mikro ()

Deskripsi
Mengembalikan jumlah mikrodetik sejak papan Arduino mulai
menjalankan program saat ini. Jumlah ini akan meluap (kembali
ke nol), setelah sekitar 70 menit. Pada 16 MHz papan Arduino
(misalnya Duemilanove dan Nano), fungsi ini memiliki resolusi
empat mikrodetik (yaitu nilai yang dikembalikan selalu
kelipatan empat). Pada 8 MHz Arduino papan
(misalnya LilyPad), fungsi ini memiliki resolusi delapan
mikrodetik.
Catatan: ada 1.000 mikrodetik dalam milidetik dan 1.000.000
mikrodetik dalam detik.

delayMicroseconds () memiliki bagian yang baik pada


peringatan / masalah, tetapi mungkin tidak jelas pada awalnya
apa ini menyiratkan. The delayMicroseconds () fungsi akan
memberikan penundaan seakurat mungkin diperlukan untuk
beberapa jenis aplikasi (misalnya SofwareSerial sedikit
membenturkan) dengan menonaktifkan interupsi selama nya
kode delay inti. Namun, interupsi (misalnya waktu overflow,
serial, lain-lain) dapat melakukan sebelum delayMicroseconds
berfungsi kembali dan waktu yang tepat sehingga
marah. Akibatnya, waktu kode kritis akan perlu untuk menjaga
diri terhadap interupsi meskipun delayMicroseconds
digunakan. Dengan demikian, fungsi tidak memberikan solusi
yang tepat untuk waktu kode kritis dalam dirinya sendiri dan
juga memiliki konsekuensi negatif lainnya seperti berikut:
Dalam LiquidCrystal dibundel dengan Arduino IDE 0016, fungsi
"jelas ()" dan "rumah ()" digunakan delayMicroseconds untuk
berhenti sejenak untuk tahun 2000 mikrodetik. Karena interupsi
dinonaktifkan selama penundaan, ini akan menyebabkan
hilangnya satu timer melimpah interrupt (penundaan lebih dari

1.024 mikrodetik) untuk setiap panggilan ke rumah dan


jelas. Menimbang bahwa perpustakaan LiquidCrystal seperti
tidak perlu mikrodetik tepat waktu selang, melainkan dijamin
minimum penundaan, ini adalah biaya yang tidak perlu
membayar karena kemungkinan untuk marah kode lain.
Jadi mengapa tidak menggunakan delay () maka ketika
penundaan lagi diperlukan (misalnya 2000 mikrodetik)?Masalah
di sini adalah delay yang tergantung pada millis () yang pada
gilirannya tergantung pada timer0 melimpah
interupsi. Penundaan () fungsi dapat kembali segera ketika
menyerukan penundaan 1 milidetik karena overflow interrupt
mungkin hanya 1 mikrodetik pergi. Jadi bagaimana jika kita
meminta dua milidetik menunda kemudian?Setiap meluap
interupsi sebenarnya 1024 mikrodetik terpisah dan sisanya (24
mikrodetik) dicatat oleh millis () fungsi seperti yang pada
kesempatan itu akan bertambah dua kali untuk timer0 meluap
interupsi tunggal. Akibatnya, bahkan penundaan dua milidetik
dapat kembali segera tanpa penundaan apapun selain
overhead fungsi panggilan.
Selanjutnya, jika kita menggunakan perpustakaan Serial untuk
menerima data pada 9600 baud, karakter baru (8 bit + mulai
dan berhenti bit) akan tiba kira-kira setiap milidetik. Setiap
panggilan ke delayMicroseconds dengan penundaan lebih dari
per-karakter waktu dapat mengakibatkan karakter yang hilang
untuk data yang diterima selama penundaan.Pada 57600 baud,
interval per-karakter serendah 174 mikrodetik.

Random fuction
random()
Deskripsi

Fungsi acak menghasilkan nomor pseudo-acak.


Sintaksis
random (max)
acak (min, max)
Parameter
min - batas bawah dari nilai acak, inklusif (opsional)
max - batas atas nilai acak, eksklusif
Pengembalian
nomor acak antara min dan max-1 (panjang)
Catatan:
Jika penting untuk urutan nilai yang dihasilkan oleh random ()
berbeda, pada eksekusi berikutnya sketsa, gunakan
randomSeed () untuk menginisialisasi nomor acak generator
dengan masukan yang cukup acak, seperti analogRead () pada
pin tidak tersambung.
Sebaliknya, kadang-kadang dapat berguna untuk menggunakan
urutan pseudo-acak yang mengulang persis. Hal ini dapat
dicapai dengan memanggil randomSeed () dengan nomor
tetap, sebelum memulai urutan acak.
Contoh
randNumber panjang;
kekosongan setup () {
Serial.begin (9600);

// Jika input analog pin 0 adalah tidak berhubungan, analog


acak
// Suara akan menyebabkan panggilan untuk randomSeed ()
untuk menghasilkan
// Nomor biji yang berbeda setiap kali berjalan sketsa.
// RandomSeed () maka akan mengocok fungsi acak.
randomSeed (analogRead (0));
}
kekosongan lingkaran () {
// Mencetak nomor acak 0-299
randNumber = random (300);
Serial.println (randNumber);
// Mencetak nomor acak 10-19
randNumber = random (10, 20);
Serial.println (randNumber);
delay (50);
}
randomSeed (biji)
Deskripsi
randomSeed () menginisialisasi pseudo-random number
generator, menyebabkan ia mulai sembarang titik dalam
urutan acak. Urutan ini, sementara sangat panjang, dan acak,
selalu sama.
Jika penting untuk urutan nilai yang dihasilkan oleh random ()
berbeda, pada eksekusi berikutnya sketsa, gunakan
randomSeed () untuk menginisialisasi nomor acak generator
dengan masukan yang cukup acak, seperti analogRead () pada
pin tidak tersambung.

Sebaliknya, kadang-kadang dapat berguna untuk menggunakan


urutan pseudo-acak yang mengulang persis. Hal ini dapat
dicapai dengan memanggil randomSeed () dengan nomor
tetap, sebelum memulai urutan acak.
Parameter
panjang, int - lulus nomor untuk menghasilkan benih.
Pengembalian
tidak ada pengembalian
Contoh
randNumber panjang;
kekosongan setup () {
Serial.begin (9600);
randomSeed (analogRead (0));
}
kekosongan lingkaran () {
randNumber = random (300);
Serial.println (randNumber);
delay (50);
}

Fungsi
Segmentasi kode ke fungsi memungkinkan programmer untuk membuat
potongan-potongan modular kode yang melakukan tugas pasti dan kemudian
kembali ke daerah kode dari mana fungsi itu "disebut". Kasus khas untuk
menciptakan fungsi adalah ketika salah satu kebutuhan untuk melakukan
tindakan yang sama beberapa kali dalam sebuah program.
Untuk programmer terbiasa menggunakan BASIC, fungsi dalam Arduino
memberikan (dan memperluas) utilitas menggunakan subrutin (gosub di
BASIC).

Standarisasi fragmen kode ke fungsi memiliki beberapa keunggulan:

Fungsi membantu tinggal programmer


terorganisir. Seringkali ini membantu untuk konsep program.

Fungsi menyusun satu tindakan di satu tempat sehingga


fungsi hanya harus dipikirkan dan debug sekali.

Hal ini juga mengurangi kemungkinan untuk kesalahan


dalam modifikasi, jika kode perlu diubah.

Fungsi membuat seluruh sketsa kecil dan lebih kompak


karena bagian dari kode yang digunakan kembali berkali-kali.

Mereka membuat lebih mudah untuk menggunakan


kembali kode program lain dengan membuatnya lebih modular,
dan sebagai efek samping yang bagus, menggunakan fungsi
juga sering membuat kode lebih mudah dibaca.
Ada dua fungsi yang diperlukan dalam sketsa Arduino, setup () dan loop
(). Fungsi lain harus dibuat di luar kurung dari dua fungsi. Sebagai contoh, kita
akan membuat fungsi sederhana untuk mengalikan dua angka.
Contoh

Untuk "memanggil" fungsi multiply sederhana kami, kami lulus parameter dari
datatype bahwa itu mengharapkan:
kekosongan lingkaran {
int i = 2;

int j = 3;
int k;
k = myMultiplyFunction (i, j); // k sekarang berisi
6
}
Fungsi kita perlu dideklarasikan di luar fungsi lainnya, sehingga
"myMultiplyFunction ()" bisa pergi baik di atas atau di bawah "loop ()" fungsi.
Seluruh sketsa kemudian akan terlihat seperti ini:
kekosongan setup () {
Serial mulai (9600).;
}
kekosongan lingkaran () {
int i = 2;
int j = 3;
int k;
k = myMultiplyFunction (i, j); // k sekarang berisi
6
Serial println (k).;
delay (500);
}
int myMultiplyFunction (int x, int y) {
int hasil;
Hasil = x * y;
Hasil kembali;
}
Contoh lain
Fungsi ini akan membaca sensor lima kali dengan analogRead () dan
menghitung rata-rata lima bacaan. Kemudian skala data ke 8 bit (0-255), dan
membalikkan itu, kembali hasil terbalik.
int ReadSens_and_Condition () {
int i;
int sval = 0;
untuk (i = 0; i <5; i ++) {
sval = sval + analogRead (0); // sensor pada analog

pin 0
}
sval = sval / 5; // rata
sval = sval / 4; // skala 8 bit (0-255)
sval = 255 - sval; // invert keluaran
kembali sval;
}
Untuk memanggil fungsi kami hanya menetapkan ke variabel.
sens int;
sens = ReadSens_and_Condition ();

hardaware interrupts
Dalam pemrograman sistem , interupsi adalah sinyal ke prosesor yang
dipancarkan oleh perangkat keras atau perangkat lunak yang
menunjukkan suatu peristiwa yang membutuhkan perhatian
segera. Interupsi alert prosesor untuk kondisi prioritas tinggi memerlukan
gangguan kode saat prosesor mengeksekusi. Prosesor merespon
dengan menghentikan kegiatan saat ini, tabungan yang negara , dan
melaksanakan fungsi disebut interrupt handler (atau rutin layanan
interupsi, ISR) untuk menangani acara tersebut. Gangguan ini bersifat
sementara, dan, setelah interrupt handler selesai, prosesor resume
kegiatan normal. [1] Ada dua jenis interupsi: interupsi hardware dan
software interupsi.
Interupsi perangkat keras yang digunakan oleh perangkat untuk
berkomunikasi bahwa mereka membutuhkan perhatian dari sistem
operasi . [2] Secara internal, interupsi hardware diimplementasikan
menggunakan sinyal memperingatkan elektronik yang dikirim ke
prosesor dari perangkat eksternal, yang merupakan salah satu bagian
dari komputer itu sendiri , seperti disk controller , atau
eksternal perifer . Misalnya, menekan tombol pada keyboard yang atau
memindahkan tikusmemicu interupsi hardware yang menyebabkan
prosesor untuk membaca keystroke atau mouse posisi. Berbeda dengan

jenis software (dijelaskan di bawah), interupsi hardware


yang asynchronous dan dapat terjadi di tengah-tengah pelaksanaan
instruksi, membutuhkan perawatan tambahan dalam
pemrograman. Tindakan memulai interupsi hardware disebut
sebagaipermintaan interupsi (IRQ).
Sebuah perangkat lunak interupsi disebabkan baik oleh kondisi luar
biasa dalam prosesor itu sendiri, atau khusus instruksidalam set
instruksi yang menyebabkan interupsi ketika dijalankan. Yang pertama
sering disebut perangkap ataupengecualian dan digunakan untuk
kesalahan atau peristiwa yang terjadi selama pelaksanaan program
yang cukup luar biasa bahwa mereka tidak dapat ditangani dalam
program itu sendiri. Sebagai contoh, jika prosesor Unit logika
aritmatikadiperintahkan untuk membagi nomor dengan nol, permintaan
tidak mungkin ini akan menyebabkan membagi-by-nol
pengecualian, mungkin menyebabkan komputer untuk meninggalkan
perhitungan atau menampilkan pesan kesalahan. Instruksi interupsi
perangkat lunak berfungsi mirip dengan panggilan subroutine dan
digunakan untuk berbagai keperluan, seperti untuk meminta layanan
dari tingkat rendah perangkat lunak sistem seperti driver
perangkat . Misalnya, komputer sering menggunakan petunjuk interrupt
software untuk berkomunikasi dengan disk controller untuk meminta
data dibaca atau ditulis ke disk.
Setiap interrupt memiliki interrupt handler sendiri. Jumlah interupsi
hardware dibatasi oleh jumlah permintaan interupsi (IRQ) baris ke
prosesor, tapi mungkin ada ratusan interupsi perangkat lunak yang
berbeda. Interupsi adalah teknik yang biasa digunakan
untuk multitasking komputer , terutama dalam komputasi realtime . Sistem seperti dikatakan mengganggu-driven.

attachInterrupt ()

Deskripsi
Menentukan bernama Interrupt Service Rutin (ISR) untuk
panggilan ketika interupsi terjadi. Menggantikan fungsi
sebelumnya yang melekat menyela. Kebanyakan papan Arduino
memiliki dua interupsi eksternal: angka 0 (pada pin digital 2) dan

1 (pada pin digital 3). Tabel di bawah ini menunjukkan tersedia


pin interrupt pada berbagai papan.
Papan

int.2

int.3

int.4

int.
5

21

20

19

18

int.0

int.1

Uno,
Ethernet

Mega2560

Leonardo

Karena

(Lihat di bawah)

Arduino Karena papan memiliki kemampuan interrupt kuat yang


memungkinkan Anda untuk melampirkan fungsi interrupt pada
semua pin yang tersedia. Anda dapat langsung menentukan
jumlah pin di attachInterrupt ().
Catatan
Di dalam fungsi yang melekat, delay () tidak akan bekerja dan
nilai yang dikembalikan oleh millis () tidak akan kenaikan.Data
serial yang diterima sementara dalam fungsi mungkin akan
hilang. Anda harus menyatakan sebagai volatile variabel yang
memodifikasi dalam fungsi terpasang. Lihat bagian ISRs bawah
untuk informasi lebih lanjut.
Menggunakan Interupsi
Interupsi berguna untuk membuat sesuatu terjadi secara otomatis
dalam program mikrokontroler, dan dapat membantu
memecahkan masalah waktu. Tugas baik untuk menggunakan
interupsi mungkin termasuk membaca rotary encoder, atau
pemantauan input pengguna.

Jika Anda ingin memastikan bahwa program selalu tertangkap


pulsa dari rotary encoder, sehingga tidak pernah melewatkan
pulsa, itu akan membuatnya sangat sulit untuk menulis sebuah
program untuk melakukan hal lain, karena program akan perlu
terus-menerus polling sensor baris untuk encoder, untuk
menangkap pulsa ketika mereka terjadi.Sensor lain memiliki
antarmuka yang sama yang dinamis juga, seperti mencoba
membaca sensor suara yang mencoba untuk menangkap klik,
atau sensor inframerah Slot (foto-interrupter) mencoba untuk
menangkap penurunan koin.Dalam semua situasi ini,
menggunakan interupsi dapat membebaskan mikrokontroler
untuk mendapatkan beberapa pekerjaan lain yang dilakukan
sementara tidak hilang input.
Tentang Interrupt Service Rutinitas
ISRS adalah jenis khusus dari fungsi yang memiliki beberapa
keterbatasan yang unik sebagian besar fungsi lain tidak
memiliki. ISR tidak dapat memiliki parameter, dan mereka tidak
harus kembali apa-apa.
Umumnya, ISR harus sesingkat dan secepat mungkin. Jika sketsa
Anda menggunakan beberapa ISRS, hanya satu dapat berjalan
pada satu waktu, interupsi lainnya akan diabaikan (dimatikan)
sampai satu saat selesai. sebagai delay () dan millis () keduanya
bergantung pada interupsi, mereka tidak akan bekerja sementara
ISR berjalan. delayMicroseconds (), yang tidak bergantung pada
interupsi, akan bekerja seperti yang diharapkan.
Biasanya variabel global yang digunakan untuk melewatkan data
antara ISR dan program utama. Untuk membuat variabel yakin

digunakan dalam ISR diperbarui dengan benar, menyatakan


mereka sebagai

volatile

detachInterrupt ()
Deskripsi
Mematikan interupsi yang diberikan.
Sintaksis
detachInterrupt (interrupt)
detachInterrupt (pin)
Parameter

mengganggu: jumlah interupsi untuk menonaktifkan


(lihat attachInterrupt () untuk lebih jelasnya).

pin: jumlah pin interupsi untuk menonaktifkan

Anda mungkin juga menyukai