در ادامه مجموعه آموزش های پکیج سنسورهای آردوینو با ما در وبسایت دیجی اسپارک همراه باشید.
در این آموزش قصد داریم تا از نوع دیگه ای از سوئیچ ها یعنی tiltswitch یا سوئیچ دورانی استفاده کنیم و با اون به راحتی رنگ های یک LED RGB را تغییر بدهیم.
وسایل مورد نیاز :
- آردوینو UNO ۰ (خرید از فروشگاه ) – arduino UNO
- پکیج سنسور های آردوینو ( خرید از فروشگاه )
- تعدادی سیم
در این پروژه با استفاده از سنسور tiltswitch و سنسور ledRGB که در پکیج سنسور های آردوینو (arduino) قرار داده شده است تعامل فیزیکی بین رنگ ال ای دی و زاویه سنسور tiltswitch برقرار میکنیم , به اینصورت که هربار که دستگاه را میچرخانیم رنگ ال ای دی تغییر کند ( یا به عبارتی مدهایی که برای رنگ ال ای دی تعریف کردیم تغییر کند ) .
مدار :
مطابق شکل پایه های R , G , B ال ای دی خود را که هرکدام بیانگر رنگ قرمز , سبز و آبی هستند به پین های دیجیتال شماره ۱۳ , ۱۲ , ۱۱ آردوینو خود متصل کنید سپس پایه گراند را به پین گراند آردوینو متصل کنید.
پایه S سنسور تیلت سوئیچ خود را به پین شماره ۳ متصل کنید و پایه گراند را به یکی از پین های گراند آردوینو متصل کنید.
برنامه نویسی :
کدهای زیر را در محیط برنامه نویسی آردوینو کپی کنید و سپس برنامه را اجرا کنید.
const int bluepin=13; const int greenpin=12; const int redpin=11; const int tiltswitch=3; boolean last=LOW; boolean current=LOW; int ledmode=0; void setup() { pinMode(bluepin,OUTPUT); pinMode(greenpin,OUTPUT); pinMode(redpin,OUTPUT); pinMode(tiltswitch,INPUT); } boolean debounce(boolean last) { boolean current=deigitalRead(tiltswitch); if(last!=current) { delay(50); current=degitalRead(tiltswitch); } return current; } void setMode(int mode) { if(mode==1) { analogWrite(bluepin,255); analogWrite(greenpin,0); analogWrite(redpin,0); } else if(mode==2) { analogWrite(bluepin,0); analogWrite(greenpin,255); analogWrite(redpin,0); } else if(mode==3) { analogWrite(bluepin,0); analogWrite(greenpin,0); analogWrite(redpin,255); } else if(mode==4) { analogWrite(bluepin,127); analogWrite(greenpin,127); analogWrite(redpin,0); } else if(mode==5) { analogWrite(bluepin,127); analogWrite(greenpin,0); analogWrite(redpin,127); } else if(mode==6) { analogWrite(bluepin,85); analogWrite(greenpin,85); analogWrite(redpin,85); } else { analogWrite(bluepin,0); analogWrite(greenpin,0); analogWrite(redpin,0); } } void loop() { current=debounce(last); if(last==LOW && current==HIGH) { ledmode++; } last=current; if(ledmode==6) { ledmode=0; } setMode(ledmode); }
شرح برنامه :
- در کنار پین هایی که برای ورودی از سنسور ها تعریف کردیم : دو متغیر منطقی بولین بنام های last و current معرفی کردیم و مقدار آنها را LOW یا معادل صفر قرار دادیم.
boolean last=LOW; boolean current=LOW;
- متغیر عددی ledmode را برای مد های متفاوت ال ای دی تعریف کرده و در ابتدا مقدار آنرا برابر با صفر قرار دادیم.
int ledmode=0;
- در قسمت void setup برنامه پایه های آبی , قرمز و سبز ال ای دی را در حالت OUTPUT و پایه ی s , tiltswitch را در حالت INPUT قرار میدهیم.
void setup() { pinMode(bluepin,OUTPUT); pinMode(greenpin,OUTPUT); pinMode(redpin,OUTPUT); pinMode(tiltswitch,INPUT); }
- در این قسمت متغیر منطقی boolean debounce را تعریف میکنیم . ( debounce کردن درواقع پریدن بین حالت های مختلف یک سوئیچ میباشد. در خط بعدی مقدار boolean current را از پین شماره ۷ که همان تیلت سوئیچ میباشد , میخوانیم.
سپس یک حلقه if میسازیم و مطابق کدهای برنامه چنانچه مقدار بولین last با مقدار بولین current برابر نبود بعد از وقفه ۵ میلی ثانیه ای مقدار تیلت سوئیچ را به متغیر بولین current میدهیم. و سپس return میکنیم.boolean debounce(boolean last) { boolean current=deigitalRead(tiltswitch); if(last!=current) { delay(50); current=degitalRead(tiltswitch); } return current; }
- حلقه ای جدید تحت عنوان void setMode تعریف میکنیم و در این حلقه متغیر mode را تعریف میکنیم. متغیر مد را تحت حلقه های متفاوت مقداردهی میکنیم و در هر کدام از حلقه ها مقادیر آنالوگ پین های قرمز , سبز و آبی را با یک مقدار دلخواه تعیین میکنیم. در این آموزش از ۶ حالت مختلف استفاده نمودیم و در آخر حلقه else را با مقادیر صفر برای هر کدام از حلقه ها به پایان رساندیم.
void setMode(int mode) { if(mode==1) { analogWrite(bluepin,255); analogWrite(greenpin,0); analogWrite(redpin,0); } else if(mode==2) { analogWrite(bluepin,0); analogWrite(greenpin,255); analogWrite(redpin,0); } else if(mode==3) { analogWrite(bluepin,0); analogWrite(greenpin,0); analogWrite(redpin,255); } else if(mode==4) { analogWrite(bluepin,127); analogWrite(greenpin,127); analogWrite(redpin,0); } else if(mode==5) { analogWrite(bluepin,127); analogWrite(greenpin,0); analogWrite(redpin,127); } else if(mode==6) { analogWrite(bluepin,85); analogWrite(greenpin,85); analogWrite(redpin,85); } else { analogWrite(bluepin,0); analogWrite(greenpin,0); analogWrite(redpin,0); } }
- در حلقه void loop برنامه متغیر بولین current را که در ابتدای برنامه تعریف کردیم با متغیر last که از حلقه debounce گرفته میشود را برابر قرار دادیم و حلقه جدید if را تحت شرایط زیر تعریف کردیم.
اگر بولین last برابر با LOW و در همان زمان متغیر current برابر با HIGH باشد. به متغیر عددی ledmode یک واحد اضافه شود و last را با current جایگزین میکنیم. برای اینکه برنامه فقط یکبار اجرا نشود و دوباره به کار خود ادامه دهد , چنانچه ledmode به مقدار ۶ رسید , آنرا صفر میکنیم. برای اینکار از حلقه if استفاده میکنیم و درنهایت مقدار setMode را برابر با ledmode جایگزین میکنیم تا هردو متغیر با هم تغییر کنند.void loop() { current=debounce(last); if(last==LOW && current==HIGH) { ledmode++; } last=current; if(ledmode==6) { ledmode=0; } setMode(ledmode); }
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.