#include <SD.h>
#include <dht.h>
#include <LiquidCrystal_I2C.h>
// SD Card
#define SPI_SPEED SD_SCK_MHZ(4)
#define CS_PIN 10
// DHT22
#define DHT22_PIN 5
// Ultrasonic
#define PIN_TRIG 3
#define PIN_ECHO 2
//LCD
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
// Fan Relay
#define PIN_FAN 8
File file;
dht DHT;
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
double temp = 0.0;
double humidity = 0.0;
double pressure = 0.0;
double dust = 0.0;
double distance = 0.0;
int light = 0;
bool fanOn = false;
int setTemp = 24; // Celcius
void getDHT() {
DHT.read22(DHT22_PIN);
temp = DHT.temperature;
humidity = DHT.humidity;
}
void getDistance() {
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
int duration = pulseIn(PIN_ECHO, HIGH);
distance = (duration / 58.0);
}
void fanRun(bool state) {
if (state)
digitalWrite(PIN_FAN, HIGH);
else
digitalWrite(PIN_FAN, LOW);
fanOn = state;
}
void updateLCD() {
// Distance
lcd.setCursor(0, 0);
lcd.print("Distance:");
lcd.setCursor(11, 0);
if (distance >= 100) {
lcd.print(distance, 0);
} else if (distance >= 10) {
lcd.print(" ");
lcd.print(distance, 0);
} else {
lcd.print(" ");
lcd.print(distance, 0);
}
lcd.print("cm");
// Temperature
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.setCursor(2, 1);
if (temp >= 10) {
lcd.print(" ");
lcd.print(temp, 1);
} else if (temp >= 0) {
lcd.print(" ");
lcd.print(temp, 1);
} else if (temp > -10) {
lcd.print(" ");
lcd.print(temp, 1);
} else {
lcd.print(temp, 1);
}
lcd.print("C");
// Humidity
lcd.setCursor(10, 1);
lcd.print("H:");
lcd.setCursor(12, 1);
if (humidity >= 100) {
lcd.print(humidity, 0);
} else if (humidity >= 10) {
lcd.print(" ");
lcd.print(humidity, 0);
} else {
lcd.print(" ");
lcd.print(humidity, 0);
}
lcd.print("%");
}
void sdWrite() {
file = SD.open("log.txt");
Serial.write(file.print(temp));
file.close();
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
// Ultrasonic
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
// Fan Relay
pinMode(PIN_FAN, OUTPUT);
// LCD
lcd.init();
lcd.backlight();
}
void loop() {
// put your main code here, to run repeatedly:
// get values
getDHT();
getDistance();
// FAN
if (fanOn && temp < setTemp)
fanRun(false);
else if (!fanOn && temp > setTemp)
fanRun(true);
// LCD
updateLCD();
// SD Card - log onto card
sdWrite();
}