اطلاعیه

Collapse
No announcement yet.

پروژه sms controler ساده

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    پروژه sms controler ساده

    با سلام :bye
    این یه پروژه ی ساده کنترل چهار تا رله با اس ام اس هست .

    برای فعال کردن رله Sx که xشماره رله هست(ضمنا اس بزرگ هم هست )
    برای غیر فعال کردن رله Rx که x شماره رله هست .
    مثلا:
    با ارسال S1 به شماره سیم کرت ماژول رله شماره یک فعال میشه .
    با ارسال R1 رله شماره 1 غیر فعال میشه.
    (ضمنا HEADER JAMPER1 برای اتصال سیم 900 به کامپیوتر گزاشتمش و باید پایه ی(HEADER JAMPER1) یکش به 2 و سه به چهار وصل بشه تا USART میکرو به ماژول متصل بشه . )
    موفق باشید :job:
    یاعلی

    لینک:
    http://s6.picofile.com/file/8198882126/sms_controller_easy.rar.html
    محمد.م

    #2
    پاسخ : پروژه sms controler ساده

    نوشته اصلی توسط mohamad0
    با سلام :bye
    این یه پروژه ی ساده کنترل چهار تا رله با اس ام اس هست .
    برای فعال کردن رله Sx که xشماره رله هست(ضمنا اس بزرگ هم هست )
    برای غیر فعال کردن رله Rx که x شماره رله هست .
    مثلا:
    S1 رله شماره یک فعال میشه .
    R1 رله شماره 1 غیر فعال میشه.
    موفق باشید :job:
    یاعلی
    سلام
    مشخصات رو دادید که بهتون پروژه بدیم؟
    وب سایت تخصصی برق و الکترونیک روبوتیها
    انجام کلیه پروژه های الکترونیک با نازل ترین قیمت
    www.Robotiha.ir

    دیدگاه


      #3
      پاسخ : پروژه sms controler ساده

      سلام
      ببخشید لینکا یادم رفت کپی کنم.اصلاح شد
      محمد.م

      دیدگاه


        #4
        پاسخ : پروژه sms controler ساده

        نوشته اصلی توسط mohamad0
        با سلام :bye
        این یه پروژه ی ساده کنترل چهار تا رله با اس ام اس هست .
        برای فعال کردن رله Sx که xشماره رله هست(ضمنا اس بزرگ هم هست )
        برای غیر فعال کردن رله Rx که x شماره رله هست .
        مثلا:
        S1 رله شماره یک فعال میشه .
        R1 رله شماره 1 غیر فعال میشه.
        (ضمنا HEADER JAMPER1 برای اتصال سیم 900 به کامپیوتر گزاشتمش و باید پایه ی(HEADER JAMPER1) یکش به 2 و سه به چهار وصل بشه تا USART میکرو به ماژول متصل بشه . )
        موفق باشید :job:
        یاعلی

        لینک:
        http://s6.picofile.com/file/8198882126/sms_controller_easy.rar.html
        من فکر کردم شما گفتید که این پروژه رو براتون انجام بدن!!نمی دونستم این پروژه رو می خواین به بقیه بدین!!دستتون درد نکنه عالی بود
        وب سایت تخصصی برق و الکترونیک روبوتیها
        انجام کلیه پروژه های الکترونیک با نازل ترین قیمت
        www.Robotiha.ir

        دیدگاه


          #5
          پاسخ : پروژه sms controler ساده

          سلام
          ببخشید چطور میشه که فقط با یه شماره خاصی بشه بهش فرمان داد؟
          همچنین بدلیل استفاده از while و getchar برنامه روی این قسمت گیر میکنه تا اینکه یه sms دریافت کنه. راهی داره که این مشکل برطرف بشه؟
          به طور کلی فرمت دریافت پیام از sim900 چیه؟ یعنی وقتی یه پیام میاد برای sim900 چه دستورات و کاراکترهایی ماژول برای میکرو میفرسته؟
          www.gam-co.blogsky.com

          دیدگاه


            #6
            پاسخ : پروژه sms controler ساده

            سلام
            وقتی یه پیام در یافت میشه ماژول آدرس خونه ای که پیام تو اونجا در یافت شده را میفرسته .وقتی پیام در یافت بشه متن شبیه زیر ماژول برای شما میفرسته که 3 آدرس خونه ا هست که پیام توش ذخیره شده .
            CMTI: “SM”,3+
            بعد شما باید اون آدرسا به ماژول بفرستی و ماژول متن پیام+ شماره تلفن فرستنده+تاریخ +...... را برات برمیگردونه .
            که دستور at+cmgr=3 را میفرستی و نتیجه شماره تلفن فرستنده + متن پیام+ ... هست که ماژول برات میفرسته .
            البته باید قبلش یه سری تنضیمات انجام بدی . مثل تنظیم تکست مود و....
            این فایلی که الان گزاشتم مال آقای صفا منش هست که میتونید اطلاعات کاملی را از اون بدست بیارید.
            این فایلا بخونید تا کلیات مطلب دستتون بیاد . بعد توضیح میدم که چطوری شماره را از متن ارسالی استخراج کنید و ما شماره ی مورد نظرتون مقایسه کنید . موفق باشید
            http://s3.picofile.com/file/8201837792/sim900_and_mobile_www_iranmicro_ir_.rar.html

            محمد.م

            دیدگاه


              #7
              پاسخ : پروژه sms controler ساده

              خیلی ممنون بابت پاسختون
              میخوام با کمک شما و سایر دوستان این برنامه sms controller رو تکمیلش کنیم. یعنی جوری که به یک شماره خاص حساس باشه و همینطور برنامه روی getchar گیر نکنه. همچنین اگه بشه وقتی شارژ سیم کارت مثلا از 400 تومن کمتر شد اعلام بشه. اگه ارتباط شبکه نیز قطع شد میکرو ماژول رو ریست کنه تا وقتی که ارتباط برقرار بشه و نیازی به ریست دستی نباشه. اگه ممکنه شما توضیح این قسمت تشخیص شماره رو شروع کنید منم دنبالشو میگیرم.
              مرسی
              www.gam-co.blogsky.com

              دیدگاه


                #8
                پاسخ : پروژه sms controler ساده

                با فرض این که پیام در یافتی تو خونه ی شماره ی یک ذخیره شده باشه .
                با ارسال AT+CMGR=1
                ماژول متن پیام را براتون میفرسته :

                <CR >< LF>
                <CMGR: "REC READ","+989137882735","","15/07/24,00:01:19+14<CR > < LF"+

                MOHAMAD
                <CR >< LF>

                OK
                <CR >< LF>

                خوب حالا از تو این رشته ما باید شماره تلفن ا بیرون بکشیم .
                داخل متن کاراکتر" , " را جستو جو میکنیم . از این مکان+ یک کاراکتر بعد تا " را تو یه آرایه ذخیره میکنیم . که میشه شماره تلفن .
                حالا از اون LF ابی رنگ تا CR هم داخل یه آرایه دیگه زخیره میکنیم که میشه متن پیام .
                ضمنا کاراکتر LF معادل 0X0A
                و CR معادل 0X0D هست (در اصل اینا کاراکتر هایی هستند که معادل سمبل ندارند و قابل مشاهده با چشم نیستند)
                برای پیدا کردن یه کاراکتر در رشته هم از تابع STRPOS استفاده میکنیم . فردا یه نمونه کد میزارم که همین کارا برمون انجام بده .
                موفق باشید
                محمد.م

                دیدگاه


                  #9
                  پاسخ : پروژه sms controler ساده

                  عالی بود. خوب متوجه شدم
                  تا فردا بی صبرانه منتظرم
                  مرسی
                  www.gam-co.blogsky.com

                  دیدگاه


                    #10
                    پاسخ : پروژه sms controler ساده

                    سلام
                    اول این دوتا تابعو توضیح بدم که خیلی باش کار داریم.
                    کد:
                    signed char strpos(char *str, char c)
                    این تابع کاراکتر C را داخل رشته ی STR جست وجو میکنه و اولین محل اون تو رشته را بر میگردونه . و اگه هم موجود نبود 1- را بر میگر دونه
                    کد:
                    signed char strcmp(char *str1, char *str2)
                    این تابع STR1 با STR2 را مقایسه میکنه و اگه برابر بودند 0 را بر میگردونه و در غیر این صورت عددی غیر صفر را بر میگردونه .
                    ----------------------------------------
                    حالا بحث اصلی
                    یه تابع برا خوندن پیام ها نوشتم و سورسش هم ضمیمه شده:
                    این تابع به خونه ی offset مراجعه میکنه و در صورتی که داخلش پیام موجود باشه شماره تلفن+متن پیامو جدامیکنه داخل دوتا ارایه مینویسه و صفر را هم بر میگردونه. اگه خونهی offset خالی بود مقدار1- را بر میگردونه و داخل ارایه ها هیچی نمیریزه .
                    کد:
                    char read_sms_textmode(char *msg,char *number,unsigned char offset)
                    توضیح محتوای تابع :
                    کد:
                    printf("AT+CMGR=%d",offset);
                    putchar(CR);
                    این قسمت آدرسی را که قرره از حافظه خونده بشه(offset) برا ماژول میفرسته.
                    ----------------
                    کد:
                    //---------------------------- get all text from module ------------------------
                    do
                    {
                    sms_temp[j]=getchar();
                    if(sms_temp[j]==CR)CR_count++;
                    j++;
                    }while(CR_count!=4);
                    sms_temp[j]=0;
                    این قسمت کل متن ارسالی توسط ماژول که شامل تاریخ و ساعت و ... میشه را در یافت میکنه و تو ارایه ی sms_temp ذخیره میکنه .
                    بعد از در یافت 4 تا کاراکتر CR از داخل متن / میفهمیم که کل دیتای ارسالی را در یافت کردیم و باید انتظار برای در یافت دیتا را پایان بدیم .
                    و در انتها هم کاراکتر null را به انتهای رشته اضافه میکنیم (برای تشخیص انتهای رشته توست توابعی که روی این ارایه می خوان کار کنن)
                    ---------------------------
                    کد:
                    if(strlen(sms_temp)<10)return -1;   // if character's <10  >>>>> in offset is no massage
                    اگه طول رشته ی در یافتی از ده کاراکتر کمتر بود یعنی این خونه خالی بوده و ما مقدار -1 را بر میگردونیم .(چون ما میدونیم که اگه این خونه حاوی پیام بود باید طول رشته از 10 تا کاراکتر خییلی بیشتر باشه )
                    -------
                    کد:
                    char_pos=strpos(sms_temp,',');
                    for(j=char_pos+2;sms_temp[j]!='"';j++)
                    {
                    *number=sms_temp[j];
                    number++;
                    }
                    *number=0;   // end of string
                    این قسمت هم برای جدا کردن شماره تلفن هست که از یک کاراکتر بع از"," تا " را جدا میکنه و داخل اشاره گر number میریزه
                    ------------
                    کد:
                    //----------------------- get msg of all text ---------------------------------
                    
                    for(;sms_temp[j]!=LF;j++);
                    
                    for(;sms_temp[j]!=CR;j++)
                    {
                    
                    if(sms_temp[j]!=LF &&sms_temp[j]!=CR)
                    {
                    *msg=sms_temp[j];msg++; 
                    }
                    
                    }
                    *msg=0;
                    این قسمت هم ازاون LF آبی رنگ تا CR را جدا میکنه و داخل اشاره گر msg میریزه

                    به همین راحتی.....
                    کد هم تست شده و مشکلی نداره.................................
                    موفق باشید
                    یا علی
                    http://s3.picofile.com/file/8201961284/source1.rar.html
                    محمد.م

                    دیدگاه


                      #11
                      پاسخ : پروژه sms controler ساده

                      ازتون واقعا ممنونم.
                      من اومدم وقفه خارجی رو در حالت پایین رونده فعال کردم که وقتی RI صفر شد تشخیص بده پیام دریافت شده یا زنگ خورده.
                      اگه RI صفر شد میاد وارد توابعی که شما زحمتشو کشیدید میشه.
                      حالا چندتا سوال داشتم:
                      1- بجای خط زیر
                      کد:
                      for(i=0;i<13;i++)putchar(MODE[i]);
                      نمیشد از printf استفاده کرد؟

                      2- توی
                      while(1)
                      نوشتید
                      read_sms
                      منظورتون همون
                      read_sms_textmode
                      بوده دیگه درسته؟

                      3-
                      printf("AT+CMGR=%d",offset);
                      putchar(CR);
                      چرا CR بعد از CMGR ارسال میشه؟

                      4- چرا number و msg پلاس پلاس میشن؟ مگه در نهایت شماره ای که پیام ازش فرستاده شده و متن پیام قرار نیس داخل این دو متغیر قرار بگیرند؟
                      من الان بخوام شماره و متن پیام رو روی ال سی دی نمایش بدم چطوری اینکارو بکنم؟ الان پیام و شماره از نوع رشتس با lcd_puts مستقیم میشه نمایش داد یا sprintf هم لازم داره؟
                      اصلا چرا از اشاره گر استفاده کردید؟ نمیشد بجاش یه آرایه میذاشتید که شماره و متن پیام داخل آرایه ها ریخته بشه؟ مثلا اینطوری:
                      کد:
                      msg[j1]=sms_temp[j];j++;j1++;
                      برای دریافت شماره هم به همین ترتیب. نمیشد؟

                      این کل برنامه تا الان ( البته تقریبا همش همون برنامه شماست!):
                      کد:
                      /*****************************************************
                      AVR Core Clock frequency: 8/000000 MHz
                      *****************************************************/
                      #include <mega32a.h>
                      #include <stdio.h>
                      #include <string.h>
                      #include <delay.h>
                      
                      #define CR  0x0D
                      #define LF  0x0A
                      #define enter 0x0d
                      
                      flash char text_mod[]={"AT+CMGF=1"};
                      flash char dell_all_sms[]={'A','T','+','C','M','G','D','A','=','"','D','E','L',' ','A','L','L','"','\0'};
                      flash char ECHO_OFF[]={"ATE0"};
                      flash char MODE[]={'A','T','+','C','S','C','S','=','"','G','S','M','"'}; 
                      
                      char read_sms_textmode(char *msg,char *number,unsigned char offset); 
                      char megage[20],my_number[20],i=0;
                      bit RI=1;
                       
                      // External Interrupt 0 service routine
                      interrupt [EXT_INT0] void ext_int0_isr(void)     //fallin edge
                      {
                       RI=0;
                      }
                      
                      void main(void)
                      {
                      // Declare your local variables here
                      
                      PORTA=0x00;
                      DDRA=0x00;
                      
                      PORTB=0x00;
                      DDRB=0x00;
                      
                      PORTC=0x00;
                      DDRC=0x00;
                      
                      PORTD=0x00;
                      DDRD=0x00;
                      
                      // External Interrupt(s) initialization
                      // INT0: On
                      // INT0 Mode: Falling Edge
                      // INT1: Off
                      // INT2: Off
                      GICR|=0x40;
                      MCUCR=0x02;
                      MCUCSR=0x00;
                      GIFR=0x40;
                      
                      // USART initialization
                      // Communication Parameters: 8 Data, 1 Stop, No Parity
                      // USART Receiver: On
                      // USART Transmitter: On
                      // USART Mode: Asynchronous
                      // USART Baud Rate: 9600
                      UCSRA=0x00;
                      UCSRB=0x18;
                      UCSRC=0x06;
                      UBRRH=0x00;
                      UBRRL=0x33;
                      
                      #asm("sei")
                      
                       printf("AT");
                       putchar(enter);
                       delay_ms(200);  
                       
                       printf("AT");
                       putchar(enter);
                       delay_ms(200);    
                        
                       printf(ECHO_OFF);
                       putchar(enter);
                       delay_ms(200);
                        
                       for(i=0;i<13;i++)putchar(MODE[i]);  // TEXT MOD
                       putchar(enter);  
                       delay_ms(200);    
                        
                       printf("AT+CMGF=1");
                       putchar(enter);
                       delay_ms(200);
                      
                      while (1)
                        {
                         if(!RI){
                           read_sms_textmode(megage,my_number,1);
                           delay_ms(1000);
                           RI=1;
                         }
                        }
                      }
                         
                       char read_sms_textmode(char *msg,char *number,unsigned char offset){
                         char sms_temp[120];
                         char j=0,CR_count=0;
                         char char_pos=0;
                         delay_ms(50);
                         printf("AT+CMGR=%d",offset);
                         putchar(CR);   
                         //---------------------------- get all text from module ------------------------
                         do
                         {
                         sms_temp[j]=getchar();
                         if(sms_temp[j]==CR)CR_count++;
                         j++;
                         }while(CR_count!=4);
                         sms_temp[j]=0;
                      
                         if(strlen(sms_temp)<10) return -1;   // if character's <10  >>>>> in offset is no massage  
                         //--------------------------- get number of alltext ---------------------------
                         char_pos=strpos(sms_temp,',');
                         for(j=char_pos+2;sms_temp[j]!='"';j++)
                         {
                         *number=sms_temp[j];
                         number++;
                         }
                         *number=0;   // end of string
                         //----------------------- get msg of all text ---------------------------------
                         for(;sms_temp[j]!=LF;j++);
                          for(;sms_temp[j]!=CR;j++){
                            if(sms_temp[j]!=LF &&sms_temp[j]!=CR)
                              *msg=sms_temp[j];msg++; 
                          }
                         *msg=0;
                       }
                      ممنونم
                      www.gam-co.blogsky.com

                      دیدگاه


                        #12
                        پاسخ : پروژه sms controler ساده

                        با سلام
                        بابت تاخیر طولانی در جواب دادن عذر خواهی میکنم. :redface:
                        نمیشد از printf استفاده کرد؟
                        میشه و مشکلی نباید باشه . اما اون موقع که من تست میکردم با printf نمیدونم چرا کاراکترا بصورت صحیح ارسال نمیشد.
                        کد:
                        2- توی
                         while(1)
                        نوشتید
                        read_sms
                        منظورتون همون
                        read_sms_textmode
                        بوده دیگه درسته؟
                        بله . اشتباه تایپی بوده.(آخه من تابعو از داخل یه پروژه که قبلا نوشته بودم بر داشتم)

                        3-
                        printf("AT+CMGR=%d",offset);
                        putchar(CR);
                        چرا CR بعد از CMGR ارسال میشه؟
                        کلا باید بعد از هر دستور کاراکتر cr ارسال بشه.(همون enter هست)

                        کد:
                        4- چرا number و msg پلاس پلاس میشن؟ مگه در نهایت شماره ای که پیام ازش فرستاده شده و متن پیام قرار نیس داخل این دو متغیر قرار بگیرند؟
                        با این کار من ادرس این دو اشاره گر را جلو میبرم. معادل اینا این هست:
                        کد:
                                   msg[i]=x    i++;      , number[j] =y     j++;
                        کد:
                        msg[j1]=sms_temp[j];j++;j1++;
                        این چیزی که شما نوشتید معادل کد بنده هست. به بخش اشاره گر ها در زبان سی مرا جعه کنید.

                        الان پیام و شماره از نوع رشتس با lcd_puts مستقیم میشه نمایش داد یا sprintf هم لازم داره؟
                        بله مستقیم میشه . نیازی به تبدیل نداره .چون مقدار بر گشتی خودش رشته هست.

                        برنامه ظاهرا درسته . متونید megage,my_number را مستقیما روی ال سی دی نمایش بدید .
                        موفق باشید
                        محمد.م

                        دیدگاه

                        لطفا صبر کنید...
                        X