Dalam sketsa Arduino, apakah ada cara untuk membuat panggilan fungsi asinkron dalam loop? Seperti mendengarkan permintaan melalui server http dan memprosesnya dengan cara yang tidak menghalangi .
programming
sketch
Jacer Omri
sumber
sumber
Jawaban:
Iya dan tidak. Anda agak tidak jelas tentang apa yang ingin Anda lakukan. Saya telah membuat ini menjadi beberapa bagian yang berbeda (terutama berfokus pada membaca data sensor ... itu berlaku untuk semuanya tetapi itulah konteks yang saya gunakan):
Utas
AFAIK semua Arduino hanya memiliki satu inti (mereka dapat melakukan satu hal sekaligus). Untuk sebagian besar papan Arduino, multithreading perangkat keras tidak didukung. Namun, ada beberapa cara untuk mengimplementasikan perangkat lunak multithreading . Pendekatan oleh AsheeshR tidak akan berfungsi dengan baik untuk fungsi yang membutuhkan waktu lama untuk diselesaikan (yaitu sesuatu di perpustakaan yang membutuhkan waktu, atau penundaan) karena akan macet oleh instruksi tersebut, tetapi akan bekerja dengan baik untuk jangka pendek fungsi seperti
pinMode()
. Pustaka Protothreads terdaftar mungkin lebih baik dalam hal ini, tapi saya tidak begitu tahu.Akan sulit untuk mengatur ini dengan HTTP, terutama karena Anda harus membuatnya
Keterlambatan
Cara umum untuk membuat sketsa untuk berhenti adalah penggunaan penundaan. Ini dapat diselesaikan dengan menggunakan, dalam loop utama, pernyataan if dan
millis()
fungsi yang mengembalikan waktu (bukan waktu jam, melainkan waktu sejak Arduino dimulai). Anda juga bisa melakukan loop di dalam loop untuk polling data sensor.The
millis()
pendekatan tidak akan bekerja dengan baik dengan hal-hal yang menyebabkan seluruh program untuk kios (yaitu lebih keterlambatan atau loop yang lalu jumlah yang nyata waktu). Perhatikan bahwa 100ms IIRC adalah waktu maksimum umum untuk membuat UI tidak tampak lamban.Terganggu
Interupsi adalah cara yang bagus untuk menjaga hal-hal hampir tidak sinkron. Mereka menjalankan sepotong kode pendek (yang Anda tentukan) setiap kali keadaan pin berubah. Itu pecah dari
loop()
, dan kembali ke tempat itu tinggalkan begitu " ISR " telah dijalankan. Saya tidak punya banyak waktu untuk menjelaskan bagaimana melakukan ini, tetapi pencarian Google cepat akan menghasilkan banyak hasil.Sejauh yang Anda contoh, bagian threading akan menjadi yang paling berlaku. Topik ini cukup kabur, jadi Anda harus bereksperimen dengan beberapa hal dan menemukan sesuatu yang berfungsi.
sumber
Saya baru saja memposting beberapa kode untuk penjadwal tugas di taman bermain tempo hari, Anda mungkin ingin mengintip, mungkin Anda dapat menyesuaikannya dengan kebutuhan Anda.
Prosesor Arduino pada dasarnya adalah single-threaded dan tidak dapat multi-tugas. Namun seperti yang telah disebutkan ada beberapa cara untuk menciptakan ilusi multi-tasking. Annonomus Penguin menyerang mereka dengan cukup baik.
Lihat juga TimerOne (Mungkin lebih baik;)
sumber