Adivino de personalidad múltiples (8 / 12 paso)

Paso 8: el Arduino sketch

Realmente quería un adivino que más personalidad que la máquina promedio, así que decidí que lo haría por lo que el usuario puede seleccionar el estado de ánimo del adivino. En el bosquejo, los archivos se dividen en diferentes secciones. Usted necesitará nombrar tus archivos de sonido después de los nombres de archivo enumeran en el sketch o cambie el nombre los nombres en el bosquejo después de sus archivos. Por ejemplo, las fortunas normales se nombran 1-14 (caso 1-14). Las fortunas sarcásticas se denominan 15s-29s (caso 15-29), así sucesivamente y así sucesivamente. Cuando se carga la tarjeta SD con los archivos de sonido, necesitará cambiar el nombre de tus archivos en consecuencia. Así que si usted se va a utilizar este bosquejo, para hacer una máquina de discos de Beatles, tendría que cambiar el nombre de Hey Jude "1" (que es 1, no 1.wav).
Vas a necesitar el protector de la onda, el Arduino y una tarjeta SD. Usted también tendrá que instalar la biblioteca de WaveHC. Hay instrucciones en la Página Web de Adafruit sobre cómo convertir correctamente sus archivos de audio al formato adecuado para el protector de la onda. He utilizado Audacity para esto, ya que hay un montón de opciones para cambiar el sonido de los archivos de Audacity y también porque realmente no quería que el adivino al sonido como yo.
Hay sólo unos pocos pins digitales disponibles porque el protector de la onda necesita algunos de los pasadores para comunicarse con Arduino. En mi bosquejo, usé pernos 6,7,8 y 9, así como pin analógico 5. El dibujo utiliza el ruido del pin analógico 0 para una selección más aleatoria de audio. Mi proyecto utiliza dos diferentes fuentes de luz. En el bosquejo, son leduvPin y ledstrobePin. También utiliza un pin para control del motor (pin 9) y un pin para la ranura de moneda (pin 8), botón rotulado en el bosquejo. El bote está conectado al pin analógico 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;

Tarjeta SdReader;    Este objeto contiene la información de la tarjeta
FatVolume vol;    Contiene la información de la partición en la tarjeta
FatReader raíz;   Esto contiene la información para el sistema de archivos en la tarjeta
FatReader f;      Esto contiene la información del archivo estamos jugamos

Ola WaveHC;      Este es el único objeto (audio) de la onda, puesto que sólo jugaremos uno a la vez

#define MOTOR 9
#define tecla 8
#define LED 13

int val = 0;
int potvalue = 0;
randNum largo;

Esta práctica función devolverá el número de bytes actualmente libres en RAM, ideal para depuración!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
Si ((int) __brkval == 0) {}
free_memory = ((int) & free_memory)-((int) & __bss_end);
}
Else {}
free_memory = ((int) & free_memory)-((int) __brkval);
}
volver free_memory;
}

void sdErrorCheck(void)
{
Si (! card.errorCode()) retorno;
putstring ("\n\rSD I/O error:");
Serial.Print(Card.ErrorCode(), hexagonal);
putstring (",");
Serial.println(Card.errorData(), hexagonal);
while(1);
}

void setup() {}

Configurar puerto serie
Serial.Begin(9600);
pinMode (botón, entrada);
pinMode (LED, salida);
pinMode (leduvPin, salida);
pinMode (ledstrobePin, salida);
randomSeed(analogRead(0));
digitalWrite (botón, alto);
pinMode (MOTOR, salida);

putstring ("memoria RAM libre:");       Esto puede ayudar con la depuración, es malo quedarse sin RAM
Serial.println(freeRam());      Si es menor de 150 bytes escribe con problemas!

Configurar los pines de salida para el control de la DAC. Este los pernos se definen en la biblioteca
pinMode (2, salida);
pinMode (3, salida);
pinMode (4, salida);
pinMode (5, salida);

