Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Monster in a Box

Componenten en benodigdheden

Houten kist/doos
× 1
Arduino UNO
× 1
Adafruit Wave Shield
× 1
SainSmart 4-kanaals relaismodule
× 1
Ruitenwissermotor
× 1
Rode LED-kerstverlichting (100)
× 1
Rookmachine
× 1
Versterker/luidspreker
× 1

Over dit project

*** BIJGEWERKT naar Ver 4 ***

Ik heb onlangs de Arduino-code voor dit project herschreven. Hier is een samenvatting van de wijzigingen:

  • Hoofdlus is nu geïmplementeerd als een toestandsmachine
  • Alle timing nu gebaseerd op de tijd van het evenement versus de huidige tijdevaluaties

- timing is niet langer afhankelijk van frames

- toegestaan ​​verwijdering van delay() in de hoofdlus

- elimineert het 'poort bezet'-probleem bij verbinding met Arduino IDE

  • Relais gebruiken nu normaal open in plaats van normaal gesloten verbindingen *** Update je relaisverbindingen!!! ***
  • Voeg bewegingsdetectie-LED toe
  • Toegevoegd Ready to Wake LED
  • Gepauzeerde LED toegevoegd
  • Actietriggerschakelaar verwijderd
  • Mogelijkheid toegevoegd om extra tijd toe te voegen aan Red Lights &Smoke

- laat deze effecten iets langer werken dan de uitsmijter van het deksel

  • Veel reacties toegevoegd

Je vindt de nieuwste code hier op github

Monster in een doos

Ik ben dol op Halloween-rekwisieten en heb geweldige Monster in a Box gezien en gelezen bouwt het afgelopen jaar en besloot dat ik mijn eigen moest bouwen. Het idee is vrij eenvoudig:creëer de illusie dat een soort container een gevaarlijk monster vasthoudt dat op het punt staat te ontsnappen. De illusie kan worden gecreëerd met elke combinatie van beweging, geluid, licht, rook en natuurlijk verrassing.

Wat zit er in de doos!?!?

U wilt een doos die groot genoeg is om iets groots en eng te kunnen bevatten. Het draagt ​​ook bij aan de illusie als de doos oud, versleten en misschien alleen sterk genoeg lijkt om het monster op afstand te houden. In het begin winkelde ik rond in kringloopwinkels en online voor iets, maar nooit iets dat ik leuk vond, dus bouwde ik mijn eigen. Het was niet erg moeilijk.

Ik gebruikte 15 6ft grenen hekpalen van Home Depot om een ​​doos te maken van ongeveer 3ft x 2,5ft x 2,5ft. Ik sneed het hele bord op lengte met een tafelzaag en monteerde de doos met behulp van een pneumatische 18 gauge brad-spijkermachine. Dit leek goed te werken, maar later realiseerde ik me dat de brads niet sterk genoeg waren om de doos bij elkaar te houden vanwege al het bonzen en stuiteren dat het zou doen. Om de doos te versterken heb ik hem later aan elkaar geschroefd met 1 inch gipsplaatschroeven (van binnen naar buiten zodat ze niet zichtbaar zijn).

Eenmaal gebouwd heb ik het hout verouderd met een proces waarbij zwarte thee, azijn en staalwol werden gebruikt. Vervolgens heb ik het versierd met stencils en labels die ik online heb gevonden en/of gemaakt en afgedrukt.

Brainzzzzz!!!

De prop heeft 2 operationele toestanden "Slapen" en "Wakker". Tijdens het slapen is de box relatief rustig en maakt alleen gesnurk en lichte grommende geluiden. Het monster wordt gewekt wanneer een trick-or-treat een bewegingssensor activeert. Wanneer het monster wordt gewekt, brult het monster, ademt rook in, stuitert tegen het deksel en de binnenkant van de doos gloeit rood op.

