// waterlevel
// https://forum.arduino.cc/t/why-the-river-water-level-has-reach-50-sending-too-many-message-but-others-send-correctly-one-time-but-only-this-message-sending-too-many-time/1064934/4
// to be deleted 2023-06


#define trigPin1 A0
#define echoPin1 A1

long duration, distance;

char phone_no1[] = "water level checking";

char phone_no[] ="water level is full reach or not";

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  lcd.begin(16, 2);
  lcd.setCursor(0, 1);
  lcd.print("FLOOD DETECTION CONTROL tank..");
  //for (int positionCounter = 0; positionCounter < 29; positionCounter++)
  //{
  //  lcd.scrollDisplayLeft();
  //  delay(500);
  //}

  Serial.begin (9600);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);

}

enum State {OK, INFO, WARNING, ALARM};
State state, previousState;

long getDistanceHC()
{
  digitalWrite(trigPin1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin1, LOW);
  duration = pulseIn(echoPin1, HIGH);
  return duration * 0.034 / 2;
}

long getDistanceADC()
{
  int adc = analogRead(A1);
  int value = map(adc, 0, 1023, 0, 20);
  return value; // measure with poti
}

void loop()
{
  //distance = getDistanceHC(); // a real function
  distance = getDistanceADC(); // simulated with a potentiometer
  // Serial.println(distance); // only to debug in wokwi

  lcd.setCursor(0, 0);

  lcd.print("WATER LEVEL:");
  lcd.print(distance);
  delay(500);
  lcd.clear();

  // evaluate state
  switch (distance)
  {
    case 0 ... 3:
      state = ALARM;
      if (previousState != state) SendMessage();  // only when state has changed
      break;

    case 4 ... 10:
      state = WARNING;
      if (previousState != state) SendMessage2();
      break;

    case 11 ... 15 :
      state = INFO;
      if (previousState != state) SendMessage1();
      break;

    default :   // larger 15
      state = OK;
  }
  previousState = state;

}

void SendMessage()
{
  Serial.println("AT+CMGF=1");
  delay(2000);
  Serial.print("AT+CSCA=");
  Serial.print(phone_no);
  Serial.write(0x22);
  Serial.write(0x0D);
  Serial.write(0x0A);
  delay(3000);
  Serial.print("AT + CMGS = ");
  Serial.print(phone_no1);
  Serial.write(0x22);
  Serial.write(0x0D);
  Serial.write(0x0A);
  delay(3000);
  Serial.print("water level is 50% reach");
  delay(500);
  Serial.println(char(26));
}

void SendMessage1()
{
  Serial.println("AT+CMGF=2");
  delay(2000);
  Serial.print("AT+CSCA= ");
  Serial.print(phone_no);
  Serial.write(0x22);
  Serial.write(0x0D);
  Serial.write(0x0A);
  delay(3000);
  Serial.print("AT + CMGS = ");
  Serial.print(phone_no1);
  Serial.write(0x22);
  Serial.write(0x0D);
  Serial.write(0x0A);
  delay(3000);
  Serial.print("tank water level has reach 50%");
  delay(500);
  Serial.println(char(26));
}

void SendMessage2()
{
  Serial.println("AT+CMGF=3");
  delay(2000);
  Serial.print("AT+CSCA= ");
  Serial.print(phone_no);
  Serial.write(0x22);
  Serial.write(0x0D);
  Serial.write(0x0A);
  delay(3000);
  Serial.print("AT + CMGS = ");
  Serial.print(phone_no1);
  Serial.write(0x22);
  Serial.write(0x0D);
  Serial.write(0x0A);
  delay(3000);
  Serial.print("tank water level reach dangerous level. Please evacuate from the place");
  delay(500);
  Serial.println(char(26));
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
pot1:VCC
pot1:SIG
pot1:GND