part 1
// libraries definition
#include <Wire.h> // library for wire connection
#include <LiquidCrystal_I2C.h> // library for I2C LCD
#include "RTClib.h" // library for real time clock
#include <avr/wdt.h> // library for default watchdog functions
#include <avr/interrupt.h> // library for interrupts handling
#include <avr/sleep.h> // library for sleep
#include <avr/power.h> // library for power control
// frequency musical notes
#define NOTE_C6 1047
#define NOTE_C3 131
#define NOTE_G3 196
#define NOTE_DS3 156
// pins definition
int levelSensorPin = 0;
int moistureSensorPin = 1;
int audioPin = 2;
int soggyLEDPin = 3;
int moistsoilLEDPin = 4;
int drysoilLEDPin = 5;
int pumpLEDPin = 6;
int pumpPin = 7;
int HSensorVCC = 9;
int LSensorVCC = 10;
int LCDBacklight = 8;
// variables
int levelSensorValue; // stores the level sensor values
float moistureSensorValue; // stores the moisture sensor values
int j = 0;
float MP;
int z;
int x;
int Val = 0;
// system messages
const char *string_table[] =
{
//0
" Welcome! :D",
//1
" LOW Water Level",
//2
" Dry soil",
//3
" Moist soil",
//4
" Soggy soil",
//5
"The water pump is on",
//6
" BALOOT",
//7
" Watering System",
//8
" Please wait!"
};
// objects definition
RTC_DS1307 RTC;
LiquidCrystal_I2C lcd(0x27, 20, 4);
//icon for water droplet
byte Droplet[8] =
{
B00100,
B00100,
B01010,
B01010,
B10001,
B10001,
B10001,
B01110,
};
void setup() {
//wdt function start
watchdogSetup();
// serial initialization
Serial.begin(9600);
// LCD initialization
lcd.init();
lcd.backlight(); // Backlight On
lcd.clear(); // clearscreen
// Wire initialization
Wire.begin();
//creating LCD Char.
lcd.createChar(1, Droplet);
// RTC initialization
RTC.begin();
if (!RTC.isrunning()) {
// date and time adjust as the PC computer date and time
RTC.adjust(DateTime(__DATE__, __TIME__));
}
// Arduino pins initalization
pinMode(audioPin, OUTPUT);
pinMode(soggyLEDPin, OUTPUT);
pinMode(moistsoilLEDPin, OUTPUT);
pinMode(drysoilLEDPin, OUTPUT);
pinMode(pumpLEDPin, OUTPUT);
pinMode(pumpPin, OUTPUT);
pinMode(HSensorVCC, OUTPUT);
pinMode(LSensorVCC, OUTPUT);
pinMode(LCDBacklight, INPUT);
//initial Pin Values for 9, 10, 7.
digitalWrite(HSensorVCC, HIGH);
digitalWrite(LSensorVCC, HIGH);
digitalWrite(pumpPin, HIGH);
// LCD initial messages
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(string_table[6]);
lcd.setCursor(0, 1);
lcd.print(string_table[7]);
lcd.setCursor(0, 3);
lcd.print(string_table[0]);
wdt_reset();
// reads the sensors
levelSensorValue = analogRead(levelSensorPin);
moistureSensorValue = analogRead(moistureSensorPin);
// initialization delay
delay(5000);
}
void loop() {
//LCD Backlight button
Val = digitalRead(LCDBacklight);
while (Val == 1)
{
z = 0;
Serial.println(z);
Val = digitalRead(LCDBacklight);
}
//LCD turn of alarm
if (z == 8) {
for (int p = 0; p < 3; p++) {
tone(audioPin, NOTE_C6, 250);
delay(150);
}
noTone(audioPin);
}
lcd.clear();
lcdbacklightsetting();
wdt_reset();
// RTC parameters definition
DateTime myRTC = RTC.now();
int H = myRTC.hour();
int M = myRTC.minute();
int S = myRTC.second();
// call Clock Function
RightHour();
MP = (((1000 / moistureSensorValue) - 0.984251968) * 100) / 4.0157480315;
//printing Sensor's values in serial monitoring and LCD
Serial.println("Moisture is"); //in case of monitoring sensor values
Serial.println(moistureSensorValue);
Serial.println("Water Level is:");
Serial.println(levelSensorValue);
Serial.println("The Z is:");
Serial.println(z);
Serial.println("The X is:");
Serial.println(x);
//
lcd.clear();
lcd.setCursor(5, 0);
lcd.write(1);
lcd.setCursor(7, 0);
lcd.print(MP);
lcd.setCursor(12, 0);
lcd.print("%");
lcd.setCursor(1, 2);
lcd.print("The Tank Level is:");
if (levelSensorValue <= 600) {
lcd.setCursor(0, 3);
lcd.print(" The Tank is Full");
}
else {
lcd.setCursor(0, 3);
lcd.print(string_table[1]);
}
delay(2000);
// if low water level: plays the low level alarm
if (levelSensorValue > 600) {
wdt_reset();
// system messages
lcd.clear();
RightHour();
lcd.setCursor(0, 3);
lcd.print(string_table[1]);
// plays the alarm sound
for (int i = 0; i < 2; i++) {
//audio alarm
tone(audioPin, NOTE_G3, 200);
delay(200);
tone(audioPin, NOTE_C3, 200);
delay(200);
tone(audioPin, NOTE_DS3, 200);
//LED Alarm
digitalWrite(pumpLEDPin, HIGH);
digitalWrite(drysoilLEDPin, HIGH);
digitalWrite(soggyLEDPin, HIGH);
digitalWrite(moistsoilLEDPin, HIGH);
delay(50);
digitalWrite(pumpLEDPin, LOW);
digitalWrite(drysoilLEDPin, LOW);
digitalWrite(soggyLEDPin, LOW);
digitalWrite(moistsoilLEDPin, LOW);
delay(50);
digitalWrite(pumpLEDPin, HIGH);
digitalWrite(drysoilLEDPin, HIGH);
digitalWrite(soggyLEDPin, HIGH);
digitalWrite(moistsoilLEDPin, HIGH);
delay(50);
digitalWrite(pumpLEDPin, LOW);
digitalWrite(drysoilLEDPin, LOW);
digitalWrite(soggyLEDPin, LOW);
digitalWrite(moistsoilLEDPin, LOW);
delay(850);
noTone(audioPin);
}
}
// check the moisture range
if (moistureSensorValue >= 750) {
// in case of dry soil:
// system messages
wdt_reset();
lcd.clear();
RightHour();
lcd.setCursor(0, 3);
lcd.print(string_table[2]);
// lights up the correct LED
digitalWrite(drysoilLEDPin, HIGH);
digitalWrite(moistsoilLEDPin, LOW);
digitalWrite(soggyLEDPin, LOW);
// plays the alarm sound
tone(audioPin, NOTE_C6, 100);
delay(1000);
noTone(audioPin);
}
if ((moistureSensorValue < 750) && (moistureSensorValue >= 238)) {
// in case of moist soil:
// system messages
wdt_reset();
lcd.clear();
RightHour();
lcd.setCursor(0, 3);
lcd.print(string_table[3]);
// lights up the correct LED
digitalWrite(drysoilLEDPin, LOW);
digitalWrite(moistsoilLEDPin, HIGH);
digitalWrite(soggyLEDPin, LOW);
delay(1000);
}
exceed 9000 limit
go to part 2 for continue