ذخیره شماره تلفن همراه در حافظه آردینو

سلام. ممنون میشم راهنمایی بفرمایید چطور میتوانم از طریق پیامک یک شماره تلفن همراه را با sim800l در حافظه آردینو ذخیره و بازخوانی کنم.

 

ویرایش:

 

این برنامه ای هست که نوشتم و کار میکنه البته بخشهایی مثل دریافت گزارشم بعدا بش اضافه میکنم، بحث حذف و اضافه شماره تلفنهای محاز از طریق پیامک رو هم میخوام به این برنامه اضافه کنم.

#include <SoftwareSerial.h>
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*********\""}; // شماره هایی که پیامک گزارش ها برای آنها ارسال می شود

void setup()
{
pinMode(rel, OUTPUT);
Serial.begin(9600);
gsmSerial.begin(9600);
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()
{
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);
}
}
}
}
}

با سلام.

برای دریافت SMS می توانید از آموزش این لینک استفاده کنید.

به محض دریافت SMS، باید با کد زیر، آن را در یک آرایه کاراکتری ذخیره کنید.

char character[32];

while(Serial.available()) {    character[i] = Serial.read(); }

String myString = String(character);

سپس با استفاده از دستور myString.indexOf می توانید به عنوان مثال موقعیت کاراکترهای " را پیدا کرده و شماره تلفن را که بین آن دو قرار گرفته را بخونید و در یک متغیر کاراکتر آرایه ای ذخیره کنید. جهت استفاده از دستور indexOf() می توانید از این لینک کمک بگیرید.
اما برای ذخیره شماره تلفن های استخراج شده به روش فوق، باید یک EEPROM تهیه کنید و به آردوینو خود متصل کنید. روش کار با این نوع حافظه ها را در این لینک می توانید مطالعه کنید.

1 پسندیده

با سلام

از این کد می توانید استفاده کنید.

#include <EEPROM.h>

unsigned long Numbers[5];

int add[5] = {0, 10, 20, 30, 40};
byte value;

/*
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
*/
unsigned long readNumbers()
{
for (byte i = 0; i < 5; i++)
{
EEPROM.get(add[i], Numbers[i]);
Serial.println(Numbers[i], DEC);
}
}

1 پسندیده

بنده ماژول 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 &lt; 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 &lt; 3; i++)
//     {
//         if (inputString.indexOf(numbers[i]) &gt; 0)
//         {
//             if (inputString.indexOf("ON") &gt; 0)
//             {
//                 digitalWrite(rel, HIGH);
//             }
//             if (inputString.indexOf("OFF") &gt; 0)
//             {
//                 digitalWrite(rel, LOW);
//             }
//         }
//     }
// }

}

 

خروجی روی سریال مانیتور هم اضافه کردم.

از طریق سریال مانیتور هم میتونید بررسی کنید شماره های ذخیره شده روی حافظه رو.

هر بار ریست کنید در شروع برنامه به شما اعلام میشود چه شماره هایی ذخیره شده است

متن نمونه برای سیو کردن نیز به صورت زیر هست

Save3:456123

1 پسندیده

با سلام من هم یک کد نوشتم که تعدادی شماره ذخیره کردم و پیامک به این شماره ها ارسال میشه با کد دستوری پیامکی میخوام حذف و اضافه کنم متاسفانه نمیتونم. با esp32 کار کردم.ممنون میشم راهنماییم کنید

با سلام

در جواب دوستمون جناب شفیعی،

برای کار کردن در سیستم ESP32 به دلیل اینکه حافظه EEPROM ندارد از این روش نمیتوانید استفاده بکنید.

راهی که باید پیش بگیرید به این صورت می باشد که از سیستم SPIFFS استفاده بکنید. به این صورت که در داخل خود ESP یک حافظه مثل SD Card به وجود می آید و میتوانید فایل های خود را در آن بریزید.

حال فرض بکنید که یک فایل TXT دارید که شماره ها در آن وجود دارد و یک کارکتر خاص مانند , از هم جدا شده اند.

به این صورت در شروع برنامه این فایل TXT را میخوانید و به صورت String در متغیر میریزید. سپس با دستور های indexOf و substring کارکتر مخصوص را پیدا میکنید و بازه 0 تا آن کارکتر را پیدا میکنید و به صورت int در آرایه Numbers ذخیره میکنید. هم‌زمان طول این متغیر را  نیز اندازه گیری میکنید تا در صورتی که کمتر از یک مقدار (مثلا 2) شد یعنی متنی باقی نمانده که بررسی بکنید. - فراموش نکنید که هر سری متن را پیدا کردید و برداشت کردید از دستور remove برای پاک کردن آن بخش استفاده بکنید.

