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;
}
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
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
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));
}