Pages: [1]   Go Down
Author Topic: Seeeduino Data Logging  (Read 1799 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I am trying to modify bicycle computer sketch written by CADJUNKI. This sketch prints serial data related to time pulses recorded from a bicycle wheel. I want to print data to the sd card but my modified sketch won't work. Is there anyone out there who can help me?
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 601
Posts: 48543
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
but my modified sketch won't work
Darn. I just sent my crystal ball out for cleaning.

Perhaps, and this is just a thought, you could post your code and explain what is happening, and how that differs from what you expect to be happening.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

Many thanks I can see where you are comming from but as a new commer the system would not let me post te code. I have probably done this wrong to but here goes.


Regards

#include <Stdio.h>

#define LED 13                   //pin for the LED
#define SWITCH 0                 //input for REED SWITCH
#include <Fat16.h>      // the SD Card library - http://code.google.com/p/fat16lib/
#include <Wire.h>  
#include <Time.h>  
#include <DS1307RTC.h> // a basic DS1307 library - http://www.arduino.cc/playground/Code/Time

int rim = 2170;                  //circumference in mm

int val = 0;                     // used to store input value
int previousVal = 0;             // lets not be too repetitious

int debounce = 10;               // the debounce time, increase if the output flickers
int cycles = 1;                  // total number of revolutions
float currentSpeed = 0;          // current speed in MPH
float averageSpeed = 0;          // average speed since "newRide" was true

unsigned long revTimer;          // create a timer that tells us how long we go between pulses,
unsigned long serialTimer;       // and one for how long it's been since we sent anything over serial
unsigned long rideTimer;         // total time since "newRide" was true

boolean activeRiding = false;    // is the bike moving?
boolean activityChange = true;   // just a way of keeping track of how long we're inactive
long inactivityTimer;            // millis() on which we began inactivity
long activeRidingOffset = 0;     // time subtracted from total riding time when calculating average speed
boolean newRide = true;          // true if we haven't moved in half an hour or more
float rideDistance = 0;          // total distance traveled since "newRide" was true
SdCard card;
Fat16 LogFile;

void setup() {
 pinMode(LED, OUTPUT);           // tell arduino LED port is an output,
 pinMode(SWITCH, INPUT);         // and SWITCH port is input
 Serial.begin(9600);             // start a serial session
 revTimer = millis();            // start pulse timer
 serialTimer = millis();         // start serial timer
 rideTimer = millis();           // start ride timer
   // initialize the SD card
  if (!card.init())
    error(1);
  // initialize a FAT16 volume
  if (!Fat16::init(&card))
    error(2);

  // open file for append, create if it doesn't exist
  if (!LogFile.open(fileName, O_CREAT | O_APPEND | O_WRITE))
    error(3);

  // clear write error
  LogFile.writeError = false;
  LogFile.println("Start");}

void loop(){
 if(!activeRiding) {
   if(activityChange) {
     inactivityTimer = millis();
     activityChange = false;
   }
 } else {
   if(activityChange) {
     activeRidingOffset += millis() - inactivityTimer;
     activityChange = false;
   }
 }
  
 val=digitalRead(SWITCH);         // read input value and store it

 if (val==HIGH) {                 // check whether input is HIGH (magnet is NOT in range of reed switch)
   digitalWrite(LED, HIGH);       // turn LED on
   previousVal = HIGH;            // allow the next "pulse" to be counted
 } else{
   digitalWrite(LED, LOW);        // turn LED off
   if (previousVal != LOW && millis() - revTimer > debounce) { // we've got a pulse!
     pulse();
   }
   previousVal = LOW;             // (in case the magnet is in range of the switch while sitting still)
 }
 
 // if it's been too long since the last pulse, assume we're not moving.
 if(millis()-revTimer > 2000) {
  currentSpeed = 0;  
  if(activeRiding) { activityChange = true; activeRiding = false; }
 }
 
 // if it's been more than fifteen minutes...
 if (millis() - revTimer > 15*60*1000) {  
   // we'll assume it's a new riding session & zero everything out at next pulse.
   newRide = true;                        
 }
}


void pulse() {
  if(newRide) {
    cycles = 0;
    averageSpeed = 0;
    rideTimer = millis();
    rideDistance = 0;
  }
  
  cycles++;                                             // The wheel has obviously turned another revolution
  
  rideDistance = (float) rim*cycles/1000;               // distance in meters,
  rideDistance = rideDistance * 0.000621371192;         // converted to miles
  
  currentSpeed = (float) (millis() - revTimer)*0.001;   // Convert time elapsed to milliseconds to seconds
  currentSpeed = rim/currentSpeed;                      // S = d/t: Rim circumference divided by time elapsed
  currentSpeed = currentSpeed*0.002237;                 // MPH Conversion: 1 mm/s = 0.001 m/s * 3600 s/hr * 1 mile / 1609 m = 0.002237 mi/hr

  // time ridden since "newRide", in hours, not including inactive time
  unsigned long activeRidingMillis = millis() - rideTimer - activeRidingOffset;  
  float activeRidingHours = (float) activeRidingMillis / 1000/60/60; // convert to hours
  averageSpeed = rideDistance / activeRidingHours;

  revTimer = millis();       // remember the current moment for speed calculations next time around
  sendStats();               // Tell Processing what's going on
  newRide = false;

  if(!activeRiding) { activityChange = true; activeRiding = true; }
}

void sendStats() {
  
  case 0: // Log data if second(t) = 0
    digitalWrite(logLedPin, HIGH);
    LogFile.print(siteID); //Site identifier
    LogFile.print(',');
    LogFile.print(t); //Unix time - Excel Time = (t/86400)+25569
    MeterPulseLog(); // Number of watts during logging interval
    LogFile.println();
    // write the data to the card at the end of every line
    if (!LogFile.sync())
      error(4);
                                                        
  Serial.print("rideDistance=");
  Serial.print(rideDistance,2);

  Serial.print("&currentSpeed=");
  Serial.print(currentSpeed,2);

  Serial.print("&averageSpeed=");
  Serial.print(averageSpeed,2);
  
  // send a linefeed character, telling Processing that we're done transmitting.
  Serial.print(10,BYTE);    
  
  serialTimer = millis();
  
  LogFile.print(',');   // print comma to seprate from previous data
  LogFile.print(rideDistance,2);
  LogFile.print(',');
  LogFile.print(currentSpeed,2);
}
// routine handle file errors
void error(int err)
{
  // blink forever
  while(1)
  {
    digitalWrite(fileLedPin, HIGH);
    delay(err * 200);
    digitalWrite(fileLedPin, LOW);
    delay(200);  
  }
}

void pauseWithoutDelay (unsigned long delayInterval)
{
  startDelayMillis = millis();
  do {
  }
  while (millis() - startDelayMillis < delayInterval);
}
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

Not enough room on the replay but here is the original code that works and send serial data I now want to log the data to the SD card on the Seeduino.
Many thanks

#include <Stdio.h>

#define LED 13                   //pin for the LED
#define SWITCH 0                 //input for REED SWITCH
int rim = 2170;                  //circumference in mm

int val = 0;                     // used to store input value
int previousVal = 0;             // lets not be too repetitious

int debounce = 10;               // the debounce time, increase if the output flickers
int cycles = 1;                  // total number of revolutions
float currentSpeed = 0;          // current speed in MPH
float averageSpeed = 0;          // average speed since "newRide" was true

unsigned long revTimer;          // create a timer that tells us how long we go between pulses,
unsigned long serialTimer;       // and one for how long it's been since we sent anything over serial
unsigned long rideTimer;         // total time since "newRide" was true

boolean activeRiding = false;    // is the bike moving?
boolean activityChange = true;   // just a way of keeping track of how long we're inactive
long inactivityTimer;            // millis() on which we began inactivity
long activeRidingOffset = 0;     // time subtracted from total riding time when calculating average speed
boolean newRide = true;          // true if we haven't moved in half an hour or more
float rideDistance = 0;          // total distance traveled since "newRide" was true

void setup() {
 pinMode(LED, OUTPUT);           // tell arduino LED port is an output,
 pinMode(SWITCH, INPUT);         // and SWITCH port is input
 Serial.begin(9600);             // start a serial session
 revTimer = millis();            // start pulse timer
 serialTimer = millis();         // start serial timer
 rideTimer = millis();           // start ride timer
}

void loop(){
 if(!activeRiding) {
   if(activityChange) {
     inactivityTimer = millis();
     activityChange = false;
   }
 } else {
   if(activityChange) {
     activeRidingOffset += millis() - inactivityTimer;
     activityChange = false;
   }
 }
  
 val=digitalRead(SWITCH);         // read input value and store it

 if (val==HIGH) {                 // check whether input is HIGH (magnet is NOT in range of reed switch)
   digitalWrite(LED, HIGH);       // turn LED on
   previousVal = HIGH;            // allow the next "pulse" to be counted
 } else{
   digitalWrite(LED, LOW);        // turn LED off
   if (previousVal != LOW && millis() - revTimer > debounce) { // we've got a pulse!
     pulse();
   }
   previousVal = LOW;             // (in case the magnet is in range of the switch while sitting still)
 }
 
 // if it's been too long since the last pulse, assume we're not moving.
 if(millis()-revTimer > 2000) {
  currentSpeed = 0;  
  if(activeRiding) { activityChange = true; activeRiding = false; }
 }
 
 // if it's been more than fifteen minutes...
 if (millis() - revTimer > 15*60*1000) {  
   // we'll assume it's a new riding session & zero everything out at next pulse.
   newRide = true;                        
 }
}


void pulse() {
  if(newRide) {
    cycles = 0;
    averageSpeed = 0;
    rideTimer = millis();
    rideDistance = 0;
  }
  
  cycles++;                                             // The wheel has obviously turned another revolution
  
  rideDistance = (float) rim*cycles/1000;               // distance in meters,
  rideDistance = rideDistance * 0.000621371192;         // converted to miles
  
  currentSpeed = (float) (millis() - revTimer)*0.001;   // Convert time elapsed to milliseconds to seconds
  currentSpeed = rim/currentSpeed;                      // S = d/t: Rim circumference divided by time elapsed
  currentSpeed = currentSpeed*0.002237;                 // MPH Conversion: 1 mm/s = 0.001 m/s * 3600 s/hr * 1 mile / 1609 m = 0.002237 mi/hr

  // time ridden since "newRide", in hours, not including inactive time
  unsigned long activeRidingMillis = millis() - rideTimer - activeRidingOffset;  
  float activeRidingHours = (float) activeRidingMillis / 1000/60/60; // convert to hours
  averageSpeed = rideDistance / activeRidingHours;

  revTimer = millis();       // remember the current moment for speed calculations next time around
  sendStats();               // Tell Processing what's going on
  newRide = false;

  if(!activeRiding) { activityChange = true; activeRiding = true; }
}

void sendStats() {
                                                        
  Serial.print("rideDistance=");
  Serial.print(rideDistance,2);

  Serial.print("&currentSpeed=");
  Serial.print(currentSpeed,2);

  Serial.print("&averageSpeed=");
  Serial.print(averageSpeed,2);
  
  // send a linefeed character, telling Processing that we're done transmitting.
  Serial.print(10,BYTE);    
  
  serialTimer = millis();
}
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 601
Posts: 48543
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Perhaps, and this is just a thought, you could post your code and explain what is happening, and how that differs from what you expect to be happening.
So, you posted your code. Now, what is happening when the code runs, and what are you expecting to have happen, and how do they differ?

Code:
if (!LogFile.open(fileName, O_CREAT | O_APPEND | O_WRITE))
I don't see that fileName is defined anywhere. It seems unlikely that the code will even compile.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

You are right the first code does not compile. The second code runs ok and sends serial dat a to my computer giving me a read out of mph etc. I want the first code to download the same serial data to the SD card on the Seeeduino board.

Thanks for your comments

« Last Edit: January 21, 2011, 12:53:35 pm by StewartArklay » Logged

Pages: [1]   Go Up
Jump to: