پروژه کنترل شدت نور و ارتباط بی سیم با میکروکنترلر 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. }

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

تاریخ انتشار: ۲ فروردین ۱۳۹۸

دسته بندی ها: avr آموزش الکترونیک پروژه

برچسب ها: atmega16a atmega32a avr c++ codevision hc05 اتصال میکرو کنترلر با تلفن همراه ارتباط بی سیم در میکروکنترلر ها الکترونیک برنامه نویسی avr برنامه نویسی پروژه بلوتوث و avr پروژه پروژه کنترل نو لامپ پزوژه کنترل نور لامپ با بلوتوث زبان سی سنسور دما کدویژن ماژول بلوتوث

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

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

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

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

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


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

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

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

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