Ik gebruikte een Arduino Uno samen met een WaveShield en een relaismodule om het gedrag van deze prop te orkestreren. De WaveShield is geladen met een kleine verzameling slaap- en brullende geluiden. Een PIR-bewegingssensor leverde input aan de Arduino om de box te schakelen tussen "slapende" en "wakkere" modi. Tijdens de wakkere modus activeert de Arduino relaiskanalen om de dekselmotor, rode lichten en de rookgenerator te laten werken. en speel de geluiden op de WaveShield. Een andere functie die ik heb toegevoegd, was een pauzeknop. Hierdoor kon ik het monster tijdelijk het zwijgen opleggen als er jongere kinderen langskwamen.

Het is aliiiiive!

Een deksellifter is een apparaat dat het deksel snel omhoog en omlaag brengt om het te laten bonzen en stuiteren alsof het monster probeert te ontsnappen. Er zijn verschillende manieren waarop dit kan worden gedaan. De meest populaire lijken pneumatische aandrijvingen en roterende nokken te zijn. Hoewel ik denk dat een elektronisch gestuurde pneumatische actuator me in staat zou hebben gesteld om de bewegingen van het deksel veel willekeuriger te maken, besloot ik voor een roterende nok te gaan, omdat dit de eenvoudigere en goedkoopste optie leek.

Ik kocht een gebruikte ruitenwissermotor voor auto's van een plaatselijke schroothoop voor $ 15. Het was best grappig. Ik liep naar binnen en vroeg om een ​​motor. De man achter de balie vroeg "voor welk merk en model auto" toen ik zei "het kan me niet schelen" zijn hoofd een beetje opzij en hij gaf me een beetje zijoog. Nadat ik had uitgelegd wat ik van plan was, wilde hij er een bouwen :)

Deze motoren, ongeacht merk/model, draaien op 12 volt, draaien redelijk rond en hebben een geweldig koppel:perfect! Opmerking. Als je er een krijgt, zorg er dan voor dat deze een deel van de oude kabelboom heeft, dan wordt het veel gemakkelijker voor je om je draad eraan te splitsen. zorg er ook voor dat het zijn crankarm en offsetpost heeft. Als de hoofdmotorpost de enige fysieke verbinding is waarmee u moet werken, zal uw nok waarschijnlijk slippen.

Monteer de motor ergens in uw doos. Ik heb de mijne op een van de zijwanden gezet. Onthoud dat er een grote roterende nok op is aangesloten en dat deze vrij moet kunnen draaien en vrij moet zijn van alle items, met name draden, die u in de doos gaat plaatsen. Er zijn verschillende goede tutorials op YouTube over het werken met deze motoren.

Ik sneed een nok met een diameter van 12 inch uit een stuk 1/2-laags hout. eerst knipte ik een perfecte cirkel. Deze heb ik op de motor gemonteerd en hiermee de benodigde hoogte van de motor in de bak bepaald. Ik wilde alleen dat het deksel ongeveer 2 centimeter optilde. Nadat ik deze aanpassing had gedaan, gebruikte ik een decoupeerzaag om willekeurig 'tanden' in de nok te snijden en deed mijn best om ze op willekeurige breedte en diepte te houden.

Ten slotte heb ik een rol aan de onderkant van het deksel gemonteerd met behulp van 2 metalen L-beugels, een 1 inch nylon afstandhouder en een slotbout. De rol bevindt zich net boven de nok zodat deze langs de tanden van de nok rijdt.

Ik gebruikte de 12 volt-rail van een ATX-voeding om de motor van stroom te voorzien via het relais dat door de Arduino wordt bestuurd. Ja, alles op een rij krijgen, vereist een beetje vallen en opstaan. Na een of twee keer de rol opnieuw te hebben gepositioneerd... ok drie keer... stond alles op een rij en begon het deksel te stuiteren zoals gepland!

Vuurademhaling:Rook en Licht

Ik gebruikte een goedkope 400 Watt rookgenerator voor rookeffecten. Uit de doos was dit radiografisch bestuurbaar. Om het met de Arduino te bedienen, opende ik de ontvanger en soldeerde twee leadlijnen aan de trigger-knoppads. Dit leverde me lijnen op die ik verbond met een Arduino-gestuurd relaiskanaal. Het was een simpele hack die ik leerde door een paar YouTube-video's te bekijken. Ik heb ook een oude stofzuigerslang toegevoegd om de rook te richten om als een stroom van net onder het deksel naar buiten te komen. Ik hield van het visuele effect en het helpt de condensatie van damp op de elektronica in de doos te verminderen.

