Friday, December 15, 2017

Lab 19 - Data Logging with SD Cards

CLASSWORK:
Basic SD Card Reader:
// Write to SD card
#include <SD.h>
//Set by default for the SD library
//MOSI = pin 11
//MISO = pin 12
//SCLK = pin 13
//We alwasy need to set the CS Pin
const int CS_PIN = 10;
void setup() {
  Serial.begin(9600);
  Serial.println("Initializing Card");
  //CS pin is an output
  pinMode(CS_PIN, OUTPUT);
  if (!SD.begin(CS_PIN))
  {
    Serial.println("Card failure");
    return;
  }
  Serial.println("Card Ready");
}

void loop() {
  long timeStamp = millis();
  String dataString = "Hello There!";

  //Open a file and write to it.
  File dataFile = SD.open("Sensor1.csv", FILE_WRITE);
  if (dataFile)
  {
    dataFile.print(timeStamp);
    dataFile.print(",");
    dataFile.println(dataString);
    dataFile.close(); //Data isnt actually written until we close the connection!
    //Print same thing to the screen for debugging
    Serial.print(timeStamp);
    Serial.print(",");
    Serial.println(dataString);
  }
  else
  {
    Serial.print("Couldn't open log file");
  }
  delay(5000);
}

SD Card Reader with Command File:
//SD read and write
#include <SD.h>

//Set by default for the SD card library
const int CS_PIN = 10;
const int POW_PIN = 8;
//Default rate of 5 seconds
int refresh_rate = 5000;

void setup() {
  Serial.begin(9600);
  Serial.println("Initializing Card");
  //CS pin is an output
  pinMode(CS_PIN, OUTPUT);
  digitalWrite(POW_PIN, HIGH);

  if (!SD.begin(CS_PIN))
  {
    Serial.println("Card Failure");
    return;
  }
  Serial.println("Card Ready");

  //Read the configuration info (speed.txt)
  File commandFile = SD.open("speed.txt");
  if (commandFile)
  {
    Serial.println("Reading Command File");

    while(commandFile.available())
    {
      refresh_rate = commandFile.parseInt();
    }
    Serial.print("Refresh Rate = ");
    Serial.print(refresh_rate);
    Serial.println("ms");
    commandFile.close(); //Close the file when finished
    
    File dataFile = SD.open("sensor1.csv", FILE_WRITE);
    dataFile.println("-----New Data Set-----");
    dataFile.println("Time,TempC,TempF");
    dataFile.close();
    
    Serial.println("-----New Data Set-----");
    Serial.println("Time\tTempC\tTempF");
  }
  else
  {
    Serial.println("Could not read command file.");
    return;
  }
}

void loop() {
  long timeStamp = millis();
  String dataString = "Hello There!";
  //Open a file and write to it.
  File dataFile = SD.open("sensor1.csv", FILE_WRITE);
  if (dataFile)
  {
    dataFile.print(timeStamp);
    dataFile.print(",");
    dataFile.println(dataString);
    dataFile.close(); //Data isnt actually written until we close the connection!

    //Print same thing to the screen for debugging
    Serial.print(timeStamp);
    Serial.print(",");
    Serial.println(dataString);
  }
  else
  {
    Serial.println("Couldn't open log file");
  }
  delay(refresh_rate);
}

HOMEWORK:
SD Card Reader with Temperature Sensor:
//SD read and write
#include <SD.h>
//Set by default for the SD card library
const int CS_PIN = 10;
const int POW_PIN = 8;
//Default rate of 5 seconds
int refresh_rate = 5000;

/*-----Temperature Sensor Constants------*/
const int temp_pin = A0;
int temp_reading = 0;
float voltage = 0; // setup some variables
float celsius = 0;
float farenheit ;

void setup() {
  Serial.begin(9600);
  Serial.println("Initializing Card");
  //CS pin is an output
  pinMode(CS_PIN, OUTPUT);
  digitalWrite(POW_PIN, HIGH);

  if (!SD.begin(CS_PIN))
  {
    Serial.println("Card Failure");
    return;
  }
  Serial.println("Card Ready");

  //Read the configuration info (speed.txt)
  File commandFile = SD.open("speed.txt");
  if (commandFile)
  {
    Serial.println("Reading Command File");

    while(commandFile.available())
    {
      refresh_rate = commandFile.parseInt();
    }
    Serial.print("Refresh Rate = ");
    Serial.print(refresh_rate);
    Serial.println("ms");
    commandFile.close(); //Close the file when finished
    
    File dataFile = SD.open("sensor1.csv", FILE_WRITE);
    dataFile.println("-----New Data Set-----");
    dataFile.println("Time,TempC,TempF");
    dataFile.close();
    
    Serial.println("-----New Data Set-----");
    Serial.println("Time\tTempC\tTempF");
  }
  else
  {
    Serial.println("Could not read command file.");
    return;
  }
}
void loop() {
long timeStamp = millis();
while (timeStamp < 60040)
  {
  long timeStamp = millis();
  temperature_function();
  String dataString = "Hello There!";
  //Open a file and write to it.
  File dataFile = SD.open("sensor1.csv", FILE_WRITE);
  if (dataFile)
  {
    dataFile.print(timeStamp*.001);
    dataFile.print(",");
    dataFile.print(celsius);
    dataFile.print(",");
    dataFile.println(farenheit);
//    dataFile.println(dataString);
    dataFile.close(); //Data isnt actually written until we close the connection!

    //Print same thing to the screen for debugging
    Serial.print(timeStamp*.001);
    Serial.print("\t");
    Serial.print(celsius);
    Serial.print("\t");
    Serial.println(farenheit);
    //Serial.println(dataString);
  }
  else
  {
    Serial.println("Couldn't open log file");
  }
  delay(refresh_rate);
  }
}

