#include <SD.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
File tempFile;
File moistFile;
#define ONE_WIRE_BUS 8
#define motorPin 9
#define vccMoist 7
#define AOUT_PIN A0
#define THRESHOLD 300
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int temp;
String dryOrWet = "---";
const int pinCS = 10;
bool motorState = false;
String motorOnorOff = "OFF";
bool wetState;
//button
int button = 5;
int status = false;
bool lcdClearStatus = false;
void setup() {
Serial.begin(9600);
sensors.begin();
pinMode (pinCS, OUTPUT);
pinMode (4, OUTPUT);
pinMode (motorPin, OUTPUT);
pinMode (vccMoist, OUTPUT);
pinMode (button, INPUT_PULLUP);
lcd.init();
lcd.backlight();
if (SD.begin()){
Serial.println("SD Card is ready to use");
Serial.println("");
} else{
Serial.println("SD Card Initializarion Failed");
return;
}
}
void loop() {
sensors.requestTemperatures();
int temp = sensors.getTempCByIndex(0);
int value = analogRead(AOUT_PIN);
tempFile = SD.open("temp.txt", FILE_WRITE);
moistFile = SD.open("moist.txt", FILE_WRITE);
if(digitalRead(button) == false){
status = !status;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("NPK PERCENTAGE");
lcd.setCursor(0, 1);
lcd.print("Nitrogren: ");
lcd.setCursor(0, 2);
lcd.print("Phosporus: ");
lcd.setCursor(0, 3);
lcd.print("Potassium: ");
} else {
lcd.clear();
//Temperature
lcd.setCursor(1, 0);
lcd.print("Temperature: ");
lcd.println((String)temp+ " C");
lcd.setCursor(6, 1);
lcd.print("Motor ");
lcd.println(motorOnorOff);
//Moisture
lcd.setCursor(0, 2);
lcd.print("Moisture Level: ");
lcd.println(value);
lcd.setCursor(2, 3);
lcd.print("The soil is ");
lcd.println(dryOrWet);
}
//WRITE TEMPERATURE DATA TO SD CARD
if(tempFile){
tempFile.print(temp);
tempFile.close();
digitalWrite(4, HIGH); //This line is just to check if the txt file is created
} else {
Serial.println("Error Opening file");
}
//WRITE MOISTURE DATA TO SD CARD
if(moistFile){
moistFile.print(value);
moistFile.close();
digitalWrite(4, HIGH); //This line is just to check if the txt file is created
} else {
Serial.println("Error Opening file");
}
//Temperature
while(temp >= 90 && !motorState){
digitalWrite(motorPin, HIGH);
Serial.println("Motor ON");
motorState = true;
motorOnorOff = "ON";
}
while(temp <90 && motorState == true){
digitalWrite(motorPin, LOW);
Serial.println("Motor OFF");
motorState = false;
motorOnorOff = "OFF";
}
//Moisture
if(value > THRESHOLD){
wetState = true;
digitalWrite(vccMoist, HIGH);
} else {
wetState = false;
digitalWrite(vccMoist, LOW);
}
while(value < THRESHOLD && wetState == false){
Serial.println("The soil is DRY");
dryOrWet = "DRY";
wetState = true;
}
while(value >= THRESHOLD && wetState == true){
Serial.println("The soil is WET");
dryOrWet = "WET";
wetState = false;
}
Serial.print("Moisture Level: ");
Serial.print(value);
Serial.println("");
Serial.print("Celsius Temperature: ");
Serial.println(sensors.getTempCByIndex(0));
Serial.println("");
delay(2000);
}