Si (! card.init(true)) {//play con spi de 4 MHz si 8MHz no funciona para usted
Si (! card.init()) {//play con spi de 8 MHz (por defecto más rápido!)
putstring_nl ("tarjeta init. no se pudo!");  Algo salió mal, permite imprimir por qué
sdErrorCheck();
while(1);                            entonces 'detener': ¡ no!
}

permiten optimizar la lectura - algunas tarjetas pueden tiempo de espera. Desactivar si tienes problemas
card.partialBlockRead(true);

Ahora buscaremos una partición FAT!
parte de uint8_t;
para (parte = 0; parte < 5; parte ++) {/ / tenemos hasta 5 ranuras en
Si (vol.init (tarjeta, parte))
rotura;                             encontró uno, permite la libertad bajo fianza
}
Si (parte == 5) {/ / si terminamos por no encontrar uno :(
putstring_nl ("No válida partición FAT!");
sdErrorCheck();      Algo salió mal, permite imprimir por qué
while(1);                            entonces 'detener': ¡ no!
}

Permite decir que el usuario lo que encontramos
putstring ("partición de uso");
Serial.Print (parte, DEC);
putstring (", el tipo es grasa");
Serial.println(Vol.fatType(),DEC);     ¿FAT16 o FAT32?

Intente abrir el directorio raíz
Si (! {root.openRoot(vol))}
putstring_nl ("no se puede abrir raíz dir!"); Algo salió mal,
while(1);                             entonces 'detener': ¡ no!
}

¡ UF! Llegamos pasado las partes difíciles.
putstring_nl("Ready!");

/ * TCCR2A = 0;
TCCR2B = 1 << CS22 | 1 << CS21 | 1 << CS20;

Permiten interrumpir el desbordamiento del TIMER2
TIMSK2 | = 1 << TOIE2;
*/

}

void loop()
{
Val = digitalRead(BUTTON);
potvalue = analogRead(5);
Serial.println (potvalue, DEC);

Si (val == alto & & potvalue > = 0 & & potvalue < = 4)
{
randNum = al azar (1, 14);
Delay(1000);
interruptor (randNum)
{
caso 1:
Serial.println(1);
playcomplete("1.wav");
rotura;
caso 2:
Serial.println(2);
playcomplete("2.wav");
rotura;
caso 3:
Serial.println(3);
playcomplete("3.wav");
rotura;
caso 4:
Serial.println(4);
playcomplete("4.wav");
rotura;
caso 5:
Serial.println(5);
playcomplete("5.wav");
rotura;
caso 6:
Serial.println(6);
playcomplete("6.wav");
rotura;
caso 7:
Serial.println(7);
playcomplete("7.wav");
rotura;
caso 8:
Serial.println(8);
playcomplete("8.wav");
rotura;
caso 9:
Serial.println(9);
playcomplete("9.wav");
rotura;
caso 10:
Serial.println(10);
playcomplete("10.wav");
rotura;
caso 11:
Serial.println(11);
playcomplete("11.wav");
rotura;
caso 12:
Serial.println(12);
playcomplete("12.wav");
rotura;
caso 13:
Serial.println(13);
playcomplete("13.wav");
rotura;
caso 14:
Serial.println(14);
playcomplete("14.wav");
rotura;
por defecto:
rotura;
}
}

Si (val == alto & & potvalue > = 5 & & potvalue < = 15)
{
randNum = random (15, 29);
Delay(1000);
interruptor (randNum)
{
caso 15:
Serial.println(15);
playcomplete "(15s. WAV");
rotura;
caso 16:
Serial.println(16);
playcomplete "(16s. WAV");
rotura;
caso 17:
Serial.println(17);
playcomplete "(17s. WAV");
rotura;
caso 18:
Serial.println(18);
playcomplete ("de 18 años. WAV");
rotura;
caso 19:
Serial.println(19);
playcomplete («19s. WAV");
rotura;
caso 20:
Serial.println(20);
playcomplete "(20s. WAV");
rotura;
caso 21:
Serial.println(21);
playcomplete ("21s. WAV");
rotura;
caso 22:
Serial.println(22);
playcomplete "(22s. WAV");
rotura;
caso 23:
Serial.println(23);
playcomplete "(23s. WAV");
rotura;
caso 24:
Serial.println(24);
playcomplete ("24s. WAV");
rotura;
caso 25:
Serial.println(25);
playcomplete ("de 25 años. WAV");
rotura;
caso 26:
Serial.println(26);
playcomplete "(26s. WAV");
rotura;
caso 27:
Serial.println(27);
playcomplete "(27s. WAV");
rotura;
caso 28:
Serial.println(28);
playcomplete ("28s. WAV");
rotura;
caso 29:
Serial.println(29);
playcomplete ("29s. WAV");
rotura;
por defecto:
rotura;
}
}

