Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Monster in einer Kiste

Komponenten und Verbrauchsmaterialien

Holzkiste/-kiste
× 1
Arduino UNO
× 1
Adafruit Wave Shield
× 1
SainSmart 4-Kanal-Relaismodul
× 1
Scheibenwischermotor
× 1
Rote LED-Weihnachtsbeleuchtung (100)
× 1
Rauchautomat
× 1
Verstärkter Verstärker/Lautsprecher
× 1

Über dieses Projekt

*** AKTUALISIERT auf Version 4 ***

Ich habe kürzlich den Arduino-Code für dieses Projekt neu geschrieben. Hier ist eine Zusammenfassung der Änderungen:

  • Hauptschleife ist jetzt als Zustandsmaschine implementiert
  • Alle Zeitangaben basieren jetzt auf der Bewertung der Ereigniszeit im Vergleich zur aktuellen Zeit

- Timing ist nicht mehr von Frames abhängig

- erlaubte Entfernung von delay() in der Hauptschleife

- Beseitigt das Problem "Port beschäftigt" beim Verbinden mit Arduino IDE

  • Relais verwenden jetzt normalerweise offene statt normalerweise geschlossene Verbindungen *** Aktualisieren Sie Ihre Relaisverbindungen!!! ***
  • LED für Bewegungserkennung hinzugefügt
  • Ready to Wake-LED hinzugefügt
  • Pausierte LED hinzugefügt
  • Aktionsauslöseschalter entfernt
  • Möglichkeit hinzugefügt, Rotlicht und Rauch zusätzliche Zeit hinzuzufügen

- lässt diese Effekte etwas länger laufen als beim Deckelwippen

  • Viele Kommentare hinzugefügt

Sie finden den neuesten Code hier auf github

Monster in einer Kiste

Ich liebe Halloween-Requisiten und habe einige großartige Monster in a Box gesehen und gelesen baut im letzten Jahr und beschloss, dass ich mein eigenes bauen sollte. Die Idee ist ziemlich einfach:Schaffen Sie die Illusion, dass eine Art Container ein gefährliches Monster enthält, das kurz vor der Flucht steht. Die Illusion kann mit jeder Kombination aus Bewegung, Ton, Licht, Rauch und natürlich Überraschung erzeugt werden.

Was ist in der Box!?!?

Sie möchten eine Kiste, die groß genug ist, um etwas Großes und Beängstigendes aufzunehmen. Es trägt auch zur Illusion bei, wenn die Schachtel alt, abgenutzt und vielleicht nur stark genug zu sein scheint, um das Monster in Schach zu halten. Zuerst kaufte ich in Secondhand-Läden und online nach etwas, aber nie etwas, das mir gefiel, also baue ich meine eigenen. Es war nicht sehr schwierig.

Ich habe 15 6ft Pinienzaunpfosten von Home Depot verwendet, um eine Kiste zu machen, die ungefähr 3ft x 2,5ft x 2,5ft misst. Ich schneide das gesamte Brett mit einer Tischkreissäge auf Länge und montierte die Box mit einem pneumatischen 18-Gauge-Bradnagler. Dies schien gut zu funktionieren, aber später stellte ich fest, dass die Brads nicht stark genug waren, um die Schachtel aufgrund des ganzen Schlagens und Springens zusammenzuhalten. Um die Box zu verstärken, habe ich sie später mit 1-Zoll-Trockenbauschrauben zusammengeschraubt (von innen nach außen, damit sie nicht sichtbar sind).

Nach dem Bau alterte ich das Holz mit einem Prozess, bei dem schwarzer Tee, Essig und Stahlwolle verwendet wurden. Ich habe es dann mit Schablonen und Etiketten dekoriert, die ich online gefunden und/oder erstellt und gedruckt habe.

Brainzzzzzz!!!

Die Stütze hat 2 Betriebszustände "Schlafend" und "Wach". Im Schlaf ist die Box relativ ruhig und macht nur Schnarchen und leichte Knurrgeräusche. Das Monster wird geweckt, wenn ein Trick-or-Treater einen Bewegungssensor auslöst. Wenn das Monster erwacht, brüllt das Monster, atmet Rauch, lässt den Deckel aufprallen und das Innere der Kiste leuchtet rot.

