بنده ماژول sim800 نداشتم تست کنم
ولی به صورت کلی به صورت زیر می شود.
// Serial.begin(115200);
// EEPROM.get(0, Numbers[0]);
// Serial.println(Numbers[0], DEC);
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>
unsigned long Numbers[5]; // شماره ها در اینجا ذخیره شده اند
unsigned long inComingNumber;
int add[5] = {0, 10, 20, 30, 40};
byte value;
SoftwareSerial gsmSerial(7, 8);
char incomingByte;
String inputString;
#define rel 3
bool rels, lastrel = 0;
// String numbers[3] = {"+98*******", "+98********"}; // شماره هایی که مجاز به کار با دستگاه می باشند
String ersal[3] = {"AT+CMGS=\"+98********\"", "AT+CMGS=\"+98*********\""}; // شماره هایی که پیامک گزارش ها برای آنها ارسال می شود
/*
put number to EEPROM
your number if is 09123456789
set it like this 123456789
*/
void saveNumber(unsigned long number, byte solt)
{
EEPROM.put(add[solt], number);
}
/*
read and save to Numbers Array
put it at start of your code
*/
void readNumbers()
{
Serial.println("Read Numbers");
for (byte i = 0; i < 5; i++)
{
EEPROM.get(add[i], Numbers[i]);
Serial.print(i);
Serial.print(" : ");
Serial.println(Numbers[i], DEC);
}
}
void setup()
{
pinMode(rel, OUTPUT);
Serial.begin(9600);
gsmSerial.begin(9600);
readNumbers(); // با این دستور در ابتدا برنامه از روی حافظه برای شما شماره ها را میخواند و بر روی متغییر Numbers آماده میکند.
// while (!gsmSerial.available())
// {
// gsmSerial.println("AT");
// delay(1000);
// Serial.println("Connecting...");
// }
// Serial.println("Connected!");
// gsmSerial.println("AT+CMGF=1");
// delay(1000);
// gsmSerial.println("AT+CNMI=1,2,0,0,0");
// delay(1000);
// gsmSerial.println("AT+CMGL=\"REC UNREAD\"");
// delay(500);
}
void loop()
{
/*
با فرض بر اینکه پیامک دریافتی به صورت زیر باشد
+CMGL: 1,"REC UNREAD","+98123456789",,"07/02/18,00:05:10+32"
Reading text messages is easy.
*/
if (gsmSerial.available())
{
inputString = gsmSerial.readStringUntil('\n');
inputString.trim();
if (inputString.startsWith("+CMGL:")) // در اینجا خط اول خوانده شده و به این صورت می باشد +CMGL: 1,"REC UNREAD","+98123456789",,"07/02/18,00:05:10+32"
{
inputString.remove(0, inputString.indexOf(',') + 1); // در اینجا تا , را حذف میکنیم و می شود "REC UNREAD","+98123456789",,"07/02/18,00:05:10+32"
inputString.remove(0, inputString.indexOf(',') + 2); // این کار را تکرار میکنیم
//+98123456789",,"07/02/18,00:05:10+32"
Serial.println("------------------------------------");
Serial.println(inputString);
Serial.println("------------------------------------");
inComingNumber = inputString.substring(inputString.indexOf('+') + 3, inputString.indexOf('"')).toInt(); // در این مرحله از کارکتر بعد + 3 عدد جلو میرویم و تا " را میخوانیم و به عدد تبدیل میکنیم و نگه داری میکنیم.
Serial.print("New Number is : ");
Serial.println(inComingNumber);
for (byte i = 0; i < 5; i++)
{
if (inComingNumber == Numbers[i]) // در اینجا بررسی می کنیم این شماره با شماره های سیو شده داخل حافظه یکی می باشد یا خیر
{
inputString = gsmSerial.readStringUntil('\n'); // در صورت تایید خط بعدی که متن پیام هست خوانده می شود.
// در اینجا چه کاری میخواهید انجام بدهید به عهده شما هست که شماره شما چه چیزی می باشد.
// برای مثال شما میخواهید شماره جدیدی را سیو کنید می توانید به صورت زیر این کار را انجام بدهید.
inputString.trim(); // فرض می کنیم متن پیام به صورت زیر باشد Save3:456123789
if (inputString.startsWith("Save"))
{
inputString.remove(0, 4); // کلمه Save را پاک میکنیم
Serial.println(inputString);
Serial.print("Save in Solt : ");
Serial.print(inputString.substring(0, 1));
Serial.print("\t with Number : ");
Serial.println(inputString.substring(inputString.indexOf(':') + 1, inputString.length()));
saveNumber(inputString.substring(inputString.indexOf(':') + 1, inputString.length()).toInt(), inputString.substring(0, 1).toInt()); // در اینجا شماره را برداشته به همراه محل ذخیره سازی داده می شود
// در اینجا نیاز است برد ریست شود
// چون آردوینو امکان ریست شدن به صورت کدی را ندارد باید یکی از پین هارو به پایه reset وصل کنید
// و با دستور دادن به این پایه برد را ریست کنید.
}
}
}
}
else
{
Serial.println(inputString);
}
}
if (Serial.available())
{
inputString = Serial.readStringUntil('\n');
inputString.trim();
if (inputString.startsWith("Save"))
{
inputString.remove(0, 4); // کلمه Save را پاک میکنیم
Serial.println(inputString);
Serial.print("Save in Solt : ");
Serial.print(inputString.substring(0, 1));
Serial.print("\t with Number : ");
Serial.println(inputString.substring(inputString.indexOf(':') + 1, inputString.length()));
saveNumber(inputString.substring(inputString.indexOf(':') + 1, inputString.length()).toInt(), inputString.substring(0, 1).toInt()); // در اینجا شماره را برداشته به همراه محل ذخیره سازی داده می شود
// در اینجا نیاز است برد ریست شود
// چون آردوینو امکان ریست شدن به صورت کدی را ندارد باید یکی از پین هارو به پایه reset وصل کنید
// و با دستور دادن به این پایه برد را ریست کنید.
}
}
// if (gsmSerial.available())
// {
// inputString = "";
// delay(1000);
// while (gsmSerial.available())
// {
// incomingByte = gsmSerial.read();
// inputString += incomingByte;
// }
// delay(100);
// Serial.print("input : ");
// Serial.print(inputString);
// Serial.println(" end");
// inputString.toUpperCase();
// Serial.println("input up : " + inputString);
// for (byte i = 0; i < 3; i++)
// {
// if (inputString.indexOf(numbers[i]) > 0)
// {
// if (inputString.indexOf("ON") > 0)
// {
// digitalWrite(rel, HIGH);
// }
// if (inputString.indexOf("OFF") > 0)
// {
// digitalWrite(rel, LOW);
// }
// }
// }
// }
}
خروجی روی سریال مانیتور هم اضافه کردم.
از طریق سریال مانیتور هم میتونید بررسی کنید شماره های ذخیره شده روی حافظه رو.
هر بار ریست کنید در شروع برنامه به شما اعلام میشود چه شماره هایی ذخیره شده است
متن نمونه برای سیو کردن نیز به صورت زیر هست
Save3:456123