Si (val == alto & & potvalue > = 16 & & potvalue < = 22)
{
randNum = random (30, 44);
Delay(1000);
interruptor (randNum)
{
caso 30:
Serial.println(30);
playcomplete ("30m. WAV");
rotura;
caso 31:
Serial.println(31);
playcomplete ("31m. WAV");
rotura;
caso 32:
Serial.println(32);
playcomplete ("32m. WAV");
rotura;
caso 33:
Serial.println(33);
playcomplete ("33m. WAV");
rotura;
caso 34:
Serial.println(34);
playcomplete ("34m. WAV");
rotura;
caso 35:
Serial.println(35);
playcomplete ("35m. WAV");
rotura;
caso 36:
Serial.println(36);
playcomplete ("36m. WAV");
rotura;
caso 37:
Serial.println(37);
playcomplete ("37m. WAV");
rotura;
caso 38:
Serial.println(38);
playcomplete ("38m. WAV");
rotura;
caso 39:
Serial.println(39);
playcomplete ("39m. WAV");
rotura;
caso 40:
Serial.println(40);
playcomplete ("40m. WAV");
rotura;
caso 41:
Serial.println(41);
playcomplete ("41m. WAV");
rotura;
caso 42:
Serial.println(42);
playcomplete ("42m. WAV");
rotura;
caso 43:
Serial.println(43);
playcomplete ("43m. WAV");
rotura;
caso 44:
Serial.println(44);
playcomplete ("44m. WAV");
rotura;
por defecto:
rotura;
}
}

Si (val == alto & & potvalue > = 23 & & potvalue < = 1023)
{
randNum = random (45, 60);
Delay(1000);
interruptor (randNum)
{
caso 45:
Serial.println(45);
playcomplete("45.wav");
rotura;
caso 46:
Serial.println(46);
playcomplete («46e. WAV");
rotura;
caso 47:
Serial.println(47);
playcomplete ("47e. WAV");
rotura;
caso 48:
Serial.println(48);
playcomplete ("48e. WAV");
rotura;
caso 49:
Serial.println(49);
playcomplete "(49e. WAV");
rotura;
caso 50:
Serial.println(50);
playcomplete ("50e. WAV");
rotura;
caso 51:
Serial.println(51);
playcomplete ("51e. WAV");
rotura;
caso 52:
Serial.println(52);
playcomplete ("52e. WAV");
rotura;
caso 53:
Serial.println(53);
playcomplete ("53e. WAV");
rotura;
caso 54:
Serial.println(54);
playcomplete "(54e. WAV");
rotura;
caso 55:
Serial.println(55);
playcomplete ("55e. WAV");
rotura;
caso 56:
Serial.println(56);
playcomplete "(56e. WAV");
rotura;
caso 57:
Serial.println(57);
playcomplete ("57e. WAV");
rotura;
caso 58:
Serial.println(58);
playcomplete ("58e. WAV");
rotura;
caso 59:
Serial.println(59);
playcomplete ("59e. WAV");
rotura;
caso 60:
Serial.println(60);
playcomplete ("60e. WAV");
rotura;
por defecto:
rotura;
}
}

}

Reproduce un archivo completo de principio a fin sin pausa.
void playcomplete(char *name) {}
llamar a nuestro ayudante para buscar y reproducir este nombre
playfile(Name);
mientras (wave.isplaying) {}
digitalWrite (MOTOR, alto);
Flash (20, delayPeriod);
digitalWrite (MOTOR, baja);
no hacer nada durante la reproducción de su
}
su hecho reproduciendo
}
anular el flash (int numFlashes, int d)
{
para (int i = 0; i < numFlashes; i ++)
{
digitalWrite (ledstrobePin, HIGH);
digitalWrite (leduvPin, bajo);
demora (d);
digitalWrite (ledstrobePin, bajo);
digitalWrite (leduvPin, HIGH);
demora (d);
digitalWrite (ledstrobePin, bajo);
digitalWrite (leduvPin, bajo);
}
}

void playfile(char *name) {}
ver si el objeto ola está haciendo algo
Si (wave.isplaying) {}
Flash (20, delayPeriod) ;// ya jugando algo, así que detenerlo!
Wave.STOP(); Basta
}
Buscar en el directorio raíz y abre el archivo
Si (! f.open (raíz, nombre)) {}
putstring ("no puede abrir archivo"); Serial.Print(Name); retorno;
}
Leer bien el archivo y convertirlo en un objeto de onda
Si (! {wave.create(f))}
putstring_nl ("no un válido WAV"); retorno;
}

OK el tiempo para jugar! iniciar la reproducción
Wave.Play();
}

Artículos Relacionados

Cómo perder 250 libras

Cómo perder 250 libras

una de las cosas que me encanta de Instructables, es gente siempre muestran sus proyectosy crear nuevas cosas con cosas que ya tienen. Así que uno de mis últimos proyectos fue a perderpeso, y yo pensé que mostrar y decir cómo lo hice!Paso 1: "antes&q
DIY camiseta de columna

DIY camiseta de columna

en cuanto a mi estilo, tengo un poco de un desorden de personalidad múltiple... En mi armario. Me encanta flores, brillo, colores, flecos... y los huesos.  En un nivel, creo que me atrae el nerviosismo de cráneos y espinas, pero a otro nivel, creo qu
Displaycer

