در قسمت 44 از آموزش آردوینو به بررسی نمایش تصاویر روی ماتریس LED و کنترل یک ماتریس LED: چارلیپلکسینگ (Charlieplexing) پرداختیم.
در این قسمت قصد داریم درباره راهاندازی نمایشگر LED سون سگمنت و راهاندازی نمایشگرهای LED هفتسگمنت چندرقمی: مالتیپلکسینگ و همچنین، راهاندازی نمایشگرهای LED سونسگمنت چندرقمی با کمترین تعداد پایه (پین) صحبت کنیم.
فرض کنید میخواهید با استفاده از یک نمایشگر عددی ۷-سگمنت، اعداد را نمایش دهید.اسکچ زیر اعداد ۰ تا ۹ را روی یک نمایشگر ۷-سگمنت تکرقمی نمایش میدهد.
شکل 1 اتصالات مربوط به یک نمایشگر آند مشترک (Common Anode) را نشان میدهد.
ممکن است تخصیص پایههای شما متفاوت باشد، بنابراین حتماً دیتاشیت نمایشگر خود را بررسی کنید.
⚡ معرفی 12 مرجع برتر دانلود دیتاشیت
اگر نمایشگر شما از نوع کاتد مشترک (Common Cathode) است، پایه کاتد مشترک را به GND متصل کنید. خروجی با روشنکردن ترکیبهایی از سگمنتها که اعداد را نمایش میدهند، تولید میشود:
|
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
/* * SevenSegment sketch * Shows numerals ranging from 0 through 9 on a single-digit display * This example counts seconds from 0 to 9 */ // bits representing segments A through G (and decimal point) for numerals 0-9 const byte numeral[10] = { //ABCDEFG+dp B11111100, // 0 B01100000, // 1 B11011010, // 2 B11110010, // 3 B01100110, // 4 B10110110, // 5 B00111110, // 6 B11100000, // 7 B11111110, // 8 B11100110, // 9 }; // pins for decimal point and each segment // dp,G,F,E,D,C,B,A const int segmentPins[8] = { 5,8,9,7,6,4,3,2}; void setup() { for(int i=0; i < 8; i++) { pinMode(segmentPins[i], OUTPUT); // set segment and DP pins to output } } void loop() { for(int i=0; i <= 10; i++) { showDigit(i); delay(1000); } // the last value if i is 10 and this will turn the display off delay(2000); // pause two seconds with the display off } // Displays a number from 0 through 9 on a 7-segment display // any value not within the range of 0-9 turns the display off void showDigit(int number) { bool isBitSet; for(int segment = 1; segment < 8; segment++) { if( number < 0 || number > 9){ isBitSet = 0; // turn off all segments } else{ // isBitSet will be true if given bit is 1 isBitSet = bitRead(numeral[number], segment); } isBitSet = ! isBitSet; // remove this line if common cathode display digitalWrite(segmentPins[segment], isBitSet); } } |

شکل 1: اتصال نمایشگر ۷-سگمنت
سگمنتهایی که باید برای هر عدد روشن شوند، در آرایهای به نام numeral ذخیره شدهاند. برای هر عدد یک بایت در نظر گرفته شده است که هر بیت از آن بایت نمایانگر یکی از سون سگمنت (یا نقطه اعشاری) است. آرایهای به نام segmentPins پایههای مربوط به هر سگمنت را نگه میدارد. تابع showDigit بررسی میکند که عدد در بازهٔ ۰ تا ۹ باشد و در صورت معتبر بودن، هر بیت مربوط به سگمنت را بررسی میکند و اگر بیت مقدار ۱ داشته باشد، آن سگمنت را روشن میکند.
برای اطلاعات بیشتر درباره تابع bitRead به قسمتهای قبلی مراجعه کنید.
همانطور که قبلاً اشاره شد، برای روشنکردن یک سگمنت در نمایشگر کاتد مشترک، پایه روی حالت HIGH قرار میگیرد و برای روشنکردن یک سگمنت در نمایشگر آند مشترک، پایه روی حالت LOW تنظیم میشود.
کد ارائهشده در اینجا مخصوص نمایشگر آند مشترک است، بنابراین مقدارها را معکوس میکند (۰ را به ۱ و ۱ را به ۰ تبدیل میکند) بهصورت زیر:
|
1 |
isBitSet = ! isBitSet; // remove this line if common cathode display |
علامت ! عملگر نقیض (NOT) است. اگر نمایشگر شما از نوع کاتد مشترک (Common Cathode) است، یعنی همه کاتدها به هم متصل شدهاند؛ اگر مطمئن نیستید به دیتاشیت مراجعه کنید.
فرض کنید میخواهید با استفاده از یک نمایشگر ۷-سگمنت که دو یا چند رقم را نمایش میدهد، اعداد را نشان دهید. نمایشگرهای ۷-سگمنت چندرقمی معمولاً از روش مالتیپلکسینگ (Multiplexing) استفاده میکنند.
در قسمتهای قبلی، سطرها و ستونهای مالتیپلکسشده LEDها به هم متصل میشدند تا یک آرایه تشکیل شود؛ در اینجا، سگمنتهای متناظر از هر رقم به یکدیگر متصل میشوند.
(شکل 2 اتصال مربوط به نمایشگر Lite-On LTC-2623 را نشان میدهد، اما اگر نمایشگر شما متفاوت است، باید دیتاشیت آن را بررسی کنید)
نمودار سیمکشی نشاندادهشده مربوط به نمایشگر Lite-On LTC-2623 است. اگر از نمایشگر دیگری استفاده میکنید، میتوانید از همان پایههای آردوینو استفاده کنید، اما باید پایههای متناظر را در دیتاشیت نمایشگر خود پیدا کنید. نمایشگر LTC-2623 از نوع آند مشترک (Common Anode) است. اگر نمایشگر شما کاتد مشترک (Common Cathode) باشد، لازم است دو تغییر انجام دهید:
نحوه اتصال ترانزیستورها را تغییر دهید: همه امیترها را به هم و به زمین (GND) وصل کنید و کلکتور هر ترانزیستور را به پایهٔ متناظر روی نمایشگر متصل نمایید.
این خط کد را در اسکچ کامنت کرده یا حذف کنید:
|
1 |
isBitSet = ! isBitSet; |
|
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
/* * SevenSegmentMpx sketch * Shows numbers ranging from 0 through 9999 on a four-digit display * This example displays the value of a sensor connected to an analog input */ // bits representing segments A through G (and decimal point) for numerals 0-9 const int numeral[10] = { //ABCDEFG /dp B11111100, // 0 B01100000, // 1 B11011010, // 2 B11110010, // 3 B01100110, // 4 B10110110, // 5 B00111110, // 6 B11100000, // 7 B11111110, // 8 B11100110, // 9 }; // pins for decimal point and each segment // dp,G,F,E,D,C,B,A const int segmentPins[] = { 4, 7,8,6,5,3,2,9}; const int nbrDigits= 4; // the number of digits in the LED display //dig 1 2 3 4 const int digitPins[nbrDigits] = { 10,11,12,13}; void setup() { for(int i=0; i < 8; i++) pinMode(segmentPins[i], OUTPUT); // set segment and DP pins to output for(int i=0; i < nbrDigits; i++) pinMode(digitPins[i], OUTPUT); } void loop() { int value = analogRead(0); showNumber(value); } void showNumber(int number) { if(number == 0) showDigit( 0, nbrDigits-1) ; // display 0 in the rightmost digit else { // display the value corresponding to each digit // leftmost digit is 0, rightmost is one less than the number of places for( int digit = nbrDigits-1; digit >= 0; digit--) { if(number > 0) { showDigit( number % 10, digit) ; number = number / 10; } } } } // Displays given number on a 7-segment display at the given digit position void showDigit( int number, int digit) { digitalWrite( digitPins[digit], HIGH ); for(int segment = 1; segment < 8; segment++) { bool isBitSet = bitRead(numeral[number], segment); // isBitSet will be true if given bit is 1 isBitSet = ! isBitSet; // remove this line if common cathode display digitalWrite( segmentPins[segment], isBitSet); } delay(5); digitalWrite( digitPins[digit], LOW ); } |

