اطلاعیه

Collapse
No announcement yet.

مشکل ساده در ارتباط سریال(برنامه کنترل رله با HC-05)

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

    مشکل ساده در ارتباط سریال(برنامه کنترل رله با HC-05)

    سلام دوستان
    من با ماژول بلوتوث و گوشی تونستم متنی رو که روی گوشی تایپ میکنم روی ال سی دی نمایش بدم.
    کد:
    #include <mega32a.h>
    #include <alcd.h>
    #include <stdio.h>
    
    char str[1];
    
    void main(void){
    {
    // 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;
    
    // Alphanumeric LCD initialization
    // Connections are specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTC Bit 0
    // RD - PORTC Bit 1
    // EN - PORTC Bit 2
    // D4 - PORTC Bit 3
    // D5 - PORTC Bit 4
    // D6 - PORTC Bit 5
    // D7 - PORTC Bit 6
    // Characters/line: 16
    lcd_init(16);
    }
      
    while (1)
       { 
        gets(str,1);
        lcd_puts(str);
       }
    }
    بعد اومدم یه سری عدد براش تعریف کردم که با زدن اونها تونستم چندتا رله رو قطع و وصل کنم.
    کد:
    #include <mega32a.h>
    #include <stdio.h>
    
    char A;
    
    void main(void){
    {
    // 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=0x03;
    
    // 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;
    }
      
    while (1)
       { 
        A=UDR;
       
        if(A=='1')
          PORTA.0=1;
        if(A=='0')
          PORTA.0=0;
        
        if(A=='3')
          PORTA.1=1;
        if(A=='2')
          PORTA.1=0;    
       }
    }
    حالا میخام هردوتای اینکارها رو با هم انجام بدم ولی نتونسم. یعنی مثلا وقتی عدد 1 رو میزنم روی ال سی دی عدد 1 نمایش بده و رله 1 هم فعال بشه. اینطوری که نوشتم رله مشکلش حل میشه ولی مشکلش اینه که کد اسکی رو روی lcd چاپ میکنه.
    کد:
    #include <mega32a.h>
    #include <alcd.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    char str[1];
    char A;
    
    void main(void){
    {
    // 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=0x03;
    
    // 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;
    
    // Alphanumeric LCD initialization
    // Connections are specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTC Bit 0
    // RD - PORTC Bit 1
    // EN - PORTC Bit 2
    // D4 - PORTC Bit 3
    // D5 - PORTC Bit 4
    // D6 - PORTC Bit 5
    // D7 - PORTC Bit 6
    // Characters/line: 16
    lcd_init(16);
    }
      
    while (1)
       { 
        A=getchar();
        lcd_gotoxy(0,0);
        itoa(A,str);
        lcd_puts(str);
           
        if(A=='1')
          PORTA.0=1;
        if(A=='0')
          PORTA.0=0;
        
        if(A=='3')
          PORTA.1=1;
        if(A=='2')
          PORTA.1=0;    
       }
    }
    دوستان ممنون میشم کمک کنید. :smile:
    www.gam-co.blogsky.com

    #2
    پاسخ : مشکل ساده در ارتباط سریال(برنامه کنترل رله با HC-05)

    سلام.
    شما باید کد اسکی رو به کاراکتر تبدیل کنی و بعد در lcdنمایش بدی اما فقط برای lcdبرای رله تبدیل رو انجام نده.

    دیدگاه


      #3
      پاسخ : مشکل ساده در ارتباط سریال(برنامه کنترل رله با HC-05)

      شما باید کد اسکی رو به کاراکتر تبدیل کنی و بعد در lcdنمایش بدی اما فقط برای lcdبرای رله تبدیل رو انجام نده.
      ممنون از جوابتون
      اما چطوری؟(راستش من یخورده توی این تبدیلات مشکل دارم )
      www.gam-co.blogsky.com

      دیدگاه


        #4
        پاسخ : مشکل ساده در ارتباط سریال(برنامه کنترل رله با HC-05)

        دوستان اصلا بذارید سوالم رو اینطوری بپرسم:
        توی برنامه اولی با تابع gets ورودی سریال رو داخل آرایه str میریزم. حالا چطوری بگم که اگه مثلا مقدار str برابر 1 بود یه پین رو روشن کن؟؟!!
        www.gam-co.blogsky.com

        دیدگاه


          #5
          پاسخ : مشکل ساده در ارتباط سریال(برنامه کنترل رله با HC-05)

          دوست عزیز تابع زیر رو تو برنامت بنویس:
          کد:
          void getstr(char *str)
          {
            char ch = 0;
            ch = getchar();
            while((ch == 10) || (ch == 13) || (ch == 0))
              ch = getchar();
            
            while((ch != 10) && (ch != 13))
            {
              *str++ = ch;
              ch = getchar();
            }
            *str = 0;
          }
          سپس به صورت زیر ازش استفاده کن:
          کد:
          char str[32];
          getstr(str);
          بعد کتابخونه string.h رو اضافه کن و از دستور زیر برای مقایسه دیتای دریافتی استفاده بکن:
          کد:
          if(!strcmpf(str,'1on'))PORTA.0=1;
          قفط یه نکته این که اون تابعی که اول برات نوشتم، طوریه که حتما باید انتهای هر چیزی که میفرستی یه اینتر(n\) بفرستی که دریافت کامل بشه، البته وقتی متنی رو توی گوشی نوشتی و بعدش اینتر رو بزنی خودش اون کاراکتر n\ رو میفرسته.

          دیدگاه


            #6
            پاسخ : مشکل ساده در ارتباط سریال(برنامه کنترل رله با HC-05)

            دوست عزیز تابع زیر رو تو برنامت بنویس:
            کد: [انتخاب]

            void getstr(char *str)
            {
            char ch = 0;
            ch = getchar();
            while((ch == 10) || (ch == 13) || (ch == 0))
            ch = getchar();

            while((ch != 10) && (ch != 13))
            {
            *str++ = ch;
            ch = getchar();
            }
            *str = 0;
            }

            سپس به صورت زیر ازش استفاده کن:
            کد: [انتخاب]

            char str[32];
            getstr(str);

            بعد کتابخونه string.h رو اضافه کن و از دستور زیر برای مقایسه دیتای دریافتی استفاده بکن:
            کد: [انتخاب]

            if(!strcmpf(str,'1on&#039)PORTA.0=1;

            قفط یه نکته این که اون تابعی که اول برات نوشتم، طوریه که حتما باید انتهای هر چیزی که میفرستی یه اینتر(n\) بفرستی که دریافت کامل بشه، البته وقتی متنی رو توی گوشی نوشتی و بعدش اینتر رو بزنی خودش اون کاراکتر n\ رو میفرسته.
            خیلی ممنون
            تست میکنم خبرشو میدم
            بازم ممنون :biggrin:
            www.gam-co.blogsky.com

            دیدگاه


              #7
              پاسخ : مشکل ساده در ارتباط سریال(برنامه کنترل رله با HC-05)

              مشکل شما اینه که وقتی از دستور getchar و یا gets استفاده میکنید برنامه با رسیدن به این دستور متوقف میشه و منتظر میمونه و هیچ کاری نمیکنه بنابراین شما صددرصد باید از وقفه یوزارت استفاده بکنید
              منم این مشکلو داشتم
              دهنم سرویس شد تا مشکلشو فهمیدم و کدشو پیدا کردم
              باور کنید تنها راهه

              دیدگاه

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