Ich habe ein Arduino Uno zusammen mit einem WaveShield und einem Relaismodul verwendet, um das Verhalten dieser Stütze zu orchestrieren. Das WaveShield ist mit einer kleinen Sammlung von Schlaf- und Brüllgeräuschen geladen. Ein PIR-Bewegungssensor lieferte dem Arduino einen Eingang, um die Box zwischen den Modi "Schlaf" und "Wach" umzuschalten. Während des Wachmodus aktiviert das Arduino Relaiskanäle, um den Deckelmotor, die roten Lichter und den Rauchgenerator zu betreiben. und spielen Sie die Sounds auf dem WaveShield ab. Eine weitere Funktion, die ich hinzugefügt habe, war eine Pause-Schaltfläche. Dadurch konnte ich das Monster vorübergehend zum Schweigen bringen, wenn jüngere Kinder vorbeikommen.

Es ist Aliiiiiv!

Ein Deckelheber ist ein Gerät, das den Deckel schnell anhebt und senkt, damit er knallt und springt, als ob das Monster versuchen würde zu entkommen. Es gibt mehrere Möglichkeiten, dies zu tun, die beliebtesten scheinen pneumatische Aktuatoren und rotierende Nocken zu sein. Obwohl ich denke, dass ein elektronisch gesteuerter pneumatischer Aktuator es mir ermöglicht hätte, die Deckelbewegungen viel zufälliger zu machen, entschied ich mich für eine rotierende Nocke, da dies die einfachere und kostengünstigste Option zu sein schien.

Ich habe einen gebrauchten Autoscheibenwischermotor von einem örtlichen Schrottplatz für 15 Dollar gekauft. Es war irgendwie lustig. Ich ging hinein und fragte nach einem Motor. Der Typ hinter der Theke fragte "nach welcher Marke und Modellauto", als ich sagte "Ist mir egal" neigte sein Kopf ein wenig zur Seite und er schenkte mir einen kleinen seitlichen Blick. Nachdem ich erklärt hatte, was ich vorhabe, wollte er einen bauen :)

Diese Motoren, unabhängig von Marke/Modell, laufen mit 12 Volt, drehen sich mit einer vernünftigen Geschwindigkeit und haben ein tolles Drehmoment:perfekt! Notiz. Wenn Sie einen bekommen, stellen Sie sicher, dass er einen Teil des alten Kabelbaums hat, damit Sie Ihren Draht viel einfacher daran spleißen können. Stellen Sie auch sicher, dass es einen Kurbelarm und einen versetzten Pfosten hat. Wenn die Hauptmotorsäule die einzige physische Verbindung ist, die Sie mit Ihrer Cam arbeiten müssen, wird sie wahrscheinlich rutschen.

Montieren Sie den Motor irgendwo in Ihrer Box. Ich habe meine auf eine der Seitenwände gelegt. Denken Sie daran, dass eine große rotierende Nocke damit verbunden ist und sich frei von allen Gegenständen drehen kann, insbesondere von Drähten, die Sie in die Schachtel legen. Auf YouTube gibt es mehrere gute Tutorials zur Arbeit mit diesen Motoren.

Ich schneide eine Nocke mit einem Durchmesser von 12 Zoll aus einem Stück 1/2-Schichtholz. Zuerst schneide ich einen perfekten Kreis. Ich habe es am Motor montiert und damit die erforderliche Höhe des Motors in der Box ermittelt. Ich wollte nur, dass der Deckel etwa 2 Zoll angehoben wird. Nachdem ich diese Anpassung gemacht hatte, benutzte ich eine Stichsäge, um nach dem Zufallsprinzip "Zähne" in die Kamera zu schneiden und mein Bestes zu geben, um sie in zufälliger Breite und Tiefe zu halten.

Zuletzt montierte ich eine Rolle an der Unterseite des Deckels mit 2 Metall-L-Klammern, einem 1-Zoll-Nylon-Abstandshalter und einer Schlossschraube. Die Rolle ist direkt über der Nocke positioniert, sodass sie entlang der Zähne der Nocke läuft.

Ich habe die 12-Volt-Schiene eines ATX-Netzteils verwendet, um den Motor über das vom Arduino gesteuerte Relais mit Strom zu versorgen. Ja, alles zum Ausrichten zu bringen, erfordert ein wenig Versuch und Irrtum. Nach ein- oder zweimaligem Neupositionieren der Walze ... ok dreimal ... alles ausgerichtet und der Deckel begann wie geplant zu hüpfen!

Feueratem:Rauch und Lichter

