راه اندازی فرستنده و گیرنده ی HMT – HMR با آردوینو
فرستنده و گیرنده ی HMT – HMR با آردوینو
فرستنده و گیرنده ی HMT – HMR ، محصول چینی شرکت چینی HOPE RF هستن که قیمت مناسبی هم دارن، فرستنده و گیرنده ی HMT – HMR برد کم و واسط ارتباطی سریال به تبادل داده بصورت بی سیم میپردازند. فرکانس کاری ماژول در بازه های 433 و 868 و 915 مگاهرتز و مدولاسیون اون هم از نوع FSK هستش.
ارتباط فرستنده گیرنده های HMT – HMR با آردوینو از طریق ارتباط سریال انجام میشه . حداکثر سرعت تراشه ، 9600 بیت برثانیه هستش. فرستنده ، سه پایه ی VCC و GND و DATA داره و تراشه ی گیرنده علاوه بر این سه پایه ، یک پایه ENABLE هم داره.در فرستنده، دو پایه ی اول رو به 5 ولت و زمین وصل میکنیم.پایه ی سوم رو به پایه TXD آردوینو وصل می کنیم.
درگیرنده ، پایه ی ENABLE فعال کننده ی تراشه است.
اگر ENABLE رو به 5 ولت وصل کنیم، فرستنده فعال است و اگر اون رو به زمین وصل کنیم، تراشه به خواب میره که برای صرفه جویی در مصرف توان مفید است. پایه ی DATA تراشه نیز به پایه ی RXD آردوینو وصل میشه.
نحوه ارسال و دریافت داده هم مثل یک واحد ارتباط سریاله و تابع هایی که در قسمت ارتباط سریال توضیح دادیم ، به کار میرن:
مثال: اعداد صفر تا 999 رو به صورت بیسیم ارسال و دریافت میکنیم.
1 2 3 4 5 6 7 |
void setup(){ Serial.begin(9600); } void loop() { for(int a=0;a<=999;a++) Serial.write(a); } |
برای دریافت اطلاعات درگیرنده بصورت زیر عمل می کنیم:
1 2 |
if(Serial.available()>0){ a= Serial.read();} |
حذف نویز در راه اندازی فرستنده و گیرنده ی HMT – HMR
دریافت و ارسال اطلاعات در فرستنده و گیرنده بی سیم با نویز حتما همراهه، وصل کردن آنتن تا حد زیادی این مشکل رو حل میکنه، ولی برای حذف نویز کامل در فرستنده و گیرنده چند کد بصورت هماهنگ مینویسیم تا داده های ناخواسته حذف بشن. بعنوان نمونه به مثال یک توجه کنید:
پروژه فرستنده و گیرنده ی HMT – HMR با آردوینو
پروژه 1
برنامه زیر ی داده ی LM35 رو که به پایه ی A0 وصل شده بصورت بی سیم ارسال میکنه ، گیرنده ، داده ی دما رو در نمایشگر LCD کاراکتری نمایش میده.
از ولتاژ مرجع داخلی 2.56 ولت استفاده کردیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
int arr[3]={0,0,0}; void setup(){ analogReference(INTERNAL); Serial.begin(9600); } void loop(){ int sensorvalue =analogRead(A0); arr[0]=sensorvalue-1; arr[1]=sensorvalue; arr[2]=sensorvalue+1; for (int i=0;i<3;i++){ Serial.write(arr[i]);} delay(10); } |
کد گیرنده:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <LiquidCrystal.h> LiquidCrystal lcd(12,11,5,4,3,2); int i=0;int arr[3]={0,0,0}; void setup(){ lcd.begin(16,2); Serial.begin(9600); } void loop() { if(Serial.available()){ arr[i]=Serial.read(); i=i+1; if(i==3){ i=0; int ave=(arr[0]+arr[1]+arr[2])/3; if(ave==arr[1]){ lcd.home(); lcd.print(ave); lcd.home(); }} }} |
در فرستنده ، دما رو در آرایه ای سه عضوی قرار میدیم که عضو دوم اون داده دماست.
عضوهای سوم و اول ، داده ی دما به علاوه منهای یک هستن. میانگین عضو های آرایه ، خود داده ی دماست. در برنامه ی گیرنده نیز همین روش کدبندی رو رعایت کردیم. در اینجا کدی به صورت انتخابی در برنامه گذاشتیم. خواننده با توجه به محیطی که فرستنده گیرنده قرار داره، میتونه کدهای پیچیده تری طراحی کنه.
در گیرنده ، میانگین داده های دریافتی رو حساب میکنیم و اگر این مقدار برابر با مقدار وسط آرایه باشه ، اون موقع خطایی در دریافت نداشتیم و مقدار دما در نمایشگر نمایش میدیم.
البته کدگذاری با آی سی های سری PT هم صورت میگیره که باید در فرستنده و گیرنده استفاده بشه.
پروژه ی 2
در این پروژه یک عدد LED را از فاصله دور به صورت بیسیم خاموش و روشن کنیم.
به این شکل که بار فشار دادن کلید (کلید به پایه 10 متصله) ، LED ( متصل به پین شماره ۱۳) روشن میشود و با فشار مجدد کلید ، LED خاموش میشود.
در کد فرستنده از کتابخانه debounce استفاده شده که میتونید از لینک زیر دریافت کنید:
کد فرستنده:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <Bounce2.h> Bounce debouncer = Bounce (); bool state = false; void setup () { pinMode (BUTTON_PIN, INPUT_PULLUP); Serial.begin (9600); debouncer.attach (10); debouncer.interval (50); } void loop () { debouncer.update (); if ( debouncer.fell () ) { state = !state; if ( state == true ) { Serial.print ('T'); } else if ( state == false ) { Serial.print ('F'); } } } |
کد گیرنده:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
void setup () { Serial.begin (9600); pinMode (13, OUTPUT); digitalWrite (13, LOW); } void loop () { if ( Serial.available ()) { char c = Serial.read (); if ( c == 'T' ) { digitalWrite (13, HIGH); } else if ( c == 'F' ) { digitalWrite (13, LOW); } }} |
موفق باشید!
خیلی جامع و عالی
واقعا دست تون درد نکنه