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

1 سال قبل
293 بازدید

0

سلام. ممنون میشم راهنمایی بفرمایید چطور میتوانم از طریق پیامک یک شماره تلفن همراه را با 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);
                }
            }
        }
    }
}
29 مهر 02 در 04:48
راحله
1

با سلام اعلام شده بود که بخشی از کد خود مربوط به ذخیره سازی دارید استفاده میکنید را نیز قرار بدهید.  – محمد دمیرچی 02-07-30 در 11:30

سلام بله درسته اما به دلیل شروع کلاسهای دانشگاه، این دوره که مربوط به گروه رباتیک صنایع بود و در آزمایشگاه دانشکده برق تشکیل میشد دچار تغییر زمان شده و هنوز روز و ساعت جدید اعلام نشده و متاسفانه سیستم اونجا هم لوکاله و به فایل ها و آردینو و... دسترسی ندارم، اگر راهنمایی بفرمایید که بدون حافظه جانبی با چه برنامه ای میتوانم شماره های تلفن همراه رو ذخیره کنم و بعد بخوانم ممنون میشم.  – راحله 02-08-06 در 03:40

افزودن دیدگاه

7 پاسخ ثبت شده است
1

با سلام.

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

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

char character[32];

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

String myString = String(character);

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

30 مهر 02 در 07:30
مجید مرآتی
609

افزودن دیدگاه

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);
    }
}
30 مهر 02 در 12:00
محمد دمیرچی
4240

این برنامه رو روی لپ تاپ(بدون اتصال به آردینو) کامپایل کردم اما ارور میده  – راحله 02-08-06 در 03:41

این تیکه کد می باشد. در کنار حلقه های برنامه خود باید قرار بدهید و از این فانکشن ها باید استفاده کنید.  – محمد دمیرچی 02-08-07 در 05:45

بله متوجم، تابع ها رو خطا میگیره، دلیلش رو هم متوجه نمیشم. اگر امکان داره و زحمتی نیست این برنامه ای که محبت کردید فرستادید رو تشریح بفرمایید ممنون میشم  – راحله 02-08-10 در 01:40

چه خطایی دریافت میکنید. ارور و جایی که از این کد استفاده کرده اید را ارسال کنید تا بررسی کنم  – محمد دمیرچی 02-08-13 در 06:40

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

ازین که در این مدت اینقدر مزاحمتون شدم پوزش‌می خواهم، واقعا اگر کافه ربات و کمک های شما نبود شاید خیلی زودتر ازین ها قید کار کردن با آردینو و ادامه دوره رو میزدم اما شما باعث شدید با وجود اینکه رشتم نه الکترونیک هست و نه کامپیوتر علاقه مند بشم  – راحله 02-08-13 در 06:51

افزودن دیدگاه

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 < 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

13 آبان 02 در 09:11
محمد دمیرچی
4240

ممنون تست میکنم نتیجه رو خدمتتون عرض میکنم  – راحله 02-08-13 در 09:43

ببخشید این برنامه چطور شماره های رو میگیره که ذخیره کنه؟‌شماره اولیه چی هست؟ شماره ای که میخوایم ذخیره کنیم رو چطور باید براش ارسال کنیم تست هم کردم اصلا پیامک دریافت نمگیره  – راحله 02-08-14 در 07:22

برای بار اول خط inComingNumber == Numbers[i] که شرط شماره ارسالی رو با شماره های سیو شده توی حافظه را چک میکند را باید خاموش کنید و با ارسال پیامک که شماره ارسالی را سیو کنید. در ادامه با فعال کردن این بخش فقط به شماره های ارسالی فیکس باقی میماند.  – محمد دمیرچی 02-08-14 در 09:23

شماره های بعدی برای ذخیره به صورت save1:0912******9 باید ارسال شود؟ تو سریال مانیتور نگاه میکنم اصلا پیامک دریافت نمیکنه که بخواید شمارش رو ثبت یا چک کنه.  – راحله 02-08-14 در 09:43