Ich habe einen billigen 400 Watt Rauchgenerator für Raucheffekte verwendet. Out of the box war dies funkgesteuert. Um es mit dem Arduino zu steuern, öffnete ich den Empfänger und lötete zwei Zuleitungen an die Trigger-Tastenpads. Dies versorgte mich mit Leitungen, die ich mit einem Arduino-gesteuerten Relaiskanal verbunden habe. Es war ein einfacher Hack, den ich durch das Anschauen einiger YouTube-Videos lerne. Ich habe auch einen alten Staubsaugerschlauch hinzugefügt, um den Rauch so zu lenken, dass er direkt unter dem Deckel als Strahl austritt. Der visuelle Effekt hat mir gefallen und er hilft, die Dampfkondensation auf der Elektronik im Inneren der Box zu reduzieren.

Für Lichter schneide ich einfach ein leichtes Verlängerungskabel und verdrahte es durch einen Relaiskanal. Die daran angeschlossene Kette von 100 roten LED-Leuchten könnte dann vom Arduino ein- und ausgeschaltet werden.

Verwenden Sie Ihre externe Stimme

Das WaveShield verfügt über eine 1/8 Zoll Kopfhörerbuchse als und Ausgang - sowie 2 I/O Pins zum direkten Anschluss. Ich habe einen 1/8-Zoll-Patch-Akkord verwendet, um einen 30-Watt-Bassgitarrenverstärker anzuschließen, den ich mir aus meinem Übungsraum ausgeliehen habe. Eine beliebige Anzahl von verstärkten Lautsprechern würde funktionieren - einschließlich PC-Lautsprecher. Aber etwas mit solidem Low-End zu verwenden ist definitiv ein Plus.

Verketten Sie es

Ich kaufe einige Plastikketten in einem Halloween-Laden und druckte ein Vorhängeschloss in 3D. Diese über die Kiste zu wickeln, verstärkte die Tiefe und das Gefühl der Illusion.

Halloween!!!

Stellen Sie die Kiste auf den Hof und verstecken Sie den Bewegungssensor in einem nahegelegenen Busch. Ich habe ein langes Lautsprecherkabel verwendet, um den Sensor anzuschließen, damit ich mit der Positionierung experimentieren konnte, sodass das Monster aufwacht, wenn sich jemand der Kiste nähert (ca. 1,5 m).

Als der Abend dunkler wurde, wurde mir klar, dass alle Details an der Außenseite der Kiste schwer zu erkennen waren. Schließlich habe ich es mit einem Stroboskop-Flutlicht beleuchtet und war mit dem Effekt sehr zufrieden.

Als Trick-or-Treater die Auffahrt hinaufgingen, bemerkten sie die knurrende Kiste:einige neugierig, andere hatten tatsächlich Angst davor. Als sie näher kamen und das Monster zum Leben erwachte, standen sie auf und kreischten, einige applaudierten sogar. Es war ein Riesenerfolg.

Verbesserungen

Ich hatte es satt, nach Möglichkeiten zu suchen, meinen Bewegungssensor in den Büschen zu verstecken, also klebte ich einen heiß in den Bauch einer Plastikratte, die ich irgendwo entlang der Auffahrt oder unter dem nahe gelegenen Busch positionieren kann. Ich habe auch eine RJ11-Telefonbuchse auf der Rückseite der Box installiert, damit ich den Rattenbewegungssensor mit einem 50-Fuß-Telefonkabel anschließen konnte - was viel besser ist als die beiden Lautsprecherkabel, die ich zuvor verwendet habe.

Sie werden feststellen, dass ich dieser neuen Platte auch einen Schalter und einige Anzeige-LEDs hinzugefügt habe. Der Schalter PAUSIEREN alle Funktionen der Box, ohne sie auszuschalten. Mein Haupt-Kill-Schalter ist die Steckdosenleiste im Inneren und ist schwer zugänglich, außerdem verwendet dieser nur die Signalspannung (5 V) an diesem externen Schalter. Dieser Schalter war großartig, um das Monster für jüngere Trick-or-Treater und andere zu stoppen, die in der Halloween-Nacht einen Blick hinein werfen möchten.

Oh! Ich drapiere Plastikketten aus Gründen der Wirkung über die Schachtel und sie können manchmal unhandlich sein. Vor allem, wenn ich abends in die Kiste muss. Um dies zu erleichtern, habe ich schwarze Federkarabiner an den Enden der Ketten befestigt. Dadurch kann ich die Enden schnell an Ösen aushängen / einhaken, die ich in die unteren Ecken der Box geschraubt habe. Nicht sehr High-Tech, aber sehr hilfreich.