Displaycer

¿Desea obtener mayor información sobre su propio sentido de la privacidad? ¿Quieres reflexionar sobre lo que significa ser en el espacio público significa a sí mismo? Displaycer puede ayudarle! Acaba de poner en y entonces déjelo tomar las fotos y ej
Adivino psíquica - un robot que lee la mente de Twitter

Adivino psíquica - un robot que lee la mente de Twitter

Parque de atracciones espeluznante atracción y App de Twitter!El adivino de mente grupal psíquica es una atracción de Feria tipo arcade que puede decirle a su fortuna. Incluso mejor que aunque - también es una aplicación de Twitter conectado a la red
Básico Modular múltiples marcos para bicicletas de carga - corte del laser hermético apilable cajas

Básico Modular múltiples marcos para bicicletas de carga - corte del laser hermético apilable cajas

Los marcos múltiples básicos para bicicletas de carga es el primer bloque de edificio en nuestra plataforma de código abierto Vélo M², un ecosistema donde ofrecemos la electricidad solar y energía del pedal y los planes de construir módulos a su imag
4 maneras de hacer superficies múltiples LED Throwies - Taggies

4 maneras de hacer superficies múltiples LED Throwies - Taggies

Hola todo el mundo,hoy que estoy publicando mi Instructable 20 y video de YouTube! Para ello, así que decidí rodar 4 Mini proyectos en uno y espero que te guste.La inspiración para este vino de proyecto de la llamada "throwies" que son básicamen
Frambuesa PiSONE múltiples centro de entretenimiento

Frambuesa PiSONE múltiples centro de entretenimiento

tras el éxito de mi primer Instructible aquí es mi segunda! Es no 1 millón millas lejos de la máquina de arcade que he construido pero el arcade de la máquina es sólo una máquina de un jugador y sólo una tiene pantalla pequeña de una persona.Así que
Centro de Control de cohetes múltiples

Centro de Control de cohetes múltiples

como un líder de Boy Scout de mucho tiempo he encontrado un recurso inestimable. Así que aquí está mi primer intento de ayudar a la comunidad con mi primer instrucable.Esta idea nace de una frustración del año pasado. Era un maestro Scout en un curso
Múltiples entradas analógicas usando un perno de analoge

Múltiples entradas analógicas usando un perno de analoge

¡ Hola!En este instructible voy a explicar cómo leer valores de más de un sensor mediante el uso de solamente una clavija de entrada analógica.Te preguntarás por qué desea esto.Cuando se utiliza un tablero de Nodemcu, como se muestra en la imagen, un
Pulsera de cuentas de cómo hacer un trenzado múltiple étnicas para el verano

Pulsera de cuentas de cómo hacer un trenzado múltiple étnicas para el verano

Hace ya tiempo pandahall diy equipo había actualizado a la última pulsera de cuentas étnica. Hoy que os traemos un nuevo estilo tibetano con cuentas de diseño de pulsera.Paso 1: Materiales en la fabricación de las pulseras abalorios étnicos trenzadas
Conectar múltiples paneles solares

Conectar múltiples paneles solares

conectar múltiples paneles solaresHay 3 formas de conectar los paneles solares; paralelo, serie y una combinación del paralelo y serie. La primera que voy a hablar es paralelo porque esto es probablemente la forma más común de conectar paneles. Para
Arduino inalámbrico interruptor de Control de tiempo (433MHz) para múltiples dispositivos

Arduino inalámbrico interruptor de Control de tiempo (433MHz) para múltiples dispositivos

Escribí este instructable porque hice un proyecto similar hace poco y pensé que sería agradable escribir mi trabajo y compartirlo con otros.Lo que queremos alcanzar con este instructable, es controlar sin hilos múltiples dispositivos (luces por ejemp
Zeta Reticuli: MIDI control de ecualizador de 10 bandas y múltiples interfaz de efecto externo

Zeta Reticuli: MIDI control de ecualizador de 10 bandas y múltiples interfaz de efecto externo

aproximadamente la mitad mi vida (20 años) hace que solía tener literalmente drillions y drillions de ideas que todavía siento no es una completa pérdida de tiempo. Una de estas brillantes ideas debía ser capaz de controlar un pedal de wah-wah guitar
Para soldar los alambres múltiples para una Junta de distribución

Para soldar los alambres múltiples para una Junta de distribución

A veces es necesario dividir/señal de energía de un solo cable para varias salidas. Normalmente prefiero usar un bloque terminal y distribución para algo como esto, pero a veces no es factible, como cuando está limitado el espacio o todo lo que neces