Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Logs data from a connected EEG toy using the Brain library to an SD card plugged into an Adafruit Data Logger Shield
- #include <SD.h>
- // #include <Wire.h>
- // #include <RTClib.h>
- #include <MemoryFree.h>
- #include <Brain.h>
- // how many milliseconds between grabbing data and logging it. 1000 ms is once a second -- deprecated
- // #define LOG_INTERVAL 1000 // mills between entries (reduce to take more/faster data)
- // how many milliseconds before writing the logged data permanently to disk
- // set it to the LOG_INTERVAL to write each time (safest)
- // set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to
- // the last 10 reads if power is lost but it uses less power and is much faster!
- #define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card
- uint32_t syncTime = 0; // time of last sync()
- #define ECHO_TO_SERIAL 1 // echo data to serial port
- #define WAIT_TO_START 0 // Wait for serial input in setup()
- // the digital pins that connect to the LEDs
- #define redLEDpin 2
- #define greenLEDpin 3
- #define BANDGAPREF 14 // special indicator that we want to measure the bandgap
- #define aref_voltage 3.3 // we tie 3.3V to ARef and measure it with a multimeter!
- #define bandgap_voltage 1.1 // this is not super guaranteed but its not -too- off
- // RTC_DS1307 RTC; // define the Real Time Clock object
- // for the data logging shield, we use digital pin 10 for the SD cs line
- const int chipSelect = 10;
- // the logging file
- File logfile;
- // Create a new Brain object on hardware serial
- // (listening on the RX pin)
- Brain brain(Serial);
- void error(char *str)
- {
- // Serial.print("error: ");
- Serial.println(str);
- // red LED indicates error
- digitalWrite(redLEDpin, HIGH);
- while(1);
- }
- void setup(void)
- {
- Serial.begin(9600);
- Serial.println();
- // for troubleshooting, tell us how much RAM is left
- Serial.print("freeMemory()=");
- Serial.println(freeMemory());
- // initialize the SD card
- Serial.print("Initializing SD card...");
- // make sure that the default chip select pin is set to
- // output, even if you don't use it:
- pinMode(10, OUTPUT);
- // see if the card is present and can be initialized:
- if (!SD.begin(chipSelect)) {
- error("Card failed, or not present");
- }
- // Serial.println("card initialized.");
- // create a new file
- char filename[] = "LOGGER00.CSV";
- for (uint8_t i = 0; i < 100; i++) {
- filename[6] = i/10 + '0';
- filename[7] = i%10 + '0';
- if (! SD.exists(filename)) {
- // only open a new file if it doesn't exist
- logfile = SD.open(filename, FILE_WRITE);
- break; // leave the loop!
- }
- }
- if (! logfile) {
- error("couldnt create file");
- }
- // Serial.print("Logging to: ");
- Serial.println(filename);
- /* comment this block out if removing Wire.h/RTC.h from includes
- // connect to RTC
- // Wire.begin();
- if (!RTC.begin()) {
- logfile.println("RTC failed");
- #if ECHO_TO_SERIAL
- Serial.println("RTC failed");
- #endif //ECHO_TO_SERIAL
- }
- */
- logfile.println("millis,datetime,eegSignalQuality,eegAttention,eegMeditation,eegDelta,eegTheta,eegLowAlpha,eegHighAlpha,eegLowBeta,eegHighBeta,eegLowGamma,eegMidGamma,eegErrors,arduinoVcc");
- #if ECHO_TO_SERIAL
- Serial.println("millis,datetime,eegSignalQuality,eegAttention,eegMeditation,eegDelta,eegTheta,eegLowAlpha,eegHighAlpha,eegLowBeta,eegHighBeta,eegLowGamma,eegMidGamma,eegErrors,arduinoVcc");
- #endif //ECHO_TO_SERIAL
- // If you want to set the aref to something other than 5v
- analogReference(EXTERNAL);
- }
- void loop(void)
- {
- // Expect packets about once per second.
- // The .readCSV() function returns a string (well, char*) listing the most recent brain data, in the following format:
- // "signal strength, attention, meditation, delta, theta, low alpha, high alpha, low beta, high beta, low gamma, high gamma"
- // delay for the amount of time we want between readings
- // delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL));
- if (brain.update()){
- // log milliseconds since starting
- uint32_t m = millis();
- logfile.print(m); // milliseconds since start
- logfile.print(",");
- #if ECHO_TO_SERIAL
- Serial.print(m); // milliseconds since start
- Serial.print(",");
- #endif
- /* comment all this out if removing Wire.h/RTC.h
- DateTime now;
- // fetch the time
- now = RTC.now();
- // log time
- // logfile.print(now.unixtime()); // seconds since 1/1/1970
- logfile.print('"');
- logfile.print(now.year(), DEC);
- logfile.print("/");
- logfile.print(now.month(), DEC);
- logfile.print("/");
- logfile.print(now.day(), DEC);
- logfile.print(" ");
- logfile.print(now.hour(), DEC);
- logfile.print(":");
- logfile.print(now.minute(), DEC);
- logfile.print(":");
- logfile.print(now.second(), DEC);
- logfile.print('"');
- #if ECHO_TO_SERIAL
- // Serial.print(now.unixtime()); // seconds since 1/1/1970
- Serial.print('"');
- 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.print(now.second(), DEC);
- Serial.print('"');
- #endif //ECHO_TO_SERIAL
- */
- // on to the good stuff, print/log the EEG data
- char* brainerrors = brain.readErrors();
- char* brainCSV= brain.readCSV();
- #if ECHO_TO_SERIAL
- Serial.print(",");
- Serial.print(brainCSV);
- Serial.print(",");
- Serial.print(brainerrors);
- #endif //ECHO_TO_SERIAL
- logfile.print(",");
- logfile.print(brainCSV);
- logfile.print(",");
- logfile.print(brainerrors);
- // Log the estimated 'VCC' voltage by measuring the internal 1.1v ref
- analogRead(BANDGAPREF);
- delay(10);
- int refReading = analogRead(BANDGAPREF);
- float supplyvoltage = (bandgap_voltage * 1024) / refReading;
- logfile.print(",");
- logfile.print(supplyvoltage);
- #if ECHO_TO_SERIAL
- Serial.print(",");
- Serial.print(supplyvoltage);
- #endif // ECHO_TO_SERIAL
- logfile.println();
- #if ECHO_TO_SERIAL
- Serial.println();
- #endif // ECHO_TO_SERIAL
- }
- digitalWrite(greenLEDpin, LOW);
- // Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card
- // which uses a bunch of power and takes time
- if ((millis() - syncTime) < SYNC_INTERVAL) return;
- syncTime = millis();
- // blink LED to show we are syncing data to the card & updating FAT!
- digitalWrite(redLEDpin, HIGH);
- logfile.flush();
- digitalWrite(redLEDpin, LOW);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement