Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Monster dalam Kotak

Komponen dan persediaan

Peti/Kotak Kayu
× 1
Arduino UNO
× 1
Adafruit Wave Shield
× 1
Modul Relai 4 Saluran SainSmart
× 1
Motor Wiper Kaca Depan
× 1
Lampu Natal LED Merah (100)
× 1
Mesin Asap
× 1
Amp/Speaker Bertenaga
× 1

Tentang proyek ini

*** DIPERBARUI ke Ver 4 ***

Saya baru-baru ini menulis ulang kode Arduino untuk proyek ini. Berikut ringkasan perubahannya:

  • Loop utama sekarang diimplementasikan sebagai mesin negara
  • Semua waktu sekarang berdasarkan waktu acara vs. evaluasi waktu saat ini

- waktu tidak lagi bergantung pada bingkai

- mengizinkan penghapusan delay() di loop utama

- menghilangkan masalah 'port busy' saat menghubungkan ke Arduino IDE

  • Relay sekarang menggunakan koneksi Biasanya Terbuka daripada Biasanya Tertutup *** Perbarui Koneksi Relai Anda!!! *
  • Menambahkan LED Terdeteksi Gerakan
  • Menambahkan LED Siap Bangun
  • Menambahkan LED yang Dijeda
  • Tombol Pemicu Tindakan Dihapus
  • Menambahkan kemampuan untuk menambahkan waktu ekstra ke Lampu Merah &Asap

- memungkinkan efek ini berjalan sedikit lebih lama daripada penjaga tutup

  • Menambahkan banyak komentar

Anda akan menemukan semua kode terbaru di sini di github

Monster Dalam Kotak

Saya suka alat peraga Halloween dan telah melihat dan membaca tentang beberapa Monster dalam Kotak great yang hebat membangun tahun lalu dan memutuskan bahwa saya harus membangun saya sendiri. Idenya cukup sederhana:buat ilusi bahwa beberapa jenis wadah sedang menahan monster berbahaya yang hampir melarikan diri. Ilusi dapat dibuat dengan kombinasi gerakan, suara, cahaya, asap, dan, tentu saja, kejutan.

Apa yang ada di dalam Kotak!?!?

Anda menginginkan sebuah kotak yang cukup besar sehingga tampaknya mampu menampung sesuatu yang besar dan menakutkan. Itu juga menambah ilusi jika kotak itu tampak tua, usang, dan mungkin hanya cukup kuat untuk menahan monster itu. Pada awalnya saya berbelanja di toko barang bekas dan online untuk sesuatu tetapi tidak pernah sesuatu yang saya suka, jadi saya membangun sendiri. Itu tidak terlalu sulit.

Saya menggunakan 15 piket pagar pinus 6 kaki dari Home Depot untuk membuat kotak yang berukuran sekitar 3 kaki x 2,5 kaki x 2,5 kaki. Saya memotong semua papan memanjang dengan gergaji meja dan merakit kotak menggunakan paku brad pengukur 18 pneumatik. Ini tampaknya bekerja dengan baik, tetapi kemudian saya menyadari bahwa brads tidak cukup kuat untuk menahan kotak bersama-sama karena semua benturan dan pantulan yang akan terjadi. Untuk memperkuat kotak, saya kemudian mengencangkannya dengan sekrup dinding kering 1 inci (dari dalam ke luar agar tidak terlihat).

Setelah dibangun saya menua kayu dengan proses yang menggunakan teh hitam, cuka dan wol baja. Saya kemudian menghiasinya dengan stensil dan label yang saya temukan secara online dan/atau dibuat dan dicetak.

Brainzzzzzz!!!

Prop memiliki 2 status operasional "Tidur" dan "Bangun". Saat tidur, kotak ini relatif tenang dan hanya mengeluarkan suara dengkuran dan geraman ringan. Monster itu terbangun saat trik-or-treater menjegal sensor gerak. Saat monster itu terbangun, monster itu mengaum, menghembuskan asap, memantulkan tutupnya, dan bagian dalam kotak bersinar merah.

