Bygge en Arduino Pest Repeller på Linux (Part 2)

I del to av denne serien vi laster og teste vår krabat-skremmer Arduino skisse, og spille skumle bevegelsesaktiverte lyder. . Først la oss gå tilbake til del 1 og dissekere vår enkle EZ1 sensor-testing skisse


En Arduino skisse inneholder to nødvendige funksjoner: setup () og loop (). setup () inneholder kode som du ønsker å kjøre en gang i begynnelsen av din skisse, som pin moduser og initialisering maskinvare. I vår ez1_measure.ino skissen setter vi vår dataoverføringshastigheten i setup (). Vi setter en seriell port hastighet selv om vår Arduino er koblet til med en USB-kabel, fordi det fortsatt er en seriell port, en skikkelig UART (Universal Asynchronous Receiver /Transmitter), og den støtter standard serieport hastigheter: 300, 1200, 2400 , 4800, 9600, 14400, 19200, 28800, 38400, 57600, eller 115200 baud. Og det er derfor den Arduino IDE har en seriell monitor hvor vi kan se resultatet av våre skisser.

loop () inneholder programmet vårt, og det kalles loop () fordi det går om og om igjen til vi trekker pluggen. Så vi må finne ut hvordan du kan lage en lyd spill bare når noen avskjærer EZ1 sonar strålen, og så stoppe etter å ha spilt en gang.

loop () begynner med å erklære to variabler, a0value og tommer. Dette er vilkårlige søkeord oppfunnet for denne skissen, og er ikke reservert søkeord. a0value holder verdien fanget fra Analog Pin # 0, og inches innehar den endelige verdien av beregnet avstanden til et objekt. float er et reservert nøkkelord, en innebygd datatype for flyttall, som er tall med desimaler.

analogRead () er en innebygd funksjon for å lese verdier fra de analoge nålene.
< p> Serial.print () er en innebygd funksjon som skriver ut tekststrenger, som er vedlagt i enkle eller doble anførselstegn, for seriellporten.

Serial.println () er en innebygd funksjon som skriver verdiene av datatyper.

forsinkelse () er en innebygd funksjon som definerer lengden på en pause, i millisekunder, så i ez1_measure.ino skisse vi har tre sekunder forsinkelse mellom hver sensor lesing.

Hvordan blir noen skal vite alt dette? Bare ta kontakt med nydelig Arduino språket referanse på Arduino.cc, den offisielle Arduino nettstedet.

The Complete CritterScare Sketch

Mind din linjeskift når du kopierer denne sketch-- //bare kommenterer ut en enkelt linje, så hvis du ved et uhell setter inn noen linjeskift vil det ikke fungere.

