پروژه کنترل شدت نور و ارتباط بی سیم با میکروکنترلر avr – قسمت سوم - وب سایت رضا احمدی

پروژه کنترل شدت نور و ارتباط بی سیم با میکروکنترلر avr - قسمت سوم

پروژه کنترل شدت نور و ارتباط بی سیم با میکروکنترلر avr – قسمت سوم

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

شماتیک سخت افزاری مدار

پروژه کنترل نور لامپ با بلوتوث
پروژه کنترل نور لامپ با بلوتوث

برنامه نویسی و نرم افزار های مورد استفاده:

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

اپلیکیشن و نرم افزار مورد استفاده که کاربر باید بر روی گوشی خود داشته باشد نرم افزار ترمینال بلوتوث (Bluetooth terminal) است؛  با این نرم افزار میتوانید با ماژول بلوتوث hc-05 ارتباط برقرار کنید و کد ها و دستورات خود را برای آن ارسال کنید.

برای مثال ما در اینجا دستورات را بصورت زیر در نظر گرفتیم:

#Lx:ab

به این صورت ک x یک عدد بین ۱ تا ۴ است به معنی شماره لامپ و a,bهم یک عدد دورقمی جهت تنظیم شدت نور لامپ برای مثال اگر بخواهیم نور لامپ ۲ برابر ۶۰ درصد شود باید دستور زیر را بنویسیم و به میکرو ارسال کنیم:

#L2:60

دقت کنید که بعد از دونقظه حتما باید دو رقم باشد و سیستم را طوری طراحی کردیم که در صورتی که بتواند رشته دریافتی را دیکد کند به شما رشته  زیر را به معنی موفقیت در دریافت ارسال میکن:

Read successfully!

اگر بخواهیم روند برنامه نویسی میکروکنترلر را بصورت کلی بنویسیم مانند خطوط زیر است:

۱-شروع

۲- تنظیم پورت های خروجی

۳-تنظیم رجیستر های مربوط به یوزارت

۴-تنظیم نمایشگر کاراکتری( جهت مشاهده اینکه پیام دریافت شده و اینکه نور لامپ ها چند درصد است)

۵-تنظیم و تعریف متغییر هایی جهت ذخیره عرض پالسه به نام L1,L2,L3,L4

۶-تنظیم اولیه pw تمام پالسا با مقدار ۵۰ درصد

۷-مقدار نور پالسها را با توجه مقدار متغییر L1,L2,L3,L4  تنظیم کن

۸-اگر در بافر وقفه دریافت تغییراتی صورت داده آن را بخوان در غیر این صورت برو مرحله ۷

۹- متغییر بافر ارتباط سریال:مقدار جدید دریافتی را بخوان و مقادیر را در L1,L2,L3,L4 ذخیره کن.

۱۰- برو به مرحله ۷

حال به شرح توابع و متغییرهای بکار رفته می پردازیم:

آرایه نگهدارنده رشته دریافتی:

unsigned char Rx_buffer[RX_BUFF_SIZE];

آرایه نگهدارنده میزان عرض پالسها با مقدار اولیه ۵۰:

unsigned char input[4]={50,50,50,50};

از این متغییر برای جستجو در رشته ها استفاده شده و محل آخری رشته را پیدا کردیم در این متغییر ذخیره میکنیم:

unsigned char pos_of_srch_res=0;

متغییری جهت اینکه بدانیم الان کدام خانه از رشته دریافتی باید مقدار قرار دهیم:

unsigned char index=0;

یک متغییر کلی جهت استفاده در حلقه ها:

int i=0;

لیست کلی توابع:

تابع تنظیم مقدار عرض پالسها که منجر به تنظیم میزان شدت نور هر لامپ میشود. این تابع ۴ مقدار بین ۰ تا ۹۹ می پذرید و با توجه به آن شدت نور تنظیم میشود:

void set_Brightness(char L1,char L2,char L3,char L4);

تابع تنظیمات اولیه پروتکل سریال جهت ارتباطبا ماژول بلوتوٍث.

void USART_init(); //initialize Usart …

تابع ارسال یک کاراکتر به به سریال ( کا این کاراکتر ارسالی به کاربر میرسد):

void USART_send_char(unsigned char data); //send char to USART

تابع جهت ارسال یک رشته به کاربر(این تابه یک رشته را دریافت کرده و با استفاده از تابع بالایی شروع به ارسال کاراکترهای آن رشته میکند):

void USART_send_string(char* str); //send String to UART

تابع وقفه دریافت ( هر گاه کاربر دستوری بفرستد این تابع اجرا میشود و دستورات را کاراکتر به کاراکتر میخواد و در رشته rx_buffer ذخیره میکند):

interrupt [USART_RXC] void usart_rx_interrupt(void);//usart recieved char interrupt…

این تابع طول یک رشته را بر میگرداند:

int get_str_len(char* str);

این تابع یک رشته را دریافت میکند و آن را در رشته rx_buffer جستجو میکند اگر آن را پیدا کرد مقدار ۱ و در غیر این صورت مقدار ۰ را بر میکرداند:

char srch_response_string(char* str);

این تابع مقادیر آرایه input[] را با توجه به دستورات دریافتی تنظیم میکند:

char set_input();

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

void show_input_in_lcd();

مقادیر رشته rx_buffer را به حروف بزرگ تبدیل میکند:

void set_Rx_buffer_to_upper();

مقدار رشته rx_buffer  پاک میکند

void clear_response();

تابع اصلی هر برنامه که به زبان سی باشد:

void main(void);

سورس کامل برنامه:

  1. /*
  2.  * Lightness_test.c
  3.  * 
  4.  * Created: 2017/01/06 04:56:41 ب.ظ
  5.  * Author: Reza.Ahmadi
  6.  * https://mrzx.ir
  7.  */
  8.  
  9. #include <io.h>
  10. #include <delay.h>
  11. #include <stdio.h>   //input and output for usart
  12. #include <stdlib.h>  //for convert string to integer
  13. #include <ctype.h>  //for using set string to upper case
  14.  
  15. #asm
  16.     .equ __lcd_port=0x1B;//PORTA Addres ...
  17. #endasm
  18.  
  19. #include <lcd.h>
  20.  
  21. #define Light1 PORTC.0
  22. #define Light2 PORTC.1
  23. #define Light3 PORTC.2
  24. #define Light4 PORTC.3
  25.  
  26. #define RX_BUFF_SIZE 128
  27.  
  28. unsigned char Rx_buffer[RX_BUFF_SIZE];
  29. unsigned char input[4]={50,50,50,50};
  30.  
  31. unsigned char pos_of_srch_res=0;
  32. unsigned char index=0;
  33. int i=0;
  34.  
  35. void set_Brightness(char L1,char L2,char L3,char L4);
  36.  
  37. void USART_init(); //initialize Usart ...
  38. void USART_send_char(unsigned char data); //send char to USART
  39. void USART_send_string(char* str); //send String to UART
  40. interrupt [USART_RXC] void usart_rx_interrupt(void);//usart recieved char interrupt...
  41.  
  42.  
  43. int get_str_len(char* str);
  44. char srch_response_string(char* str);
  45. char set_input();
  46. void show_input_in_lcd();
  47. void set_Rx_buffer_to_upper();
  48.  
  49. void clear_response(){
  50. unsigned char j=0;
  51. 	for(j=0;j<RX_BUFF_SIZE;j++)
  52. 	Rx_buffer[j]='';
  53. 	index=0;
  54. }
  55.  
  56.  
  57.  
  58. void main(void)
  59. {
  60. DDRC=0xff;
  61. PORTC=0x00;
  62. PORTB=0xff;
  63. DDRB=0x00;
  64. lcd_init(16);
  65. lcd_putsf("Hello, System is starting up...");
  66. delay_ms(2000);
  67. USART_init();
  68. delay_ms(1000);
  69. #asm("sei");
  70. USART_send_string("Hello\r\nThis project is designed by: Reza.Ahmadi\r\n");
  71. USART_send_string("Send your structure\r\n");
  72. lcd_clear();
  73. lcd_putsf("send Your structure");
  74. delay_ms(2000);
  75.  
  76. lcd_clear();
  77. show_input_in_lcd();
  78. while (1)
  79.     {
  80.     // Please write your application code here
  81.     //set_input();    
  82.     set_Brightness(input[0],input[1],input[2],input[3]);
  83.  
  84.     }
  85. }
  86.  
  87. void set_Brightness(char L1,char L2,char L3,char L4)
  88. {
  89. char a=1,b=1,c=1,d=1;//store value of ports...
  90. char Lc=0,count=0;
  91.  
  92.     while(1)
  93.     {
  94.     Light1=a;
  95.     Light2=b;
  96.     Light3=c;
  97.     Light4=d;
  98.     delay_us(100);
  99.     Lc++;
  100.  
  101.     if(Lc>=L1 && a==1){a=0;}
  102.     if(Lc>=L2 && b==1){b=0;}
  103.     if(Lc>=L3 && c==1){c=0;}
  104.     if(Lc>=L4 && d==1){d=0;}
  105.     if(Lc>=100) {Lc=0;a=1;b=1;c=1;d=1;count++;}
  106.  
  107.     if(count>=100 && index>=6)
  108.         {
  109.         count=0;        
  110.         if(set_input())
  111.             break;
  112.         }
  113.     }
  114. }
  115.  
  116. void USART_init()
  117. {	
  118. 	UCSRA=0x00;
  119. 	UCSRB=0x98;//enable RXD and TXD ,and ENABLE receive INTERRUPT
  120. 	UCSRC=0x86;
  121. 	UBRRH=0x00;
  122. 	UBRRL=0x33; //set Baud rate to 9600 in fosc 8MHz	
  123. }
  124.  
  125. void USART_send_char(unsigned char data)
  126. {
  127. 	putchar(data);
  128. }
  129.  
  130. void USART_send_string(char* str)
  131. {
  132. 	int len=get_str_len(str);
  133. 	for(i=0;i<len;i++)
  134. 	{
  135. 		USART_send_char(str[i]);
  136. 	}
  137. 	USART_send_char('\n');
  138. }
  139.  
  140. interrupt [USART_RXC] void usart_rx_interrupt(void)
  141. {
  142. char data;
  143. data=UDR;
  144. Rx_buffer[index]=data;
  145. if(++index >= RX_BUFF_SIZE) {index=0;}
  146.  
  147. }
  148.  
  149. int get_str_len(char* str)
  150. {
  151. 	    int len=0;
  152. 	    for(i=0;str[i];i++)len=i;
  153. 	    return len+1;
  154. }
  155.  
  156. char srch_response_string(char* str)
  157. {
  158. 	unsigned char k=0,start=0;
  159. 	int len=get_str_len(str);
  160. 	for(i=0;i<RX_BUFF_SIZE;i++)
  161. 	{
  162. 		if(Rx_buffer[i]==str[k])
  163. 		{k++;start=1;pos_of_srch_res=i;}
  164. 		else if( start==1 && (Rx_buffer[i] !=str[k]))
  165. 		{k=0;start=0;}
  166.  
  167. 		if(k==len)break;					
  168. 	}
  169. 	if(k>=len)return 1; // find the str in response msg... 
  170. 	else return 0; // not find
  171. }
  172.  
  173. char set_input()
  174. {
  175.     char temp[2],c=0,acc=0;
  176.     set_Rx_buffer_to_upper();
  177.  
  178.     if(srch_response_string("#L1:"))
  179.     { 
  180.         for(i=(pos_of_srch_res+1);i<(pos_of_srch_res+3);i++)
  181.          temp[c++]=Rx_buffer[i];
  182.         input[0]=atoi(temp);
  183.     if(Rx_buffer[pos_of_srch_res+2])
  184.     acc=1; 
  185.  
  186.      }
  187.     c=0;
  188.     if(srch_response_string("#L2:"))
  189.     {
  190.         for(i=(pos_of_srch_res+1);i<(pos_of_srch_res+3);i++)
  191.          temp[c++]=Rx_buffer[i];
  192.         input[1]=atoi(temp);
  193.     if(Rx_buffer[pos_of_srch_res+2])
  194.     acc=1;      
  195.      }
  196.     c=0;
  197.     if(srch_response_string("#L3:"))
  198.     {
  199.         for(i=(pos_of_srch_res+1);i<(pos_of_srch_res+3);i++)
  200.          temp[c++]=Rx_buffer[i];
  201.         input[2]=atoi(temp);
  202.     if(Rx_buffer[pos_of_srch_res+2])
  203.     acc=1;      
  204.      }
  205.     c=0;
  206.     if(srch_response_string("#L4:"))
  207.     {
  208.         for(i=(pos_of_srch_res+1);i<(pos_of_srch_res+3);i++)
  209.          temp[c++]=Rx_buffer[i];
  210.         input[3]=atoi(temp);
  211.     if(Rx_buffer[pos_of_srch_res+2])
  212.     acc=1;      
  213.      }
  214.     if(srch_response_string("#ONALL"))
  215.     {
  216.      input[0]=99;input[1]=99;input[2]=99;input[3]=99;
  217.      acc=1;   
  218.     }
  219.  
  220.     if(srch_response_string("#OFFALL"))
  221.     {
  222.      input[0]=0;input[1]=0;input[2]=0;input[3]=0;
  223.         acc=1;   
  224.     }
  225.  
  226.     if(acc==1)
  227.     {
  228.         clear_response();
  229.         USART_send_string("Read successfully!");
  230.         show_input_in_lcd();
  231.         return 1;        
  232.     }
  233.     return 0;
  234. }
  235.  
  236. void set_Rx_buffer_to_upper()
  237. {
  238. for(i=0;i<RX_BUFF_SIZE;i++)
  239.     Rx_buffer[i]=toupper(Rx_buffer[i]);
  240. }
  241.  
  242. void show_input_in_lcd()
  243. {
  244.     unsigned char strLCD[16];
  245.     //lcd_clear();
  246.     sprintf(strLCD,">L1:%d  >L2:%d  ",input[0],input[1]);
  247.     lcd_gotoxy(0,0);
  248.     lcd_puts(strLCD);
  249.     sprintf(strLCD,">L3:%d  >L4:%d  ",input[2],input[3]);
  250.     lcd_gotoxy(0,1);
  251.     lcd_puts(strLCD);
  252. }

پروژه کنترل نور لامپ با بلوتوث
پروژه کنترل نور لامپ با بلوتوث

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دیدگاه های ثبت شده

    الی | ۱۱ مهر ۱۳۹۹

    عالی بود ممنون


    الی | ۰۹ آبان ۱۳۹۹

    سلام من میخوام این پروژه رو بسازم اما نمی تونم بفهمم بعضی قطعات مثل J7 کارش چی هست؟ و اصلا چه قطعه ای باید بخرم. ممنون میشم راهنماییم کنید

      رضا احمدی | ۰۹ آبان ۱۳۹۹

      سلام
      قطعه j7 یک کانکتور پین هدر نری است که به پورت B میکرو وصل شده. این قطعه در این پروژه کاربردی ندارد و فقط برای استفاده های ممکن در آینده بر روی برد قرار گرفته تا اگر نیاز به تغییر جزیی در پروژه بود برنامه میکرو را تغییر داده و از این پورت استفاده شود.
      پین هدر 40*1 صاف نری