Voor verlichting knipte ik eenvoudig een verlengsnoer voor lichte doeleinden en bedraadde het via een relaiskanaal. De reeks van 100 rode LED-lampjes die hierop is aangesloten, kan vervolgens door de Arduino worden in- en uitgeschakeld.

Gebruik je externe stem

De WaveShield heeft een 1/8 inch koptelefoonaansluiting als en uitgang - evenals 2 i/o-pinnen voor een directe verbinding. Ik gebruikte een 1/8 inch patchakkoord om een ​​30 Watt basgitaarversterker aan te sluiten die ik uit mijn oefenruimte had geleend. Elk aantal versterkte luidsprekers zou werken - inclusief pc-luidsprekers. Maar iets met solide low-end gebruiken is zeker een pluspunt.

Zet het vast

Ik koop wat plastic kettingen van een Halloween-winkel en 3D-print een hangslot. Door deze over de kist te wikkelen, werd de diepte en het gevoel van de illusie vergroot.

Halloween!!!

Zet de kist buiten in de tuin en verberg de bewegingssensor in een nabijgelegen struik. Ik heb een lange luidsprekerkabel gebruikt om de sensor aan te sluiten, zodat ik met de positionering kon experimenteren, zodat het monster wakker zou worden als iemand dichtbij (ongeveer 5 ft) bij de kist komt.

Toen de avond donkerder werd, realiseerde ik me dat alle details aan de buitenkant van de kist moeilijk te zien waren. Uiteindelijk verlichtte ik het met een strobed-schijnwerper en was erg blij met het effect.

Terwijl trick-or-treaters de oprit opliepen, merkten ze de grommende doos op:sommigen nieuwsgierig, anderen waren er eigenlijk bang voor. Toen ze dichterbij kwamen en het monster brulde tot leven, kwamen ze omhoog en gilden sommigen zelfs applaudisserend. Het was een enorme hit.

Verbeteringen

Ik werd moe van het zoeken naar manieren om mijn bewegingssensor in de struiken te verbergen, dus heb ik er een in de buik van een plastic rat gelijmd die ik ergens langs de oprit of onder die nabijgelegen struik kan plaatsen. Ik heb ook een RJ11-telefoonaansluiting aan de achterkant van de doos geïnstalleerd, zodat ik de bewegingssensor van de rat kon aansluiten met een 50ft-telefoonakkoord - wat veel beter is dan de twee strengen luidsprekerdraad die ik eerder gebruikte.

U zult opmerken dat ik ook een schakelaar en enkele indicatie-LED's aan die nieuwe plaat heb toegevoegd. De schakelaar PAUZE alle functies op de box zonder deze uit te schakelen. Mijn belangrijkste kill-schakelaar is de stekkerdoos binnenin en is omslachtig om toegang te krijgen, plus hiermee gebruikt deze alleen signaalspanning (5v) op deze externe schakelaar. Deze schakelaar was geweldig om het monster te stoppen voor jongere trick-or-treaters en anderen die op Halloween-avond om een ​​kijkje naar binnen vragen.

Oh! Ik drapeer plastic kettingen over de doos voor effect en ze kunnen soms onpraktisch zijn. Zeker als ik 's avonds in de box moet. Om dit gemakkelijker te maken rits ik zwarte veerkarabiners aan de uiteinden van de kettingen. Hierdoor kan ik snel de uiteinden losmaken / vasthaken aan oogjes die ik in de onderste hoeken van de doos heb geschroefd. Niet erg high-tech, maar erg nuttig.

De toekomst