void temperature_function()
{
  temp_reading = analogRead(temp_pin);
  voltage = ((float)temp_reading*5000)/1024; // convert  sensor value to millivolts
  voltage = voltage-500;        // remove voltage offset
  celsius = voltage/10;         // convert millivolts to Celsius
  farenheit = ((celsius*1.8)+32);
//  Serial.print(temp_reading);
//  Serial.print(" Temperature: ");  // these four lines send the temp to the port
//  Serial.print(celsius);
//  Serial.print(" degrees C ");
//  Serial.print(farenheit);
  //Serial.println(" degrees F");
  
//  delay(1000);
}

Temperature Sensor with SD Card Reader and Interrupts:
//Use Hardware and Timer Interrupts for Fun with Sound
//Include the TimerOne library
#include <TimerOne.h>
#include <SD.h>
//Button pins
const int BUTTON_INT = 0;
const int BUTTON2_INT =1;

//Set by default for the SD card library
const int CS_PIN = 10;
const int POW_PIN = 8;

//Volatile variables can change inside interrupts
volatile int refresh_rate = 0; // in ms
volatile long timeStamp;

/*-----Temperature Sensor Constants------*/
const int temp_pin = A0;
int temp_reading = 0;
float voltage = 0; // setup some variables
float celsius = 0;
float farenheit ;

void setup() 
{
  //Set up Serial
  Serial.begin(9600);
  Serial.println("Initializing Card");
  //CS pin is an output
  pinMode(CS_PIN, OUTPUT);

  pinMode(POW_PIN, OUTPUT);
  digitalWrite(POW_PIN, HIGH);

  if (!SD.begin(CS_PIN))
  {
    Serial.println("Card Failure");
    return;
  }
  Serial.println("Card Ready");

  //Read the configuration info (speed.txt)
  File commandFile = SD.open("speed.txt");
  if (commandFile)
  {
    Serial.println("Reading Command File");

    while(commandFile.available())
    {
      refresh_rate = commandFile.parseInt();
    }
    Serial.print("Refresh Rate = ");
    Serial.print(refresh_rate);
    Serial.println("ms");
    commandFile.close(); //Close the file when finished
    
    File dataFile = SD.open("sensor1.csv", FILE_WRITE);
    dataFile.println("-----New Data Set-----");
    dataFile.println("Time,TempC,TempF");
    dataFile.close();
    
    Serial.println("-----New Data Set-----");
    Serial.println("Time\tTempC\tTempF");
  }
  else
  {
    Serial.println("Could not read command file.");
    return;
  }
  //The pin is inverted, so we want to look at the rising edge
  attachInterrupt(BUTTON_INT, increaseDelay, RISING);
  //attachInterrupt(BUTTON2_INT, decreaseDelay, RISING);

  //Set up timer interrupt
  Timer1.initialize(refresh_rate*1000); //Set a timer of length 1 seconds
  Timer1.attachInterrupt(printData); //Runs "temperature function" on each 
                                  //time interrupt
}
void increaseDelay()
{
  if (refresh_rate >= 18)
    refresh_rate++;
  else 
    refresh_rate = 18; 
  Serial.print("New Refresh Rate:");
  Serial.println(refresh_rate);
}

void decreaseDelay()
{
  if (refresh_rate > 18)
    refresh_rate--;
  else 
    refresh_rate = 18;
    Serial.print("Decrease:");
  Serial.println(refresh_rate); 
}

void loop() {
  temperature_function();
  //Open a file and write to it.
  File dataFile = SD.open("sensor1.csv", FILE_WRITE);
  if (dataFile)
  {
    dataFile.print(timeStamp);
    dataFile.print(",");
    dataFile.print(celsius);
    dataFile.print(",");
    dataFile.println(farenheit);
    dataFile.close(); //Data isnt actually written until we close the connection!

    //Print same thing to the screen for debugging
    Serial.print(timeStamp);
    Serial.print("\t");
    Serial.print(celsius);
    Serial.print("\t");
    Serial.println(farenheit);
    //Serial.println(dataString);
  }
  else
  {
    Serial.println("Couldn't open log file");
  }
}

void printData()
{
  timeStamp = millis();
}

void temperature_function()
{
  temp_reading = analogRead(temp_pin);
  voltage = ((float)temp_reading*5000)/1024; // convert  sensor value to millivolts
  voltage = voltage-500;        // remove voltage offset
  celsius = voltage/10;         // convert millivolts to Celsius
  farenheit = ((celsius*1.8)+32);
}

No comments:

Post a Comment