شکل 2: اتصال نمایشگر ۷-سگمنت چندرقمی (LTC-2623)
این اسکچ دارای تابع showDigit است؛ مشابه آنچه در قسمتهای قبلی توضیح داده شد.
در اینجا، این تابع عدد (numeral) و موقعیت رقم را دریافت میکند. منطق روشنکردن سگمنتها متناسب با عدد تغییری نکرده است، اما علاوهبرآن، کد پایهای را که مربوط به موقعیت رقم است روی حالت HIGH قرار میدهد تا فقط همان رقم فعال شده و نوشته شود. (برای توضیحات بیشتر به مباحث قبلی مربوط به مالتیپلکسینگ مراجعه کنید).
فرض کنید میخواهید چندین نمایشگر سونسگمنت (7-segment) را کنترل کنید، اما میخواهید تعداد پایههای موردنیاز آردوینو را به حداقل برسانید.
در این آموزش از یک برد مبتنی بر HT16K33 برای کنترل نمایشگرهای چهاررقمی کاتد مشترک استفاده میشود؛ مانند LuckyLight KW4-56NXBA-P یاBetlux BL-Q56C-43 . آیسی HT16K33 یک راهحل سادهتر ارائه میدهد، زیرا عمل مالتیپلکسکردن و کدگشایی ارقام را بهصورت سختافزاری انجام میدهد. میتوانید بردهای مبتنی بر HT16K33 را از منابع مختلف تهیه کنید. شرکت Adafruit محصولی به نام 7-Segment LED Matrix Backpack (شماره قطعه 877) تولید میکند که برای کار با نمایشگرهای سونسگمنت چهاررقمی که خودش عرضه میکند طراحی شده است؛ همچنین این شرکت این بردها را همراه با خودِ نمایشگرها و در رنگهای متنوع نیز ارائه میدهد.
این اسکچ عددی بین ۰ تا ۹٬۹۹۹ را نمایش میدهد (شکل 3 اتصالات را نشان میدهد):
|
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 |
/* HT16K33 seven segment display sketch */ #include <Wire.h> #include <Adafruit_GFX.h> #include "Adafruit_LEDBackpack.h" Adafruit_7segment matrix = Adafruit_7segment(); const int numberOfDigits = 4; // change 4 to the # of digits wired up const int maxCount = 9999; int number = 0; void setup() { Serial.begin(9600); matrix.begin(0x70); // Initialize the display matrix.println(number); // Send the number (0 initially) to the display matrix.writeDisplay(); // Update the display } void loop() { // display a number from serial port terminated by end of line character if (Serial.available()) { char ch = Serial.read(); if ( ch == '\n') { if (number <= maxCount) { matrix.println(number); matrix.writeDisplay(); number = 0; // Reset the number to 0 } |

شکل 3: راهاندازی (درایو کردن) یک نمایشگر سونسگمنت چندرقمی با کاتد مشترک توسط HT16K33
این روش از ارتباط I2C آردوینو برای برقراری ارتباط با تراشه HT16K33 استفاده میکند. کتابخانه Adafruit_LEDBackpack یک رابط برای سختافزار فراهم میکند که از طریق یک نمونه از شیء Adafruit_7segment (که در این اسکچ «matrix» نام دارد) به آن دسترسی پیدا میشود.
این اسکچ درصورتیکه عددی با حداکثر چهار رقم از طریق پورت سریال دریافت شود، آن را نمایش میدهد—برای توضیح کد سریال در تابع loop به قسمتهای قبلی مراجعه کنید. تابع matrix.println مقادیر را به HT16K33 ارسال میکند و تابع matrix.writeDisplay نمایشگر را با آخرین مقدار ارسالشده بهروزرسانی میکند.
برد Breakout از یک نمایشگر سونسگمنت چهاررقمی استفاده میکند، اما اگر یک برد HT16K33 عمومیتر (مانند قطعه شماره 1427 شرکت Adafruit) تهیه کنید، میتوانید آن را با نمایشگرهای تکرقمی یا دورقمی برای حداکثر هشت رقم به کار ببرید. هنگام ترکیب چند نمایشگر، هر پایه متناظر سگمنت باید به یکدیگر متصل شوند. لازم است به دیتاشیت نمایشگر سگمنت مورداستفاده و همچنین دیتاشیت برد HT16K33 که انتخاب کردهاید مراجعه کنید.
من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.