Hvordan bygge en egendefinert Arduino Talking Påminnelse Machine, del 2

I del 1 lærte vi om lodde brødfjel og DS1307 sanntidsklokke for å holde tiden på Arduino enheter. Nå kommer vi til å laste og teste komplett skisse for å spille bevegelsesaktiverte lyd påminnelser

Sette alt sammen

Sett SD-kortet med de innspilte meldinger. Betale regninger, leke med hundene, favoritt dikt, inspirerende sitater, favoritt songs-- alt du vil. Lydfilene må mono 22050Hz WAV-filer. Deretter prøve ut Påminnelse Machine skisse. Endre lydfil navn til lyd- filnavn, angi noen nær-framtid ganger, wave noe foran MaxBotix, og se hva som skjer.

 /* Arduino Påminnelse Machine * Spill lyd påminnelser, inspirerende * sitater, poesi, eller noe * du liker. Avspilling er utløst av * bevegelsessensor og tidsplan * /# inkluderer < FatReader.h > #include < SdReader.h > #include < avr /pgmspace.h > # include "WaveUtil.h" #include "WaveHC.h "#include < Wire.h > # include" RTClib.h "/* Variabler for å lese SD-kort * og utskrift filnavn * /SdReader kort; FatVolume vol; FatReader rot; FatReader f; WaveHC bølge; uint8_t dirLevel; dir_t dirBuf; #define feil (msg) error_P (PSTR (msg)) RTC_DS1307 RTC; void setup () {Serial.begin (9600); Wire.begin (); RTC.begin (); /* Begynn initialisering og sjekke SD-kort for feil * /putstring_nl ("\\ nLa oss begynne med å teste SD-kort og filer."); /* Test hvis kortet vil spille med standard 8 MHz SPI (Serial Peripheral Interface) busshastighet . Hvis den ikke gjør det, kommenter bort * "if (! Card.init ())" og uncomment "if (! Card.init (true))" * ///if (! Card.init (true)) {if (! card.init ()) {feil ("Card init mislyktes."); } /* Aktiver optimalisert leser - noen kort kan timeout. Deaktiver hvis du har problemer * /card.partialBlockRead (true); /* Nå vil vi lete etter en FAT partisjon * /uint8_t del!; for (en del = 0; del < 5; del ++) {if (vol.init (kort del)) break; } If (del == 5) {feil ("Beklager, jeg kunne ikke finne en gyldig FAT partisjon!"); } /* Skriv ut partisjonsinformasjon * /putstring ("jeg bruker partisjon"); Serial.print (del, DEC); putstring (", og filsystemet typen er FAT"); Serial.println (vol.fatType (), DEC); /* Kan rotkatalogen åpnes? Skrive ut en feil * beskjed hvis det ikke kan * /if {error. (Root.openRoot (vol)!) ("Kan ikke åpne root dir!"); } /* All right, alt ser bra ut. Skriv ut * filnavnene funnet på SD-kortet * /putstring_nl ("\\ nI fant disse filene på SD-kort: (* = fragmentert):."); root.ls (LS_R | LS_FLAG_FRAGMENTED); putstring_nl ("\\ nEverything sjekker ut, så la oss komme i gang \\ n");} /*** Slutt Initial og sjekk SD-kort for feil *** //* Begynn Påminnelse Machine skisse * Første visning klokkeslett, dato og * MaxBotix sensor verdi * /void loop () {Datetime nå = RTC.now (); int a0value = analogRead (0); Serial.print ("The lesing fra sensoren, hentet fra analog pin 0, er"); Serial.print (analogRead (0)); Serial.println (); Serial.print ("Den dagen i uken er"); Serial.print (now.dayOfWeek (), DEC); Serial.println (); Serial.println ("Dato og klokkeslett er:"); Serial.print (now.year (), DEC); Serial.print ('/'); Serial.print (now.month (), DEC); Serial.print ('/'); Serial.print (now.day (), DEC); Serial.print (''); Serial.print (now.hour (), DEC); Serial.print (':'); Serial.print (now.minute (), DEC); Serial.print (':'); Serial.println (now.second (), DEC); /*** Sluttdato, tid og sensor verdi skjerm *** //* Nå planlegger vi lydavspilling. Lyd spilles * når to vilkår er oppfylt: sensoren oppdager * bevegelse, og det er det planlagte tidspunktet * /if ((a0value < = 45) & & (now.hour () == 14)) {Serie .println ("\\ nNow spille: Walk the dogs \\ n"); playcomplete ("WALKDOGS.WAV"); forsinkelse (600 000); //ikke spille i 10 minutter} else if ((a0value < = 45) & & (now.day () == 5)) {Serial.println ("\\ nNow spille: Klipp plenen \\ n "); playcomplete ("MOWLAWN.WAV"); forsinkelse (600 000); } Else if ((a0value < = 45) & & (now.dayOfWeek () == 7) & & (now.hour () == 18)) {Serial.println ("\\ nNow spille: slappe av og lese en bok \\ n "); playcomplete ("READBOOK.WAV"); forsinkelse (600 000); } Else {Serial.print ("\\ nSorry, tallene samsvarer ikke Ingen musikk for deg \\ n \\ n.."); forsinkelse (30000); }} /*** Slutt avspilling tidsplan *** //* lydavspilling og feilfunksjoner * /void error_P (const char * str) {PgmPrint ("Feil:"); SerialPrint_P (str); sdErrorCheck (); while (1), (! 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);.} /* Spill en WAV-fil fra begynnelse til slutt uten pause * Spill kun én fil om gangen * /void playcomplete (char * navn) {playfile (navn); while (wave.isplaying) {}} void playfile (char * navn) {if (wave.isplaying) {wave.stop (); } If {Serial.print ("\\ nCouldn't åpne filen") (f.open (root, navn)!); Serial.println (navn); komme tilbake; } If {Serial.print ("\\ nnot en gyldig WAV") (wave.create (f)!); komme tilbake; } Wave.play ();} /*** slutt lydavspilling og feilfunksjoner *** //*** slutten skisse *** /
En vellykket start til

Når det begynner hell det vil si dette:

 La oss starte med å teste SD-kort og files.I'm bruker partisjon 1, og filsystemet typen er FAT32I fant disse filene på SD-kortet: (* = fragmentert): MOWLAWN.WAV WALKDOGS ! WAV READBOOK.WAV alt stemmer, så la oss komme i gang Lesningen fra sensor, hentet fra analog pin 0, er 11Den dagen i uken er 3the dato og klokkeslett er: 2014/5/21 15: 59: 35Sorry, tallene dine stemmer ikke overens. . Ingen musikk for deg 

Når vilkårene er oppfylt for å spille av en lydfil, dette er hva du vil se:

 Lese fra sensor, hentet fra analog pin 0, er 39The dag uke er 3the dato og klokkeslett er: 2014/5/21 16: 0: 11Now spille: Walk the dogs 

Koden som leser SD-kortet og kontrollerer lydavspilling kom fra WaveHC eksempel skisser. Dato og klokkeslett kode kom fra RTClib eksempel skisser. Nyttelasten i midten, loopen koden som styrer avspilling av lydfiler, er en enkel serie om - annet - hvis uttalelser. Du kan tilpasse denne skissen ved å redigere loop funksjon.

Du kan ikke ønsker dine purre filer til å spille hver gang du går forbi etter at de er utløst første gang, og det er en enkel måte å kontrollere dette med Arduino forsinkelse () -funksjonen. forsinkelse () tar en enkelt parameter av millisekunder, slik at 1000 er ett sekund. Hvis du setter forsinkelsen () verdi til 600 000, som er 10 minutter som din påminnelse ikke vil spille. Starter forsinkelsestid etter din WAVE filen slutter å spille.

Din a0value innstillingen bør spesifisere maksimal avstand slik at sensor ikke er satt av ved en motsatt vegg eller annen gjenstand som ikke trenger påminnelser.
< p> Eksemplene i skissen spille dine påminnelser i løpet av en periode på én time. Du kan begrense tidsperioden med minutter, slik:

 ((a0value > = 30) & & (now.hour () == 16) & & ((now.minute ( ) > = 0) & & (now.minute () < = 30))) 

Dette setter påminnelse for 04:00-04:30 Mind din parentes! De kan drive deg til vanvidd.

Denne skissen kan enkelt endres til å spille påminnelser bare på en tidsplan, eller bare når sensoren registrerer bevegelser, så ha det gøy å blande den opp.

Dette avslutter vår flott og morsomt prosjekt. Vennligst se delen Referanser å lære mer

Referanser

Hvordan bygge en egendefinert Arduino Talking Påminnelse Machine, del 1Ladyada.net Arduino TutorialsArduino språk referenceAn utmerket innføringsbok for nybegynnere er Programmering Arduino. Får Startet med Sketchesby Simon Monk, andArduino Cookbook, er andre Editionby Michael Margolis flott hvis du allerede vet litt om elektronikk og en smidgen av C programmering. Anmeldelser