آموزش ماتریس LED هشت در هشت (8*8) مدل MAX7219 همراه با پیمایش متن و کنترل تحت سیستم عامل اندروید با استفاده از بلوتوث
در این آموزش آردوینو قصد داریم تا براه اندازی دات ماتریس با آردوینو vh Hl,ca nidl. به این منظور در ادامه به بحثوبررسی حول این موضوع میپردازیم.
بررسی اجمالی راه اندازی دات ماتریس با آردوینو
این آموزش با سه مثال همراه خواهد بود. مثال اول به تشریح اصول کاری پایهای MAX7219 خواهیم پرداخت، در مثال دوم خواهیم آموخت که چگونه فرایند پیمایش متن در ماتریس LED هشت در هشت کار میکند و در سومین مثال، این تجهیزات را توسط بلوتوث و یک اپلیکیشن سفارشی ساخته شده تحت اندروید کنترل خواهیم کرد.
MAX7219
حال میتوانیم نگاه دقیقتری به راهانداز MAX7219 داشته باشیم. این IC قادر خواهد بود که تا 64 LED مستقل را درحالیکه تنها از 3 سیم برای اتصال با آردوینو استفاده میکند را راهاندازی کند و علاوه بر این ما میتوانیم چندین راهانداز و ماتریس را بهصورت زنجیری متصل کنیم و در این حالت نیز از همان 3 سیم استفاده کنیم. ما میتوانیم در آینده در بخش های مختلف آموزش رباتیک نیز از این مقاله استفاده کنیم.
64 الایدی توسط 16 پین خروجی IC راه اندازی میشوند. سؤالی که در اینجا به وجود میآید این است که چگونه انجام این امر ممکن است. ذکر این نکته ضروری به نظر میرسد که بیشترین تعداد LED روشن به صورت همزمان در واقع هشت LED است. LEDها به صورت مجموعههای سطری ستونی 8*8 مرتب شدهاند؛ بنابراین، MAX7219 هر ستون را برای مدت کوتاهی فعال میکند و همزمان هر ردیف را نیز راه اندازی میکند. پس، با کلیدزنی سریع سطرها و ستونها چشم انسان یک نور پیوسته را مشاهده میکند.
توجه داشته باشد که پینهای یک ماتریس 8*8 LED مشترک داخلی به چه ترتیب چیده شدهاند. بهاینترتیب درنظرگرفتن این نکته در مواردی که میخواهید ماتریس خود را بسازید ضروری به نظر میرسد.
همچنین ذکر این نکته ضروری به نظر میرسد که یک صفحه مشترک برای MAX7219 همراه با یک مقاومت بین پین 5 ولتی و پین IC شماره 18 است. مقاومت برای تنظیم روشنایی یا شارش جریان به LEDها استفاده میشود.
در جدول زیر که از دیتاشیت IC برداشت شده است، مقدار مقاومتی که باید باتوجه به افت ولتاژ LED استفاده کنیم، آورده شده است.
شماتیک مداری
حال به بررسی اتصال ماژول ماتریسی 8*8 LED به برد آردوینو میپردازیم. شماتیک مداری آن بهصورت شکل زیر است:
Vcc و GND ماژول به پینهای 5 ولتی و GND آردوینو و سه پین دیگر که DIN, CLK و CS هستند به هر پین دیجیتال برد آردوینو متصل میشوند. اگر بخواهیم بیش از یک ماژول را متصل کنیم، تنها باید پینهای خروجی برد قبلی را به پایههای ورودی ماژول جدید متصل کنیم. در واقع این پایهها همه یکسان هستند با این تفاوت که پایه DOUT برد قبلی به پایهی DIN برد جدید میرود.
کد مقدماتی آردوینوی MAX7219
بهمحض اینکه ماژولها را متصل کنیم، آماده هستیم تا کدنویسی آردوینو را برای مثال اول پیادهسازی کنیم. به این منظور از کتابخانهی MaxMatrix استفاده میکنیم که از GitHub قابل دانلود است.
/* 8x8 LED Matrix MAX7219 Example 01 Based on the following library: GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219 */ #include <MaxMatrix.h> int DIN = 7; // DIN pin of MAX7219 module int CLK = 6; // CLK pin of MAX7219 module int CS = 5; // CS pin of MAX7219 module int maxInUse = 1; MaxMatrix m(DIN, CS, CLK, maxInUse); char A[] = {4, 8, B01111110, B00010001, B00010001, B01111110, }; char B[] = {4, 8, B01111111, B01001001, B01001001, B00110110, }; char smile01[] = {8, 8, B00111100, B01000010, B10010101, B10100001, B10100001, B10010101, B01000010, B00111100 }; char smile02[] = {8, 8, B00111100, B01000010, B10010101, B10010001, B10010001, B10010101, B01000010, B00111100 }; char smile03[] = {8, 8, B00111100, B01000010, B10100101, B10010001, B10010001, B10100101, B01000010, B00111100 }; void setup() { m.init(); // MAX7219 initialization m.setIntensity(8); // initial led matrix intensity, 0-15 } void loop() { // Seting the LEDs On or Off at x,y or row,column position m.setDot(6,2,true); delay(1000); m.setDot(6,3,true); delay(1000); m.clear(); // Clears the display for (int i=0; i<8; i++){ m.setDot(i,i,true); delay(300); } m.clear(); // Displaying the character at x,y (upper left corner of the character) m.writeSprite(2, 0, A); delay(1000); m.writeSprite(2, 0, B); delay(1000); m.writeSprite(0, 0, smile01); delay(1000); m.writeSprite(0, 0, smile02); delay(1000); m.writeSprite(0, 0, smile03); delay(1000); for (int i=0; i<8; i++){ m.shiftLeft(false,false); delay(300); } m.clear(); }
توضیحات: بنابراین در ابتدا به اضافه کردن کتابخانهی MaxMatrix.h نیاز داریم که این کتابخانه پینهایی که به ماژول متصل هستند را تعریف میکند و تعداد ماژولهایی که استفاده میکنیم را تنظیم میکند و MaxMatrix را تعریف میکند.
برای نمایش کاراکترها در ابتدا به تعریف آن ها در آرایهای از کاراکترها یا بیتها نیاز داریم و در اینجا چندین مثال در این مورد آورده شده است. باید توجه داشته باشیم که بیتها چگونه کاراکترهای صفر و یک را تشکیل میدهند. در این شرایط 90 درجه چرخانده میشوند اما مثال کتابخانه این پیشنهاد را میدهد که از آن ها بهگونهای استفاده شود که بعداً پیادهسازی تابع shiftLeft برای پیمایش متن سادهتر باشد.
در بخش تنظیمات تنها نیاز به مقدار دهی اولیهی ماژول داریم و باید در این بخش روشنایی LEDها را نیز تنظیم کنیم. در بخش حلقه با استفاده از تابع ()setDot میتوانیم هر LED در هر مختصات X و Y در موقعیت سطری و ستونی را روشن کنیم و با استقاده از تابع ()clear میتوانیم نمایشگر را پاک کنیم.
برای نمایش نویسههای از پیش تعریف شده از تابع ()writeSprite استفاده میکنیم و در این حالت دو آرگومان اول موقعیت X و Y گوشه سمت چپ بالای کاراکتر است. در انتها با استفاده از تابع ()shiftLeft کاراکتر را جابهجا میکنیم یا به سمت چپ پیمایش میکنیم.
کد آردوینوی پیمایش ماتریس 8*8 الایدی
در ادامه قصد داریم تا به مثال متن پیمایش بپردازیم و تفاوتهای آن را مورد بررسی قرار دهیم. در کد زیر توضیحات مربوط به آن قابل مشاهده است:
/* 8x8 LED Matrix MAX7219 Scrolling Text Example Based on the following library: GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219 */ #include <MaxMatrix.h> #include <avr/pgmspace.h> PROGMEM const unsigned char CH[] = { 3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space 1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // ! 3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // " 5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // # 4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $ 5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // % 5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // & 1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // ' 3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // ( 3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // ) 5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // * 5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // + 2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // , 4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // - 2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // . 4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // / 4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0 3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1 4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2 4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3 4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4 4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5 4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6 4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7 4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8 4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9 2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // : 2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ; 3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // < 3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // = 3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // > 4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ? 5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @ 4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A 4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B 4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C 4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D 4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E 4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F 4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G 4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H 3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I 4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J 4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K 4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L 5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M 5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N 4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O 4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P 4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q 4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R 4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S 5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T 4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U 5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V 5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W 5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X 5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y 4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z 2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [ 4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash 2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ] 3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat 4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _ 2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // ` 4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a 4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b 4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c 4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d 4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e 3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f 4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g 4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h 3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i 4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j 4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k 3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l 5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m 4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n 4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o 4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p 4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q 4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r 4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s 3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t 4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u 5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v 5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w 5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x 4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y 3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z 3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // { 1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // | 3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // } 4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~ }; int DIN = 7; // DIN pin of MAX7219 module int CLK = 6; // CLK pin of MAX7219 module int CS = 5; // CS pin of MAX7219 module int maxInUse = 2; MaxMatrix m(DIN, CS, CLK, maxInUse); byte buffer[10]; char text[]= "HowToMechatronics.com "; // Scrolling text void setup() { m.init(); // module initialize m.setIntensity(15); // dot matix intensity 0-15 } void loop() { printStringWithShift(text, 100); // (text, scrolling speed) } // Display=the extracted characters with scrolling void printCharWithShift(char c, int shift_speed) { if (c < 32) return; c -= 32; memcpy_P(buffer, CH + 7 * c, 7); m.writeSprite(32, 0, buffer); m.setColumn(32 + buffer[0], 0); for (int i = 0; i < buffer[0] + 1; i++) { delay(shift_speed); m.shiftLeft(false, false); } } // Extract the characters from the text string void printStringWithShift(char* s, int shift_speed) { while (*s != 0) { printCharWithShift(*s, shift_speed); s++; } }
توضیحات: در اینجا ما باید یک کتابخانهی اضافی از PROGMEN قرار دهیم که بهبود دهندهی متغیر است و برای ذخیرهسازی اطلاعات از فلش مموری بهجای SRAM استفاده میکند. هنگامی که پایگاهدادهای از متغیرها داریم که استاتیک هستند مانند همین نمونه که حروف و کاراکترها را تعریف میکنیم، بهتر است که آن ها را در یک فلش مموری ذخیره کنیم زیرا 32 هزار بایت آن در مقایسه با 2 هزار بایت SRAM بسیار بزرگتر است.
در مرحلهی بعدی با یک آرایه از کاراکتر پیمایش یک متن را تعریف می کنیم و در بهش حلقهی تابع سفارشی، printStringWithShift پیمایش متن را روی ماتریس LED با سرعتی برابر با میلی ثانیه چاپ می کند. اولین موضوعی که این تابع سفارشی مورد بررسی انجام می دهد این است که کاراکترها را از رشته ی متن استخراج میکند و پس از آن این کاراکترهای پیمایشی را روی ماتریس LED نمایش میدهد.
اپلیکیشن اندروید برای کنترل ماتریس 8*8 LED توسط بلوتوث
حال که با شیوهی عملکرد MAX7219 آشنا شدیم، میتوانیم سومین مثال را که در مورد یک پروژهی عملی آردوینو است را شروع کنیم. در این پروژه یک اپلیکیشن سفارشی اندروید خواهیم ساخت که از طریق رابط بلوتوث برای کنترل ماتریس LED به کار میرود.
در ادامه کد آردوینوی مرتبط آورده شده است و اکنون تغییرات را در مقایسه با مثال قبلی مشاهده میکنیم.
/* 8x8 LED Matrix MAX7219 Scrolling Text Android Control via Bluetooth Based on the following library: GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219 */ #include <MaxMatrix.h> #include <SoftwareSerial.h> #include <avr/pgmspace.h> PROGMEM const unsigned char CH[] = { 3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space 1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // ! 3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // " 5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // # 4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $ 5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // % 5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // & 1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // ' 3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // ( 3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // ) 5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // * 5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // + 2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // , 4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // - 2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // . 4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // / 4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0 3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1 4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2 4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3 4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4 4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5 4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6 4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7 4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8 4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9 2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // : 2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ; 3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // < 3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // = 3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // > 4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ? 5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @ 4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A 4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B 4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C 4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D 4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E 4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F 4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G 4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H 3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I 4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J 4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K 4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L 5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M 5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N 4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O 4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P 4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q 4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R 4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S 5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T 4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U 5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V 5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W 5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X 5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y 4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z 2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [ 4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash 2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ] 3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat 4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _ 2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // ` 4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a 4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b 4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c 4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d 4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e 3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f 4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g 4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h 3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i 4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j 4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k 3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l 5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m 4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n 4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o 4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p 4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q 4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r 4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s 3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t 4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u 5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v 5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w 5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x 4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y 3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z 3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // { 1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // | 3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // } 4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~ }; int dIn = 7; // DIN pin of MAX7219 module int clk = 6; // CLK pin of MAX7219 module int cs = 5; // CS pin of MAX7219 module int maxInUse = 2; // Number of MAX7219's connected MaxMatrix m(dIn, cs, clk, maxInUse); SoftwareSerial Bluetooth(8, 7); // Bluetooth byte buffer[10]; char incomebyte; int scrollSpeed = 100; char text[100] = "HowToMechatronics.com "; // Initial text message int brightness = 15; int count = 0; char indicator; void setup() { m.init(); // MAX7219 initialization m.setIntensity(brightness); // initial led matrix intensity, 0-15 Bluetooth.begin(38400); // Default communication rate of the Bluetooth module } void loop() { // Printing the text printStringWithShift(text, scrollSpeed); if (Bluetooth.available()) { // Checks whether data is comming from the serial port indicator = Bluetooth.read(); // Starts reading the serial port, the first byte from the incoming data // If we have pressed the "Send" button from the Android App, clear the previous text if (indicator == '1') { for (int i = 0; i < 100; i++) { text[i] = 0; m.clear(); } // Read the whole data/string comming from the phone and put it into text[] array. while (Bluetooth.available()) { incomebyte = Bluetooth.read(); text[count] = incomebyte; count++; } count = 0; } // Adjusting the Scrolling Speed else if (indicator == '2') { String sS = Bluetooth.readString(); scrollSpeed = 150 - sS.toInt(); // Milliseconds, subtraction because lower value means higher scrolling speed } // Adjusting the brightness else if (indicator == '3') { String sB = Bluetooth.readString(); brightness = sB.toInt(); m.setIntensity(brightness); } } } void printCharWithShift(char c, int shift_speed) { if (c < 32) return; c -= 32; memcpy_P(buffer, CH + 7 * c, 7); m.writeSprite(32, 0, buffer); m.setColumn(32 + buffer[0], 0); for (int i = 0; i < buffer[0] + 1; i++) { delay(shift_speed); m.shiftLeft(false, false); } } void printStringWithShift(char* s, int shift_speed) { while (*s != 0) { printCharWithShift(*s, shift_speed); s++; } } void printString(char* s) { int col = 0; while (*s != 0) { if (*s < 32) continue; char c = *s - 32; memcpy_P(buffer, CH + 7 * c, 7); m.writeSprite(col, 0, buffer); m.setColumn(col + buffer[0], 0); col += buffer[0] + 1; s++; } }
توضیحات:
در ابتدا باید کتابخانهی SoftwareSerial.h را اضافه کنیم که رابط بلوتوث را فعال میکند و برخی متغیرهای موردنیاز برای برنامه را تعریف میکند. در بخش تنظیمات نیاز داریم تا بلوتوث را در نرخ باود 38400 بیت بر ثانیه راهاندازی کنیم. ما در اینجا یک پیغام نمایشی برای شروع انتخاب کردهایم که سرعت پیمایش 100 میلیثانیهای برای تأخیر را در نظر دارد.
در مرحلهی بعدی، با استفاده از تابع ()Bluetooth.available این موضوع را بررسی خواهیم کرد که آیا داده های ورودی از پورت سریال وجود دارد یا خیر و اینکه اگر وجود دارد، با استفاده از تابع Bluetooth.read شروع به خواندن ورودی از پورت سریال با یک بیت برای هر تکرار کنیم؛ بنابراین اولین بایت ورودی همیشه در متغیر indicator ذخیره خواهد شد و با توجه به آن انتخاب می کنیم که آیا پیام متنی را تغییر دهیم یا سرعت پیمایش یا روشنایی ماتریس LED را.
اگر نگاهی به بلوکهای کد برنامه اندروید بیندازیم، متوجه میشویم که وقتی روی دکمه “ارسال” کلیک شود، ابتدا بایت نشانگر را ارسال میکنیم، در این مثال “1”، به این معنی است که ما میخواهیم پیام متنی را تغییر دهیم. برای انجام این کار، در سمت آردوینو، کل آرایة کاراکترها و همچنین صفحهنمایش ماتریس LED را پاک میکنیم. سپس در حلقه “while” بقیة دادهها را در پورت سریال میخوانیم، و آنها، همان پیامهایی هستند که در کادر متن برنامه اندروید تایپ شدهاند.
درصورتی که متغیر نشانگر “2” باشد، به این معنی است که ما موقعیت اسلایدر سرعت پیمایش را تغییر دادهایم، بنابراین مقدار جدید آن را با استفاده از تابع () Bluetooth.readString میخوانیم و سرعت پیمایش را تنظیم میکنیم. به همین ترتیب ما روشنایی LEDها را تنظیم میکنیم.
بهاینترتیب این بخش از آموزش نیز کامل شد.
به امید موفقیت روزافزون.