امروز از صبح دارم روی لین برنامه کار میکنم اما نتیجه نمیگیرم! مشکلاتی به نظرم هست، مثلا قبل از setup و شروع ارتباط سریال از serial.println استقاده کردید یا پیامک رو نوشتید با cmgl مخونه درحالی که cmt‌میخونه و اینکه اصلا برنامه دریافت پیامک نداره. همه اینا رو خودم تغییر دادم اما متاسفانه هیچی‌به هیچی!! لطفا اگر زحمتی نیست یک بازنگری بفرمایید ممنون میشم  – راحله 02-08-14 در 01:20

نمیشه شماره اول رو دستی ثبت کنیم و ازون به بعد اون بشه ادمین و هر شماره ای رو خواست اضافه یا جایگزین کنن؟ که لازم نباشه اون خطی که فرمودید رو دفعه اول غیر فعال کنیم؟  – راحله 02-08-14 در 01:22

یک بار متن پیامک دریافتی از سمت GSM که در سریال مانیتور دریافت میکنید را برای بنده ارسال کنید تا بر اساس اون تنظیم کنم  – محمد دمیرچی 02-08-15 در 05:02

کد آپدیت شد، در صورتی که پیامک ارسالی وارد مود سیو نشد حتما از سریال مانیتور عکس گرفته و پیوست کنید، کدی قرار دادم که نشان بدهد متن های ارسالی به چه صورت هستند.  – محمد دمیرچی 02-08-15 در 05:20

سلام وقت بخیر. ممنون از محبت شما، برنامه آپدیت شده رو تست کردم با تبدیل cmgl به cmt درست عمل میکنه و خروجی سریال مانیتور مانند خروجی شماست و شماره ها در حافظه ذخیره میشوند، فقط یک مسئله اینکه با هر سماره ای ظارهرا میشه شماره ها را عوض کرد و شماره جدید ذخیره کرد، البته من دو شماره بیشتر نداشتم اما با هردو امتحان کردم شماره های در حافظه عوض میشد!  – راحله 02-08-15 در 07:26

ببخشید عدد ذخیره شده در حافظه با شماره تلفن تفاوت داره و هیچ شباهتی به هم ندارن دلیل چیه؟ یعنی مثلا من دستور Save1:09121234567 را ارسال کردم اما بعد از ریست آردینو شماره در حافظه یک ۵۳۱۲۹۹۹۷۵ هست  – راحله 02-08-15 در 07:30

09 رو ارسال نکنید حافظه انقدر جا ندارد که این عدد بزرگ رو ذخیره کند.  – محمد دمیرچی 02-08-15 در 08:44

سلام. ببخشید اینکار رو چطور میتونم به جای موبایل به وسیله صفحه کلید ۳ در ۴ انجام بدم؟  – راحله 02-08-20 در 08:38

اون یه داستان دیگه رو ایجاد میکنه، پیشنهاد میکنم از آموزش صفحه کلید ماتریکسی و نحوه راه اندازیش رو مطالعه کنید، بعدش مراحل تاییده و رمز و.. رو باید براش درست کنید در نهایت چطوری توی حافظه بریزه هم براش ایجاد کنید، نمایشگر هم باید قرار بدهید تا ببینید چه عدد هایی را وارد کردید.  – محمد دمیرچی 02-08-20 در 12:59

برای اون هم همین روش ذخیره سازی تکی تکی و شیفت و... باید اجرا بشه  – راحله 02-08-20 در 02:00

روش ذخیره‌سازی همین هست، به دنبال روش های دیگر نباشید. اگر میخواهید ساده‌تر انجام بدهید از همان اول گفتم به سراغ esp بروید.  – محمد دمیرچی 02-08-22 در 05:25

در سایت کافه ربات برنامه مربوط به اتصال صفحه با یک لاین نیست؟  – راحله 02-08-22 در 11:06

با چه صفحه ای؟؟ کیپد رو منظورتون هست؟؟ آموزش خود کیپد رو مطالعه کنید.  – محمد دمیرچی 02-08-22 در 11:34

