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

#define trigPin1 A0
#define echoPin1 A1

long duration, distance;

char phone_no1[]="+60179487311";

char phone_no[]="+60120000015";

#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 ROOM..");
for (int positionCounter = 0; positionCounter < 29; positionCounter++)
{
lcd.scrollDisplayLeft();
delay(500);
}

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

}

static int flag;
void loop()
{

digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration = pulseIn(echoPin1, HIGH);
distance = duration*0.034/2;

lcd.setCursor(0,0);

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

if ( distance<=10)
{
if (! flag) SendMessage2();
flag = 1;
}
else
{
flag = 0;
}
static int flag;
if ( distance<=15)
{
if (! flag) SendMessage1();
flag = 1;
}
else
{
flag = 0;
}
if ( distance<=3)
{
if (! flag) SendMessage();
flag = 1;
}
else
{
flag = 0;
}

}

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 in danger level");
delay(500);
Serial.println(char(26));
}
void SendMessage1()
{
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("River water level has reach 50%");
delay(500);
Serial.println(char(26));
}
void SendMessage2()
{
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("River water level reach dangerous level. Please evacuate from the place");
delay(500);
Serial.println(char(26));
}

Please follow the advice given in the link below when posting code, in particular the section entitled 'Posting code and common code problems'

Use code tags (the </> icon above the compose window) to make it easier to read and copy for examination

update the code of post #1 using code tags </> so it is readable
what water sensor are you using ? is it a commercial device or one you have designed youself?
for a river water level sensor I have used a sr04t ultrasonic transducer without problem

The short answer in three parts

Declare a starting value for 'flag' above the 'loop' function

The second declaration of 'flag' inside of the 'loop' function may cause problems

The logic needs restructuring

If 'distance' equals 12 and 'flag' is 0 the program will send message1,
but then since the next comparison
'distance' is greater than 3 the 'else' sets 'flag' to 0 again
and on next iteration will send message1 again

1 Like
#define trigPin1 A0
#define echoPin1 A1

long duration, distance;

char phone_no1[] = "+60179487311";

char phone_no[] = "+60120000015";

#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 ROOM..");
  for (int positionCounter = 0; positionCounter < 29; positionCounter++)
  {
    lcd.scrollDisplayLeft();
    delay(500);
  }

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

}

static int flag = 0; // define default value

void loop()
{

  digitalWrite(trigPin1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin1, LOW);
  duration = pulseIn(echoPin1, HIGH);
  distance = duration * 0.034 / 2;

  lcd.setCursor(0, 0);

  lcd.print("WATER LEVEL:");
  lcd.print(distance);
  delay(500);
  lcd.clear();
  
  if ( distance <= 10)
  {
    if (! flag) SendMessage2();
    flag = 1;
  }

  if ( distance <= 15)
  {
    if (! flag) SendMessage1();
    flag = 1;
  }
  
  if ( distance <= 3)
  {
    if (! flag) SendMessage();
    flag = 1;
  }

  if ( distance > 15)   // If all is safe prepare to send messages again
  {
    flag = 0;
  }
}

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 in danger level");
  delay(500);
  Serial.println(char(26));
}

void SendMessage1()
{
  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("River water level has reach 50%");
  delay(500);
  Serial.println(char(26));
}

void SendMessage2()
{
  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("River water level reach dangerous level. Please evacuate from the place");
  delay(500);
  Serial.println(char(26));
}

interesting artical on Liquid Level Monitoring Code Example using Time-of-Flight sensors

@MarshaJ847

first evaluate a state out of your measurement.
Send a messsage if the state has changed compared to the previous state
remember the current state for the next loop.

one switch makes it clearer then 4 if statements.

I might get confused with your messages, but imho it does what it should do.
just replace the ADC function with a HC function

// 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[] = "+60179487311";

char phone_no[] = "+60120000015";

#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 ROOM..");
  //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 in danger level");
  delay(500);
  Serial.println(char(26));
}

void SendMessage1()
{
  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("River water level has reach 50%");
  delay(500);
  Serial.println(char(26));
}

void SendMessage2()
{
  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("River water level reach dangerous level. Please evacuate from the place");
  delay(500);
  Serial.println(char(26));
}

Simulation in Wokwi for a limited time:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.