Proses manufaktur
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
|
Sementara mencuci tangan selalu menjadi senjata penting dalam pencegahan penyakit dan kesehatan secara keseluruhan, itu telah mengambil keunggulan baru sebagai tindakan pencegahan untuk mengekang penyebaran pandemi COVID-19.
Pedoman CDC untuk mencuci tangan yang baik menyatakan bahwa seseorang harus menggosok tangan secara ideal selama 20 detik. https://www.cdc.gov/handwashing/when-how-handwashing.html
** Barang tambahan ** Ini dia beberapa ilmu dibalik cuci tangan jika kamu tertarik! - https://www.cdc.gov/handwashing/show-me-the-science-handwashing.html
Dalam reduks timer cuci tangan ini, timer cuci tangan musik kami diaktifkan dengan melambaikan tangan di depan sensor ultrasonik, dan menampilkan hitungan mundur pada layar 7 segmen. Untuk membuatnya lebih menarik, ia juga memainkan pilihan jingle 20 detik yang berputar dari daftar jingle yang telah diprogram. Anda dapat menambahkan musik Anda sendiri dengan mudah dengan menyalin notasi lembaran musik apa pun yang Anda miliki!
Berikut adalah tampilan Musik Tanpa Sentuhan Pengatur Waktu Cuci Tangan beraksi, menunjukkan semua 4 jingle yang saya program di
Wah, tanganku super-duper bersih pada akhirnya! 😊
** Barang tambahan ** Sekarang, kita semua tahu bahwa menyanyikan "Happy Birthday to You", dua kali, membutuhkan waktu sekitar 20 detik, dan itu telah menjadi standar de facto untuk waktu mencuci tangan, bahkan dinyanyikan oleh Perdana Menteri Kanada Justin Trudeau! Dr. Theresa Tam, Kepala Petugas Kesehatan Masyarakat Kanada, memiliki favoritnya sendiri seperti We Will We Will Wash You ! 😊Tonton wawancara menarik berikut ini oleh kontributor CBC Kids News, Arjun Ram.
Saya menampilkan kedua lagu di Pengatur Waktu Cuci Tangan Musik Tanpa Sentuh , ditambah beberapa lagi! 😊
Langkah 1 - Skema
Proyek ini menggunakan Arduino Uno, 7-Segment LED Backpack (I2C), Sensor Ultrasonik HC-SR04 dan Piezo Buzzer. Lihat skema di bawah ini.
Langkah 2 - Merencanakan dan Menyiapkan
Di luar skema dan pemrograman, saya juga ingin memikirkan "produk jadi" dan bagaimana membuatnya dapat digunakan - oleh karena itu memasukkannya ke dalam selungkup dan merencanakannya.
Saya menggunakan ProtoStax Enclosures - mereka dapat ditumpuk, dan dilengkapi dengan dukungan untuk Arduino, Raspberry Pi, dan Breadboard. Karena saya menggunakan Arduino dengan sirkuit Breadboard, saya memilih ProtoStax Enclosure untuk Arduino dan ProtoStax Enclosure untuk Breadboard/Custom Board. Saya juga ingin agar sensor Ultrasonik dapat diakses dari luar dan oleh karena itu dipasang pada enklosur - saya menggunakan ProtoStax Kit untuk Sensor Ultrasonik HC-SR04.
Saya mulai dengan menumpuk platform dasar Arduino dan Breadboard secara horizontal menggunakan konektor susun horizontal untuk memfasilitasi pembuatan prototipe:
Setelah saya memiliki platform prototyping saya, saya bisa mulai mengisi komponen sesuai skema. Saya memasang Sensor Ultrasonik HC-SR04 ke dinding samping dari ProtoStax Kit untuk Sensor Ultrasonik HC-SR04 agar dapat diakses setelah enklosur disatukan setelah prototipe selesai. Dinding samping dengan sensor masuk ke slot platform dasar seperti yang ditunjukkan:
Langkah 3 - Pemrograman dan Pengujian
Sekarang setelah saya memiliki platform prototyping yang berfungsi, saya dapat mengembangkan kode untuk itu. Saya akan mempelajari lebih lanjut fungsionalitas dan tata letak kode di bagian terpisah di bawah ini. Berikut adalah video pengujiannya. Sungguh gila bahwa iPhone 11 yang saya gunakan untuk merekam video benar-benar mengambil ping sonar yang berbeda dari sensor ultrasonik, yang dapat didengar dengan sangat jelas di video di bawah ini (meskipun denyut ultrasonik hampir tidak dapat direkam sebaliknya dengan klik yang tidak berbahaya- klik-klik) ! 😊
Setelah semuanya dipastikan berfungsi, saya melanjutkan dan menambahkan dinding samping serta konektor dan bagian atas yang tersisa untuk menyelesaikan enklosur saya:
Video di atas menunjukkan "produk" terakhir yang digunakan! 😊
Memahami Kode
Inisialisasi komponen:
Kami menggunakan kelas Adafruit_7segment dari perpustakaan Ransel LED untuk menginisialisasi dan berkomunikasi dengan tampilan 7-segmen kami.
Adafruit_7segment matrix =Adafruit_7segment();
Kami juga menginisialisasi pin trigonometri dan gema pada HC-SR04 sebagai output dan input masing-masing
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); matrix.begin(0x70);
Di loop utama, inilah yang dilakukan pada level tinggi:
1) Periksa pembacaan jarak sensor ultrasonik untuk melihat apakah Timer Cuci Tangan telah dipicu.
2) Jika ya, catat waktu saat ini, inisialisasi penghitung waktu mundur (saya setel ke 20 selama 20 detik), dan juga pilih jingle musik berikutnya untuk dimainkan. Saya pertama kali menggunakan random() untuk memilih melodi acak, tetapi saya mengubahnya menjadi "round-robin" di atas susunan melodi (berputar kembali ke yang pertama), dan mengatur startMusic ke 1 (untuk mengatur hitung mundur dan pemutaran musik bergerak .
if (jarak <10 &&!startMusic) { startMusic =1; // inisialisasiTimer1(); hitung mundur =20; saat iniWaktu =milis(); melodiNum =(melodiNum+1)%(NUM_MELODIES(melodi)); }
Lihat Ma Tidak ada penundaan()!
Di sini kami melakukan dua hal secara bersamaan - kami ingin memperbarui jam hitung mundur secara berkala yang menunjukkan berapa detik tersisa untuk mencuci tangan. Kami juga ingin memproses jingle dan memainkannya tepat waktu dengan benar.
Kami tidak bisa gunakan delay() oleh karena itu.
Contoh tipikal memainkan musik menggunakan fungsi tone() dari perpustakaan Tone, dan menunggu penundaan yang sesuai sebelum beralih ke not berikutnya untuk dimainkan. Itu tidak akan berhasil, karena kami masih ingin memperbarui jam hitung mundur!
tone() adalah panggilan non-blocking. Ini menggunakan Timer2 untuk mengirim sinyal untuk jangka waktu yang ditentukan, yang berarti untuk sementara, kami bebas melakukan pemrosesan lainnya.
Kami menggunakan milis() dan variabel lokal untuk mengetahui berapa banyak waktu yang telah berlalu, alih-alih menggunakan delay(), dan dapat melanjutkan untuk melakukan pemeriksaan lain dan melakukan operasi lain sementara itu. Kami akan melihat kode yang tepat sedikit lebih jauh ke bawah.
Mentranskripsi Musik dengan Cara Mudah - Catatan Utuh, Catatan Seperempat, dll
Kami ingin memainkan melodi tertentu, dan juga ingin membuatnya mudah untuk mentranskripsikan lebih banyak melodi. Contoh musik Arduino biasanya menyimpan dua larik berbeda, satu untuk not, dan satu larik untuk durasi nada (dalam milidetik).
Untuk menyederhanakan banyak hal, saya telah membuat struct untuk mengaitkan catatan dan durasi yang diberikan. Dan alih-alih menggunakan durasi absolut, saya menggunakan durasi relatif yang telah saya buat #defines untuk
typedef struct Catatan { int frekuensi; durasi mengambang; } Catatan;#define NOTE_SELURUH 1#define NOTE_HALF 0.5f#define NOTE_QUARTER 0.25f#define NOTE_EIGHTH 0.125f#define NOTE_SIXTEENTH 0.0625f#define DOTTED(X) (X * 1.5f)
Mari kita ambil contoh Selamat Ulang Tahun.
Ini dapat ditranskripsikan sebagai berikut, cukup banyak catatan untuk catatan. Jika Anda tidak dapat membaca lembaran musik, cari saja not yang sebenarnya untuk digunakan. Tetapi belajar membaca lembaran musik selalu merupakan keterampilan yang bagus untuk dimiliki, dan Anda tidak harus sangat ahli dalam hal itu - cukup dengan mengetahui apa nadanya akan memungkinkan Anda melakukan hal yang diperlukan untuk mentranspos musik ke Anda Arduino!
// Selamat Ulang TahunCatatan melodi[] ={ {NOTE_G6, DOTTED(NOTE_EIGHTH)}, {NOTE_G6, NOTE_SIXTEENTH}, {NOTE_A6, NOTE_QUARTER}, {NOTE_G6, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER}, {NOTE_B6 , CATATAN_HALF}, {NOTE_G6, DOTTED(NOTE_EIGHTH)}, {NOTE_G6, NOTE_SIXTEENTH}, {NOTE_A6, NOTE_QUARTER}, {NOTE_G6, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTE_C7, {NOTE_HALFH} }, {NOTE_G6, NOTE_SIXTEENTH}, {NOTE_E7, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER}, {NOTE_B6, NOTE_QUARTER}, {NOTE_A6, NOTE_HLF}, {NOTE_F7, {NOTE_F7, DOTTED_F7_ NOTE_SIXTEENTH}, {NOTE_E7, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTE_C7, NOTE_HALF}, };
Catatan (permainan kata-kata yang dimaksudkan!) bahwa saya tidak menggunakan durasi sebenarnya di sini, saya menentukan durasi relatif dari not sebagai not seperempat, not kedelapan, not keenam belas, dll. Saya bahkan memiliki makro DOTTED() untuk mewakili not bertitik (1,5 x durasi nada apa pun yang mendahuluinya).
Melodi itu sendiri terdiri dari larik ini, serta informasi tambahan tentang durasi yang harus diwakili oleh seluruh nada.
typedef struct Melody { Catatan *catatan; int numCatatan; int wholeNoteDurationMs; } Melodi;
Karena array C tidak dapat diukur dengan menggunakan pointer ke array, saya menambahkan numNotes sebagai ukuran array Note. Ini dapat dengan mudah diinisialisasi menggunakan makro MELODY_LENGTH - jadi Anda tidak perlu khawatir tentang berapa banyak nada yang Anda buat di larik Note saat Anda menyalin lagu favorit Anda!
Saya kemudian mendefinisikan array Melody tersebut untuk digunakan dalam program saya.
Melodi melodi[] ={ {melodi, MELODY_LENGTH(melodi), 1250}, {melody3, MELODY_LENGTH(melodi3), 1000}, {melody4, MELODY_LENGTH(melodi4), 1000}};
Dalam pengulangan, saat memulai penghitung waktu mundur dan musik, saya menggunakan informasi nada di atas, durasi relatif, dan durasi sebenarnya dari seluruh nada, untuk mengetahui cara memainkan musik. Di sela-sela memutar musik, saya juga memeriksa dan memperbarui penghitung waktu mundur dan menampilkan nomor pada tampilan 7-segmen.
Karena saya membayangkan bahwa orang ingin menyelesaikan mendengarkan seluruh jingle, saya terus memainkan jingle sampai selesai, bahkan jika 20 detik sudah habis (hitungan Mundur akan berubah menjadi negatif sampai lagu berakhir). Setelah jingle selesai, jingle akan berhenti sampai dipicu lebih lanjut dengan melambaikan tangan Anda di depan sensor ultrasonik sekali lagi. Jika jingle terlalu pendek, maka jingle akan diputar ulang sekali lagi, hingga 20 detik berlalu DAN musik telah selesai diputar! Sederhana.
if (startMusic) { // Pilih melodi yang akan dimainkan Melody mel =melodies[melodyNum]; Catatan *m =mel.catatan; int mSize =mel.numNotes; // speedUp adalah cara mudah untuk mempercepat pemutaran not. Cara terbaik adalah dengan // mengatur seluruhNoteDurationMs dengan tepat. int speedUp =1; tidakNada(TONE_PIN); // Mulai dengan awal yang bersih untuk (int thisNote =0; thisNote
Seluruh kode dapat ditemukan di GitHub dan tautan ke repositori disertakan. Saya akan merekomendasikan mengambil kode dari sana, daripada menyalin dan menempelkan kode dari sini.
Mengambil Proyek Lebih Jauh
Setelah Anda merasa nyaman bermain-main dengan contoh kode dan memahami kodenya, selalu menyenangkan untuk mencoba memperluas pembelajaran Anda dengan melakukan lebih banyak.
Berikut adalah beberapa saran tentang bagaimana Anda dapat memajukan proyek ini:
1) Anda dapat menemukan lagu favorit Anda lalu menyalinnya menggunakan CATATAN dan CATATAN durasi makro seperti yang saya jelaskan di atas. Ingatlah untuk mengomentari satu atau lebih jingle lain yang sudah ditentukan, untuk menjaga penggunaan memori tetap rendah (kecuali jika Anda melanjutkan dan memindahkan array Note dan Melody ke PROGMEM dengan sukses seperti yang dijelaskan di bawah ini! 😊)
2) Melodi menempati ruang di SRAM dan dapat dengan cepat menghabiskan memori yang tersedia. Misalnya, saya menyalin 4 melodi (Selamat Ulang Tahun, Do-Re-Mi, We Will Rock You, dan Jeopardy!). Namun, ini mendorong penggunaan SRAM hingga 96%, tidak cukup untuk berfungsinya pustaka tampilan 7-segmen, dan tidak diperbarui dengan benar! Saya harus mengecualikan salah satu melodi dari array Melody agar semuanya berfungsi dengan baik.
Arduino Uno dilengkapi dengan 2k SRAM, tetapi 32k memori Flash (tempat program berada). Jika Anda dapat memindahkan beberapa variabel global ke memori Flash, Anda tidak hanya dapat mengosongkan SRAM untuk sisa program, tetapi Anda juga memiliki lebih banyak ruang untuk menyimpan lebih banyak lagu! Cobalah untuk memindahkan array Note dan Melody ke Flash dengan mendefinisikannya sebagai PROGMEM. [Catatan:ini adalah upaya lanjutan dan tidak sepele. Anda akan jadi mengurangi yang susunan dari struktur ke PROGEM dan lalu memiliki ke baca yang program ke akses yang data.]
Untuk menghargai perbedaannya, program ini (dengan 3 melodi) menghabiskan 31% penyimpanan program dan 76% memori dinamis pada Uno. Dengan variabel-variabel di atas yang didefinisikan dalam PROGMEM, ia menempati 32% dari ruang program (itu hanya sedikit peningkatan dalam penggunaan memori Flash dengan lebih banyak lagi yang tersedia) dan hanya 22% (turun dari 76%) dari memori dinamis! Itu berarti Anda dapat dengan mudah menambahkan banyak lagu untuk Pengatur Waktu Cuci Tangan Musik Tanpa Sentuh . ini setelah Anda memindahkan sesuatu ke PROGMEM! 😊
Dapatkah Anda memikirkan cara lain untuk memperpanjang proyek ini? Bagikan dengan kami di bawah ini! 😊
Selamat Membuat! 😊
Proses manufaktur
Komponen dan persediaan Arduino UNO × 1 Pengontrol Gerakan Lompatan × 1 LED (generik) × 4 Kabel jumper (generik) × 10 Aplikasi dan layanan online Arduino IDE Tentang proyek ini Aplikasi ini menggunakan LeapMotion dan Arduino Uno
Komponen dan persediaan Arduino UNO × 1 Katoda Umum Difusi RGB × 1 Transceiver IR (Generik) × 1 Suku Cadang Elektronik UTSOURCE × 1 Alat dan mesin yang diperlukan Pita, Dua Sisi Aplikasi dan layanan online Arduino IDE
Komponen dan persediaan Arduino UNO × 1 Sensor Ultrasonik - HC-SR04 (Generik) × 2 Kabel jumper (generik) × 1 Aplikasi dan layanan online Arduino IDE Python IDLE Perpustakaan PySerial Perpustakaan Pyautogui Tentang p
Komponen dan persediaan Arduino UNO × 1 Adafruit LCD Standar - 16x2 Putih di Atas Biru × 1 Sakelar Tombol Tekan SparkFun 12mm × 4 Resistor 10k ohm × 4 Resistor 221 ohm Yah, 220 ohm... × 2 Potensiometer Putaran Tunggal- 100k ohm × 1