آموزش استفاده از طریق آردوینو

آموزش استفاده از طریق platformIO

 

در جواب دوستمون که کامنت گذاشته اند - پیشنهاد میکنم بر روی گزینه پاسخ به این سؤال کلیک کنید تا یک سؤال جدید ایجاد شود. در غیر این صورت برای ما نوتفیکیشن نمی آید که پاسخ بدهیم.

این موضوع را دقت بکنید که وقتی پیامی را دریافت میکنید شماره فرستنده در متغیر inComingNumber وجود دارد.

پس از اینکه کار های میخواهید انجام شد از همین متغیر استفاده بکنید برای ارسال جواب وضعیت. نیازی نیست درگیر آرایه کل شماره ها بشوید.

1 پسندیده

سلام آخه مشکل اینجاست که برای مثلا یک ره نیازه به 4 تا شماره پیامک ارسال کنه برای یک رله فقط به یک شماره و برای رله دیگر مثلا 2 شماره، یعنی قرار نیست فقط به شماره ای که دستور فعال سازی رله رو داده پیام بفرسته

ببخشید متوجه نشدم سوالم رو ازین طریق مطرح کنم یا از طریق افزودن دیدگاه یا...؟

 

ویرایش :

یک مداره برای کارگاه بابام درست کردم که غیر از خودش چند نفر دیگه هم اونجان و مثلا وقتی یکی فرمان میده که رله مربوط به کنتاکتور یکی از دستگاه ها روشن بشه برای ۵ نفر که شمارشون تو حافظه است پیام میره یا مثلا یکی‌پیامک میفرسته لامپ انبار روشن بشه برای سه نفر پیام میره، منظورم اینه پیامک فقط برای کسی که پیام به دستگاه فرستاده نمیره و گاهی برای همه یا برای بخشی از افراد میره به خاطر همین لازمه موقع ارسال پیامک همه شماره های در حافظه را چک و برای اونهایی که مشخص شده پیام ارسال کند. نمیدونم تونستم خوب خدمتتون توضیح بدم؟ 

خوب این مشخص هست

اگر میخواهید وقتی پیام روشن شدن دریافت شد به سایر به جز فرستنده پیام ارسال بشه که ساده می باشد داخل یک حلقه شرط بررسی میکنید شماره دریافتی اگر شماره ای که میخواهید ارسال بکنید یکسان نبود ارسال انجام بشه.

اگر برای دستور های خاصی میخواهید شماره های خاصی تنظیم بکنید. مثلا در این فضا به شماره های 1 تا 3 ارسال بکنه. کافی است یک آرایه نیز ایجاد بکنید که در آن محل مشخص بکنید به چه کسانی پیام رو ارسال بکنه.

دلیل اینکه پیام ها به صورت رندوم گاهی ارسال و گاهی ارسال نمیشود قفل کردن ماژول سیم کارت در ارسال پیام های پشت هم هست. برای رفع این مشکل. کافی است متن پیام و شماره هایی که میخواهید برای آنها ارسال بکنید را از قبل داخل حافظه ماژول سیم کارت تنظیم بکنید.

برای این کار پس از این که ماژول سیم کارت روشن شد و آماده کار شد دستور های زیر را باید ارسال بکنید.

"AT+CPMS=\"ME\",\"ME\",\"ME\""
"AT+CMGD=1,4"
// در اینجا کل حافظه را پاک کرده اید
// این بخش را یکبار انجام بدهید

“AT+CMGW="+989123456789"” //شماره ای که میخواید پیام را سیو بکنید
//حال متن پیام مورد نظر خود را وارد میکنید
// در اینجا به شما اعلام میشود که پیام شما در حافظه شماره x ذخیره شد
// این بخش را به تعداد شماره ها و متن های مختلفی که میخواهید تکرار بکنید

حال شما یک آرشیو کامل از پیام های آماده داخل ماژول سیمکارت دارید.

برای ارسال پیام کافی است دستور 

AT+CMSS=x //شماره ای که دستگاه داده است

ارسال بکنید تا پیام مورد نظر به شماره مورد نظر ارسال بشود. - از این لینک میتوانید اطلاعات بیشتری را دریافت بکنید

البته پیشنهاد بنده در این روش متن ها را برای یک شماره ایجاد بکنید. و در نهایت با دستور 

