I essentially copied code from the tutorials, and played around with them to get it to to work on the data-logger and audio wave shield. I'm only marginally experienced in programming, so keep that in mind.
(Also, although the code specifies multiple buttons, I am currently only using one sensor input in A0. The knock-sensor. I did not change it because it did not affect the RAM. I used it originally because it was given as an example)
Thank you!
Code: Select all
#include <SD.h>
#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include "WaveUtil.h"
#include "WaveHC.h"
SdReader card; // This object holds the information for the card
FatVolume vol; // This holds the information for the partition on the card
FatReader root; // This holds the information for the filesystem on the card
FatReader f; // This holds the information for the file we're play
WaveHC wave; // This is the only wave (audio) object, since we will only play one at a time
// for Piezo
const int ledPin = 13; // led connected to digital pin 13
const int knockSensor = A0; // the piezo is connected to analog pin 0
const int threshold = 205;
const int conthreshold = 820; // threshold value to decide when the detected sound is a knock or not
int CS_pin = 10; //For datalogger
int pow_pin = 8;
// these variables will change:
int sensorReading = 0; // variable to store the value read from the sensor pin
int ledState = LOW; // variable for reading the pin status
#define DEBOUNCE 5 // button debouncer
// this handy function will return the number of bytes currently free in RAM, great 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);
}
return free_memory;
}
void sdErrorCheck(void)
{
if (!card.errorCode()) return;
putstring("I/O error: ");
Serial.print(card.errorCode(), HEX);
putstring(", ");
Serial.println(card.errorData(), HEX);
while(1);
}
void setup() {
//pinMode(ledPin, OUTPUT); // declare the ledPin as as OUTPUT
Serial.begin(9600);
// use the serial port
byte i;
// set up serial port
Serial.begin(9600);
//putstring_nl("WaveHC with ");
//putstring_nl("buttons");
putstring("RAM: "); // This can help with debugging, running out of RAM is bad
Serial.println(freeRam()); // if this is under 150 bytes it may spell trouble!
// Set the output pins for the DAC control. This pins are defined in the library
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, INPUT);
pinMode(8, OUTPUT);
// if (!card.init(true)) { //play with 4 MHz spi if 8MHz isn't working for you
if (!card.init()) { //play with 8 MHz spi (default faster!)
putstring_nl("Card init. failed!"); // Something went wrong, lets print out why
sdErrorCheck();
while(1); // then 'halt' - do nothing!
}
// enable optimize read - some cards may timeout. Disable if you're having problems
card.partialBlockRead(true);
// Now we will look for a FAT partition!
uint8_t part;
for (part = 0; part < 5; part++) { // we have up to 5 slots to look in
if (vol.init(card, part))
break; // we found one, lets bail
}
if (part == 5) { // if we ended up not finding one :(
putstring_nl("f2");
sdErrorCheck(); // Something went wrong, lets print out why
while(1); // then 'halt' - do nothing!
}
// Lets tell the user about what we found
putstring("Partition");
Serial.print(part, DEC);
putstring("FAT");
Serial.println(vol.fatType(),DEC); // FAT16 or FAT32?
// Try to open the root directory
if (!root.openRoot(vol)) {
putstring_nl("Dir!"); // Something went wrong,
while(1); // then 'halt' - do nothing!
}
Serial.println("Intializing failed");
pinMode(CS_pin, OUTPUT);
pinMode(pow_pin, OUTPUT);
digitalWrite(pow_pin, HIGH);
if(!SD.begin(CS_pin)) // data-logger code
{
Serial.println("Failed");
//return;
}
Serial.println("Ready");
// Whew! We got past the tough parts.
putstring_nl("Ready!");
TCCR2A = 0;
TCCR2B = 1<<CS22 | 1<<CS21 | 1<<CS20;
//Timer2 Overflow Interrupt Enable
TIMSK2 |= 1<<TOIE2;
}
SIGNAL(TIMER2_OVF_vect) {
check_switches();
}
void check_switches()
{
}
void loop(){
//digitalWrite(8,HIGH);
Serial.println(sensorReading);
sensorReading = analogRead(knockSensor); // read input value
if (sensorReading >= 820) { // check if the input is HIGH
Serial.println("ExtremeDanger");
// Make scary eyes
Serial.println("Playing");
// SSSSSSSSS.... That's a nice everything you have
playcomplete("case5.wav");
delay(100);
Serial.println("NXT");
// End Movement
// Explode
//Serial.println("time to explode");
//playcomplete("explode.wav");
// Go back to sleep
Serial.println("next");
delay(100);
// We only want to print on the output change, not state
//pirState = HIGH;
/* /*else {
digitalWrite(ledPin, LOW); // turn LED OFF
if (pirState == HIGH){
// we have just turned of
Serial.println("Motion ended!");
// We only want to print on the output change, not state
pirState = LOW;
}
}*/
}
delay(100);
if ( sensorReading > 103 && sensorReading < 250){
Serial.println("D1");
playcomplete("case1.wav");
delay(100);
Serial.println("Player informed");
}
if ( sensorReading > 250 && sensorReading < 410){
Serial.println("20Gs detected");
playcomplete("case2.wav");
delay(100);
Serial.println("Player informed. Back to data collection");
}
if ( sensorReading > 410 && sensorReading < 615){
Serial.println("d40");
playcomplete("case3.wav");
delay(100);
Serial.println("NXT");
}
if ( sensorReading > 615 && sensorReading < 820){
Serial.println("d60");
playcomplete("case4.wav");
delay(100);
Serial.println("NXT");
}
String dataString = String(sensorReading);
File dataFile = SD.open("log.txt", FILE_WRITE); //writing to file
if(dataFile)
{
dataFile.println(dataString);
dataFile.close();
Serial.println(dataString); // data-logger code
}
else
{
Serial.println("Failed");
}
delay(1000);
}
// Plays a full file from beginning to end with no pause.
void playcomplete(char *name) {
// call our helper to find and play this name
playfile(name);
while (wave.isplaying) {
// do nothing while its playing
}
// now its done playing
}
void playfile(char *name) {
// see if the wave object is currently doing something
if (wave.isplaying) {// already playing something, so stop it!
wave.stop(); // stop it
}
// look in the root directory and open the file
if (!f.open(root, name)) {
putstring("Couldn't open file "); Serial.print(name); return;
}
// OK read the file and turn it into a wave object
if (!wave.create(f)) {
putstring_nl("Not a valid WAV"); return;
}
// ok time to play! start playback
wave.play();
}