Multi personlighet Fortune teller (8 / 12 steg)
Steg 8: Arduino skiss
Jag ville verkligen en spåkvinnan som skulle ha mer personlighet än genomsnittliga maskinen, så jag bestämde mig att jag skulle göra det så att användaren kan välja stämningen i spåkvinnan. I skissen, är wave-filer uppdelade i olika avdelningar. Måste du antingen namnge dina ljudfiler efter filnamn visas i skissen eller byta namn på namnen i skissen efter dina filer. Så till exempel heter normala öden 1-14 (fall 1-14). Sarkastisk öden heter 15s-29s (fall 15-29), så vidare och så vidare. När du laddar ditt SD-kort med ljudfiler, måste du byta namn på filerna därefter. Så om du skulle använda denna skiss som, för att göra en Beatles jukebox, skulle du behöva byta namn på Hey Jude "1" (det är 1, inte 1.wav).Du behöver den våg skölden, Arduino och ett SD-kort. Du kommer också behöva installera biblioteket för WaveHC. Det finns instruktioner på Adafruit webbplats om hur man korrekt konvertera dina ljudfiler till rätt format för Wave sköld. Jag använde Audacity för detta, eftersom det finns massor av alternativ för att ändra ljudet av filer i Audacity, och eftersom jag inte riktigt ville spåkvinnan till ljud som mig.
Det finns bara några digitala stiften eftersom wave sköld behöver några av stiften att kommunicera med Arduino. I min skiss använde jag pins 6,7,8 och 9, samt analoga stift 5. Skissen använder buller från analoga stift 0 för ett mera slumpmässigt ljud urval. Mitt projekt använder två olika ljuskällor. I skissen är dessa leduvPin & ledstrobePin. Den använder också en PIN-kod för motorstyrning (pin 9) & en PIN-kod för springan (pin 8), märkt knappen i skissen. Potten är kopplad till analoga stift 5.
#include < FatReader.h >
#include < SdReader.h >
#include < avr/pgmspace.h >
#include "WaveUtil.h"
#include "WaveHC.h"
int ledstrobePin = 7.
int leduvPin = 6;
int delayPeriod = 20;
SdReader kort; Detta objekt innehåller information för kortet
FatVolume vol; Detta innehåller information för partitionen på kortet
FatReader rot. Detta innehåller information för filsystemet på kortet
FatReader f; Detta innehåller information för filen vi är spelar
WaveHC våg; Detta är enda våg (audio)-objektet, eftersom vi bara kommer att spela en i taget
#define MOTOR 9
#define knappen 8
#define LED 13
int val = 0;
int potvalue = 0;
lång randNum;
Denna behändiga funktionen returnerar antalet byte för närvarande gratis i RAM, bra för felsökning!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
om ((int) __brkval == 0) {
free_memory = ((int) & free_memory)-((int) & __bss_end);
}
annat {
free_memory = ((int) & free_memory)-((int) __brkval);
}
återvända free_memory;
}
void sdErrorCheck(void)
{
om (! card.errorCode()) återvända;
putstring ("\n\rSD I/O fel:");
Serial.Print(Card.ErrorCode(), HEX);
putstring (",");
Serial.println(Card.errorData(), HEX);
While(1);
}
void setup() {
Ställ in serieporten
Serial.BEGIN(9600);
pinMode (knapp, indata);
pinMode (LED, OUTPUT);
pinMode (leduvPin, produktionen);
pinMode (ledstrobePin, produktionen);
randomSeed(analogRead(0));
digitalWrite (knappen, hög);
pinMode (MOTOR, OUTPUT);
putstring ("fri slå ned:"); Detta kan hjälpa till med felsökning, slut RAM är dålig
Serial.println(freeRam()); om detta är under 150 byte kan det stava problem!
Ställa in produktionen stift för DAC kontroll. Detta stift definieras i biblioteket
pinMode (2, utgång);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
om (! card.init(true)) {//play med 4 MHz spi om 8MHz inte fungerar för dig
om (! card.init()) {//play med 8 MHz spi (standard snabbare!)
putstring_nl ("kort init. misslyckades!"); Något gick fel, kan skriva ut varför
sdErrorCheck();
While(1); sedan 'stoppa' - gör ingenting!
}
Aktivera optimera Läs - vissa kort kan timeout. Inaktivera om du har problem
card.partialBlockRead(true);
Nu söker vi en FAT-partition!
uint8_t del;
för (del = 0; del < 5; del ++) {/ / vi har upp till 5 platser att titta i
om (vol.init (kort, del))
bryta; Vi hittade en, låter borgen
}
om (del == 5) {/ / om vi slutade inte att hitta en :(
putstring_nl ("ingen giltig FAT-partition!");
sdErrorCheck(); Något gick fel, kan skriva ut varför
While(1); sedan 'stoppa' - gör ingenting!
}
Kan tala om för användaren om vad vi hittade
putstring ("använda partition");
Serial.Print (del, DEC);
putstring (", typ är FAT");
Serial.println(Vol.fatType(),dec); FAT16 eller FAT32?
Försök öppna rotkatalogen
om (! root.openRoot(vol)) {
putstring_nl kan inte ("öppna rotfästa dir!"); Något gick fel,
While(1); sedan 'stoppa' - gör ingenting!
}
Usch! Vi fick tidigare de hårda delarna.
putstring_nl("ready!");
/ * TCCR2A = 0;
TCCR2B = 1 << CS22 | 1 << CS21 | 1 << CS20;
Timer2 spill Interrupt Enable
TIMSK2 | = 1 << TOIE2;
*/
}
void loop()
{
Val = digitalRead(BUTTON);
potvalue = analogRead(5);
Serial.println (potvalue, DEC);
om (val == hög & & potvalue > = 0 & & potvalue < = 4)
{
randNum = random (1, 14);
Delay(1000);
växel (randNum)
{
fall 1:
Serial.println(1);
playcomplete("1.wav");
bryta;
fall 2:
Serial.println(2);
playcomplete("2.wav");
bryta;
fall 3:
Serial.println(3);
playcomplete("3.wav");
bryta;
fall 4:
Serial.println(4);
playcomplete("4.wav");
bryta;
fall 5:
Serial.println(5);
playcomplete("5.wav");
bryta;
fall 6:
Serial.println(6);
playcomplete("6.wav");
bryta;
fall 7:
Serial.println(7);
playcomplete("7.wav");
bryta;
mål 8:
Serial.println(8);
playcomplete("8.wav");
bryta;
mål 9:
Serial.println(9);
playcomplete("9.wav");
bryta;
mål 10:
Serial.println(10);
playcomplete("10.wav");
bryta;
mål 11:
Serial.println(11);
playcomplete("11.wav");
bryta;
ärende 12:
Serial.println(12);
playcomplete("12.wav");
bryta;
ärende 13:
Serial.println(13);
playcomplete("13.wav");
bryta;
fall 14:
Serial.println(14);
playcomplete("14.wav");
bryta;
standard:
bryta;
}
}
om (val == hög & & potvalue > = 5 & & potvalue < = 15)
{
randNum = random (15, 29);
Delay(1000);
växel (randNum)
{
mål 15:
Serial.println(15);
playcomplete ("15s. WAV");
bryta;
fall 16:
Serial.println(16);
playcomplete ("16s. WAV");
bryta;
fall 17:
Serial.println(17);
playcomplete ("17s. WAV");
bryta;
fall 18:
Serial.println(18);
playcomplete ("18s. WAV");
bryta;
fall 19:
Serial.println(19);
playcomplete ("19s. WAV");
bryta;
mål 20:
Serial.println(20);
playcomplete ("20s. WAV");
bryta;
mål 21:
Serial.println(21);
playcomplete ("21s. WAV");
bryta;
fall 22:
Serial.println(22);
playcomplete ("22s. WAV");
bryta;
fall 23:
Serial.println(23);
playcomplete ("23s. WAV");
bryta;
fall 24:
Serial.println(24);
playcomplete ("24s. WAV");
bryta;
fall 25:
Serial.println(25);
playcomplete "(25 år. WAV");
bryta;
fall 26:
Serial.println(26);
playcomplete ("26s. WAV");
bryta;
fall 27:
Serial.println(27);
playcomplete ("27s. WAV");
bryta;
fall 28:
Serial.println(28);
playcomplete ("28s. WAV");
bryta;
fall 29:
Serial.println(29);
playcomplete ("29s. WAV");
bryta;
standard:
bryta;
}
}
om (val == hög & & potvalue > = 16 & & potvalue < = 22)
{
randNum = random (30, 44);
Delay(1000);
växel (randNum)
{
fall 30:
Serial.println(30);
playcomplete ("30m. WAV");
bryta;
fall 31:
Serial.println(31);
playcomplete ("31m. WAV");
bryta;
fall 32:
Serial.println(32);
playcomplete ("32m. WAV");
bryta;
fall 33:
Serial.println(33);
playcomplete ("33m. WAV");
bryta;
fall 34:
Serial.println(34);
playcomplete ("34m. WAV");
bryta;
fall 35:
Serial.println(35);
playcomplete ("35m. WAV");
bryta;
fall 36:
Serial.println(36);
playcomplete ("36m. WAV");
bryta;
fall 37:
Serial.println(37);
playcomplete ("37m. WAV");
bryta;
fall 38:
Serial.println(38);
playcomplete ("38m. WAV");
bryta;
Case 39:
Serial.println(39);
playcomplete ("39m. WAV");
bryta;
fall 40:
Serial.println(40);
playcomplete ("40m. WAV");
bryta;
fallet 41:
Serial.println(41);
playcomplete ("41m. WAV");
bryta;
fall 42:
Serial.println(42);
playcomplete ("42m. WAV");
bryta;
fall 43:
Serial.println(43);
playcomplete ("43m. WAV");
bryta;
fall 44:
Serial.println(44);
playcomplete ("44m. WAV");
bryta;
standard:
bryta;
}
}
om (val == hög & & potvalue > = 23 & & potvalue < = 1023)
{
randNum = random (45, 60);
Delay(1000);
växel (randNum)
{
mål 45:
Serial.println(45);
playcomplete("45.wav");
bryta;
fall 46:
Serial.println(46);
playcomplete ("46e. WAV");
bryta;
fall 47:
Serial.println(47);
playcomplete ("47e. WAV");
bryta;
fall 48:
Serial.println(48);
playcomplete ("48e. WAV");
bryta;
fall 49:
Serial.println(49);
playcomplete ("49e. WAV");
bryta;
fall 50:
Serial.println(50);
playcomplete ("50e. WAV");
bryta;
fallet 51:
Serial.println(51);
playcomplete ("51e. WAV");
bryta;
fall 52:
Serial.println(52);
playcomplete ("52e. WAV");
bryta;
fall 53:
Serial.println(53);
playcomplete ("53e. WAV");
bryta;
fall 54:
Serial.println(54);
playcomplete ("54e. WAV");
bryta;
fall 55:
Serial.println(55);
playcomplete ("55e. WAV");
bryta;
fall 56:
Serial.println(56);
playcomplete ("56e. WAV");
bryta;
fall 57:
Serial.println(57);
playcomplete ("57e. WAV");
bryta;
fall 58:
Serial.println(58);
playcomplete ("58e. WAV");
bryta;
fall 59:
Serial.println(59);
playcomplete ("59e. WAV");
bryta;
fall 60:
Serial.println(60);
playcomplete ("60e. WAV");
bryta;
standard:
bryta;
}
}
}
Spelar en full fil från början till slut med ingen paus.
void playcomplete(char *name) {
Ring vår hjälpare för att hitta och spela detta namn
playfile(Name);
samtidigt (wave.isplaying) {
digitalWrite (MOTOR, hög);
blixt (20, delayPeriod);
digitalWrite (MOTOR, låg);
göra ingenting samtidigt dess spelar
}
dess gjort spelar nu
}
void flash (int numFlashes, int d)
{
för (int jag = 0; jag < numFlashes; jag ++)
{
digitalWrite (ledstrobePin, hög);
digitalWrite (leduvPin, låg);
fördröjning (d);
digitalWrite (ledstrobePin, låg);
digitalWrite (leduvPin, hög);
fördröjning (d);
digitalWrite (ledstrobePin, låg);
digitalWrite (leduvPin, låg);
}
}
void playfile(char *name) {
se om objektet våg för närvarande gör något
om (wave.isplaying) {
blixt (20, delayPeriod) spelar ;// redan något, så sluta det!
Wave.stop(); Sluta
}
titta i rotkatalogen och öppna filen
om (! f.open (rot, namn)) {
putstring kunde inte ("öppna filen"); Serial.Print(Name); hemkomst.
}
OK läsa filen och förvandla det till en våg objekt
om (! wave.create(f)) {
putstring_nl ("inte en giltig WAV"); hemkomst.
}
OK dags att spela! starta uppspelningen
Wave.Play();
}