AT+CMSS=x,"+989123456789"

متن مورد نظر که ذخیره شده است را به این شماره جدیدی که تایین کرده اید ارسال بکند.

در این روش متن ارسالی دچار خطا نمیشود و سرعت ارسال پیام بیشتر میشود.

حتما پس از اجرا این دستور منتظر جواب OK باشید و بعدش دستور ارسال پیام بعدی را بدهید. از دیلی برای این کار استفاده نکنید چون بسته به شلوغی شبکه امکان دارد زمان برگشت OK متفاوت باشد.

این موضوع که اعلام کردم هر بار موقع روشن کردن ماژول سیمکارت اطلاعات را پاک و از نو تنظیم بکنید نیز به این دلیل می باشد که در تست های بنده در حدود یک الی 2 هفته خاموش بودن سیستم این اطلاعات به صورت رندوم پاک میشوند و نمیتوان بهشون اعتماد کرد و وقتی در زمان روشن شدن تنظیم میشود مطمئن هستید تا زمانی که روشن هست مشکلی پیش نمی آید.

 

در نهایت برای این که پیامک برای چه شخصی ارسال بشود یا نشود را در یک گراف بکشید سپس با ایجاد شرط و حلقه هدف خود را ایجاد بکنید. به این صورت در زمینه برنامه نویسی گیج نمیشوید و نقشه ای از مراحل کار خود دارید.

 

از این 2 سایت برای بررسی چارت کدی که نوشته اید میتوانید استفاده بکنید.

https://app.code2flow.com/

https://codetoflow.com/

www.mymap.ai

 

 

ویرایش اول:

دستور AT+CPMS برای تنظیم کردن حافظه می باشد و بله باید بر روی ME تنظیم بکنیم تا از حافظه خود ماژول استفاده بشود.

همچنین بعد از تنظیم تمامی پیام ها دستور 

AT+CPMS="SM","ME","SM"

نیز ارسال بکنید.

همچنین دقت بنمایید به توضیحات بالاتر. عرض کردم بعد از تنظیم کردم ماژول سیمکارت این دستور ها را ارسال بکنید.

 

حال توضیح بیشتر در مورد این که چرا این کار را انجام میدهیم.

هر بار شما میخواهید دستور ارسال پیام را بدهید ابتدا دستور میدهید که میخواهید یک پیام به یک شماره ای ارسال بشود. سپس از سمت ماژول یک کارکتر > می آید که متن پیام را وارد بکنید و زمانی که متن پیام را وارد میکنید با علامت پایان متن که پیام ارسال بشود.

گاهی پیش می آید به دلیل وجود نویز در خط ارتباطی بین ماژول و میکروکنترلر دیتا ارسالی دچار خطا میشود و متن های اشتباهی تایپ میشود و در صورتی که این متن تایپ شده خیلی ایراد سنگین داشته باشد پیام ارسال نمیشود و به شما با ارور بر میگردد.

برای رفع این مشکل راهکار این است که پیام را داخل سیو مسیج های داخلی خود سیمکارت ذخیره کرده باشیم. به این صورت شما فقط دستور میدهید که متن (برای مثال شماره 3) به شماره فلان ارسال بشود. نیازی نیست میکروکنترلر و ماژول سیمکارت درگیر ارسال و دریافت پیام بشوند و پس از این دستور ماژول اقدام به ارسال پیام میکند و در صورتی که شارژ نداشته باشد و آنتن دهی کافی نباشد به شما ارور مربوطه را میدهد.

کد را دقت نمیکنید. اگر شما داخل setup متغییری تعریف بکنید. داخل همان جا میتوانید بهشون دسترسی پیدا بکنید یعنی متغییری که تعریف کرده اید خصوصی می باشد

اگر بیرون setup بالاترش ایجاد بکنید این مقدار public یا کلی میشود. و میتوانید داخل همه فانکشن ها این متغییر را استفاده بکنید.

برای مثال تعدادی کامنت داخل کد قبلی اضافه کردم تا دقیق تر متوجه بشوید.

#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*********"”}; // شماره هایی که پیامک گزارش ها برای آنها ارسال می شود

//متغییر های بالاتر از اینجا جهانی هستند و میتوانید داخل همه فانکشن ها بهشون دسترسی پیدا بکنید.
//برای مثال آرایه Numbers public تعریف شده است و میبینیم کجا ها استفاده شده است

