advanced functions

Upload: indraatmaja

Post on 09-Jan-2016

10 views

Category:

Documents


0 download

DESCRIPTION

Advanced functions

TRANSCRIPT

Advanced functionsSejauh ini kita telah membahas tidak hanya struktur dan sintaks bahasa pemrograman pemrograman Arduino berbasis-C, 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 inimillis ()DeskripsiMengembalikan jumlah milidetik sejak papan Arduino mulai menjalankan program saat ini.Jumlah ini akan meluap (kembali ke nol), setelah sekitar 50 hari.ParameterTak satupunPengembalianJumlah 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 ()DeskripsiJeda program untuk jumlah waktu (dalam miliseconds) ditetapkan sebagai parameter.(Ada 1000 milidetik dalam satu detik.)Sintaksisdelay (ms)Parameterms: jumlah milidetik untuk menghentikan sementara(unsigned panjang)Pengembaliantidak adaContohintledPin=13;// LED terhubung ke pin digital 13

kekosongansetup(){pinMode(ledPin,OUTPUT);// set pin digital sebagai output}

kekosonganlingkaran(){digitalWrite(ledPin,TINGGI);// set LED padadelay(1000);// menunggu untuk keduadigitalWrite(ledPin,LOW);// set LED offdelay(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 melihatmillis ()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 ()DeskripsiMengembalikan jumlah mikrodetik sejak papan Arduino mulai menjalankan program saat ini.Jumlah ini akan meluap (kembali ke nol), setelah sekitar 70 menit.Pada 16MHzpapan Arduino (misalnya Duemilanove dan Nano), fungsi ini memiliki resolusi empat mikrodetik (yaitu nilai yang dikembalikan selalu kelipatan empat).Pada 8MHzArduino papan (misalnyaLilyPad),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()DeskripsiFungsi acak menghasilkan nomor pseudo-acak.Sintaksisrandom (max)acak (min, max)Parametermin - batas bawah dari nilai acak, inklusif(opsional)max - batas atas nilai acak, eksklusifPengembaliannomor 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)DeskripsirandomSeed () 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.Parameterpanjang, int - lulus nomor untuk menghasilkan benih.Pengembaliantidak ada pengembalianContoh randNumber panjang;

kekosongan setup () { Serial.begin (9600); randomSeed (analogRead (0)); }

kekosongan lingkaran () { randNumber = random (300); Serial.println (randNumber);

delay (50); }FungsiSegmentasi 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:kekosonganlingkaran{inti=2;intj=3;intk;

k=myMultiplyFunction(i, j);// k sekarang berisi 6}Fungsi kita perludideklarasikandi luar fungsi lainnya, sehingga "myMultiplyFunction ()" bisa pergi baik di atas atau di bawah "loop ()" fungsi.Seluruh sketsa kemudian akan terlihat seperti ini:kekosongansetup() {Serial mulai(9600).;}

kekosonganlingkaran() {inti=2;intj=3;intk;

k=myMultiplyFunction(i, j);// k sekarang berisi 6Serial println(k).;delay(500);}

intmyMultiplyFunction(intx,inty) {inthasil;Hasil=x* y;Hasilkembali;}Contoh lainFungsi 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.intReadSens_and_Condition() {inti;intsval=0;

untuk(i=0;i