Very good that this code-version is working.
In the meantime I have added more serial printing for analysing test this code-version and post the serial output as a code-section
// MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START *
// a detailed explanation how these macros work is given in this tutorial
// https://forum.arduino.cc/t/comfortable-serial-debug-output-short-to-write-fixed-text-name-and-content-of-any-variable-code-example/888298
#define dbg(myFixedText, variableName) \
Serial.print( F(#myFixedText " " #variableName"=") ); \
Serial.println(variableName);
#define dbgi(myFixedText, variableName,timeInterval) \
{ \
static unsigned long intervalStartTime; \
if ( millis() - intervalStartTime >= timeInterval ){ \
intervalStartTime = millis(); \
Serial.print( F(#myFixedText " " #variableName"=") ); \
Serial.println(variableName); \
} \
}
#define dbgc(myFixedText, variableName) \
{ \
static long lastState; \
if ( lastState != variableName ){ \
Serial.print( F(#myFixedText " " #variableName" changed from ") ); \
Serial.print(lastState); \
Serial.print( F(" to ") ); \
Serial.println(variableName); \
lastState = variableName; \
} \
}
#define dbgcf(myFixedText, variableName) \
{ \
static float lastState; \
if ( lastState != variableName ){ \
Serial.print( F(#myFixedText " " #variableName" changed from ") ); \
Serial.print(lastState); \
Serial.print( F(" to ") ); \
Serial.println(variableName); \
lastState = variableName; \
} \
}
// MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END *
#include <SoftwareSerial.h>
#include <SafeString.h>
cSF(myMessage_SS, 64);
cSF(sms_SS, 128);
cSF(PHONE1, 16, "+94717897");
cSF(PHONE2, 16, "+94762");
cSF(PHONE3, 16, "+94781");
cSF(ATD, 4, "ATD");
cSF(ATH, 4, "ATH");
unsigned long MyTestTimer = 0; // Timer-variables MUST be of type unsigned long
const byte OnBoard_LED = 13;
//String sms;
/*
const String PHONE1 = "+94717897"; // Phone number 1
const String PHONE2 = "+94762"; // Phone number 2
const String PHONE3 = "+94781"; // Phone number 3
*/
#define rxPin 6
#define txPin 7
#define buzzerPin 11 // Buzzer pin
#define RELAY_PIN 9 // Output for Relay Control
SoftwareSerial sim800(rxPin, txPin);
int pir_sensor1 = 2; // PIR sensor 1
int pir_sensor2 = 3; // PIR sensor 2
bool called = false; // To track if the call has been made
// Function to check the state of the relay (HIGH/ON or LOW/OFF)
bool relayStatus() {
return digitalRead(RELAY_PIN) == HIGH;
}
void setup() {
Serial.begin(9600);
Serial.println("Setup-Start");
PrintFileNameDateTime();
pinMode(pir_sensor1, INPUT);
pinMode(pir_sensor2, INPUT);
pinMode(buzzerPin, OUTPUT); // Set buzzer pin as OUTPUT
pinMode(RELAY_PIN, OUTPUT); // Set the relay pin as OUTPUT
digitalWrite(RELAY_PIN, LOW); // Initially turn off the relay (turn off PIR sensor)
sim800.begin(9600);
Serial.println("SIM800L software serial initialized");
myMessage_SS = "AT";
//sim800.println("AT");
printToSim800_AND_serial(myMessage_SS);
delay(1000);
Serial.println("trying to connect to Sim800...");
while (!sim800.available()) {
//sim800.println("AT");
myMessage_SS = "AT";
printToSim800_AND_serial(myMessage_SS);
delay(1000);
}
Serial.println("Connected to Sim800!");
//sim800.println("AT+CMGF=1"); //Set SMS to Text Mode
myMessage_SS = "AT+CMGF=1";
printToSim800_AND_serial(myMessage_SS);
delay(1000);
//sim800.println("AT+CNMI=1,2,0,0,0"); //Procedure to handle newly arrived messages(command name in text: new message indications to TE)
myMessage_SS = "AT+CNMI=1,2,0,0,0";
printToSim800_AND_serial(myMessage_SS);
delay(1000);
//sim800.println("AT+CMGL=\"REC UNREAD\""); // Read Unread Messages
myMessage_SS = "AT+CMGL=\"REC UNREAD\"";
printToSim800_AND_serial(myMessage_SS);
}
void loop() {
dbgc("Top of loop",called);// whenever variable with name "called" changes its value print the change to serial monitor
dbgc("Top of loop",relayStatus() ); // whenever the function relayStatus() results in a changed value print the change to serial monitor
dbgc("Top of loop",digitalRead(pir_sensor1) );
dbgc("Top of loop",digitalRead(pir_sensor2) );
while (sim800.available()) {
//String sms = sim800.readString();
sms_SS = sim800.readString().c_str();
Serial.print("Received SMS: #");
Serial.print(sms_SS);
Serial.println("#");
// Ignore responses that match "Received SMS: AT+CMGDA=\"DEL ALL\" OK"
//if (sms.startsWith("Received SMS: ")) {
if (sms_SS.startsWith("Received SMS: ")) {
dbg("sms_SS.startsWith('Received SMS: ')",sms_SS.startsWith("Received SMS: "));
continue;
}
// Check if the SMS contains a valid command
//if (sms.indexOf("ON1") != -1)
if (sms_SS.indexOf("ON1") != -1)
{
dbg("if (sms_SS.indexOf('ON1') != -1)",sms_SS.indexOf("ON1") );
// Turn on the relay
digitalWrite(RELAY_PIN, HIGH);
//sim800.println("Relay is ON"); // Send a response message
myMessage_SS = "Relay is ON";
printToSim800_AND_serial(myMessage_SS);
}
//else if (sms.indexOf("OFF1") != -1) {
else if (sms_SS.indexOf("OFF1") != -1) {
dbg("else if sms_SS.indexOf('OFF1') != -1",sms_SS.indexOf("OFF1") );
// Turn off the relay
digitalWrite(RELAY_PIN, LOW);
//sim800.println("Relay is OFF"); // Send a response message
myMessage_SS = "Relay is OFF";
printToSim800_AND_serial(myMessage_SS);
}
// Delete Messages & Save Memory
}
dbgc("before motion detect",called);// whenever variable with name "called" changes its value print the change to serial monitor
dbgc("before motion detect",relayStatus() ); // whenever the function relayStatus() results in a changed value print the change to serial monitor
dbgc("before motion detect",digitalRead(pir_sensor1) );
dbgc("before motion detect",digitalRead(pir_sensor2) );
// Check if any PIR sensor is HIGH, the relay is ON, and a call hasn't been made yet
if (!called && relayStatus() && (digitalRead(pir_sensor1) == HIGH || digitalRead(pir_sensor2) == HIGH) ) {
Serial.println("Motion detected!");
digitalWrite(buzzerPin, HIGH); // Turn on the buzzer
Serial.println("buzzer");
Serial.println("delay(20000)");
delay(20000); // Buzzer stays on for 20 seconds
digitalWrite(buzzerPin, LOW); // Turn off the buzzer
Serial.println("delay(20000) done");
Serial.println("calling....");
Serial.println("delay(1000)");
delay(1000);
//sim800.println("ATD" + PHONE1 + ";"); // Call the 1st phone number
myMessage_SS = ATD;
myMessage_SS += PHONE1;
myMessage_SS += ";";
called = true; // Set to true to avoid making more calls
printToSim800_AND_serial(myMessage_SS);
Serial.println("delay(25000)");
delay(25000); // Wait for 10 seconds (adjust as needed)
Serial.println("delay(25000) done");
//sim800.println("ATH"); // Hang up the current call
myMessage_SS = ATH;
printToSim800_AND_serial(myMessage_SS);
Serial.println("delay(5000)");
delay(5000); // Wait for 5 seconds before calling the next number
Serial.println("delay(5000) done");
//sim800.println("ATD" + PHONE2 + ";"); // Call the 2nd phone number
myMessage_SS = ATD;
myMessage_SS += PHONE2;
myMessage_SS += ";";
printToSim800_AND_serial(myMessage_SS);
Serial.println("delay(26000)");
delay(26000); // Wait for 10 seconds (adjust as needed)
Serial.println("delay(26000) done");
//sim800.println("ATH"); // Hang up the current call
myMessage_SS = ATH;
printToSim800_AND_serial(myMessage_SS);
Serial.println("delay(6000)");
delay(6000); // Wait for 5 seconds before calling the last number
//sim800.println("ATD" + PHONE3 + ";"); // Call the 3rd phone number
Serial.println("delay(6000) done");
myMessage_SS = ATD;
myMessage_SS += PHONE3;
myMessage_SS += ";";
printToSim800_AND_serial(myMessage_SS);
Serial.println("delay(27000)");
delay(27000); // Wait for 10 seconds (adjust as needed)
Serial.println("delay(27000) done");
//sim800.println("ATH"); // Hang up the current call
myMessage_SS = ATH;
printToSim800_AND_serial(myMessage_SS);
// Reset the 'called' variable to allow making calls again if motion is detected
called = false;
sim800.println("Searching");
}
}
void PrintFileNameDateTime() {
Serial.println( F("Code running comes from file ") );
Serial.println( F(__FILE__) );
Serial.print( F(" compiled ") );
Serial.print( F(__DATE__) );
Serial.print( F(" ") );
Serial.println( F(__TIME__) );
}
// easy to use helper-function for non-blocking timing
boolean TimePeriodIsOver (unsigned long &startOfPeriod, unsigned long TimePeriod) {
unsigned long currentMillis = millis();
if ( currentMillis - startOfPeriod >= TimePeriod ) {
// more time than TimePeriod has elapsed since last time if-condition was true
startOfPeriod = currentMillis; // a new period starts right here so set new starttime
return true;
}
else return false; // actual TimePeriod is NOT yet over
}
void BlinkHeartBeatLED(int IO_Pin, int BlinkPeriod) {
static unsigned long MyBlinkTimer;
pinMode(IO_Pin, OUTPUT);
if ( TimePeriodIsOver(MyBlinkTimer, BlinkPeriod) ) {
digitalWrite(IO_Pin, !digitalRead(IO_Pin) );
}
}
void printToSim800_AND_serial(SafeString& pointerTo_SS) {
sim800.println(pointerTo_SS.c_str() );
Serial.print("send to sim800 #");
Serial.print(pointerTo_SS);
Serial.println("#");
}
best regards Stefan