اطلاعیه

Collapse
No announcement yet.

فعال کردن رله خاص توسط اس ام اس دریافتی خاص

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

    فعال کردن رله خاص توسط اس ام اس دریافتی خاص

    سلام
    من یه برد آموزشی sim900 از فروشگاه eca خریدم و خواستم برنامه ای رو بنویسم که مثلا با دریافت sms ی که متنش rel1 هست, رله شماره یک رو فعال کنه
    برای شروع هم از برنامه های آماده که توی پکیج sim900 بود استفاده کردم ----- برنامه SMS Reciever
    ممکنه راهنمایی کنید که چطور باید این کار رو انجام بدم
    با سپاس

    این کدی هست که من تغییر دادم
    کد:
    /*****************************************************
    Project : SMS Reciever
    Version : 1.0
    Date  : 1392/07/20
    Author : Ali Imanifar
    Company : ECA
    Comments: This is a sample program for SIM900 Learning board produce by ECA
    
    
    Chip type        : ATmega32
    Program type      : Application
    AVR Core Clock frequency: 11.059200 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 512
    *****************************************************/
    
    #include <mega32.h>
    #include <stdlib.h>
    #include <delay.h>
    #include <keypad.h>
    #include <SIM900.h>
    
    // Alphanumeric LCD functions
    #include <alcd.h>
    
    
    
    // Declare your global variables here
    char key=16;
    char str[50],sms[200],phone[30],s1[3]="X1",s2[3]="55";
    int i=0;
     
    
    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    
     
    // Place your code here
      char str2[5];
      
      getstr(str);  
      str2[0] = str[12];
      str2[1] = 0;
      i = atoi(str2); 
      
      
      PORTD.6 = 1;
      delay_ms(700);
      PORTD.6 = 0;
      
      
      lcd_clear();
      lcd_gotoxy(0,0);
      lcd_puts("New Message");
      lcd_gotoxy(0,1);
      lcd_puts("Read:1 Skip:2");
      
      key = keyscan();
      while((key != 1) & (key != 2))
      {
        key = keyscan();
      }
      
      if(key == 1)
      {
        SMS_Recieve(sms,phone,i); 
        lcd_clear(); 
    //    lcd_show(phone,0);
    //    lcd_show(sms,1);
    if(strcmp(sms,s1))
    {
      lcd_puts("Re:S1 ");
    }
    if(strcmp(sms,s2))
    {
      lcd_puts("Re:S25 ");
    }
        while(keyscan() != 10);
        lcd_clear();
      }        
      else
      {
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_puts("Skipped");
        delay_ms(500);
        lcd_clear();
      } 
      
      lcd_gotoxy(0,0);
      lcd_puts("Read:1     ");
      lcd_gotoxy(0,1);
      lcd_puts("Delete:2    ");
    }
    
    // Standard Input/Output functions
    #include <stdio.h>
    
    
    
    void main(void)
    {
    
    
      
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTA=0x00;
    DDRA=0x00;
    
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTB=0x00;
    DDRB=0x00;
    
    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0 
    PORTC=0x00;
    DDRC=0x0F;
    
    // Port D initialization
    // Func7=In Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=0 State5=0 State4=T State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0x60;
    
    // 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=0x86;
    UBRRH=0x00;
    UBRRL=0x47;
    
    
    // Alphanumeric LCD initialization
    // Connections are specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTA Bit 0
    // RD - PORTA Bit 1
    // EN - PORTA Bit 2
    // D4 - PORTA Bit 4
    // D5 - PORTA Bit 5
    // D6 - PORTA Bit 6
    // D7 - PORTA Bit 7
    // Characters/line: 16
    lcd_init(16);
    // Global enable interrupts
    #asm("sei")
    
    
    lcd_clear();
    delay_ms(200);
    lcd_gotoxy(0,0);
    lcd_puts("Only GOD");
    lcd_gotoxy(0,1);
    lcd_puts("www.ECA.ir");
    delay_ms(3000);
    
    
    
    
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_puts("Power ON The");
    lcd_gotoxy(0,1);
    lcd_puts("SIM900? Y:1 N:2");
    
    i = 17;
    do
      i = keyscan();
    while ((i != 1) & (i != 2));
      
    
    if(i == 1) {
      lcd_clear();
      lcd_gotoxy(0,0);
      lcd_puts("Powering ON ...");
      
      SIM900_PWR_ON();
      
      lcd_gotoxy(0,1);
      lcd_puts("Powered ON");
    }
    else {
      lcd_clear();
      lcd_gotoxy(0,0);
      lcd_puts("Note:");
      lcd_show("You choose to powering on the SIM900 by yuor self so if the module is off please use the power button on the module to power it on",1);
      
      while(SIM900_Is_ON() == 0)
      {
        delay_ms(300);
        lcd_gotoxy(0,1);
        lcd_puts("Power ON SIM900 ");
      }
      
      delay_ms(2000);  
    }
    
    delay_ms(1000);
    
    
    
    
    i = SIM900_Init();
    lcd_clear();
    if(i==1)
    {
      lcd_gotoxy(0,0);
      lcd_puts("Sim900 Init");
    }
    else
    {
      lcd_gotoxy(0,0);
      lcd_puts("Not Init");
    }
    
    
    i = Net_Is_Register();
    if(i==1)
    {
      lcd_gotoxy(0,1);
      lcd_puts("Register Network");
    }
    else
    {
      lcd_gotoxy(0,1);
      lcd_puts("Not Register");
    }
    
    
    
    
    
    
      lcd_gotoxy(0,0);
      lcd_puts("Read:1     ");
      lcd_gotoxy(0,1);
      lcd_puts("Delete:2    ");
    while (1)
    {
      // Place your code here 
       
      
      key = keyscan(); 
      
      if(key == 1)
      {
        delay_ms(200);
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_puts("SMS Number :");
        if(number_keyscan(str) == 1)
        {          
          i = atoi(str);
          if(SMS_Recieve(sms,phone,i) == 1)
          { 
            lcd_clear(); 
            lcd_show(phone,0);
            lcd_show(sms,1);
            while(keyscan() != 10);
            lcd_clear();
          }
          else
          {
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_puts("Not Found !");
            delay_ms(1500);
          }
        }
        else
        {
          lcd_clear();
          lcd_gotoxy(0,0);
          lcd_puts("Canceled!");
          delay_ms(1500);
        } 
        
        
        
        lcd_gotoxy(0,0);
        lcd_puts("Read:1     ");
        lcd_gotoxy(0,1);
        lcd_puts("Delete:2    ");
      }
      
      
      if(key == 2)
      {  
        sms_del:
        
        delay_ms(200);
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_puts("All:1  Inbox:2");
        lcd_gotoxy(0,1);
        lcd_puts("UnRead:3 Read:4");
        delay_ms(2000);
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_puts("Press 1..4");
        
        if(number_keyscan(str) == 1)
        {          
          i = atoi(str);
          
          switch(i)
          {
            case 1 :
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_puts("Deleting ...");
            if(SMS_Delete("ALL") == 1)
            {
              lcd_gotoxy(0,1);
              lcd_puts("ALL SMS Deleted"); 
              delay_ms(1500);
            } 
            else
            {
              lcd_gotoxy(0,1);
              lcd_puts("Deleting Failed!");
              delay_ms(1500);
            }
            break;
            
            case 2 : 
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_puts("Deleting ...");
            if(SMS_Delete("INBOX") == 1)
            { 
              lcd_gotoxy(0,1);
              lcd_puts("INBOX SMS Deleted");
              delay_ms(1500);
            }
            else
            {
              lcd_gotoxy(0,1);
              lcd_puts("Deleting Failed!");
              delay_ms(1500);
            }
            break;
            
            case 3 :
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_puts("Deleting ...");
            if(SMS_Delete("UNREAD"))
            {
              lcd_gotoxy(0,1);
              lcd_puts("UnRead SMS Deleted"); 
              delay_ms(1500); 
            }
            else
            {
              lcd_gotoxy(0,1);
              lcd_puts("Deleting Failed!");
              delay_ms(1500);
            }
            break;
            
            case 4 :
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_puts("Deleting ...");
            if(SMS_Delete("READ") == 1)
            {
              lcd_gotoxy(0,1);
              lcd_puts("Read SMS Deleted");
              delay_ms(1500);
            }
            else
            {
              lcd_gotoxy(0,1);
              lcd_puts("Deleting Failed!");
              delay_ms(1500);
            }
            break;
            
            default:
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_puts("Wrong Choice!"); 
            delay_ms(1500);
            goto sms_del;
          }
        }
        else
        {
          lcd_clear();
          lcd_gotoxy(0,0);
          lcd_puts("Canceled!");
          delay_ms(1500);
        } 
        
        
        lcd_gotoxy(0,0);
        lcd_puts("Read:1     ");
        lcd_gotoxy(0,1);
        lcd_puts("Delete:2    ");
      } 
        
    }
    }

    #2
    پاسخ : فعال کردن رله خاص توسط اس ام اس دریافتی خاص

    سلام دوست عزیز
    ماإ¾ژول sim900 قبل و بعد از ارسال هر دستور به میکرو کارکتر های "0x0d , 0x0a" رو ارسال میکنه شما ابتدا در اینترپت دریافت سریال میکررو منتظر دریافت این دو کارکتر باشید بعد از دریافت این دو کارکتر بقیه کارکتر های ارسالی از sim900 رو تو بافر قرار بده.
    بطور مثال با ارسال AT شما ok در یافت میکنید ولی در اصل شما این کد رو دریافت میکنید."0x0d,0x0a,0x4f,0x4b,0x0d,0x0a"
    با برنامه coolterm میتونید کدهای هگز اسالی و دریافتی به پورت سریال رو ببینید. http://freeware.the-meiers.org/

    دیدگاه


      #3
      پاسخ : فعال کردن رله خاص توسط اس ام اس دریافتی خاص

      دوست عزیز , مهندس mh1762
      لطفا کدی که گذاشتم رو ملاحضه کنید
      نمونه برنامه SMS Reciever متن اس ام اس دریافتی رو روی ال سی دی نشون میده !
      اما وقتی که دستور strcmp رو روی آرایه کارکتری sms (همون آرایه ای که روی ال سی دی چاپ سده ) اعمال میکنم دستور رو درست انجام نمیده !
      اگر ممکنه لطفا با کد مثال بزنید
      با سپاس

      دیدگاه


        #4
        پاسخ : فعال کردن رله خاص توسط اس ام اس دریافت&#1740

        ;

        دیدگاه


          #5
          پاسخ : فعال کردن رله خاص توسط اس ام اس دریافت&#1740

          ک

          دیدگاه


            #6
            پاسخ : فعال کردن رله خاص توسط اس ام اس دریافتی خاص

            دوست عزیز نتیجه تست رو اعلام کنید اگر مشکلی بود کمکتون میکنم

            دیدگاه


              #7
              پاسخ : فعال کردن رله خاص توسط اس ام اس دریافتی خاص

              از برنامه زیر استفاده کن کاره خودمه و تو اکثر پروژه هام استفاده میکنم

              [code=c] sms="relay a is on."


              if (search_str(sms,"REL1&quot!=255)
              PORTB.0=1;[/code]


              [code=c]int search_str(const char *stra,const char *strb)
              {
              byte i=0,j=0;

              for (j=0;j<=strlen(stra);j++)
              {
              if (i>=strlen(strb))
              {
              return (j-i);
              break;
              }
              else
              {
              if (stra[j]==strb[i])
              i++;
              else
              i=00;
              }
              }
              if (i<strlen(strb)

              return 255;
              }[/code]

              دیدگاه


                #8
                پاسخ : فعال کردن رله خاص توسط اس ام اس دریافت&#1740

                با استفاده از تابع search_str برنامه رو به این شکل تغییر دادم (توی وقفه ازش استفاده کردم )
                نتیجه نداد :angry: oo: :cry:

                کد:
                
                      int search_str(const char *stra,const char *strb)
                        {
                         int i=0,j=0;
                         
                          for (j=0;j<=strlen(stra);j++)
                           {
                            if (i>=strlen(strb))
                              {
                                return (j-i);
                                break;
                              }
                            else
                              {
                                if (stra[j]==strb[i])
                                  i++;
                                else
                                  i=00;
                              }
                           }
                            if (i<strlen(strb))
                            
                         return 255;
                        }
                
                
                
                // External Interrupt 0 service routine
                interrupt [EXT_INT0] void ext_int0_isr(void)
                {
                
                 
                // Place your code here
                  char str2[5];
                  
                  getstr(str);  
                  str2[0] = str[12];
                  str2[1] = 0;
                  i = atoi(str2); 
                  
                  
                  PORTD.6 = 1;
                  delay_ms(700);
                  PORTD.6 = 0;
                  
                  
                  lcd_clear();
                  lcd_gotoxy(0,0);
                  lcd_puts("New Message");
                  lcd_gotoxy(0,1);
                  lcd_puts("Read:1 Skip:2");
                  
                  key = keyscan();
                  while((key != 1) & (key != 2))
                  {
                    key = keyscan();
                  }
                  
                  if(key == 1)
                  {
                    SMS_Recieve(sms,phone,i); 
                    lcd_clear(); 
                    lcd_show(phone,0);
                    lcd_show(sms,1); 
                    delay_ms(900);
                    lcd_clear();
                   
                  
                       ////////////////////////////////////////////////////////
                       ////////////////////////////////////////////////////////
                       //////////////////////+++++++++++++++///////////////////
                       ////////////////////////////////////////////////////////
                  if (search_str(sms,"REL1")!=255)  
                  {   
                   lcd_show(phone,0);
                    lcd_show(sms,1);   
                    
                  lcd_puts("Rel 1 Enabled");
                  PORTB.0=1;
                  }
                    while(keyscan() != 10);
                    lcd_clear();
                  }        
                  else
                  {
                    lcd_clear();
                    lcd_gotoxy(0,0);
                    lcd_puts("Skipped");
                    delay_ms(500);
                    lcd_clear();
                  } 
                  
                  lcd_gotoxy(0,0);
                  lcd_puts("Read:1     ");
                  lcd_gotoxy(0,1);
                  lcd_puts("Delete:2    ");
                }

                دیدگاه


                  #9
                  پاسخ : فعال کردن رله خاص توسط اس ام اس دریافتی خاص

                  با این دستورات جواب داد
                  :applause: :applause: :applause: :applause: :applause: :wow: :wow: :wow: :wow: :wow: :nice: :nice: :nice: :nice:




                  کد:
                  interrupt [EXT_INT0] void ext_int0_isr(void)
                  {
                  // Place your code here
                    char str2[5];
                    
                    getstr(str);  
                    str2[0] = str[12];
                    str2[1] = 0;
                    i = atoi(str2); 
                    
                    
                    lcd_clear();
                    lcd_gotoxy(0,0);
                    lcd_puts("New Command");
                    
                    PORTD.6 = 1;
                    delay_ms(700);
                    PORTD.6 = 0;
                    
                    
                    
                    
                    SMS_Recieve(sms,phone,i);
                    
                    if(!strcmp(sms,"Relay0 ON")) {
                      lcd_clear();
                      lcd_gotoxy(0,0);
                      lcd_puts("Turn Relay0 ON");
                      PORTC.0 = 1;  
                    }
                    if(!strcmp(sms,"Relay0 OFF")) {
                      lcd_clear();
                      lcd_gotoxy(0,0);
                      lcd_puts("Turn Relay0 OFF");
                      PORTC.0 = 0;  
                    }
                    
                    if(!strcmp(sms,"Relay1 ON")) {
                      lcd_clear();
                      lcd_gotoxy(0,0);
                      lcd_puts("Turn Relay1 ON");
                      PORTC.1 = 1;  
                    }
                    if(!strcmp(sms,"Relay1 OFF")) {
                      lcd_clear();
                      lcd_gotoxy(0,0);
                      lcd_puts("Turn Relay1 OFF");
                      PORTC.1 = 0;  
                    }
                    
                    if(!strcmp(sms,"Relay2 ON")) {
                      lcd_clear();
                      lcd_gotoxy(0,0);
                      lcd_puts("Turn Relay2 ON");
                      PORTC.2 = 1;  
                    }
                    if(!strcmp(sms,"Relay2 OFF")) {
                      lcd_clear();
                      lcd_gotoxy(0,0);
                      lcd_puts("Turn Relay2 OFF");
                      PORTC.2 = 0;  
                    }
                    
                    if(!strcmp(sms,"Relay3 ON")) {
                      lcd_clear();
                      lcd_gotoxy(0,0);
                      lcd_puts("Turn Relay3 ON");
                      PORTC.3 = 1;  
                    }
                    if(!strcmp(sms,"Relay3 OFF")) {
                      lcd_clear();
                      lcd_gotoxy(0,0);
                      lcd_puts("Turn Relay3 OFF");
                      PORTC.3 = 0;  
                    }
                    
                    SMS_Delete("ALL");
                    
                    
                    lcd_gotoxy(0,0);
                    lcd_puts("WWW.ECA.IR   ");
                    lcd_gotoxy(0,1);
                    lcd_puts("Relay Control  ");
                  }

                  دیدگاه


                    #10
                    پاسخ : فعال کردن رله خاص توسط اس ام اس دریافتی خاص

                    سلام دوست عزیز شما چرا برنامه روشن و خاموش کردن رله هاتون رو تو روتین وقفه نوشتین؟
                    به نظر شما آیا این دستور در همه شرایط به شما جواب درست میده مثلا اگه کاربر حروف رو کوچیک یا بزرگ نوشته باشه؟

                    [code=c]#include <stdio.h>
                    #include <string.h>

                    int main ()
                    {
                    char str1[15];
                    char str2[15];
                    int ret;


                    strcpy(str1, "abcdef"
                    strcpy(str2, "ABCDEF"

                    ret = strcmp(str1, str2);

                    if(ret < 0)
                    {
                    printf("str1 is less than str2"
                    }
                    else if(ret > 0)
                    {
                    printf("str2 is less than str1"
                    }
                    else
                    {
                    printf("str1 is equal to str2"
                    }

                    return(0);
                    }

                    Let us compile and run the above program, this will produce the following result:

                    str2 is less than str1
                    [/code]

                    دیدگاه


                      #11
                      پاسخ : فعال کردن رله خاص توسط اس ام اس دریافتی خاص

                      وقتی دستورات رو بیرون از وقفه میزاشتم درست جواب نمیداد البته با این کار سرعت اجرا هم به نظرم بهتر میشد
                      برای حروف کوچک و بزرگ میشه تابعی گذاشت که toupper یا tolower کنه بعد دیگه مهم نیست که شما دستور رو چطوری بنویسید
                      پیشنهاد میکنم شما هم از این کد استفاده کنید خیلی خوب جواب میده

                      دیدگاه

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