Panggilan fungsi tak sinkron dalam sketsa Arduino

14

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 .

Jacer Omri
sumber
1
Jika Anda bukan pemula C ++, maka Anda bisa melihat di perpustakaan Cosa ( github.com/mikaelpatel/Cosa ). Ini adalah penulisan ulang lengkap dari perpustakaan Arduino untuk membuatnya lebih baik: OOP dan umumnya didorong oleh interupsi. Saya pikir mereka mendukung HTTP, tetapi saya belum memeriksa bagian itu.
jfpoilpret

Jawaban:

11

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.

Penguin Anonim
sumber
3

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;)

Aurast
sumber
TimerOne adalah ide yang buruk karena hanya bekerja dengan arduinos berbasis avr saja. Misalnya Wemos D1 R1 saya tidak berfungsi
Vyachaslav Gerchicov