سلام .ببخشید مجددا مزاحمتون میشم، چون مشغول دانشگاه هستم کمتر فرصت میکنم با آردینو کار کنم تازه این برنامه رو تست کردم، همانطور که فرمودید 09 را ارسال نکردم درست ذخیره شد فقط برنامه خیلی پیچیده است و مسکل دیگری هم که دارم بعد از قطع و وصل برق(نه ریست) دیگه ارتباط با سریال و sim800 برقرار نمیشه و باید دوباره پروگرام کنم! چرا اینطوریه؟  – راحله 02-08-26 در 01:42

خواهش میکنم ،این یک کد خیلی ساده ای هست. این که ارتباط با sim800 قطع می شود دلیل دیگری باید داشته باشد و باید مورد بررسی قرار بگیرد.  – محمد دمیرچی 02-08-27 در 05:43

بله درست می فرمایید اما برای من که نه رشتم الکترونیک نه کامپیوتر و فقط یک دوره اردینو شرکت کردم و علاقه مند شدم به عنوان کتر فوق‌برنامه راحت نیست و از همین جهت زیاد مزاحم شما می شم و شما هم با صبوری پاسخ میدید و چندین برابر دوره ای که تابستان شرکت کردم از شما ساد گرفتم، این برنامه رو هم همانطور که عرض کردم برای کارگاه پدرم میخوام که بتونن یک کلید رو بدون بالا رفتن از پله ها خاموش‌روشن کنن. در مورد sim800 چندتا برنامه دیگه آپلود کردم هیچکدومشون این مشکل رو نداشتن و فقط این برنامه مشکل داشت  – راحله 02-08-27 در 03:16

افزودن دیدگاه

0

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

1 ماه قبل
عباس شفیعی
1

سلام سپاس از مهندس دمیرچی عزیز، برنامه با دقت بررسی کردم و مواردی نیاز به تغییر پ اصلاح داشت انجام دادم و کاملا صحیح عمل میکنه، ممنونم... الان یک مشکل دارم، مداری که با آردینو یونو بستم بعد از اینکه مثلا فرمان میدیم رله ۱ رو روشن کن بعد از روشن کردن یک پیامک به شماره هایی که به برنامه دادم ارسال میکنه مبنی بر اینکه لامپ کارگاه روشن شد، حالا که دارم شماره ها را از حافظه میخوانم برای ارسال گزارش چطور باید این شماره ها را استفاده کنم، در حال حاضر همانطور کی در خط ۸ برنامه ویرایش سوال ملاحظه میفرمایید این شماره ها را با فرمت String ersal[3] = {"AT+CMGS=\"+98********\"", "AT+CMGS=\"+98*********\""}; قراردادم در دستورات به این شماره ها ارسال میشه، لطفا راهنمایی بفرمایید برای این مورد(ارسال گزارش عملکرد پیام) به شماره های ذخیره شده در حافظه باید چه کار کنم. باز هم سپاسگزارم  – راحله 03-09-24 در 09:11

افزودن دیدگاه

0

با سلام

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

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

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

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

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

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

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

 

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

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

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

7 روز قبل
محمد دمیرچی
4240

سلام آخه مشکل اینجاست که برای مثلا یک ره نیازه به 4 تا شماره پیامک ارسال کنه برای یک رله فقط به یک شماره و برای رله دیگر مثلا 2 شماره، یعنی قرار نیست فقط به شماره ای که دستور فعال سازی رله رو داده پیام بفرسته  – راحله 03-09-25 در 06:53

افزودن دیدگاه

0

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

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

 

ویرایش :

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

7 روز قبل
راحله
1

یکم موضوع را بیشتر باز میکنید. متوجه منظورتون نشدم. یک مثال میزنید که به چه صورت باید عمل بکند. با ویرایش سوال میتوانید توضیحات بیشتری را قرار بدهید.  – محمد دمیرچی 03-09-25 در 08:23

افزودن دیدگاه

0

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

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

