Stap 8: de Arduino schets
Ik wilde eigenlijk een waarzegster die meer persoonlijkheid dan de gemiddelde machine, hebben zou dus heb ik besloten dat ik kunnen zijn zou zodat de gebruiker kan de sfeer van de waarzegster selecteren. In de sketch, zijn de wave-bestanden opgedeeld in verschillende secties. Moet u de namen in de schets na uw bestanden hernoemen of naam uw geluidsbestanden niet groter nadat de bestandsnamen in de tekening weergegeven. Dus bijvoorbeeld, zijn de normale fortuinen 1-14 (geval 1-14) genoemd. De sarcastische fortuinen heten 15s-29 's (geval 15-29), enzovoort & enzovoort. Wanneer u uw SD-kaart met geluidsbestanden laadt, moet u de naam van uw bestanden dienovereenkomstig wijzigen. Dus als u ging deze schets zoals is, zodat een Beatles-jukebox gebruiken, zou u moeten hernoemen Hey Jude "1" (dat is 1, niet 1.wav).Hier moet u het schild van de Golf, de Arduino en een SD-kaart. Ook moet u de bibliotheek voor WaveHC te installeren. Er zijn instructies op de website van Adafruit over hoe goed uw audiobestanden te converteren naar de juiste indeling voor de Wave shield. Ik gebruikte Audacity voor dit, omdat er tal van opties zijn voor het wijzigen van het geluid van de bestanden in Audacity, en ook omdat ik echt niet de waarzegster te klinken wilde zoals mij.
Er zijn slechts een paar digitale pinnen beschikbaar, omdat de wave shield moet enkele van de pinnen om te communiceren met de Arduino. In mijn schets gebruikte ik pinnen 6,7,8, & 9, evenals analoge pin 5. De schets lawaai van analoge pin 0 voor een meer willekeurige audio selectie gebruikt. Mijn project maakt gebruik van twee verschillende lichtbronnen. In de sketch zijn dit leduvPin & ledstrobePin. Het gebruikt ook een pincode voor motorische controle (pin 9) & een pin voor de betaalautomaat (pin 8), met het label van de knop in de schets. De pot is aangesloten op de analoge pin 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;
Kaart van de SdReader; Dit object bevat de gegevens voor de kaart
FatVolume vol; Dit houdt de informatie voor de partitie op de kaart
FatReader wortel; Dit bevat de gegevens voor het bestandssysteem op de kaart
F FatReader; Dit bevat de gegevens voor het bestand we aan het spelen bent
WaveHC Golf; Dit is de enige Golf (audio) object, omdat we zullen slechts één filter tegelijk spelen
#define MOTOR 9
#define knop 8
#define LED 13
int val = 0;
int potvalue = 0;
lange randNum;
deze handige functie geeft het aantal bytes in het RAM, momenteel gratis groot voor debugging!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
Als (__brkval (int) == 0) {}
FREE_MEMORY = ((int) & free_memory)-((int) & __bss_end);
}
else {}
FREE_MEMORY = ((int) & free_memory)-((int) __brkval);
}
Return free_memory;
}
VOID sdErrorCheck(void)
{
Als (! card.errorCode()) keren;
putstring ("\n\rSD I/O fout:");
Serial.Print(Card.ErrorCode(), HEX);
putstring (",");
Serial.println(Card.errorData(), HEX);
while(1);
}
VOID Setup {}
seriële poort instellen
Serial.begin(9600);
pinMode (knop, INPUT);
pinMode (LED, uitvoer);
pinMode (leduvPin, OUTPUT);
pinMode (ledstrobePin, OUTPUT);
randomSeed(analogRead(0));
digitalWrite (knop, hoge);
pinMode (MOTOR, uitvoer);
putstring ("vrije RAM:"); Dit kan helpen met het opsporen van fouten, uit RAM lopend is slecht
Serial.println(freeRam()); Als dit onder 150 bytes kan het problemen magie!
De pennen voor de DAC-besturingselement instellen Deze pennen zijn gedefinieerd in de bibliotheek
pinMode (2, OUTPUT);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
Als (! card.init(true)) {//play met 4 MHz spi als 8MHz niet voor u werkt
Als (! card.init()) {//play met 8 MHz spi (standaard sneller!)
putstring_nl ("Card init. mislukt!"); Er ging iets mis, laat uitprinten waarom
sdErrorCheck();
while(1); vervolgens 'stoppen' - niets doen!
}
inschakelen optimaliseren lees - sommige kaarten kunnen timeout. Uitschakelen als u problemen ondervindt
card.partialBlockRead(true);
Nu gaan we voor een FAT-partitie!
uint8_t deel;
voor (deel = 0; deel < 5; deel ++) {/ / Wij hebben maximaal 5 "slots" om in te kijken
Als (vol.init (kaart, deel))
breken; We vonden een, laat borgtocht
}
Als (deel == 5) {/ / als we uiteindelijk niet het vinden van een :(
putstring_nl ("geen geldige FAT-partitie!");
sdErrorCheck(); Er ging iets mis, laat uitprinten waarom
while(1); vervolgens 'stoppen' - niets doen!
}
Laat de gebruiker te vertellen over wat we gevonden
putstring ("Using partitie");
Serial.Print (deel, DEC);
putstring (", type is vet");
Serial.println(vol.fatType(),DEC); FAT16 of FAT32?
Probeert te openen van de root directory
Als (! root.openRoot(vol)) {}
putstring_nl ("kan niet openen root dir!"); Er ging iets mis,
while(1); vervolgens 'stoppen' - niets doen!
}
Oef! Daar kregen we voorbij de harde delen.
putstring_nl("Ready!");
/ * TCCR2A = 0;
TCCR2B = 1 << CS22 | 1 << CS21 | 1 << CS20;
Timer2 Overflow Interrupt Enable
TIMSK2 | = 1 << TOIE2;
*/
}
void loop
{
Val = digitalRead(BUTTON);
potvalue = analogRead(5);
Serial.println (potvalue, DEC);
Als (val == HIGH & & potvalue > = 0 & & potvalue < = 4)
{
randNum = willekeurige (1, 14);
delay(1000);
schakelaar (randNum)
{
Case 1:
Serial.println(1);
playcomplete("1.wav");
breken;
Case 2:
Serial.println(2);
playcomplete("2.wav");
breken;
Case 3:
Serial.println(3);
playcomplete("3.wav");
breken;
Case 4:
Serial.println(4);
playcomplete("4.wav");
breken;
Case 5:
Serial.println(5);
playcomplete("5.wav");
breken;
Case 6:
Serial.println(6);
playcomplete("6.wav");
breken;
Case 7:
Serial.println(7);
playcomplete("7.wav");
breken;
zaak 8:
Serial.println(8);
playcomplete("8.wav");
breken;
Case 9:
Serial.println(9);
playcomplete("9.wav");
breken;
zaak 10:
Serial.println(10);
playcomplete("10.wav");
breken;
zaak 11:
Serial.println(11);
playcomplete("11.wav");
breken;
zaak 12:
Serial.println(12);
playcomplete("12.wav");
breken;
zaak 13:
Serial.println(13);
playcomplete("13.wav");
breken;
geval 14:
Serial.println(14);
playcomplete("14.wav");
breken;
standaard:
breken;
}
}
Als (val == HIGH & & potvalue > = 5 & & potvalue < = 15)
{
randNum = willekeurige (15, 29);
delay(1000);
schakelaar (randNum)
{
Case 15:
Serial.println(15);
playcomplete ("15s. WAV");
breken;
case 16:
Serial.println(16);
playcomplete ("16s. WAV");
breken;
koffer 17:
Serial.println(17);
playcomplete ("17s. WAV");
breken;
Case 18:
Serial.println(18);
playcomplete ("18s. WAV");
breken;
Case 19:
Serial.println(19);
playcomplete ("19s. WAV");
breken;
Case 20:
Serial.println(20);
playcomplete ("20s. WAV");
breken;
Case 21:
Serial.println(21);
playcomplete ("21s. WAV");
breken;
Case 22:
Serial.println(22);
playcomplete ("22s. WAV");
breken;
Case 23:
Serial.println(23);
playcomplete ("23s. WAV");
breken;
Case 24:
Serial.println(24);
playcomplete ("24s. WAV");
breken;
Case 25:
Serial.println(25);
playcomplete ("25s. WAV");
breken;
Case 26:
Serial.println(26);
playcomplete ("26s. WAV");
breken;
Case 27:
Serial.println(27);
playcomplete ("27s. WAV");
breken;
Case 28:
Serial.println(28);
playcomplete ("28s. WAV");
breken;
Case 29:
Serial.println(29);
playcomplete "(29 's. WAV");
breken;
standaard:
breken;
}
}
Als (val == HIGH & & potvalue > = 16 & & potvalue < = 22)
{
randNum = willekeurige (30, 44);
delay(1000);
schakelaar (randNum)
{
Case 30:
Serial.println(30);
playcomplete ("30m. WAV");
breken;
Case 31:
Serial.println(31);
playcomplete ("31m. WAV");
breken;
Case 32:
Serial.println(32);
playcomplete ("32m. WAV");
breken;
Case 33:
Serial.println(33);
playcomplete ("33m. WAV");
breken;
Case 34:
Serial.println(34);
playcomplete ("34m. WAV");
breken;
Case 35:
Serial.println(35);
playcomplete ("35m. WAV");
breken;
Case 36:
Serial.println(36);
playcomplete ("36m. WAV");
breken;
case 37:
Serial.println(37);
playcomplete ("37m. WAV");
breken;
Case 38:
Serial.println(38);
playcomplete ("38m. WAV");
breken;
Case 39:
Serial.println(39);
playcomplete ("39m. WAV");
breken;
case 40:
Serial.println(40);
playcomplete ("40m. WAV");
breken;
Case 41:
Serial.println(41);
playcomplete ("41m. WAV");
breken;
Case 42:
Serial.println(42);
playcomplete ("42m. WAV");
breken;
Case 43:
Serial.println(43);
playcomplete ("43m. WAV");
breken;
case 44:
Serial.println(44);
playcomplete ("44m. WAV");
breken;
standaard:
breken;
}
}
Als (val == HIGH & & potvalue > = 23 & & potvalue < = 1023)
{
randNum = willekeurige (45, 60);
delay(1000);
schakelaar (randNum)
{
Case 45:
Serial.println(45);
playcomplete("45.wav");
breken;
Case 46:
Serial.println(46);
playcomplete ("46e. WAV");
breken;
Case 47:
Serial.println(47);
playcomplete ("47e. WAV");
breken;
Case 48:
Serial.println(48);
playcomplete ("48e. WAV");
breken;
Case 49:
Serial.println(49);
playcomplete ("49e. WAV");
breken;
Case 50:
Serial.println(50);
playcomplete ("50e. WAV");
breken;
Case 51:
Serial.println(51);
playcomplete ("51e. WAV");
breken;
Case 52:
Serial.println(52);
playcomplete ("52e. WAV");
breken;
Case 53:
Serial.println(53);
playcomplete ("53e. WAV");
breken;
Case 54:
Serial.println(54);
playcomplete ("54e. WAV");
breken;
Case 55:
Serial.println(55);
playcomplete ("55e. WAV");
breken;
Case 56:
Serial.println(56);
playcomplete ("56e. WAV");
breken;
Case 57:
Serial.println(57);
playcomplete ("57e. WAV");
breken;
Case 58:
Serial.println(58);
playcomplete ("58e. WAV");
breken;
Case 59:
Serial.println(59);
playcomplete ("59e. WAV");
breken;
Case 60:
Serial.println(60);
playcomplete ("60e. WAV");
breken;
standaard:
breken;
}
}
}
Speelt een volledige bestand van begin tot eind met geen pauze.
ongeldig playcomplete(char *name) {}
Bel onze helper vinden en spelen deze naam
playfile(name);
terwijl (wave.isplaying) {}
digitalWrite (MOTOR, hoge);
Flash (20, delayPeriod);
digitalWrite (MOTOR, laag);
niets te doen tijdens het spelen van haar
}
nu zijn gedaan afspelen
}
VOID flitser (int numFlashes, int d)
{
for (int i = 0; ik < numFlashes; ik ++)
{
digitalWrite (ledstrobePin, hoge);
digitalWrite (leduvPin, laag);
vertraging (d);
digitalWrite (ledstrobePin, laag);
digitalWrite (leduvPin, hoge);
vertraging (d);
digitalWrite (ledstrobePin, laag);
digitalWrite (leduvPin, laag);
}
}
ongeldig playfile(char *name) {}
Zie als de Golf-object is momenteel bezig met iets
Als (wave.isplaying) {}
Flash (20, delayPeriod) ;// al het spelen van iets, dus stoppen met het!
Wave.stop(); Stop ermee
}
kijken in de root directory en open het bestand
Als (! f.open (root, naam)) {}
putstring kon niet ("open bestand"); Serial.Print(name); terugkeer;
}
OK lees het bestand en zet hem in een golf-object
Als (! wave.create(f)) {}
putstring_nl ("niet een geldig WAV"); terugkeer;
}
OK tijd om te spelen! Start het afspelen
Wave.Play();
}