#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define rxPin 2
#define txPin 3
#define buzzer_pin 4
#define Motor_pin 5
SoftwareSerial sim800L(rxPin, txPin);
LiquidCrystal_I2C lcd(0x27, 16, 2);
const String PHONE_1 = "+9198xxxxxxxxx"; // Replace with your number
bool motorStatus = false;
unsigned long motorStartTime = 0;
unsigned long totalRunTime = 0;
void setup() {
Serial.begin(19200);
sim800L.begin(9600);
lcd.init();
lcd.backlight();
pinMode(buzzer_pin, OUTPUT);
pinMode(Motor_pin, OUTPUT);
digitalWrite(buzzer_pin, LOW);
digitalWrite(Motor_pin, LOW);
// Show startup title
lcd.setCursor(0, 0);
lcd.print("Mobile Control");
lcd.setCursor(0, 1);
lcd.print("Pump ON/OFF");
delay(3000); // Show title for 3 seconds
// Show standby status
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motor Ctrl Ready");
lcd.setCursor(0, 1);
lcd.print("Waiting Call...");
delay(1000);
sim800L.println("AT");
delay(1000);
sim800L.println("AT+CMGF=1");
delay(1000);
sim800L.println("AT+CLIP=1"); // Enable caller ID
delay(1000);
}
void loop() {
if (sim800L.available()) {
String input = sim800L.readString();
input.toUpperCase();
Serial.println(input);
if (input.indexOf("+CLIP:") >= 0 && input.indexOf(PHONE_1) >= 0) {
toggleMotor();
delay(1000);
sim800L.println("ATH"); // Hang up call
}
}
// Update LCD timer if motor is ON
if (motorStatus) {
unsigned long elapsed = (millis() - motorStartTime) / 1000;
lcd.setCursor(0, 1);
lcd.print("ON Time: ");
lcd.print(elapsed);
lcd.print("s ");
}
}
void toggleMotor() {
motorStatus = !motorStatus;
digitalWrite(Motor_pin, motorStatus ? HIGH : LOW);
lcd.setCursor(0, 0);
lcd.print("Motor: ");
lcd.print(motorStatus ? "ON " : "OFF");
if (motorStatus) {
motorStartTime = millis();
send_sms("Motor turned ON by Call", PHONE_1);
} else {
totalRunTime = (millis() - motorStartTime) / 1000;
send_sms("Motor turned OFF. ON Time: " + String(totalRunTime) + "s", PHONE_1);
lcd.setCursor(0, 1);
lcd.print("Total: ");
lcd.print(totalRunTime);
lcd.print("s ");
}
}
void send_sms(String text, String phone) {
sim800L.println("AT+CMGF=1");
delay(1000);
sim800L.print("AT+CMGS=\"");
sim800L.print(phone);
sim800L.println("\"");
delay(1000);
sim800L.print(text);
delay(500);
sim800L.write(0x1A); // CTRL+Z to send
delay(5000);
}