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

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

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

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

3 پاسخ ثبت شده است
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
محمد دمیرچی
4170

این برنامه رو روی لپ تاپ(بدون اتصال به آردینو) کامپایل کردم اما ارور میده  – راحله 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
محمد دمیرچی
4170

ممنون تست میکنم نتیجه رو خدمتتون عرض میکنم  – راحله 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

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


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