اگر برای دستور های خاصی میخواهید شماره های خاصی تنظیم بکنید. مثلا در این فضا به شماره های 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) به شماره فلان ارسال بشود. نیازی نیست میکروکنترلر و ماژول سیمکارت درگیر ارسال و دریافت پیام بشوند و پس از این دستور ماژول اقدام به ارسال پیام میکند و در صورتی که شارژ نداشته باشد و آنتن دهی کافی نباشد به شما ارور مربوطه را میدهد.

7 روز قبل
محمد دمیرچی
4240

بسیار سپاسگزارم حتما ان شالله انجام میدم مشکلی بود مجددا مزاحمتون میشم، یک سوال هم خدمتتون دارم، اینکه در برنامه فرمودید متن پیام دریافتی به صورت +CMGL: 1,"REC UNREAD","+98123456789",,"07/02/18,00:05:10+32" است، ای متن وابسطه به چیه و چرا برای من با این متن فرق داره؟ در صورتی که دقیقا این برنامه رو اجرا کردم فقط به خاطر تفاوت متن دستورات مربوط به حذف اضافات رو تغییرات مختصری دادم  – راحله 03-09-25 در 06:39

نمیدانم بالاتر گفتم یا خیر ، بنده SIM800 ندارم و با ماژول A6 تست کردم و به این صورت دستور ها را دریافت میکنم. و خدمتتون عرض کرده بود که با توجه به متن دریافتی خودتان باید تغییر بدهید.  – محمد دمیرچی 03-09-26 در 05:46

ممنون از پاسختون، ببخشید خط )(readNumbers که مربوط به ذخیره شماره روی‌متغیر Numbers هست رو چطور میشه قبل از viod setup آورد، وقتی در اونجا میارمش ارور میده  – راحله 03-09-27 در 12:10

قبل void setup شما نمیتوانید دستوری را اجرا بکنید. هر دستوری دارید که میخواهید در شروع اجرا برنامه اجرا شود داخل همین void setup باید بزنید و نیازی نیست جا به جا اش بکنید در شروع برنامه بعد از اینکه کانفیگ های سریال انجام شد اطلاعات مربوط به شماره ها از حافظه خوانده میشود.  – محمد دمیرچی 03-09-27 در 01:46

بسیار ممنون، دستورات "AT+CPMS=\"ME\",\"ME\",\"ME\"" "AT+CMGD=1,4" که فرمودید را در دو خط در viod setup در سریال پرینت بذارم ارسال کنم؟ و سوال دوم اینکه جای me باید چیزی بذارم یا همون me باید باشه؟ ببخشید کلا متوجه منظورتون ازین دستورات و توضیحاتی که در مورد ارسال نشدن گاه به گاه پیامک فرمودید نشدم،اگر امکان داره بیشتر توضیح بفرمایید که موضوع و مشکل دقیقا چی هست؟  – راحله 03-09-27 در 07:00

پاسخ ویرایش شد  – محمد دمیرچی 03-09-28 در 12:38

ممنونم، متوجه شدم، منظور شما اینه که متن پیامک رو در ماژول سیمکارت ذخیره کنم.  – راحله 03-09-28 در 01:27

ببخشید یک سوال، وقتی از حافظه آردینو استفاده میکنیم مثلا ۵ تا شماره تلفن یا متن یا... در eeprom آردینو ذخیره میکنیم باعث کندی عملکردش میشه یا استفاده از حافظه ارتباطی به عملکرد میکرو نداره؟  – راحله 03-09-28 در 01:29

در مرحله اول حافظه آردوینو خیلی نیست که همه چیز را داخل آن قرار بدهید و همچنین در عملکرد میکرو تاثیری ندارد و فقط باید این نکته را توجه داشته باشید که زیاد داخل این حافظه write نکنید (read مشکلی ندارد) چون عمر این حافظه محدود می باشد و بعد از 1 میلیون بار wirte خراب میشود.  – محمد دمیرچی 03-10-01 در 05:49

افزودن دیدگاه


انجمن کافه‌ربات © 1400