Saya menggunakan Arduino Uno bersama dengan WaveShield dan Modul Relay untuk mengatur perilaku prop ini. WaveShield sarat dengan koleksi kecil suara tidur dan menderu. Sensor gerak PIR memberikan input ke Arduino untuk mengalihkan kotak antara mode "tidur" dan "bangun". Selama mode terjaga, Arduino mengaktifkan saluran relai untuk menjalankan motor tutup, lampu merah, generator asap. dan mainkan suara di WaveShield. Salah satu fitur lain yang saya tambahkan adalah Tombol Jeda. Ini memungkinkan saya untuk sementara membungkam monster itu ketika anak-anak kecil datang.

Astaga!

Pengangkat tutup adalah perangkat yang akan dengan cepat menaikkan dan menurunkan tutupnya untuk membuatnya menggedor dan memantul seolah-olah monster itu mencoba melarikan diri. Ada beberapa cara yang dapat dilakukan, yang paling populer adalah aktuator pneumatik dan kamera berputar. Meskipun saya pikir aktuator pneumatik yang dikontrol secara elektronik akan memungkinkan saya untuk membuat gerakan tutup jauh lebih acak, saya memutuskan untuk menggunakan cam berputar karena tampaknya menjadi pilihan yang lebih sederhana dan paling murah.

Saya membeli motor wiper kaca depan mobil bekas dari tempat pembuangan sampah lokal seharga $15. Itu agak lucu. Saya masuk dan meminta motor. Pria di belakang konter bertanya "untuk merek dan model mobil apa" ketika saya berkata, "Saya tidak peduli" kepalanya sedikit miring ke samping dan dia memberi saya sedikit pandangan ke samping. Setelah saya menjelaskan apa yang saya lakukan, dia ingin membangunnya :)

Motor ini, terlepas dari merek/modelnya, berjalan pada 12 volt, berputar pada kecepatan yang wajar dan memiliki torsi yang besar:sempurna! Catatan. Ketika Anda mendapatkannya, pastikan ia memiliki beberapa kabel kabel lama, itu akan memudahkan Anda untuk menyambungkan kabel Anda ke sana. juga pastikan ia memiliki lengan engkol dan tiang offset. Jika tiang motor utama adalah satu-satunya sambungan fisik yang Anda miliki untuk bekerja dengan kamera Anda kemungkinan besar akan tergelincir.

Pasang motor di suatu tempat di dalam kotak Anda. Saya meletakkan milik saya di salah satu dinding samping. Ingat akan ada cam berputar besar yang terhubung dengannya dan itu harus dapat berputar bebas dan bebas dari setiap dan semua item, terutama kabel, yang akan Anda masukkan ke dalam kotak. Ada beberapa tutorial bagus di YouTube tentang bekerja dengan motor ini.

Saya memotong cam berdiameter 12 inci dari sepotong kayu lapis 1/2. pertama saya memotong lingkaran yang sempurna. Saya memasangnya di motor dan menggunakan ini untuk menentukan ketinggian motor yang dibutuhkan di dalam kotak. Saya hanya ingin tutupnya terangkat sekitar 2 inci. Setelah melakukan pemasangan ini, saya menggunakan gergaji jig untuk memotong 'gigi' secara acak ke dalam kamera, mencoba yang terbaik untuk menjaganya pada lebar dan kedalaman yang acak.

Terakhir saya memasang roller ke sisi bawah tutup menggunakan 2 braket L logam, spacer nilon 1 inci, dan baut kereta. Rol diposisikan tepat di atas cam sehingga bergerak di sepanjang gigi cam.

Saya menggunakan rel 12 volt dari catu daya ATX untuk memberi daya pada motor melalui relai yang dikendalikan oleh Arduino. Ya, mendapatkan semuanya untuk berbaris memang membutuhkan sedikit trial and error. Setelah memposisikan ulang roller sekali atau dua kali... oke tiga kali... semuanya berbaris dan tutupnya mulai memantul sesuai rencana!

Nafas Api :Asap dan Cahaya

