-
Notifications
You must be signed in to change notification settings - Fork 10
/
datalogger.ino
149 lines (123 loc) · 4.23 KB
/
datalogger.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
//Time stamped datalogger onto SD Card
//@vmfoo - 7/19/2014
// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
const int chipSelect = 10;
//The RTC Library needs Wire
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
//The SDlibrary needs SPI
#include <SPI.h>
#include "SD.h"
//Some SD Card code borrowed from Adafruit library examples
// set up variables using the SD utility library functions:
File dataFile;
#define LOGFILE "datalog.txt"
//library to read the temp/humid sensor
#include "DHT.h"
#define DHTPIN 2 // what pin the DHT is connected to
// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(19200);
//Initialize the Sensor
Serial.println("Initializing datalogger with RTC version 1.0");
Serial.println("Starting Temp and Humidity Sensor");
dht.begin();
Serial.println("Starting SDCard reader and card");
pinMode(chipSelect, OUTPUT);
pinMode(SS, OUTPUT);
if (!SD.begin(chipSelect)) {
Serial.println("SD Card initialization failed!");
return;
}
Serial.println("Opening logfile for write.");
// Open up the file we're going to log to!
dataFile = SD.open(LOGFILE, FILE_WRITE);
if (! dataFile) {
Serial.println("error opening log file");
// Wait forever since we cant write data
while (1) ;
}
Serial.println("Starting Real Time Clock");
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //uncomment this once and upload. Then comment it out and upload again
//This will set the time the first time you upload it and if you don't upload again with it commented out it will
//reset the clock to the time the code was compliled each time.
if (! rtc.isrunning()) { //code borrowed from adafruit example rtc code
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
DateTime now = rtc.now();
Serial.print("Unixtime: ");
Serial.println(now.unixtime());
}
void loop(){
char temp[6]; //2 int, 2 dec, 1 point, and \0
char hum[6];
char msg[13];
//get the temp/humid into chars to format
ftoa(temp,readTemp());
ftoa(hum,readHumidity());
//Compile a comma delimited string to send to the log
sprintf(msg,"%s,%s",temp, hum);
logThis(msg);
delay(3000);
}
void logThis(char* logmessage){
char message[120];
DateTime now = rtc.now();
long epoch = now.unixtime();
int Year = now.year();
int Month = now.month();
int Day = now.day();
int Hour = now.hour();
int Minute = now.minute();
int Second = now.second();
sprintf(message, "%ld,%d/%d/%d %02d:%02d:%02d,%s",epoch,Year,Month,Day,Hour,Minute,Second,logmessage );
//Write the entry to the log file and console
dataFile.println(message);
dataFile.flush();
// print to the serial port too:
Serial.println(message);
}
float readTemp(){
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float t = dht.readTemperature();
float tf = t * 1.8 +32; //Convert from C to F
return tf;
}
float readHumidity(){
float h = dht.readHumidity();
return h;
}
int ftoa(char *a, float f) //translates floating point readings into strings
{
int left=int(f);
float decimal = f-left;
int right = decimal *100; //2 decimal points
if (right > 10) { //if the decimal has two places already. Otherwise
sprintf(a, "%d.%d",left,right);
} else {
sprintf(a, "%d.0%d",left,right); //pad with a leading 0
}
}