Og nå, se, komplett CritterScare Sketch.

 //CritterScare.ino. Spiller skumle lydeffekter //når en hjort eller annet freeloader kommer innenfor //24 inches av sonar avstandsmåler # inkluderer < FatReader.h > #include < SdReader.h > #include < avr /pgmspace.h > #include "WaveUtil.h" #include "WaveHC.h" SdReader kort; FatVolume vol; FatReader rot; FatReader f; WaveHC bølge; //erklærer funksjoner; funksjons kropper er //under loop () functionint FreeRAM (void); void sdErrorCheck (void); void playfile (char * navn); void playfile (char * navn); //setup () er et obligatorisk Arduino functionvoid setup () {Serial.begin (9600); Serial.print ("\\ nDet seriell port er satt til 9600 baud \\ nWelcome til CritterScare Sketch.!"); Serial.print ("\\ nDu har"); Serial.println (FreeRAM ()); Serial.print ("byte med ledig RAM."); //Sett utdatastrømpunkt for DAC kontroll pinMode (2 UTGANG); pinMode (3, OUTPUT); pinMode (4, UTGANG); pinMode (5, UTGANG); hvis {Serial.print ("\\ nCard init mislyktes.!") (card.init ()!); sdErrorCheck (); mens (1); } //Aktivere optimalisere lese - noen kort kan timeout. //Deaktiver hvis du har problemer card.partialBlockRead (true); //Nå skal vi se etter en FAT partisjon! uint8_t del; for (en del = 0; del < 5; del ++) {if (vol.init (kort del)) break; } If (del == 5) {putstring_nl ("Beklager, det er ingen gyldig FAT partisjon!"); sdErrorCheck (); mens (1); } //Skriv ut partisjon og filsystem informasjon Serial.print ("\\ nI'm hjelp partisjon"); Serial.print (del, DEC); Serial.print ("på SD-kortet, og filsystemet typen er FAT"); Serial.println (vol.fatType (), DEC); //Prøv å åpne rotkatalogen hvis {Serial.print (root.openRoot (vol)!) ("\\ NCan't open root dir!"); mens (1); } //Puh! Vi kom forbi de vanskelige delene. Serial.print ("\\ nEverything sjekker ut, så la oss komme i gang \\ n");} //loop () er en nødvendig Arduino funksjon //konvertere spenning fra sensoren til inchesvoid loop () {float a0value = analogRead (0); flyte inches = 0,496 * a0value; Serial.print ("\\ nDet verdi fanges fra pin A0 er:"); Serial.println (a0value); Serial.print ("\\ nDet avstand i inches er"); Serial.println (inches); forsinkelse (3000); int avspilling = 0; if (inches < 24 & & avspilling == 0) {avspilling = 1; playcomplete ("COYOTEHOWL.WAV"); } Else if (inches < 24 & & avspilling == 0) {} else {avspilling = 0; wave.stop (); }} //Og nå de andre funksjons organer //denne hendige funksjonen vil returnere antall //byte for tiden gratis i RAM, flott for debugging! int FreeRAM (void) {extern int __bss_end; extern int * __ brkval; int free_memory; if ((int) __ brkval == 0) {free_memory = ((int) & free_memory) - ((int) & __ bss_end); } Else {free_memory = ((int) & free_memory) - ((int) __ brkval); } Returnere free_memory; (! Card.errorCode ())} void sdErrorCheck (void) {if tilbake; Serial.print ("\\ n \\ RSD I /O error:"); Serial.println (card.errorCode (), HEX); Serial.print (""); Serial.println (card.errorData (), HEX); while (1);} //Spiller en WAV-fil fra begynnelse til slutt uten pause.void playcomplete (char * navn) {//ringe vår hjelper å finne og spille dette navnet playfile (navn); while (wave.isplaying) {//gjør noe annet}} void playfile (char * navn) {//se om bølgen objektet er for tiden gjør noe hvis (wave.isplaying) {wave.stop (); } //Ser i rotkatalogen, og åpne filen if (f.open (root, navn)) {Serial.print ("\\ nCouldn't åpne fil"); Serial.println (navn); komme tilbake; } //OK lese filen og slå den inn i en bølge objekt hvis {Serial.print ("\\ nnot en gyldig WAV") (wave.create (f)!); komme tilbake; } //Ok tid til å spille! starte avspilling wave.play ();} 
Hvordan fungerer det

De fleste av koden i denne skissen er satt opp og feilkontroller. Sløyfen () -funksjonen er der vi forteller det hva du skal gjøre, så la oss dissekere det.

Vi er allerede kjent med de sju første linjene, som er repurposed fra ez1_measure.ino.

neste bit er der magien skjer for å spille av lydfilen bare én gang og deretter stoppe, og ikke spille det igjen før utløst av sensoren. To vilkår må være oppfylt for å spille av filen: en krabat må være innen 24 inches eller nærmere, og filen må ikke allerede spiller

Først initial verdien av avspilling (et vilkårlig navn og ikke et reservert nøkkelord. ) til null, noe som betyr at ikke spiller:

 int avspilling = 0; 

Deretter satt opp vilkårene for å utløse avspilling: et objekt innen 24 inches eller nærmere, og verdien av avspilling er på null , noe som betyr at filen ikke allerede spiller. Når disse to betingelsene er oppfylt deretter tildele en som verdien av avspilling, noe som betyr lek, og angi hvilke lydfilen å spille:

 if (inches < 24 & & avspillings == 0) {avspilling = 1; playcomplete ("COYOTEHOWL.WAV"); } 

Når skummelt filen er allerede spiller, tilordne verdi på null å spille, slik at det vil stoppe når den når slutten:

 else if (inches < 24 & & avspilling = ! = 0) {} else {avspilling = 0; wave.stop (); } 

Da er det reset og venter på de to forholdene å utløse avspilling til å skje igjen. Det finnes andre måter å gjøre dette, selvfølgelig, så gjerne dele dine egne ideer i kommentarfeltet. Figur 2 viser hvordan det ser ut i aksjon:


Vel alrighty da, som gjør det for nå! Vennligst nyte dette prosjektet, og hvis du har spørsmål ta kontakt Resources

Resources

Ladyada.net Arduino TutorialsArduino språk referenceAn utmerket innføringsbok for nybegynnere er Programmering Arduino. Komme i gang med skisser av Simon Monk, og Arduino Cookbook, er andre utgave av Michael Margolis flott hvis du allerede vet litt om elektronikk og en smidgen av C programmering. Anmeldelser