Saya menggunakan generator asap 400 Watt yang murah untuk efek asap. Di luar kotak ini dikendalikan radio. Untuk mengontrolnya dengan Arduino, saya membuka penerima dan menyolder dua jalur utama ke bantalan tombol pemicu. Ini memberi saya saluran yang saya sambungkan ke saluran relai yang dikendalikan Arduino. Itu adalah peretasan sederhana yang saya pelajari dengan menonton beberapa video YouTube. Saya juga menambahkan selang penyedot debu tua untuk mengarahkan asap keluar sebagai aliran dari tepat di bawah tutupnya. Saya menyukai efek visualnya dan membantu mengurangi kondensasi uap pada barang elektronik di dalam kotak.

Untuk lampu, saya cukup memotong kabel ekstensi tugas ringan dan menyambungkannya melalui saluran relai. Rangkaian 100 lampu LED merah yang terhubung ke ini kemudian dapat dinyalakan dan dimatikan oleh Arduino.

Gunakan Suara Luar Anda

WaveShield memiliki jack headphone 1/8 inci sebagai dan output - serta 2 pin i/o untuk koneksi langsung. Saya menggunakan patch chord 1/8 inci untuk menyambungkan ke amplifier gitar bass 30 Watt yang saya pinjam dari ruang latihan saya. Sejumlah speaker yang diperkuat akan berfungsi - termasuk speaker PC. Tetapi menggunakan sesuatu dengan low end yang solid jelas merupakan nilai tambah.

Rantai Itu

Saya membeli beberapa rantai plastik dari toko Halloween dan 3D mencetak kunci pad. Membungkus ini di atas peti menambah kedalaman dan nuansa ilusi.

Hallowen!!!

Letakkan peti di halaman dan sembunyikan sensor gerak di semak-semak terdekat. Saya menggunakan kabel speaker yang panjang untuk menghubungkan sensor sehingga saya bisa bereksperimen dengan pemosisian sedemikian rupa sehingga monster itu akan bangun ketika seseorang mendekat (sekitar 5 kaki) ke peti.

Saat malam semakin gelap, saya menyadari bahwa semua detail di bagian luar peti menjadi sulit untuk dilihat. Akhirnya saya menyinarinya dengan lampu sorot yang menyala dan sangat senang dengan efeknya.

Saat penipu berjalan di jalan masuk, mereka melihat kotak yang menggeram:beberapa dengan rasa ingin tahu yang lain benar-benar takut akan hal itu. Saat mereka mendekat dan monster itu meraung hidup, mereka akan bangkit, dan memekik beberapa bahkan bertepuk tangan. Itu sukses besar.

Penyempurnaan

Saya lelah mencari cara untuk menyembunyikan Sensor Gerak saya di semak-semak, jadi saya menempelkannya ke perut tikus plastik yang bisa saya posisikan di suatu tempat di sepanjang jalan masuk atau di bawah semak terdekat. Saya juga memasang soket telepon RJ11 di bagian belakang kotak sehingga saya dapat menghubungkan sensor gerak tikus menggunakan kunci telepon sepanjang 50 kaki - yang jauh lebih baik daripada dua untai kabel speaker yang saya gunakan sebelumnya.

Anda akan melihat bahwa saya juga menambahkan sakelar dan beberapa LED indikator ke pelat baru itu. Sakelar JEDA semua fungsi pada kotak tanpa mematikannya. Sakelar pembunuh utama saya adalah soket ekstensi di dalam dan tidak praktis untuk diakses, ditambah dengan ini hanya menggunakan tegangan sinyal (5v) pada sakelar eksternal ini. Sakelar ini sangat bagus untuk menghentikan monster untuk trik-atau-treater yang lebih muda dan orang lain yang meminta mengintip ke dalam pada malam Halloween.

Oh! Saya menggantungkan rantai plastik di atas kotak untuk efek dan kadang-kadang bisa berat. Apalagi jika saya harus masuk ke dalam kotak pada malam hari. Untuk mempermudah ini, saya mengikat ritsleting karabiner pegas hitam ke ujung rantai. Ini memungkinkan saya dengan cepat melepas/mengaitkan ujung ke lubang tali yang saya pasang di sudut bawah kotak. Teknologi tidak terlalu tinggi tetapi sangat membantu.

Masa Depan

