Welcome to EnviroDIY, a community for do-it-yourself environmental science and monitoring. EnviroDIY is part of WikiWatershed, an initiative of Stroud Water Research Center designed to help people advance knowledge and stewardship of fresh water.
New to EnviroDIY? Start here

Reply To: Arduino datalogger

Home Forums Other Data Loggers Arduino datalogger Reply To: Arduino datalogger

#2081
lilcano
Participant

    So i have decided to improve my project by adding a data logger shield from adafruit. can seam to get the data from the attached decagon 5TM sensors. Please can any one help with what i am doing wrong in my sketch.

    #include <SPI.h>
    #include <SD.h>
    #include <Wire.h>
    #include “RTClib.h”
    #include <SDI12.h>

    // A simple data logger for the Arduino digital pins

    // how many milliseconds between grabbing data and logging it. 1000 ms is once a second
    #define LOG_INTERVAL 60000 // 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 60000 // 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 DATAPIN 7 // change to the proper pin for sdi-12 data pin, I prefer D7
    SDI12 mySDI12(DATAPIN);

    // The analog pins that connect to the sensors
    //#define photocellPin 0 // analog 0
    //#define tempPin 1 // analog 1
    //#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_PCF8523 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;
    void tmMeasurement(char c);

    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();

    // use debugging LEDs
    pinMode(redLEDpin, OUTPUT);
    pinMode(greenLEDpin, OUTPUT);

    #if WAIT_TO_START
    Serial.println(“Type any character to start”);
    while (!Serial.available());
    #endif //WAIT_TO_START

    // 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);

    // 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,stamp,datetime,sensor,ea,vwc,temp “);

    #if ECHO_TO_SERIAL
    Serial.println(“Sketch for sampling multiple SDI12 sensors”);
    Serial.println(“millis,stamp,datetime,sensor,ea,temp”);

    #endif //ECHO_TO_SERIAL

    Serial.println();
    // If you want to set the aref to something other than 5v
    //analogReference(EXTERNAL);
    delay(1000);
    }

    void loop(void)
    {

    //Now lets look at the timestamp
    DateTime now;

    // delay for the amount of time we want between readings
    delay((LOG_INTERVAL -1) – (millis() % LOG_INTERVAL));

    digitalWrite(greenLEDpin, HIGH);

    // 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

    // fetch the time
    now = RTC.now();
    // log time
    logfile.print(now.unixtime()); // seconds since 1/1/1970
    logfile.print(“, “);
    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(‘”‘);
    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
    //for(char j=’1′;j<=’3’;j++){
    tmMeasurement(j);
    //}
    Serial.println();
    }
    //delay(1000);
    // Now lets look at collecting the data from the sensors

    void tmMeasurement(char c){
    String command = “”;
    float Ea = 0.0;
    float temp = 0.0;
    float VWC = 0.0;
    command += c;
    command += “M!”; // SDI-12 measurement command format [address][‘M’][!]
    mySDI12.sendCommand(command);
    delay(500); // wait a sec
    mySDI12.flush();

    command = “”;
    command += c;
    command += “D0!”; // SDI-12 command to get data [address][D][dataOption][!]
    mySDI12.sendCommand(command);
    delay(500);

    if(mySDI12.available() > 0){
    int channel = mySDI12.parseInt();
    Ea = mySDI12.parseFloat();
    temp = mySDI12.parseFloat();

    VWC = (4.3e-6*(Ea*Ea*Ea)) – (5.5e-4*(Ea*Ea)) + (2.92e-2 * Ea) – 5.3e-2 ; //the TOPP equation used to calculate VWC

    logfile.print(“, “);
    logfile.print(channel);
    logfile.print(“, “);
    logfile.print(Ea);
    logfile.print(“, “);
    logfile.print(VWC);
    logfile.print(“, “);
    logfile.print(temp);

    #if ECHO_TO_SERIAL
    Serial.print(“, “);
    Serial.print(channel);
    Serial.print(“, “);
    Serial.print(Ea);
    Serial.print(“, “);
    Serial.print(VWC);
    Serial.print(“, “);
    Serial.print(temp);

    #endif //ECHO_TO_SERIAL
    /*/analogRead(photocellPin);
    //delay(10);
    //int photocellReading = analogRead(photocellPin);

    //analogRead(tempPin);
    //delay(10);
    int tempReading = analogRead(tempPin);

    // converting that reading to voltage, for 3.3v arduino use 3.3, for 5.0, use 5.0
    float voltage = tempReading * aref_voltage / 1024;
    float temperatureC = (voltage – 0.5) * 100 ;
    float temperatureF = (temperatureC * 9 / 5) + 32;

    logfile.print(“, “);
    logfile.print(photocellReading);
    logfile.print(“, “);
    logfile.print(temperatureF);
    #if ECHO_TO_SERIAL
    Serial.print(“, “);
    Serial.print(photocellReading);
    Serial.print(“, “);
    Serial.print(temperatureF);
    #endif //ECHO_TO_SERIAL
    */

    /*
    // 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);
    digitalWrite(redLEDpin, LOW);
    }
    logfile.flush();

    }