Er zijn een paar dingen die ik in de toekomst wil toevoegen. Misschien RC-besturing zodat ik het monster op afstand kan pauzeren of triggeren. Ik zal ook een soort feedback aan de deksellifter toevoegen, zodat de Arduino kan 'weten' wanneer het deksel open of gesloten is. Meerdere keren stopte de lifter op een hoog punt in de cyclus waardoor de 'ingewanden' van de box zichtbaar werden tot de volgende wake-cyclus. Ten slotte kan ik de externe verlichting/flitsers aansluiten op de Arduino zodat ze kunnen worden bestuurd door het programma en/of de RC-fob.

GitHub-opslagplaats

U vindt de nieuwste code en bedradingsschema's Hier op GitHub

Code

  • Monster In A Box-schets
  • MonsterSounds.h
  • MonsterSounds.ino
Monster In A Box-schetsC/C++
/*Wave Shield-pinnen in gebruik:2, 3, 4, 5, 10, 11, 12 &13Pins 13, 12, 11 worden altijd gebruikt door de SD-kaart (dit zijn de enige pinnen met een snelle SPI koppel). Dan zijn er nog 5 andere pinnen die worden gebruikt om met de DAC en SD-kaart te praten, maar ze kunnen worden ingesteld om verbinding te maken met elke Arduino-pin. De bibliotheek is echter standaard geconfigureerd om pinnen 10 (voor SD-kaart) en pinnen 2, 3, 4 en 5 voor de DAC te gebruiken. Om deze pinnen te wijzigen, moet de bibliotheek worden aangepast - er wordt naar de pinnen verwezen door hun 'hardware'-pinnamen (dwz PORTD, enz.) niet door arduino-pinnen. Dat betekent dat pinnen 6, 7, 8, 9 en de 6 analoge in-pinnen (ook bekend als digitale i/o-pinnen 14-20) beschikbaar zijn.https://learn.adafruit.com/adafruit-wave-shield-audio- shield-for-arduino/faq*/#include "MonsterSounds.h"#define RESERVED_00 0 // Gereserveerd voor Serial RX#define RESERVED_01 1 // Gereserveerd voor Serial TX#define RESERVED_02 2 // Gereserveerd voor Wave Shield#define RESERVED_03 3 // Gereserveerd voor Wave Shield#define RESERVED_04 4 // Gereserveerd voor Wave Shield#define RESERVED_05 5 // Gereserveerd voor Wave Shield#define FOG_MACHINE 6 // Digitale pin op Arduino aansluiten op relaismodule#define RED_LEDS 7 // Digitale pin aansluiten op Arduino op relaismodule#define LID_BOUNCER 8 // Digitale pin op Arduino aansluiten op relaismodule#define RESERVED_09 9 // Digitale pin op Arduino aansluiten op relaismodule#define RESERVED_10 10 // Gereserveerd voor Wave Shield#define RESERVED_11 11 // Gereserveerd voor Wave Shield#define RESERVED_12 12 // Gereserveerd voor Wave Shield#define RESERVED_13 13 // Gereserveerd voor Wave Shield#define PIR_SENSOR A 0 // PIR Input#define MOTION_LED A1 // LED:licht op wanneer beweging wordt gedetecteerd (ongeacht de pauze/slaap/waaktoestand)#define PAUSED_LED A2 // LED:licht op wanneer het systeem is gepauzeerd#define READY_LED A3 // LED:licht op wanneer monster zich in de READY_TO_WAKE-status bevindt#define PAUSE_BUTTON A4 // Pauze Switch Input#define DEBUG_BUTTON A5 // Debug Switch Input// Effects Timer Settings - in Seconds (BEWERK DEZE)#define WAKE_DELAY 30 // Minimale tijd tussen 'wakker' komt voor in seconden#define WAKE_DELAY_DEBUG 10 // WAKE_DELAY overschrijven wanneer DEGUB-schakelaar is ingeschakeld#define SLEEP_SOUND_DELAY 1 // Aantal seconden wachten tussen pogingen om het volgende 'slaap'-geluid af te vuren#define WAKE_MIN 3 // Minimale 'wakker'-tijd in seconden#define WAKE_MAX 5 // Maximale hoeveelheid 'wakker' tijd in seconden#define RED_LIGHT_EXTRA_TIME 1 // Laat de rode lichten desgewenst iets langer branden dan de uitsmijter van het deksel#define SMOKE_EXTRA_TIME 2 // Laat de rook lopen een beetje langer dan de uitsmijter van het deksel, indien gewenst // Effecten Timers Settings - in milliseconden (DO NOT EDIT DEZE) #define WAKE_DELAY_MILLIS WAKE_DELAY * 1000 # definiëren WAKE_DELAY_DEBUG_MILLIS WAKE_DELAY_DEBUG * 1000 # definiëren SLEEP_SOUND_DELAY_MILLIS SLEEP_SOUND_DELAY * 1000 # define WAKE_MIN_MILLIS WAKE_MIN * 1000 # definiëren WAKE_MAX_MILLIS WAKE_MAX * 1000 # definiëren RED_LIGHT_EXTRA_TIME_MILLIS RED_LIGHT_EXTRA_TIME * 1000 # definiëren SMOKE_EXTRA_TIME_MILLIS SMOKE_EXTRA_TIME * 1000MonsterSounds klinkt;statisch niet-ondertekend lange timeSinceLastSnore=0;statisch niet-ondertekend lang wakeAllowedTimer =0;statisch niet-ondertekend lang lidBounceTimer =0;statisch niet-ondertekend lang lidBounceDuration =0;statisch niet-ondertekend lang smokeTimer =0;statisch niet-ondertekend lang smokeDuration =0;statisch niet-ondertekend lang redLightTimer =0;static unsigned long redLightDuration =0;enum States { STATE_INITIALIZE, // Alleen tijdens het uitvoeren van setup() en de eerste keer in loop() STATE_PAUSED, // Schakel alle geluiden en effecten uit STATE_SLEEPING, // Geen effecten, slaapgeluiden , staat niet toe dat wakker wordt geactiveerd STATE_READY_TO_WAKE, // Nee effecten, slaapgeluiden, maakt het mogelijk om wakker te worden STATE_AWAKE}; // Vuureffecten en monster wakker geluidenStates state =STATE_INITIALIZE; void setup () {// initialiseer seriële communicatie:Serial.begin (9600); // Stel alle relaispinnen in pinMode (LID_BOUNCER, OUTPUT); pinMode (RED_LEDS, UITGANG); pinMode (FOG_MACHINE, UITGANG); pinMode (PAUSED_LED, UITGANG); pinMode (MOTION_LED, UITGANG); pinMode (READY_LED, UITGANG); // Forceer alle effecten UIT stopAllEffects(); pinMode (PIR_SENSOR, INPUT); pinMode (PAUSE_BUTTON, INPUT_PULLUP); pinMode (DEBUG_BUTTON, INPUT_PULLUP); geluiden.initialize(); // Monster klinkt geluiden.playSystemReady(); vertraging (1000); Serieel.println(); Serial.print("*** Systeem gereed ***"); Serieel.println(); }/* * OPMERKING:Alle knoppen gebruiken pull-ups, dus LAAG betekent dat de knop is INGEDRUKT * Houd er rekening mee dat pull-up betekent dat de schakellogica omgekeerd is. * Het wordt HOOG wanneer het open is, en LAAG wanneer het wordt ingedrukt. * * De PIR-bewegingssensor gedraagt ​​zich NIET op deze manier. *//* * Hoofdverwerkingslus * - Beheert de Monster's State Machine */void loop() { boolean pauseSwitchClosed =digitalRead (PAUSE_BUTTON) ==LAAG; boolean motionDetected =digitalRead (PIR_SENSOR) ==HOOG; digitalWrite (MOTION_LED, digitalRead (PIR_SENSOR)); switch (state) { case STATE_INITIALIZE:if (pauseSwitchClosed) { goToPause(); } else { goToSleep(); } pauze; case STATE_PAUSED:if (!pauseSwitchClosed) { goToSleep(); digitalWrite (PAUSED_LED, LAAG); } else { digitalWrite (PAUSED_LED, HOOG); } pauze; case STATE_SLEEPING:if (pauseSwitchClosed) { goToPause(); } else if ( isAllowedToWake()) { goToReadyToWake(); } else { processSleeping(); } pauze; case STATE_READY_TO_WAKE:if (pauseSwitchClosed) { goToPause(); digitalWrite (READY_LED, LAAG); } else if (motionDetected) { goToAwake(); digitalWrite (READY_LED, LAAG); } else { processSleeping(); } pauze; geval STATE_AWAKE:if (pauseSwitchClosed){ ​​goToPause(); } else if ( processAwakeAnimation() ) { goToSleep(); } // processAwakeAnimation() retourneert true wanneer alle animaties compleet zijn afgebroken; standaard:Serial.println ("ONBEKENDE STAAT"); pauze; // We zouden hier nooit moeten komen } }/* * Overgang naar de pauzestatus */inline void goToPause() { Serial.println("PAUSED"); staat =STATE_PAUSED; stopAlleEffecten(); sounds.stopAll();}/* * Overgang naar de slaapstand */inline void goToSleep() { Serial.println ("GA NAAR SLAAP"); staat =STAAT_SLEEPING; wakeAllowedTimer =millis();}/* * Overgang naar de toestand Klaar om te ontwaken * Dit is een speciaal geval van de slaaptoestand */inline void goToReadyToWake() { Serial.println("READY TO WAKE"); staat =STATE_READY_TO_WAKE; }/* * Overgang naar de Awake State * - Maak het monster wakker en verwerk de effecten en geluiden */inline void goToAwake() { Serial.println("AWAKE"); staat =STATE_AWAKE; wakeMonster();}/* * een cyclus van de SLAAP-activiteit verwerken * - Slaapgeluiden uitvoeren * - Slaaptimer bijwerken */inline void processSleeping() { if ((millis() - timeSinceLastSnore)> SLEEP_SOUND_DELAY_MILLIS) { sounds.playSnore( ); timeSinceLastSnore =millis(); }}/* * Bepaalt of het monster op dit moment wakker mag worden. * - Controleer de debug-schakelaar, als deze gesloten is, gebruiken we een kortere Wake Allowed Timer * - Monster moet een vooraf gedefinieerde minimale tijd slapen voordat het kan worden gewekt * - Verlicht LED wanneer het klaar is om te worden gewekt */inline boolean isAllowedToWake( ) {boolean isDebug =digitalRead (DEBUG_BUTTON) ==LAAG; unsigned long requiredDelay =WAKE_DELAY_MILLIS; if (isDebug) { requiredDelay =WAKE_DELAY_DEBUG_MILLIS; } boolean isAllowed =(millis() - wakeAllowedTimer)> requiredDelay; if (isAllowed) {digitalWrite(READY_LED, HIGH); } return isAllowed;}/* * Wake Monster * Start de Awake Animations * Speelt de Awake Sounds * * Roep dit EENMAAL aan om de WAKKER-status te starten. */void wakeMonster() {int activityDuration =random(WAKE_MIN_MILLIS, WAKE_MAX_MILLIS); // dit is hoe lang het monster actief zal zijn Serial.print(" wake duration:"); Seriële.afdruk (activiteitsduur); Serial.println(" ms "); bounceLid (activiteitsduur); flashRedLight (activityDuration + RED_LIGHT_EXTRA_TIME_MILLIS); activeSmoke (activityDuration + SMOKE_EXTRA_TIME_MILLIS); sounds.playRoar();} /* * Beheert de voortgang van de AWAKE-animaties * Roep dit ELKE CYCLUS aan tijdens de AWAKE-status. * Retourneert TRUE wanneer alle animaties voltooid zijn */boolean processAwakeAnimation(){ printTimersToLog(); boolean gedaan1 =onwaar; boolean done2 ​​=false; boolean done3 =false; if (millis() - lidBounceTimer> lidBounceDuration) { bounceLid(0); gedaan1 =waar; } if (millis() - redLightTimer> redLightDuration ) { flashRedLight(0); gedaan2 =waar; } if (millis() - smokeTimer> smokeDuration ) { activeSmoke(0); klaar3 =waar; } return done1 &&done2 ​​&&done3;}/* * Beheer effect:stuiter het deksel van de doos * - diration is het aantal milliseconden dat het effect moet worden uitgevoerd * - duur van 0 betekent dat het effect moet worden gestopt */inline void bounceLid(unsigned lange duur){ if (duur <=0) { energizeRelay(LID_BOUNCER); lidBounceDuration =0; } else { // start het deksel stuiterend de_energyRelay (LID_BOUNCER); lidBounceTimer =millis(); lidBounceDuration =duur; }}/* * Effect beheren:rode flitsen * - diration is het aantal milliseconden dat het effect moet worden uitgevoerd * - duur van 0 betekent dat het effect moet worden gestopt */inline void flashRedLight (unsigned long duration){ if (duur <=0) { bekrachtig relais (RED_LEDS); redLightDuration =0; } else { // start het lampje knippert de_energyRelay (RED_LEDS); redLightTimer =millis(); redLightDuration =duur; } }/* * Start/stop-effect:rook activeren * - diration is het aantal milliseconden dat het effect moet worden uitgevoerd * - duur van 0 betekent dat het effect moet worden gestopt */ inline void activeSmoke (unsigned long duration) { // ' druk op de rookknop // duur moet een vaste hoeveelheid tijd zijn die de machine nodig heeft om op de actie te reageren // stel een time-out in om te stoppen na duur if (duur <=0) { energizeRelay(FOG_MACHINE); rookduur =0; } else { // start het lampje knippert de_energyRelay (FOG_MACHINE); smokeTimer =millis(); rookDuur =duur; } }/* * Stop alle effecten * - Dit zet het monster effectief uit */inline void stopAllEffects(){ bounceLid(0); flitsRoodlicht(0); activeSmoke(0);}/* * Drukt de Awake Animation-timers één keer per seconde af naar het logboek */inline void printTimersToLog() { static unsigned long timeofLastTimerLog =0; if (millis() - timeofLastTimerLog>=1000) { Serial.print(" lid:"); Serial.print( (millis()-lidBounceTimer)> lidBounceDuration ? 0 :(lidBounceDuration -(millis()-lidBounceTimer) )); Serial.print(" licht op:"); Serial.print( (millis()-redLightTimer)> redLightDuration ? 0:(redLightDuration -(millis()-redLightTimer)) ); Serial.print(" rook:"); Serial.println( (millis()-smokeTimer)> smokeDuration ? 0 :(smokeDuration -(millis()-smokeTimer) ) ); timeofLastTimerLog =millis(); }}/* * Activeer relais * Stelt de normaal open (NO)-aansluiting in op OPEN * Normaal gesloten wordt gesloten */ inline leegte energizeRelay (int kanaal) { digitalWrite (kanaal, HOOG); }/* * Ontspanningsrelais * Stelt de normaal open (NO)-aansluiting in op GESLOTEN. * Normaal Gesloten wordt OPEN */ inline void de_energyRelay (int kanaal) { digitalWrite (kanaal, LAAG); }
MonsterSounds.hC/C++
Arduino-header voor de bibliotheek met monstergeluiden
/* OPMERKING OVER ARDUINO-PINNEN * Pinnen 13, 12, 11 worden altijd gebruikt door de SD-kaart (zij zijn de enige pinnen met een snelle SPI-interface). * Dan zijn er nog 5 andere pinnen die worden gebruikt om met de DAC en SD-kaart te praten, maar ze kunnen worden ingesteld om verbinding te maken met elke Arduino-pin. * De bibliotheek is echter standaard geconfigureerd om pinnen 10 (voor SD-kaart) en pinnen 2, 3, 4 en 5 voor de DAC te gebruiken. * Om deze pinnen te wijzigen, moet de bibliotheek worden aangepast - naar de pinnen wordt verwezen door hun 'hardware'-pinnamen (dwz PORTD, enz.) niet door arduino-pinnen. * Dat betekent dat pinnen 6, 7, 8, 9 en de 6 analoge in-pinnen (ook bekend als digitale i/o-pinnen 14-20) beschikbaar zijn. * */ #include #include #include #include  static const char roar0[] ="ROAR0000.wav"; static const char roar1[] ="ROAR0001.wav"; static const char roar2[] ="ROAR0002.wav"; statische 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"; statische const char * const sleepSounds [] ={sleep0, sleep1, sleep2}; int previousRoarSound =-1; klasse MonsterSounds { privé:SdReader-kaart; // Dit object bevat de informatie voor de kaart FatVolume vol; // Dit bevat de informatie voor de partitie op de kaart FatReader root; // Dit bevat de informatie voor het FatReader-bestand in de hoofdmap van de volumes; // Dit object vertegenwoordigt het WAV-bestand voor een zin WaveHC-golf; // Een enkel golfobject -- er wordt slechts één geluid tegelijk afgespeeld void playfile (char *name); public:void initialize(); void playSystemReady(); void playRoar(); void playSnore(); ongeldig stopAll();};
MonsterSounds.inoC/C++
Arduino-code voor de bibliotheek met monstergeluiden
/* OPMERKING OVER ARDUINO-PINNEN * Pinnen 13, 12, 11 worden altijd gebruikt door de SD-kaart (zij zijn de enige pinnen met een snelle SPI-interface). * Dan zijn er nog 5 andere pinnen die worden gebruikt om met de DAC en SD-kaart te praten, maar ze kunnen worden ingesteld om verbinding te maken met elke Arduino-pin. * De bibliotheek is echter standaard geconfigureerd om pinnen 10 (voor SD-kaart) en pinnen 2, 3, 4 en 5 voor de DAC te gebruiken. * Om deze pinnen te wijzigen, moet de bibliotheek worden aangepast - naar de pinnen wordt verwezen door hun 'hardware'-pinnamen (dwz PORTD, enz.) niet door arduino-pinnen. * Dat betekent dat pinnen 6, 7, 8, 9 en de 6 analoge in-pinnen (ook bekend als digitale i/o-pinnen 14-20) beschikbaar zijn. * */ void MonsterSounds::initialize(){ Serial.println("Geluiden initialiseren..."); if(!card.init()) Serial.println(F("Kaart init. mislukt!")); if(!vol.init(kaart)) Serial.println(F("Geen partitie!")); if(!root.openRoot(vol)) Serial.println(F("Kan map niet openen")); Serial.println(F("Bestanden gevonden:")); wortel.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 =willekeurig (3); } previousRoarSound =index; this->playfile(roarSounds[index]);}void MonsterSounds::playSnore(){ if (!wave.isplaying) // Onderbreek een bestaand geluid niet met snurken {int index =random(3); // 0, 1, 2 dit->afspeelbestand (sleepSounds[index]); }}nietig MonsterSounds::stopAll(){ wave.stop(); // Stop een WAV die momenteel wordt afgespeeld}// --------------------------------------- ----------------------------// playfile() // Open en speel een WAV-bestand af// ------ -------------------------------------------------- -----------void MonsterSounds::playfile(char *name) { PgmPrint("Geluid afspelen:"); Serial.println(naam); if (wave.isplaying) {// speelt al iets, dus stop ermee! golf.stop(); // stop it } if (!file.open(root, name)) { PgmPrintln("Bestand niet gevonden"); opbrengst; } if (!wave.create(file)) { PgmPrintln("Geen geldige WAV"); opbrengst; } // oke tijd om te spelen! wave.play();}

Aangepaste onderdelen en behuizingen

monstersounds_7vLZD3NU4t.zip

Schema's


Productieproces

  1. EEG Machine
  2. Juice Box
  3. Automaat
  4. Apparaat wijzigen
  5. Naaimachine
  6. Panty
  7. Maak thuis een zelfgemaakte schrijfmachine voor huiswerk
  8. Giftduino - De perfecte Arduino-geschenkdoos
  9. ULTRASONE LEVITATION-machine die ARDUINO gebruikt
  10. Arduino + ESP-weerbox
  11. Digital Watch op Arduino met behulp van een Finite State Machine