Ada beberapa hal yang ingin saya tambahkan di masa depan. Mungkin R/C mengontrol agar saya bisa menjeda atau memicu monster dari jarak jauh. Saya juga akan menambahkan beberapa jenis umpan balik ke pengangkat tutup agar Arduino bisa 'tahu' kapan tutupnya terbuka atau tertutup. Beberapa kali pengangkat berhenti di titik tinggi dalam siklus yang membuat 'nyali' kotak terlihat sampai siklus bangun berikutnya. Terakhir, saya dapat menghubungkan pencahayaan/strobo eksternal ke Arduino agar dapat dikontrol oleh program dan atau fob R/C.

Repositori GitHub

Anda akan menemukan kode dan diagram pengkabelan terbaru Di sini di GitHub

Kode

  • Sketsa Monster Dalam Kotak
  • MonsterSounds.h
  • MonsterSounds.ino
Sketsa Monster Dalam KotakC/C++
/*Pin Perisai Gelombang yang Digunakan:2, 3, 4, 5, 10, 11, 12 &13Pin 13, 12, 11 selalu digunakan oleh kartu SD (ini adalah satu-satunya pin yang memiliki SPI kecepatan tinggi antarmuka). Kemudian ada 5 pin lain yang digunakan untuk berbicara dengan DAC dan kartu SD, tetapi mereka dapat diatur untuk terhubung ke pin arduino apa pun. Namun, secara default, perpustakaan dikonfigurasi untuk menggunakan pin 10 (untuk kartu SD) dan pin 2, 3, 4 dan 5 untuk DAC. Untuk mengubah pin ini memerlukan modifikasi library - pin direferensikan dengan nama pin 'hardware' mereka (yaitu PORTD, dll) bukan dengan pin arduino. Itu berarti pin 6, 7, 8, 9 dan 6 analog di pin (juga dikenal sebagai digital i/o pin 14-20) tersedia.https://learn.adafruit.com/adafruit-wave-shield-audio- shield-for-arduino/faq*/#include "MonsterSounds.h"#define RESERVED_00 0 // Dicadangkan untuk Serial RX#define RESERVED_01 1 // Dicadangkan untuk Serial TX#define RESERVED_02 2 // Dicadangkan untuk Wave Shield#define RESERVED_03 3 // Dicadangkan untuk Wave Shield#define RESERVED_04 4 // Dicadangkan untuk Wave Shield#define RESERVED_05 5 // Dicadangkan untuk Wave Shield#define FOG_MACHINE 6 // Hubungkan Pin Digital pada Arduino ke Modul Relay#define RED_LEDS 7 // Hubungkan Pin Digital pada Arduino ke Modul Relay#define LID_BOUNCER 8 // Hubungkan Pin Digital pada Arduino ke Modul Relay#define RESERVED_09 9 // Hubungkan Pin Digital pada Arduino ke Modul Relay#define RESERVED_10 10 // Dicadangkan untuk Wave Shield#define RESERVED_11 11 // Dicadangkan untuk Wave Shield#define RESERVED_12 12 // Dicadangkan untuk Wave Shield#define RESERVED_13 13 // Dicadangkan untuk Wave Shield#define PIR_SENSOR A 0 // PIR Input#define MOTION_LED A1 // LED:menyala saat gerakan terdeteksi (terlepas dari status jeda/tidur/bangun)#define PAUSED_LED A2 // LED:menyala saat sistem dijeda#define READY_LED A3 // LED:lampu ketika monster dalam keadaan READY_TO_WAKE#define PAUSE_BUTTON A4 // Jeda Input Switch#define DEBUG_BUTTON A5 // Debug Switch Input// Efek Pengaturan Timer - dalam Detik (EDIT INI)#define WAKE_DELAY 30 // Jumlah waktu minimum antara 'bangun' kejadian dalam Detik#define WAKE_DELAY_DEBUG 10 // Timpa WAKE_DELAY saat sakelar DEGUB diaktifkan#define SLEEP_SOUND_DELAY 1 // Jumlah detik untuk menunggu antara upaya untuk menyalakan suara 'tidur' berikutnya#define WAKE_MIN 3 // Jumlah minimum waktu 'bangun' dalam Detik#define WAKE_MAX 5 // Jumlah maksimum waktu 'bangun' dalam Detik#define RED_LIGHT_EXTRA_TIME 1 // Memungkinkan lampu merah menyala sedikit lebih lama dari penjaga tutup, jika diinginkan#define SMOKE_EXTRA_TIME 2 // Memungkinkan asap menyala sedikit lebih panjang dari tutup penjaga, jika diinginkan // Efek Timer Pengaturan - di Milidetik (DO NOT EDIT INI) #define WAKE_DELAY_MILLIS WAKE_DELAY * 1000 # mendefinisikan WAKE_DELAY_DEBUG_MILLIS WAKE_DELAY_DEBUG * 1000 # mendefinisikan SLEEP_SOUND_DELAY_MILLIS SLEEP_SOUND_DELAY * 1000 # define WAKE_MIN_MILLIS WAKE_MIN * 1000 # mendefinisikan WAKE_MAX_MILLIS WAKE_MAX * 1000 # mendefinisikan RED_LIGHT_EXTRA_TIME_MILLIS RED_LIGHT_EXTRA_TIME * 1000 # mendefinisikan SMOKE_EXTRA_TIME_MILLIS SMOKE_EXTRA_TIME * 1000MonsterSounds terdengar;waktu lama tidak bertanda statis SinceLastSnore=0;wake lama tidak bertanda statisAllowedTimer =0;tutup panjang tidak bertanda statisBounceTimer =0;tutup panjang tidak bertanda statisBounceDuration =0;asap panjang tidak bertanda statisTimer =0;asap panjang tidak bertanda statisDurasi panjang =0;statis tidak bertanda tangan redLightTimer =0;static unsigned long redLightDuration =0;enum States { STATE_INITIALIZE, // Hanya saat menjalankan setup() dan pertama kali ke loop() STATE_PAUSED, // Matikan semua suara dan efek STATE_SLEEPING, // Tanpa efek, suara tidur , tidak mengizinkan bangun untuk dipicu STATE_READY_TO_WAKE, // Tidak efek, suara tidur, memungkinkan terjaga untuk dipicu STATE_AWAKE}; // Efek kebakaran dan suara monster terjaga Status status =STATE_INITIALIZE;pengaturan batal() { // menginisialisasi komunikasi serial:Serial.begin(9600); // Atur semua pin Relai pinMode(LID_BOUNCER, OUTPUT); pinMode(RED_LEDS, OUTPUT); pinMode(FOG_MACHINE, OUTPUT); pinMode(PAUSED_LED, OUTPUT); pinMode(MOTION_LED, OUTPUT); pinMode(READY_LED, OUTPUT); // Paksa semua Efek ke OFF stopAllEffects(); pinMode(PIR_SENSOR, INPUT); pinMode(PAUSE_BUTTON, INPUT_PULLUP); pinMode(DEBUG_BUTTON, INPUT_PULLUP); suara.inisialisasi(); // Suara Monster terdengar.playSystemReady(); penundaan (1000); Serial.println(); Serial.print("*** Sistem Siap ***"); Serial.println(); }/* * CATATAN:Semua tombol menggunakan pull-up, jadi LOW berarti tombol TERTEKAN * Perlu diingat pull-up berarti logika sakelar terbalik. * Menjadi TINGGI saat dibuka, dan RENDAH saat ditekan. * * Sensor gerak PIR TIDAK berperilaku seperti ini.*//* * Putaran pemrosesan utama * - Mengatur Mesin Status Monster */void loop() { boolean pauseSwitchClosed =digitalRead(PAUSE_BUTTON) ==LOW; boolean motionDetected =digitalRead(PIR_SENSOR) ==TINGGI; digitalWrite(MOTION_LED, digitalRead(PIR_SENSOR)); switch (status) { kasus STATE_INITIALIZE:if (pauseSwitchClosed) { goToPause(); } else { goToSleep(); } merusak; kasus STATE_PAUSED:if (!pauseSwitchClosed) { goToSleep(); digitalWrite(PAUSED_LED, RENDAH); } else { digitalWrite(LED_PAUSED, TINGGI); } merusak; kasus STATE_SLEEPING:if (pauseSwitchClosed) { goToPause(); } else if ( isAllowedToWake() ) { goToReadyToWake(); } else { prosesTidur(); } merusak; kasus STATE_READY_TO_WAKE:if (pauseSwitchClosed) { goToPause(); digitalWrite(READY_LED, RENDAH); } else if (motionDetected) { goToAwake(); digitalWrite(READY_LED, RENDAH); } else { prosesTidur(); } merusak; kasus STATE_AWAKE:if (pauseSwitchClosed){ ​​goToPause(); } else if ( processAwakeAnimation() ) { goToSleep(); } // processAwakeAnimation() mengembalikan nilai true ketika semua animasi benar-benar putus; default:Serial.println("NEGARA TIDAK DIKETAHUI"); merusak; // Kita seharusnya tidak pernah sampai di sini } }/* * Transisi ke Status Jeda */inline void goToPause() { Serial.println("PAUSED"); status =STATE_PAUSED; stopAllEffects(); sound.stopAll();}/* * Transisi ke Keadaan Tidur */inline void goToSleep() { Serial.println("GOING TO SLEEP"); status =STATE_SLEEPING; wakeAllowedTimer =millis();}/* * Transisi ke Status Siap Bangun * Ini adalah kasus khusus dari status tidur */inline void goToReadyToWake() { Serial.println("READY TO WAKE"); status =STATE_READY_TO_WAKE; }/* * Transisi ke Keadaan Terjaga * - Bangunkan monster dan proses efek &suara */inline void goToAwake() { Serial.println("AWAKE"); status =STATE_AWAKE; wakeMonster();}/* * memproses siklus aktivitas TIDUR * - Jalankan Suara Tidur * - Perbarui pengatur waktu tidur */inline void processSleeping() { if ((millis() - time SinceLastSnore)> SLEEP_SOUND_DELAY_MILLIS) { sound.playSnore( ); time SinceLastSnore =milis(); }}/* * Menentukan apakah monster diizinkan untuk bangun saat ini. * - Periksa sakelar debug, jika ditutup, kami menggunakan Pengatur Waktu yang Diizinkan yang lebih pendek * - Monster harus tidur selama waktu minimum yang telah ditentukan sebelum dapat dibangunkan * - Menyala LED ketika siap untuk dibangunkan */inline boolean isAllowedToWake( ) { boolean isDebug =digitalRead(DEBUG_BUTTON) ==RENDAH; unsigned long requiredDelay =WAKE_DELAY_MILLIS; if ( isDebug ) { diperlukanDelay =WAKE_DELAY_DEBUG_MILLIS; } boolean isAllowed =(millis() - wakeAllowedTimer )> requiredDelay; if (diizinkan ) { digitalWrite(READY_LED, HIGH); } return isAllowed;}/* * Wake Monster * Memulai Animasi Awake * Memainkan Suara Awake * * Panggil ini SEKALI untuk memulai status AWAKE. */void wakeMonster() { int activityDuration =random(WAKE_MIN_MILLIS, WAKE_MAX_MILLIS); // berapa lama monster akan aktif Serial.print(" wake duration:"); Serial.print(Durasi aktivitas); Serial.println("ms"); bounceLid(Durasi aktivitas); flashRedLight(Durasi aktivitas + RED_LIGHT_EXTRA_TIME_MILLIS); aktifkanSmoke(Durasi aktivitas + SMOKE_EXTRA_TIME_MILLIS); sound.playRoar();} /* * Mengatur kemajuan animasi AWAK * Panggil ini SETIAP SIKLUS selama status AWAK. * Mengembalikan TRUE ketika semua animasi selesai */boolean processAwakeAnimation(){ printTimersToLog(); boolean done1 =salah; boolean done2 ​​=salah; boolean done3 =salah; if (milis() - lidBounceTimer> lidBounceDuration) { bounceLid(0); selesai1 =benar; } if (milis() - redLightTimer> redLightDuration ) { flashRedLight(0); selesai2 =benar; } if (millis() - smokeTimer> smokeDuration ) {activateSmoke(0); selesai3 =benar; } return done1 &&done2 ​​&&done3;}/* * Kelola Efek:Bounce tutup kotak * - diration adalah jumlah milidetik yang harus dijalankan oleh efek * - durasi 0 berarti efek harus dihentikan */inline void bounceLid(unsigned durasi panjang){ if (durasi <=0) { energizeRelay(LID_BOUNCER); lidBounceDuration =0; } else { // mulai tutupnya memantul de_energizeRelay(LID_BOUNCER); lidBounceTimer =milis(); lidBounceDuration =durasi; }}/* * Kelola Efek:Lampu Merah Flash * - diration adalah jumlah milidetik yang harus dijalankan efek * - durasi 0 berarti efek harus dihentikan */inline void flashRedLight(unsigned long duration){ if (durasi <=0) { energizeRelay(RED_LEDS); redLightDuration =0; } else { // nyalakan lampu berkedip de_energizeRelay(RED_LEDS); redLightTimer =milis(); redLightDuration =durasi; } }/* * Start/Stop Effect:Activate Smoke * - diration adalah jumlah milidetik yang harus dijalankan oleh efek * - durasi 0 berarti efek harus dihentikan */ inline void activativeSmoke(unsigned long duration) { // ' tekan' tombol asap // durasi harus merupakan jumlah waktu tetap yang dibutuhkan mesin untuk merespon tindakan // setel batas waktu untuk berhenti setelah durasi if (durasi <=0) { energizeRelay(FOG_MACHINE); asapDurasi =0; } else { // nyalakan lampu berkedip de_energizeRelay(FOG_MACHINE); smokeTimer =milis(); asapDurasi =durasi; } }/* * Hentikan semua Efek * - Ini secara efektif mematikan monster */inline void stopAllEffects(){ bounceLid(0); flashRedLight(0); activeSmoke(0);}/* * Mencetak timer Animasi Sedar ke log sekali per detik */inline void printTimersToLog() { static unsigned long timeofLastTimerLog =0; if (milis() - timeofLastTimerLog>=1000) { Serial.print(" tutup:"); Serial.print( (millis()-lidBounceTimer)> lidBounceDuration ? 0 :(lidBounceDuration -(millis()-lidBounceTimer) ) ); Serial.print("lampu:"); Serial.print( (millis()-redLightTimer)> redLightDuration ? 0 :(redLightDuration -(millis()-redLightTimer) ) ); Serial.print("asap:"); Serial.println( (millis()-smokeTimer)> smokeDuration ? 0 :(smokeDuration -(millis()-smokeTimer) ) ); timeofLastTimerLog =milis(); }}/* * Relai Energi * Mengatur terminal Biasanya Terbuka (NO) ke BUKA * Biasanya Tertutup akan menjadi Tertutup */ sebaris void energizeRelay(saluran int) { digitalWrite(saluran, TINGGI); }/* * De-Energize Relay * Mengatur terminal Biasanya Terbuka (NO) ke TUTUP. * Biasanya Tertutup akan menjadi TERBUKA */ sebaris void de_energizeRelay(saluran int) { digitalWrite(saluran, RENDAH); }
MonsterSounds.hC/C++
Header Arduino untuk perpustakaan suara monster
/* CATATAN TENTANG PIN ARDUINO * Pin 13, 12, 11 selalu digunakan oleh kartu SD (ini adalah satu-satunya pin yang memiliki antarmuka SPI berkecepatan tinggi). * Kemudian ada 5 pin lain yang digunakan untuk berbicara dengan DAC dan kartu SD, tetapi mereka dapat diatur untuk terhubung ke pin arduino apa pun. * Namun, secara default, perpustakaan dikonfigurasi untuk menggunakan pin 10 (untuk kartu SD) dan pin 2, 3, 4 dan 5 untuk DAC. * Untuk mengubah pin ini memerlukan modifikasi library - pin direferensikan dengan nama pin 'hardware' mereka (yaitu PORTD, dll) bukan dengan pin arduino. * Itu berarti pin 6, 7, 8, 9 dan 6 pin analog (juga dikenal sebagai pin i/o digital 14-20) tersedia. * */ #include #include #include #include  static const char raung0[] ="ROAR0000.wav"; static const char gemuruh1[] ="ROAR0001.wav"; static const char gemuruh2[] ="ROAR0002.wav"; static const char * const gemuruhSuara[] ={mengaum0, mengaum1, mengaum2}; static const char sleep0[] ="SNORE000.wav"; static const char sleep1[] ="SNORE001.wav"; static const char sleep2[] ="SNORE002.wav"; static const char * const sleepSounds[] ={sleep0, sleep1, sleep2}; int sebelumnyaRoarSound =-1; class MonsterSounds { pribadi:kartu SdReader; // Objek ini menyimpan informasi untuk kartu FatVolume vol; // Ini menyimpan informasi untuk partisi pada akar kartu FatReader; // Ini menyimpan informasi untuk direktori akar volume file FatReader; // Objek ini mewakili file WAV untuk gelombang frase WaveHC; // Objek gelombang tunggal -- hanya satu suara yang dimainkan dalam satu waktu void playfile(char *name); publik:batal inisialisasi(); batal playSystemReady(); batalkan playRoar(); batal bermainSnore(); batalkan stopAll();};
MonsterSounds.inoC/C++
Kode Arduino untuk perpustakaan suara monster
/* CATATAN TENTANG PIN ARDUINO * Pin 13, 12, 11 selalu digunakan oleh kartu SD (ini adalah satu-satunya pin yang memiliki antarmuka SPI berkecepatan tinggi). * Kemudian ada 5 pin lain yang digunakan untuk berbicara dengan DAC dan kartu SD, tetapi mereka dapat diatur untuk terhubung ke pin arduino apa pun. * Namun, secara default, perpustakaan dikonfigurasi untuk menggunakan pin 10 (untuk kartu SD) dan pin 2, 3, 4 dan 5 untuk DAC. * Untuk mengubah pin ini memerlukan modifikasi library - pin direferensikan dengan nama pin 'hardware' mereka (yaitu PORTD, dll) bukan dengan pin arduino. * Itu berarti pin 6, 7, 8, 9 dan 6 pin analog (juga dikenal sebagai pin i/o digital 14-20) tersedia. * */ void MonsterSounds::initialize(){ Serial.println("Menginisialisasi Suara..."); if(!card.init()) Serial.println(F("Kartu init. gagal!")); if(!vol.init(card)) Serial.println(F("Tidak ada partisi!")); if(!root.openRoot(vol)) Serial.println(F("Tidak dapat membuka direktori")); Serial.println(F("Berkas ditemukan:")); root.ls(); randomSeed(analogRead(0));}void MonsterSounds::playSystemReady(){ this->playfile("WELCOME0.WAV");}void MonsterSounds::playRoar(){ int index =random(3); // 0, 1, 2 while (indeks ==sebelumnyaRoarSound) { indeks =acak(3); } sebelumnyaRoarSound =indeks; this->playfile(roarSounds[index]);}void MonsterSounds::playSnore(){ if (!wave.isplaying) // Jangan interupsi suara yang ada dengan dengkuran { int index =random(3); // 0, 1, 2 this->playfile(sleepSounds[index]); }}void MonsterSounds::stopAll(){ wave.stop(); // Hentikan WAV yang sedang diputar}// --------------------------------------- ----------------------------// playfile() // Buka dan mulai mainkan file WAV// ------ -------------------------------------------------- -----------void MonsterSounds::playfile(char *name) { PgmPrint("Memutar suara:"); Serial.println(nama); if (wave.isplaying) {// sudah memainkan sesuatu, jadi hentikan! gelombang.berhenti(); // hentikan } if (!file.open(root, name)) { PgmPrintln("File tidak ditemukan "); kembali; } if (!wave.create(file)) { PgmPrintln("Bukan WAV yang valid"); kembali; } // oke saatnya bermain! wave.play();}

Suku cadang dan penutup khusus

monstersounds_7vLZD3NU4t.zip

Skema


Proses manufaktur

  1. Mesin EEG
  2. Jus Box
  3. Mesin Penjual Otomatis
  4. Ganti Mesin
  5. Mesin Jahit
  6. Pantyhose
  7. Membuat Mesin Tulis Pekerjaan Rumah DIY di Rumah
  8. Giftduino - Kotak Hadiah Arduino yang Sempurna
  9. Mesin ULTRASONIC LEVITATION Menggunakan ARDUINO
  10. Arduino + ESP Weather Box