0

Datalogger w/ SHT31 Temp&Humid
Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.

Datalogger w/ SHT31 Temp&Humid

by noveltone on Mon Jan 21, 2019 5:45 pm

Hello, I just wanted to post the code I used to integrate the Adafruid Datalogger with the SHT31 Temp and Humidity Sensor. Maybe it's simple for experienced folks but as my first Arduino project it took me some iterations to get it right-ish. Maybe someone can use it to get up and running faster. With Temp (dry bulb) and Relative Humidity, you can deduce any point on the psychrometric chart, knowing latent and sensible heat. Neat! It's working well so far.

It's an adaptation of the Light and Temp Sensor Code on the Adafruit SHT31 page: https://learn.adafruit.com/adafruit-dat ... me-clock-2

This uses the PCF8523 real time clock. It takes a reading every second and syncs the data to SD card every 10 seconds. To make it simpler to read I added a line to show degrees in Fahrenheit.

Thanks so much Adafruit folks!

#include <Arduino.h>
#include "Adafruit_SHT31.h"
#include "SD.h"
#include <Wire.h>
#include "RTClib.h"

Adafruit_SHT31 sht31 = Adafruit_SHT31();
RTC_PCF8523 RTC; // define the Real Time Clock object

// A simple data logger for the Arduino i2c

// how many milliseconds between grabbing data and logging it. 1000 ms is once a second
#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 10*LOG_INTERVAL // 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


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

sht31.begin(0x44)
;sht31.heater(false)

#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(pinMode)) {
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,tempC,tempF,rel_humid");
#if ECHO_TO_SERIAL
Serial.println("millis,stamp,datetime,tempC,tempF,rel_humid");
#endif //ECHO_TO_SERIAL

// If you want to set the aref to something other than 5v
analogReference(EXTERNAL);
}

void loop(void)
{
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.println('"');
#endif //ECHO_TO_SERIAL

float tC = sht31.readTemperature();
float h = sht31.readHumidity();
float tF = ((tC) * 1.8) + 32;

logfile.print(", ");
logfile.print(tC);
logfile.print(", ");
logfile.print(tF);
logfile.print(", ");
logfile.print(h);
#if ECHO_TO_SERIAL
if (! isnan(tC)) { // check if 'is not a number'
Serial.print("Temp *C = "); Serial.println(tC);
Serial.print("Temp *F = "); Serial.println(tF);
} else {
Serial.println("Failed to read temperature");
}

if (! isnan(h)) { // check if 'is not a number'
Serial.print("Hum. % = "); Serial.println(h);
} else {
Serial.println("Failed to read humidity");
}
#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);

}

noveltone
 
Posts: 1
Joined: Mon Jan 21, 2019 4:55 pm

Please be positive and constructive with your questions and comments.