#include <RTClib.h>
#include <SdFat.h>
#include <LiquidCrystal.h>
#include <DHT.h>
#define DHTPIN_1 A0
#define DHTPIN_2 A1
#define DHTPIN_3 A2
#define DHTPIN_4 A3
#define DHTPIN_5 2
#define DHTPIN_6 3
#define DHTTYPE DHT22
DHT dht_1(DHTPIN_1, DHTTYPE);
DHT dht_2(DHTPIN_2, DHTTYPE);
DHT dht_3(DHTPIN_3, DHTTYPE);
DHT dht_4(DHTPIN_4, DHTTYPE);
DHT dht_5(DHTPIN_5, DHTTYPE);
DHT dht_6(DHTPIN_6, DHTTYPE);
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
const int chipSelect = 10;
const int interval = 15000;
RTC_DS1307 rtc;
SdFat SD;
DateTime lastFileTime;
void setup() {
Serial.begin(9600);
while (!Serial) {
; // Wait for serial port to connect. Needed for native USB port only
}
initializeSensors();
initializeRTC();
initializeSD();
lcd.begin(16, 2);
DateTime now = rtc.now();
lastFileTime = DateTime(now.year(), now.month(), now.day());
}
void loop() {
DateTime now = rtc.now();
float temperatures[6];
if (!readTemperatures(temperatures)) {
Serial.println("Failed to read from DHT sensors!");
return;
}
logData(now, temperatures);
displayData(temperatures);
printTemperatures(temperatures);
delay(interval);
}
void initializeSensors() {
dht_1.begin();
dht_2.begin();
dht_3.begin();
dht_4.begin();
dht_5.begin();
dht_6.begin();
}
void initializeRTC() {
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void initializeSD() {
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
while (1);
}
Serial.println("Card initialized.");
}
bool readTemperatures(float *temps) {
temps[0] = dht_1.readTemperature();
temps[1] = dht_2.readTemperature();
temps[2] = dht_3.readTemperature();
temps[3] = dht_4.readTemperature();
temps[4] = dht_5.readTemperature();
temps[5] = dht_6.readTemperature();
for (int i = 0; i < 6; i++) {
if (isnan(temps[i])) {
return false;
}
}
return true;
}
void logData(DateTime now, float *temps) {
String filename = String(now.year()) + "_" + String(now.month()) + "_" + String(now.day()) + ".csv";
File dataFile = SD.open(filename, FILE_WRITE);
if (dataFile) {
dataFile.print(now.timestamp());
for (int i = 0; i < 6; i++) {
dataFile.print(",");
dataFile.print(temps[i]);
}
dataFile.println();
dataFile.close();
Serial.println("Data logged.");
} else {
Serial.println("Error creating or opening CSV file");
}
}
void displayData(float *temps) {
lcd.clear();
// Display readings from sensors 1, 2, 3 on the top row
lcd.setCursor(0, 0);
lcd.print(temps[0], 1);
lcd.print(" ");
lcd.print(temps[1], 1);
lcd.print(" ");
lcd.print(temps[2], 1);
// Display readings from sensors 4, 5, 6 on the bottom row
lcd.setCursor(0, 1);
lcd.print(temps[3], 1);
lcd.print(" ");
lcd.print(temps[4], 1);
lcd.print(" ");
lcd.print(temps[5], 1);
}
void printTemperatures(float *temps) {
Serial.print("Temp1: ");
Serial.print(temps[0]);
Serial.print(" *C\t");
Serial.print("Temp2: ");
Serial.print(temps[1]);
Serial.print(" *C\t");
Serial.print("Temp3: ");
Serial.print(temps[2]);
Serial.println(" *C\t");
Serial.print("Temp4: ");
Serial.print(temps[3]);
Serial.print(" *C\t");
Serial.print("Temp5: ");
Serial.print(temps[4]);
Serial.print(" *C\t");
Serial.print("Temp6: ");
Serial.print(temps[5]);
Serial.println(" *C");
}