Welcome to EnviroDIY, a community for do-it-yourself environmental science and monitoring. EnviroDIY is part of WikiWatershed, a web toolkit designed to help citizens, conservation practitioners, municipal decision-makers, researchers, educators, and students 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();

    }