Saya memiliki masalah, yang pada awalnya (dan baru di Arduino) saya pikir itu adalah aplikasi yang sempurna untuk Arduino. Namun, setelah mencoba dan gagal menerapkannya, saya sendiri ragu!
Cukup - Saya perlu mengontrol banyak LED secara independen, banyak di antaranya akan memiliki pola tersendiri - misalnya "5 detik hidup - mati 5 detik". "flash berkelanjutan" - atau urutan seperti "2 berkedip, jeda, 1 flash". Jelas tanpa kemewahan utas saya menjadi sedikit macet. Lebih baik mendengar jika a) Arduino adalah pilihan terbaik dan b) jika itu - bagaimana saya bisa melakukan ini!
Terima kasih sebelumnya :)
Jawaban:
Menangani beberapa pola pada saat yang bersamaan tentu dimungkinkan dengan platform seperti Arduino, dan ada sejumlah cara untuk melakukannya.
Salah satu metode yang akan saya pertimbangkan adalah fungsi menulis yang secara efektif mewakili setiap pola secara matematis. Anda baru saja melewatkannya total waktu yang telah berlalu dalam program Anda sejauh ini, dan itu akan melakukan tindakan yang sesuai untuk momen spesifik waktu itu. Ini akan segera kembali setelah itu (tidak ada penundaan atau apa pun).
Untuk melakukan itu, pertama-tama Anda harus tahu berapa lama satu siklus pola berlangsung. Anda kemudian dapat menggunakan operator modulo untuk mengetahui seberapa jauh siklus Anda saat ini. Dari sana, yang perlu Anda lakukan adalah memiliki beberapa
if
kondisi untuk menentukan apa yang harus dilakukan pada waktu tertentu.Inilah yang mungkin terlihat untuk pola "5 detik aktif, 5 detik nonaktif" Anda:
Memang, terus-menerus menelepon
digitalWrite()
ketika Anda tidak perlu secara teknis tidak terlalu efisien. Seharusnya tidak menyebabkan bahaya, dan cukup mudah untuk dioptimalkan jika perlu.Untuk menggunakan contoh di atas dalam sketsa, Anda hanya perlu memanggilnya
loop()
, dan meneruskan nomor yang Anda dapatkanmillis()
; misalnya:Pola lain akan lebih kompleks, tetapi mengikuti prinsip yang sama. Anda hanya perlu menggunakan
if
pernyataan yang sesuai untuk mengekspresikan logika Anda.Yang penting untuk diingat adalah bahwa fungsi tersebut mewakili momen tertentu dalam waktu. Seharusnya tidak pernah menghentikan atau menunda program, jika tidak maka pola lainnya tidak akan berjalan.
Sunting: Waktu pada siklus pertama
Seperti jfpoilpret mencatat dalam komentar, siklus pertama akan dimulai pada titik acak. Hal ini karena pertama kali Anda menelepon
millis()
diloop()
, itu tidak akan dimulai dari 0 (perangkat akan sudah telah berjalan untuk waktu yang singkat sebelumloop()
dipanggil). Sangat mudah untuk diselesaikan, jika perlu.Anda akan melakukannya dengan mengimbangi
totalTime
nilai dengan nilai apa pun yang Anda dapatkan pada saat pertama kaliloop()
. Sebagai contoh:sumber
%
pendekatan ini adalah bahwa waktunya tidak akan benar pertama kali, karena itu hanya akan acak pada awalnya.millis
satu kali dalam loop dan meneruskan nilainya sebagai parameter ke setiap fungsi yang dipimpin, untuk memiliki masing-masing fungsi sebagai yang tanpa parameter, dan menjalankan millis di dalam masing-masing. Itu akan memungkinkan setiap fungsi untuk mendapatkan nilai yang lebih tepat, yang mungkin atau mungkin tidak penting tergantung pada berapa banyak waktu yang dibutuhkan masing-masing fungsi dalam loop, dan juga persyaratan ketepatan waktu aplikasi.Arduino adalah pilihan yang bagus untuk tugas ini - mudah untuk memulai. Kuncinya adalah menulis kode yang tidak menghalangi. Anda dapat melihat contoh BlinkWithoutDelay.
Saya membuat saran untuk tugas Anda:
sumber
Saya tahu posting sudah tua, tapi saya memeriksa contoh dengan pendekatan berbasis array dan menurut saya:
akan selalu menghasilkan ukuran yang dialokasikan (jumlah elemen) dari array - dalam kasus ini 10. Jadi waktunya tidak akan restart sampai Anda mencapai "akhir" array, menggunakan elemen yang tidak ditentukan. Untuk LED "0":
Salam Tommy
sumber