Die Zukunft

Es gibt ein paar Dinge, die ich in Zukunft hinzufügen möchte. Vielleicht R/C-Steuerung, damit ich das Monster aus der Ferne anhalten oder auslösen kann. Ich werde dem Deckelheber auch eine Art Feedback hinzufügen, damit der Arduino "wissen" kann, wann der Deckel geöffnet oder geschlossen ist. Mehrmals hielt der Heber an einem hohen Punkt im Zyklus an, wodurch die „Eingeweide“ der Box bis zum nächsten Wachzyklus sichtbar wurden. Schließlich kann ich die externe Beleuchtung / Blitze an den Arduino anschließen, damit sie vom Programm und oder dem R / C-Anhänger gesteuert werden können.

GitHub-Repository

Den neuesten Code und Schaltpläne finden Sie hier auf GitHub

Code

  • Monster In A Box-Skizze
  • MonsterSounds.h
  • MonsterSounds.ino
Monster-in-a-Box-SkizzeC/C++
/*Wave Shield Pins im Einsatz:2, 3, 4, 5, 10, 11, 12 &13Pins 13, 12, 11 werden immer von der SD-Karte verwendet (sie sind die einzigen Pins, die einen Hochgeschwindigkeits-SPI haben Schnittstelle). Dann gibt es 5 andere Pins, die verwendet werden, um mit dem DAC und der SD-Karte zu kommunizieren, aber sie können so eingestellt werden, dass sie mit jedem Arduino-Pin verbunden werden. Die Bibliothek ist jedoch standardmäßig so konfiguriert, dass sie die Pins 10 (für die SD-Karte) und die Pins 2, 3, 4 und 5 für den DAC verwendet. Um diese Pins zu ändern, muss die Bibliothek geändert werden - die Pins werden durch ihre 'Hardware'-Pin-Namen (dh PORTD usw.) referenziert, nicht durch Arduino-Pins. Das bedeutet, dass die Pins 6, 7, 8, 9 und die 6 analogen In-Pins (auch als digitale I/O-Pins 14-20 bekannt) verfügbar sind.https://learn.adafruit.com/adafruit-wave-shield-audio- shield-for-arduino/faq*/#include "MonsterSounds.h"#define RESERVED_00 0 // Reserviert für Serial RX#define RESERVED_01 1 // Reserviert für Serial TX#define RESERVED_02 2 // Reserviert für Wave Shield#define RESERVED_03 3 // Reserviert für Wave Shield#define RESERVED_04 4 // Reserviert für Wave Shield#define RESERVED_05 5 // Reserviert für Wave Shield#define FOG_MACHINE 6 // Verbinden Sie den digitalen Pin auf Arduino mit dem Relaismodul#define RED_LEDS 7 // Verbinden Sie den digitalen Pin auf Arduino mit Relaismodul#define LID_BOUNCER 8 // Digitalen Pin von Arduino mit Relaismodul verbinden#define RESERVED_09 9 // Digitalen Pin von Arduino mit Relaismodul verbinden#define RESERVED_10 10 // Reserviert für Wave Shield#define RESERVED_11 11 // Reserviert für Wave Shield#define RESERVED_12 12 // Reserviert für Wave Shield#define RESERVED_13 13 // Reserviert für Wave Shield#define PIR_SENSOR A 1 wenn das Monster im READY_TO_WAKE-Zustand ist#define PAUSE_BUTTON A4 // Pause Switch Input#define DEBUG_BUTTON A5 // Debug Switch Input // Effekt-Timer-Einstellungen - in Sekunden (EDIT THESE)#define WAKE_DELAY 30 // Mindestzeit zwischen 'Aufwachen' Vorkommnisse in Sekunden#define WAKE_DELAY_DEBUG 10 // WAKE_DELAY überschreibt, wenn der DEGUB-Schalter betätigt wird#define SLEEP_SOUND_DELAY 1 // Anzahl der Sekunden, die zwischen dem Versuch, den nächsten 'Schlaf'-Sound auszulösen, gewartet werden soll#define WAKE_MIN 3 // Minimale 'Aufwach'-Zeit in Sekunden#define WAKE_MAX 5 // Maximale 'Aufwachzeit' in Sekunden#define RED_LIGHT_EXTRA_TIME 1 // Lässt das rote Licht etwas länger laufen als die Deckelwippe, falls gewünscht#define SMOKE_EXTRA_TIME 2 // Lässt den Rauch laufen auf Wunsch etwas länger als die Deckelwippe // Effekte Timer-Einstellungen - in Millisekunden (DO NOT EDIT THESE) #define WAKE_DELAY_MILLIS WAKE_DELAY * 1000 # WAKE_DELAY_DEBUG_MILLIS WAKE_DELAY_DEBUG * 1000 # definieren SLEEP_SOUND_DELAY_MILLIS SLEEP_SOUND_DELAY * 1000 # define WAKE_MIN_MILLIS WAKE_MIN * 1000 # WAKE_MAX_MILLIS WAKE_MAX * 1000 # RED_LIGHT_EXTRA_TIME_MILLIS definieren definieren RED_LIGHT_EXTRA_TIME * 1000 # definieren SMOKE_EXTRA_TIME_MILLIS definieren SMOKE_EXTRA_TIME * 1000MonsterSounds Sounds;statisch unsigned lange timeSinceLastSnore=0;statisch unsigned lange WakeAllowedTimer =0;statisch unsigned langes lidBounceTimer =0;statisch unsigned langes lidBounceDuration =0;statisch unsigned langes RauchenTimer =0;statisch unsigned langes smokeDuration =0;statisch unsigned long redLightTimer =0;static unsigned long redLightDuration =0;enum States { STATE_INITIALIZE, // Nur während setup() und erstmalig in loop() STATE_PAUSED, // Alle Sounds und Effekte ausschalten STATE_SLEEPING, // Keine Effekte, Schlafgeräusche , lässt nicht zu, dass wach ausgelöst wird STATE_READY_TO_WAKE, // Nein Effekte, Schlafgeräusche, ermöglicht das Auslösen des Wachzustands STATE_AWAKE}; // Feuert Effekte und Monster-Wake-Sounds abStates state =STATE_INITIALIZE;void setup () { // serielle Kommunikation initialisieren:Serial.begin (9600); // Alle Relais-Pins einrichten pinMode (LID_BOUNCER, OUTPUT); pinMode (RED_LEDS, AUSGANG); pinMode (FOG_MACHINE, AUSGANG); pinMode (PAUSED_LED, AUSGANG); pinMode (MOTION_LED, AUSGANG); pinMode (READY_LED, AUSGANG); // Alle Effekte auf OFF erzwingen stopAllEffects(); pinMode (PIR_SENSOR, EINGANG); pinMode (PAUSE_BUTTON, INPUT_PULLUP); pinMode (DEBUG_BUTTON, INPUT_PULLUP); sound.initialize(); // Monstersounds sounds.playSystemReady(); Verzögerung (1000); Serial.println(); Serial.print ("*** System Ready ***"); Serial.println(); }/* * HINWEIS:Alle Tasten verwenden Pullups, daher bedeutet LOW, dass die Taste GEDRÜCKT ist. * Denken Sie daran, dass das Pullup bedeutet, dass die Schaltlogik invertiert ist. * Es geht auf HIGH, wenn es geöffnet ist, und auf LOW, wenn es gedrückt wird. * * Der PIR-Bewegungssensor verhält sich NICHT auf diese Weise.*//* * Hauptverarbeitungsschleife * - Verwaltet die Zustandsmaschine des Monsters */void loop() { Boolean pauseSwitchClosed =digitalRead(PAUSE_BUTTON) ==LOW; boolean motionDetected =digitalRead(PIR_SENSOR) ==HIGH; digitalWrite (MOTION_LED, digitalRead (PIR_SENSOR)); switch (state) { case STATE_INITIALIZE:if (pauseSwitchClosed) { goToPause(); aufrechtzuerhalten. Sonst { goToSleep(); } brechen; case STATE_PAUSED:if (!pauseSwitchClosed) { goToSleep(); digitalWrite (PAUSED_LED, LOW); aufrechtzuerhalten. Sonst { DigitalWrite (PAUSED_LED, HIGH); } brechen; case STATE_SLEEPING:if (pauseSwitchClosed) { goToPause(); aufrechtzuerhalten. Sonst if (isAllowedToWake()) { goToReadyToWake(); aufrechtzuerhalten. Sonst { processSleeping(); } brechen; case STATE_READY_TO_WAKE:if (pauseSwitchClosed) { goToPause(); digitalWrite (READY_LED, LOW); aufrechtzuerhalten. Sonst if (motionDetected) { goToAwake(); digitalWrite (READY_LED, LOW); aufrechtzuerhalten. Sonst { processSleeping(); } brechen; case STATE_AWAKE:if (pauseSwitchClosed){ ​​goToPause(); aufrechtzuerhalten. Sonst if (processAwakeAnimation()) {goToSleep(); } // processAwakeAnimation() gibt true zurück, wenn alle Animationen vollständig sind break; Standard:Serial.println ("UNBEKANNTER ZUSTAND"); brechen; // Wir sollten nie hierher kommen}}/* * Übergang in den Pause-Zustand */inline void goToPause() { Serial.println("PAUSED"); Zustand =ZUSTAND_PAUSED; stopAllEffects(); sounds.stopAll();}/* * Übergang in den Ruhezustand */inline void goToSleep() { Serial.println("GOING TO SLEEP"); Zustand =STATE_SLEEPING; WakeAllowedTimer =millis();}/* * Übergang in den Bereitschaftszustand * Dies ist ein Sonderfall des Ruhezustands */inline void goToReadyToWake() { Serial.println("READY TO WAKE"); Zustand =STATE_READY_TO_WAKE; }/* * Übergang in den Wachzustand * - Wecke das Monster und verarbeite die Effekte und Sounds */inline void goToAwake() { Serial.println("AWAKE"); Zustand =STATE_AWAKE; WakeMonster();}/* * einen Zyklus der SLEEP-Aktivität verarbeiten * - Sleep Sounds ausführen * - Sleep Timer aktualisieren */inline void processSleeping() { if ((millis() - timeSinceLastSnore)> SLEEP_SOUND_DELAY_MILLIS) {sounds.playSnore( ); timeSinceLastSnore =millis(); }}/* * Legt fest, ob das Monster zu diesem Zeitpunkt aufwachen darf. * - Debug-Schalter überprüfen, wenn er geschlossen ist, verwenden wir einen kürzeren Wake Allowed Timer * - Monster muss für eine vordefinierte Mindestzeit schlafen, bevor es aufgeweckt werden kann * - LED aufleuchten, wenn es zum Aufwachen bereit ist */inline boolean isAllowedToWake( ) { Boolean isDebug =digitalRead (DEBUG_BUTTON) ==LOW; unsigned long requiredDelay =WAKE_DELAY_MILLIS; if (isDebug) { erforderlichDelay =WAKE_DELAY_DEBUG_MILLIS; } boolean isAllowed =(millis() - WakeAllowedTimer)> requiredDelay; if (isAllowed) { digitalWrite (READY_LED, HIGH); } return isAllowed;}/* * Wake Monster * Startet die Wach-Animationen * Spielt die Wach-Sounds ab * * Rufen Sie dies EINMAL auf, um den AWAKE-Zustand zu starten. */void wakeMonster() { int ActivityDuration =random(WAKE_MIN_MILLIS, WAKE_MAX_MILLIS); // so lange wird das Monster aktiv sein Serial.print ( "Wake-Dauer:"); Serial.print (Aktivitätsdauer); Serial.println("ms"); BounceLid (Aktivitätsdauer); flashRedLight(AktivitätDauer + RED_LIGHT_EXTRA_TIME_MILLIS); AktiviereSmoke(AktivitätDauer + SMOKE_EXTRA_TIME_MILLIS); sounds.playRoar();} /* * Verwaltet den Fortschritt der AWAKE-Animationen * Rufen Sie dies EVERY CYCLE während des AWAKE-Zustands auf. * Gibt TRUE zurück, wenn alle Animationen abgeschlossen sind */boolean processAwakeAnimation(){ printTimersToLog(); boolescher Wert done1 =false; boolean done2 ​​=false; boolean done3 =false; if (millis() - lidBounceTimer> lidBounceDuration) { bounceLid(0); done1 =wahr; aufrechtzuerhalten. Wenn (millis () - redLightTimer> redLightDuration ) { flashRedLight (0); done2 ​​=wahr; aufrechtzuerhalten. Wenn (millis() - smokeTimer> smokeDuration) {activateSmoke(0); done3 =wahr; } return done1 &&done2 ​​&&done3;}/* * Effekt verwalten:Bounce the box cover * - diration ist die Anzahl der Millisekunden, die der Effekt ausgeführt werden soll * - Dauer von 0 bedeutet, dass der Effekt gestoppt werden soll */inline void bounceLid(unsigned lange Dauer) { if (Dauer <=0) {EnergeRelay (LID_BOUNCER); lidBounceDuration =0; aufrechtzuerhalten. } else { // Starte das Prellen des Deckels de_energizeRelay(LID_BOUNCER); lidBounceTimer =millis(); lidBounceDuration =Dauer; }}/* * Effekt verwalten:Rote Lichter blinken * - diration ist die Anzahl der Millisekunden, die der Effekt ausgeführt werden soll * - Dauer von 0 bedeutet, dass der Effekt gestoppt werden sollte */inline void flashRedLight(unsigned long length){ if (duration <=0) {energetisieren Sie Relais (RED_LEDS); redLightDuration =0; aufrechtzuerhalten. Sonst {// das Licht blinken starten de_energizeRelay (RED_LEDS); redLightTimer =millis(); redLightDuration =Dauer; } }/* * Start/Stopp-Effekt:Aktiviere Smoke * - diration ist die Anzahl der Millisekunden, die der Effekt ausgeführt werden soll * - Dauer von 0 bedeutet, dass der Effekt gestoppt werden soll */ inline void activateSmoke(unsigned long duration) { // ' Drücken Sie den Rauchknopf // die Dauer sollte eine feste Zeitspanne sein, die die Maschine benötigt, um auf die Aktion zu reagieren // eine Zeitüberschreitung festlegen, um nach der Dauer zu stoppen if (duration <=0) {EnergyRelay(FOG_MACHINE); Rauchdauer =0; aufrechtzuerhalten. Sonst {// das Licht blinken starten de_energizeRelay (FOG_MACHINE); RauchTimer =millis(); Rauchdauer =Dauer; } }/* * Stoppe alle Effekte * - Dies schaltet das Monster effektiv aus */inline void stopAllEffects(){ bounceLid(0); BlitzRotLicht(0); activateSmoke(0);}/* * Gibt die Awake-Animation-Timer einmal pro Sekunde in das Protokoll aus */inline void printTimersToLog() { static unsigned long timeofLastTimerLog =0; if (millis () - timeofLastTimerLog> =1000) { Serial.print ( "Deckel:"); Serial.print ((millis()-lidBounceTimer)> lidBounceDuration? 0:(lidBounceDuration -(millis()-lidBounceTimer))); Serial.print(" leuchtet:"); Serial.print ((millis()-redLightTimer)> redLightDuration? 0:(redLightDuration -(millis()-redLightTimer))); Serial.print("Rauch:"); Serial.println ((millis()-smokeTimer)> smokeDuration? 0:(smokeDuration -(millis()-smokeTimer))); timeofLastTimerLog =millis(); }}/* * Relais energetisieren * Setzt die Klemme Schließer (NO) auf OFFEN * Öffner wird geschlossen */ inline void energizeRelay (int channel) { digitalWrite (channel, HIGH); }/* * Relais de-energize * Setzt den normalerweise offenen (NO) Anschluss auf GESCHLOSSEN. * Normalerweise geschlossen wird OFFEN */ inline void de_energizeRelay (int channel) { digitalWrite (channel, LOW); }
MonsterSounds.hC/C++
Arduino-Header für die Monstersound-Bibliothek
/* HINWEIS ZU ARDUINO-PINS * Die Pins 13, 12, 11 werden immer von der SD-Karte verwendet (sie sind die einzigen Pins, die eine Highspeed-SPI-Schnittstelle haben). * Dann gibt es 5 andere Pins, die verwendet werden, um mit dem DAC und der SD-Karte zu kommunizieren, aber sie können so eingestellt werden, dass sie mit jedem Arduino-Pin verbunden werden. * Die Bibliothek ist jedoch standardmäßig so konfiguriert, dass sie die Pins 10 (für die SD-Karte) und die Pins 2, 3, 4 und 5 für den DAC verwendet. * Um diese Pins zu ändern, muss die Bibliothek geändert werden - die Pins werden durch ihre 'Hardware'-Pin-Namen (dh PORTD usw.) referenziert, nicht durch Arduino-Pins. * Das bedeutet, dass die Pins 6, 7, 8, 9 und die 6 analogen In-Pins (auch bekannt als digitale I/O-Pins 14-20) verfügbar sind. * */ #include #include #include #include  static const char roar0[] ="ROAR0000.wav"; static const char roar1[] ="ROAR0001.wav"; static const char roar2[] ="ROAR0002.wav"; statisch const char * const roarSounds[] ={roar0, roar1, roar2}; static const char sleep0[] ="SNORE000.wav"; static const char sleep1[] ="SNORE001.wav"; static const char sleep2[] ="SNORE002.wav"; statisch const char * const sleepSounds[] ={sleep0, sleep1, sleep2}; int previousRoarSound =-1; Klasse MonsterSounds { privat:SdReader-Karte; // Dieses Objekt enthält die Informationen für die Karte FatVolume vol; // Dies enthält die Informationen für die Partition auf der Karte FatReader root; // Dies enthält die Informationen für das Root-Verzeichnis des Volumes FatReader-Datei; // Dieses Objekt repräsentiert die WAV-Datei für eine Phrase WaveHC wave; // Ein einzelnes Wave-Objekt -- es wird immer nur ein Sound abgespielt void playfile(char *name); öffentlich:void initialize(); void playSystemReady(); void playRoar(); void playSnore(); void stopAll();};
MonsterSounds.inoC/C++
Arduino-Code für die Monstersound-Bibliothek
/* HINWEIS ZU ARDUINO-PINS * Die Pins 13, 12, 11 werden immer von der SD-Karte verwendet (sie sind die einzigen Pins, die eine Highspeed-SPI-Schnittstelle haben). * Dann gibt es 5 andere Pins, die verwendet werden, um mit dem DAC und der SD-Karte zu kommunizieren, aber sie können so eingestellt werden, dass sie mit jedem Arduino-Pin verbunden werden. * Die Bibliothek ist jedoch standardmäßig so konfiguriert, dass sie die Pins 10 (für die SD-Karte) und die Pins 2, 3, 4 und 5 für den DAC verwendet. * Um diese Pins zu ändern, muss die Bibliothek geändert werden - die Pins werden durch ihre 'Hardware'-Pin-Namen (dh PORTD usw.) referenziert, nicht durch Arduino-Pins. * Das bedeutet, dass die Pins 6, 7, 8, 9 und die 6 analogen In-Pins (auch bekannt als digitale I/O-Pins 14-20) verfügbar sind. * */ void MonsterSounds::initialize () { Serial.println ( "Initializing Sounds ..."); if(!card.init()) Serial.println(F("Karteninit. fehlgeschlagen!")); if(!vol.init(card)) Serial.println(F("Keine Partition!")); if(!root.openRoot(vol)) Serial.println(F("Konnte Verzeichnis nicht öffnen")); Serial.println (F ( "Dateien gefunden:")); root.ls(); randomSeed(analogRead(0));}void MonsterSounds::playSystemReady(){ this->playfile("WELCOME0.WAV");}void MonsterSounds::playRoar(){ int index =random(3); // 0, 1, 2 while (index ==previousRoarSound) { index =random(3); } previousRoarSound =index; this->playfile(roarSounds[index]);}void MonsterSounds::playSnore(){ if (!wave.isplaying) // Unterbreche keinen bestehenden Ton mit Schnarchen { int index =random(3); // 0, 1, 2 this->playfile(sleepSounds[index]); }}void MonsterSounds::stopAll(){ wave.stop(); // Stoppen Sie alle aktuell abgespielten WAV}// --------------------------------------- ---------------------------------------- // playfile() // Öffnen und Abspielen einer WAV-Datei // ------ -------------------------------------------------- -----------void MonsterSounds::playfile(char *name) { PgmPrint("Wiedergabe von Sound:"); Serial.println (Name); if (wave.isplaying) {// spielt schon etwas, also hör auf damit! wave.stop(); // stoppen } if (!file.open(root, name)) { PgmPrintln("Datei nicht gefunden"); Rückkehr; } if (!wave.create(file)) { PgmPrintln("Keine gültige WAV"); Rückkehr; } // Ok Zeit zum Spielen! wave.play();}

Kundenspezifische Teile und Gehäuse

monstersounds_7vLZD3NU4t.zip

Schaltpläne


Herstellungsprozess

  1. EEG-Maschine
  2. Saftbox
  3. Automaten
  4. Maschine wechseln
  5. Nähmaschine
  6. Strumpfhose
  7. Machen Sie eine DIY-Hausaufgaben-Schreibmaschine zu Hause
  8. Giftduino - Die perfekte Arduino-Geschenkbox
  9. ULTRASCHALLLEVITATION-Maschine mit ARDUINO
  10. Arduino + ESP Weather Box