/*
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 آماده میکند.

}

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 &lt; 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 وصل کنید
        //  و با دستور دادن به این پایه برد را ریست کنید.
    }
}</code></pre>

 

 

نکته دیگر نیز برای دستور ارسال از این آرایه ersal که شما ساخته اید استفاده نمیشود.

شما شماره مورد نظر را دارید. پس دستور ارسال به صورت 

 

gsmSerial.println("AT+CMGS=\""+String(Numbers[2])+"\"");//شما میتوانید هر عددی را به جای این آرایه Numbers[2] قرار بدهید.
//اگر از شماره های مختلف حافظه میخواهید استفاده بکنید کافی است عدد 2 را تغییر بدهید که به همان شماره دستور ارسال را بدهید.

با سلام اعلام شده بود که بخشی از کد خود مربوط به ذخیره سازی دارید استفاده میکنید را نیز قرار بدهید.

سلام بله درسته اما به دلیل شروع کلاسهای دانشگاه، این دوره که مربوط به گروه رباتیک صنایع بود و در آزمایشگاه دانشکده برق تشکیل میشد دچار تغییر زمان شده و هنوز روز و ساعت جدید اعلام نشده و متاسفانه سیستم اونجا هم لوکاله و به فایل ها و آردینو و… دسترسی ندارم، اگر راهنمایی بفرمایید که بدون حافظه جانبی با چه برنامه ای میتوانم شماره های تلفن همراه رو ذخیره کنم و بعد بخوانم ممنون میشم.

این برنامه رو روی لپ تاپ(بدون اتصال به آردینو) کامپایل کردم اما ارور میده

این تیکه کد می باشد. در کنار حلقه های برنامه خود باید قرار بدهید و از این فانکشن ها باید استفاده کنید.

بله متوجم، تابع ها رو خطا میگیره، دلیلش رو هم متوجه نمیشم.
اگر امکان داره و زحمتی نیست این برنامه ای که محبت کردید فرستادید رو تشریح بفرمایید ممنون میشم

چه خطایی دریافت میکنید. ارور و جایی که از این کد استفاده کرده اید را ارسال کنید تا بررسی کنم

سلام. این سوال دیگه برای دوره نیست چون فعلا که امکان تشکیل کلاس تو آزمایشگاه نیست و اگر آخر هفته باشه من امکان شرکت ندارم، الام می خوام فقط این مشکل حل بشه چون دیگه شخصیه، یک آردینو یونو و ماژول رله و… از کافه ربات خریدم و برای کارگاه بابام یک مدار درست کردم که با پیامک یک کلید که دسترسی بش سخته و روزی چندبار خاموش‌روشن باید بشه رو با موبایل روشن خاموش‌میکنن اما الان مشکل اینجاست که بابام همیشه تو کارگاهش نیست کارگراشم زیاد عوض‌میشن به خاطر همین میخواد وقتی کارگری رفت شماره اون رو پاک کنه و شماره جدید اضافه کنه و من دوباره به همین مشکل امکان حذف و اضافه شماره تلفن های مجاز به کار دستگاه برخورد کردم! از بچه های الکترونیکم پرسیدم هیچکدوم بلد نبودن!!! لطفا بفرمایید دستورات رو چطور و کجاش به برنامم اضافه کنم که یک شماره ادمین باشه و بتونه باقی شماره ها رو حذف یا اضافه کنه؟ برنامه ای که الان داره کار میکنه رو در ویرایش سوال نوشتم، لطفا ملاحظه کنید راهنمایی بفرمایید.

ازین که در این مدت اینقدر مزاحمتون شدم پوزش‌می خواهم، واقعا اگر کافه ربات و کمک های شما نبود شاید خیلی زودتر ازین ها قید کار کردن با آردینو و ادامه دوره رو میزدم اما شما باعث شدید با وجود اینکه رشتم نه الکترونیک هست و نه کامپیوتر علاقه مند بشم

ممنون تست میکنم نتیجه رو خدمتتون عرض میکنم

ببخشید این برنامه چطور شماره های رو میگیره که ذخیره کنه؟‌شماره اولیه چی هست؟ شماره ای که میخوایم ذخیره کنیم رو چطور باید براش ارسال کنیم
تست هم کردم اصلا پیامک دریافت نمگیره

برای بار اول خط inComingNumber == Numbers[i] که شرط شماره ارسالی رو با شماره های سیو شده توی حافظه را چک میکند را باید خاموش کنید و با ارسال پیامک که شماره ارسالی را سیو کنید. در ادامه با فعال کردن این بخش فقط به شماره های ارسالی فیکس باقی میماند.