#include <SoftwareSerial.h>
#include <avr/wdt.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
SoftwareSerial gprsSerial(7,8);




const byte sump = 2;
const byte biofilter = 3;
const byte POWER = 4;
const byte IBC_TOP = 10;
const byte IBC_BOTTOM =11;

unsigned long CURRENT;
unsigned long PREVIOUS;

unsigned long interval   = 1801000;
unsigned long interval_2   = 60000;
unsigned long interval_debug = 5000;


byte POWER_STATE = 0;
byte IBC_TOP_STATE = 0;
byte IBC_BOTTOM_STATE = 0;
byte SUMP_STATE = 0;
byte BIOFILTER_STATE = 0;

char start[]="Hi Chris, system is starting";
char bio_sms[]="BIOFILTER HIGH";
char bio_ok[]="BIOFILTER OK";
char sump_sms[]="SUMP LEVEL HIGH";
char sump_ok[]="SUMP LEVEL OK";
char ibc_high[]="3A LEVEL HIGH";
char ibc_ok[]="3A LEVEL OK";
char ibc_low[]="3A LEVEL LOW";
char power_on_sms[]="POWER ON";
char power_off_sms[]="POWER OFF";
char Chris[]=" \"+27829729702\"";

void setup ()
{
 Serial.begin(19200);
 Serial.println("SUPER BZ TANK SMS MONITOR");
 Serial.println("CHRIS WILKES - 2016");
  wdt_enable(WDTO_8S);
  Wire.begin();
    RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  POWER_UP();
  wdt_reset();
  gprsSerial.begin(19200); // GPRS shield baud rate
  Serial.println("10");
  delay(1000);
  wdt_reset();
  Serial.println("9");
  delay(1000);
  wdt_reset();
  Serial.println("8");
  delay(1000);
  wdt_reset();
  Serial.println("7");
  delay(1000);
  wdt_reset();
  Serial.println("6");
  delay(1000);
  wdt_reset();
  Serial.println("5");
  delay(1000);
  wdt_reset();
  Serial.println("4");
  delay(1000);
  wdt_reset();
  Serial.println("3");
  delay(1000);
  wdt_reset();
  Serial.println("2");
  delay(1000);
  wdt_reset();
  Serial.println("1");
  delay(1000);
  wdt_reset();
  Serial.println("0");
  delay(1000);
  wdt_reset();
  Serial.println("Starting program");
  delay(1000);
  wdt_reset();
  gprsSerial.print("AT+CMGF=1\r"); // Set the shield to SMS mode
  //gprsSerial.print("AT+CNMI=2,2,0,0,0\r");
  delay(200);
  wdt_reset();
}
void loop ()
  {
   wdt_reset();
   delay(3000);
   //wdt_reset();
Serial.println(CURRENT_A);
Serial.println(PREVIOUS_A);
    
    //OKs
  
   if (digitalRead(sump)==LOW)
     {
       if (SUMP_STATE ==1)
       {
     Serial.println ("SUMP OK, STATE 1");
     PREVIOUS_A = 0;
     SUMP_STATE=1; 
     delay (100); 
     } 
     if  (SUMP_STATE == 0)
     {
     Serial.println ("SUMP OK, STATE 0 ");
     SMS_OK(sump_ok, CURRENT_A, PREVIOUS_A);
     SUMP_STATE=1;  
     delay (100); 
     }
     }
  
  if (digitalRead (sump) == HIGH)
     {
     Serial.println ("SUMP LEVEL HIGH.");
     
     CURRENT=millis();
     SMS(ibc_high, CURRENT, PREVIOUS);
     delay (100); 
     
     SUMP_STATE=0;
     } 
  
     
     
     if (digitalRead(biofilter)==LOW)
     {
       if (BIOFILTER_STATE ==1)
       {
     Serial.println ("BIOFILTER OK, STATE 1");
     PREVIOUS_B = 0;
     BIOFILTER_STATE=1; 
     delay (100); 
     } 
     if  (BIOFILTER_STATE == 0)
     {
     Serial.println ("BIOFILTER OK, STATE 0 ");
     PREVIOUS_B=millis();
     SMS_OK(bio_ok, CURRENT_B, PREVIOUS_B);
     BIOFILTER_STATE=1;  
     delay (100); 
     }
     }

      if (digitalRead (biofilter) == HIGH)
     {
     Serial.println ("BIOFILTER LEVEL HIGH.");
     CURRENT_B=millis();
     SMS(bio_sms, CURRENT_B, PREVIOUS_B);
     delay (100); 
     PREVIOUS_B=millis();
     BIOFILTER_STATE=0;
     }
     
     
      if (digitalRead(POWER)==HIGH)
     {
       if (POWER_STATE ==1)
       {
     Serial.println ("POWER OK, POWER STATE 1");
     PREVIOUS_C = 0;
     POWER_STATE=1; 
     delay (100); 
     } 
     if  (POWER_STATE == 0)
     {
     Serial.println ("POWER OK,POWER STATE 0 ");
     PREVIOUS_C=millis();
     SMS_OK(power_on_sms, CURRENT_C, PREVIOUS_C);
     POWER_STATE=1; 
     delay (100); 
     }
     }


       if (digitalRead (POWER) == LOW)
     {
     Serial.println ("POWER OFF");
     CURRENT_C=millis();
     SMS(power_off_sms, CURRENT_C, PREVIOUS_C);
     delay (100); 
     PREVIOUS_C=millis();;
     POWER_STATE=0;
     }
     
      if (digitalRead(IBC_TOP)==LOW)
     {
       if (IBC_TOP_STATE ==1)
       {
     Serial.println ("3A_TOP OK, STATE 1");
     PREVIOUS_D = 0;
     IBC_TOP_STATE=1; 
     delay (100); 
     } 
     if  (IBC_TOP_STATE == 0)
     {
     Serial.println ("3A_TOP OK, STATE 0 ");
     PREVIOUS_D=millis();
     SMS_OK(ibc_ok, CURRENT_D, PREVIOUS_D);
     IBC_TOP_STATE=1;  
     delay (100); 
     }
     }

      if (digitalRead (IBC_TOP) == HIGH)
     {
     Serial.println ("3A LEVEL HIGH ");
     CURRENT_D=millis();
     SMS(ibc_high, CURRENT_D, PREVIOUS_D);
     IBC_TOP_STATE=0;
     delay (100); 
     PREVIOUS_D=millis();
     }
     
      if (digitalRead(IBC_BOTTOM)==HIGH)
     {
       if (IBC_BOTTOM_STATE ==1)
       {
     Serial.println ("3A_BOTTOM OK, STATE 1");
     PREVIOUS_E = 0;
     IBC_BOTTOM_STATE=1; 
     delay (100); 
     } 
     if  (IBC_BOTTOM_STATE == 0)
     {
     Serial.println ("3A_BOTTOM OK, STATE 0 ");
     PREVIOUS_E = millis();
     SMS_OK(ibc_ok, CURRENT_E, PREVIOUS_E);
     IBC_BOTTOM_STATE=1;  
     delay (100); 
     }
     }
      
      if (digitalRead (IBC_BOTTOM) == LOW)
     {
     Serial.println ("3A LEVEL LOW ");
     CURRENT_E=millis();
     SMS(ibc_low, CURRENT_E, PREVIOUS_E);
     IBC_BOTTOM_STATE=0;
     delay (100); 
     PREVIOUS_E=millis();
     }
      
     Serial.println();
  }  // end of loop

  
  
  unsigned long SMS(String message, unsigned long current, &unsigned long previous)
{
   if (current-previous>interval){
 // Serial.println("Sending Text...");
  gprsSerial.print("AT+CMGF=1\r"); // Set the shield to SMS mode
  delay(200);
  // send sms message, the phone number needs to include the country code e.g. if a U.S. phone number such as (540) 898-5543 then the string must be:
  // +15408985543
  gprsSerial.println("AT+CMGS = \"+27829729702\"");
  delay(200);
  gprsSerial.println(message); //the content of the message
  delay(200);
  DateTime now = RTC.now();
  gprsSerial.print(now.year(), DEC);
  gprsSerial.print('/');
  gprsSerial.print(now.month(), DEC);
  gprsSerial.print('/');
  gprsSerial.print(now.day(), DEC);
  gprsSerial.print(' ');
  gprsSerial.print(now.hour(), DEC);
  gprsSerial.print(':');
  gprsSerial.print(now.minute(), DEC);
  gprsSerial.print(':');
  gprsSerial.print(now.second(), DEC);
  gprsSerial.println(); 
  delay(200);
  gprsSerial.print((char)26);//the ASCII code of the ctrl+z is 26 (required according to the datasheet)
  delay(200);
  Serial.println("Text Sent.");
  return 
} else {Serial.println("INTERVAL TOO SHORT TO SEND SMS A");
}
}
  
  void SMS_OK(String message, unsigned long current, unsigned long previous)
{
if (current-previous>interval_2){
 // Serial.println("Sending Text...");
  gprsSerial.print("AT+CMGF=1\r"); // Set the shield to SMS mode
  delay(200);
  // send sms message, the phone number needs to include the country code e.g. if a U.S. phone number such as (540) 898-5543 then the string must be:
  // +15408985543
  gprsSerial.println("AT+CMGS = \"+27829729702\"");
  delay(200);
  gprsSerial.println(message); //the content of the message
  delay(200);
  DateTime now = RTC.now();
  gprsSerial.print(now.year(), DEC);
  gprsSerial.print('/');
  gprsSerial.print(now.month(), DEC);
  gprsSerial.print('/');
  gprsSerial.print(now.day(), DEC);
  gprsSerial.print(' ');
  gprsSerial.print(now.hour(), DEC);
  gprsSerial.print(':');
  gprsSerial.print(now.minute(), DEC);
  gprsSerial.print(':');
  gprsSerial.print(now.second(), DEC);
  gprsSerial.println(); 
  delay(200);
  gprsSerial.print((char)26);//the ASCII code of the ctrl+z is 26 (required according to the datasheet)
  delay(200);
  //gprsSerial.println();
  Serial.println("Text Sent.");
  } else {Serial.println("INTERVAL TOO SHORT TO SEND SMS A");
}
} 

   
    
void POWER_UP()
{
  
 digitalWrite(9,LOW);
 delay(1000);
 digitalWrite(9,HIGH);
 delay(2000);
 digitalWrite(9,LOW);
 delay(3000);
}
