🔢 نمایشگر سونسگمنت ۴ رقمی TM1637 با آردوینو: عدد، دونقطه و تایمر معکوس
اگر بخواهی با آردوینو یک ساعت، تایمر آشپزخانه یا شمارندهی امتیاز بسازی، سونسگمنت ۴ رقمی TM1637 بهترین شروع است. چهار رقم درشت و خوانا، یک دونقطه برای ساعت، و نکتهی اصلی: فقط دو سیم داده لازم دارد. در این آموزش TM1637 با آردوینو را با کتابخانهی TM1637Display راه میاندازیم، عدد و ساعت نشان میدهیم و در آخر یک تایمر معکوس با دکمه و بوق میسازیم. اگر این پروژه را قبلاً در ووکوی (Wokwi) دیدهای، اینجا نسخهی فارسی و قدمبهقدم آن است.
TM1637 چطور کار میکند؟
هر رقم یک سونسگمنت است: هفت LED باریک به شکل عدد ۸ (به اسم a تا g) و گاهی یک نقطه. چهار رقم یعنی بیش از سی LED. اگر بخواهی همه را مستقیم به آردوینو وصل کنی، پایه کم میآوری. راهحل، تراشهی کوچک TM1637 پشت ماژول است: آردوینو فقط به آن میگوید «رقم اول را ۱ کن، رقم دوم را ۲»، و خود تراشه با سرعت زیاد رقمها را یکییکی روشن میکند. اینقدر سریع که چشم ما همه را با هم روشن میبیند. به این روش مالتیپلکس میگویند. روشنایی هم هشت پله دارد (۰ تا ۷) که با یک دستور عوض میشود.
اگر هنوز با یک رقم تکی کار نکردهای، صفحهی قطعهی سونسگمنت تکرقمی را ببین تا بفهمی هر سگمنت چطور روشن میشود؛ TM1637 همان کار را برایت خودکار انجام میدهد.
پایههای ماژول
| پایه | کار |
|---|---|
| CLK | ساعت؛ آهنگ فرستادن داده را تعیین میکند |
| DIO | داده؛ عددها از این سیم میروند |
| VCC | تغذیهی ۵ ولت (۳٫۳ ولت هم کار میکند) |
| GND | زمین |
قطعهها و سیمکشی
- یک آردوینو Uno
- یک ماژول سونسگمنت ۴ رقمی TM1637
- برای پروژهی تایمر: یک دکمه و یک بازر
| پایهی TM1637 | آردوینو Uno | توضیح |
|---|---|---|
| CLK | D2 | هر پایهی دیجیتال دیگری هم میشود |
| DIO | D3 | در کد باید با همین ترتیب بیاید |
| VCC | 5V | — |
| GND | GND | — |
کد کامل
کتابخانهی TM1637Display (با اسم «TM1637» از Avishay Orpaz در Library Manager) را نصب کن و این برنامه را اجرا کن. اول چند حالت نمایش را نشان میدهد، بعد یک کرنومتر دقیقه:ثانیه با دونقطهی چشمکزن میشود.
// TM1637 4-digit display: numbers, letters, colon and a stopwatch.
#include <TM1637Display.h>
const int CLK = 2;
const int DIO = 3;
TM1637Display display(CLK, DIO);
// Raw segments: bit 0 = a, bit 1 = b ... bit 6 = g
const uint8_t HI[4] = {0b01110110, 0b00000110, 0, 0}; // "HI "
void setup() {
display.setBrightness(5); // 0 (dim) .. 7 (bright)
display.clear();
display.setSegments(HI); // letters made by hand
delay(1500);
display.showNumberDec(1234); // all four digits
delay(1500);
display.showNumberDec(7, false); // " 7" without leading zeros
delay(1500);
display.showNumberDec(7, true); // "0007" with leading zeros
delay(1500);
}
void loop() {
// a minutes:seconds stopwatch built from millis()
unsigned long total = millis() / 1000;
int minutes = (total / 60) % 100;
int seconds = total % 60;
bool colonOn = (total % 2) == 0; // blink the colon once a second
display.showNumberDecEx(minutes * 100 + seconds, colonOn ? 0b01000000 : 0, true);
delay(100);
}
توضیح خط به خط
TM1637Display display(CLK, DIO);یک شیء نمایشگر میسازد. ترتیب مهم است: اول CLK، بعد DIO.setBrightness(5)روشنایی را از ۰ تا ۷ تنظیم میکند. این عدد از دستور نمایش بعدی اثر میکند، نه همان لحظه.setSegments(HI)چهار بایت میگیرد؛ هر بیت یک سگمنت است. برای H سگمنتهای b، c، e، f و g را روشن کردهایم. با همین روش میتوانی کلمههایی مثلdonEیاStoPهم بنویسی.showNumberDec(عدد, صفرهای اول)عدد ۰ تا ۹۹۹۹ را نشان میدهد. اگر پارامتر دومtrueباشد، جای خالی با صفر پر میشود؛ برای ساعت همین را میخواهیم (07:05 بهجای 7:5).showNumberDecExهمان است، بهاضافهی نقطهها.0b01000000دونقطهی وسط را روشن میکند. ترفند ساعت این است که دقیقه را در ۱۰۰ ضرب کنیم و ثانیه را اضافه کنیم: ۳ دقیقه و ۹ ثانیه میشود ۳۰۹ و با صفرهای اول «03:09» دیده میشود.millis() / 1000تعداد ثانیههای گذشته از روشن شدن برد است. با باقیمانده بر ۲ (% 2) هر ثانیه دونقطه یک بار خاموش و روشن میشود.
پروژهی کوچک: تایمر معکوس با دکمه و بوق
یک تایمر آشپزخانه که از 01:30 شروع میکند. دکمه روی D4 آن را راه میاندازد یا مکث میکند و وقتی به 00:00 رسید، بازر روی D8 بوق میزند. دکمه را بین D4 و GND بگذار؛ چون پایه را INPUT_PULLUP کردهایم، مقاومت لازم نیست. پایهی مثبت بازر به D8 و پایهی دیگرش به GND.
// Countdown timer MM:SS: button on D4 starts/pauses, buzzer on D8 at 00:00.
#include <TM1637Display.h>
TM1637Display display(2, 3); // CLK, DIO
const int BUTTON = 4;
const int BUZZER = 8;
int minutes = 1, seconds = 30; // start from 01:30
bool running = false;
bool wasPressed = false;
unsigned long lastTick = 0;
void show() {
display.showNumberDecEx(minutes * 100 + seconds, 0b01000000, true);
}
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
display.setBrightness(5);
show();
}
void loop() {
bool pressed = digitalRead(BUTTON) == LOW;
if (pressed && !wasPressed) running = !running; // start / pause
wasPressed = pressed;
if (running && millis() - lastTick >= 1000) {
lastTick = millis();
if (seconds > 0) {
seconds--;
} else if (minutes > 0) {
minutes--;
seconds = 59;
}
show();
if (minutes == 0 && seconds == 0) { // finished
running = false;
tone(BUZZER, 880, 1500);
}
}
delay(20);
}
متغیر wasPressed لبهی فشار دکمه را تشخیص میدهد؛ یعنی نگه داشتن دکمه فقط یک بار تایمر را عوض میکند، نه پنجاه بار در ثانیه. شمارش هم با millis() است، نه delay(1000)، تا دکمه در تمام مدت جواب بدهد.
اجرا در شبیهساز
دو مثال آماده در تینکرکد فارسی هست: کرنومتر با TM1637 و تایمر معکوس با TM1637 که همان مدار بالا با دکمه است. برای یادگیری قدمبهقدم، درس نمایشگر ۴ رقمی TM1637 را ببین. باز کردن و خواندن مثالها رایگان است؛ TM1637 جزو ماژولهای حرفهای است و برای اجرای خود ماژول به اشتراک Plus نیاز داری. سونسگمنت تکرقمی معمولی ولی رایگان است: پروژهی سونسگمنت.
اشکالهای رایج
- هیچ چیزی نشان نمیدهد: CLK و DIO را جابهجا بستهای، یا ترتیبشان در
TM1637Display display(CLK, DIO)با سیمکشی یکی نیست. - دونقطه روشن نمیشود: از
showNumberDecاستفاده کردهای؛ برای نقطهها بایدshowNumberDecExبنویسی. روی ماژولهایی که بهجای دونقطه، نقطهی اعشار دارند، بیت دیگری (مثلاً0b10000000) لازم است. - ساعت به شکل «7:5» دیده میشود: پارامتر صفرهای اول را
trueنگذاشتهای. - تغییر روشنایی اثر نمیکند: بعد از
setBrightnessباید دوباره چیزی نمایش بدهی. - عدد بزرگتر از ۹۹۹۹: فقط چهار رقم جا دارد. عدد را تقسیم کن یا واحدش را عوض کن.
- آن را روی A4 و A5 کنار LCD I2C گذاشتهای: TM1637 آدرس I2C ندارد و با دستگاههای I2C روی یک باس قاطی میشود. دو پایهی جدا به آن بده.
نمایشگر متنی میخواهی؟ LCD ۱۶×۲ با I2C را بخوان. برای نقش و تصویر هم ماتریس LED با MAX7219 را ببین. همهی آموزشهای ماژولها در بخش سنسورها و ماژولها و همهی پروژههای آردوینو در صفحهی آردوینو است.
تایمر معکوس TM1637 را باز کن 🔢سؤالهای رایج
TM1637 همان I2C است؟
نه. TM1637 هم دو سیم دارد (CLK و DIO) ولی پروتکلش I2C نیست و آدرس ندارد. برای همین میتوانی آن را به هر دو پایهی دیجیتال آزاد وصل کنی و نباید آن را با ماژولهای I2C روی یک باس بگذاری.
چطور دونقطهی وسط ساعت را روشن کنم؟
از showNumberDecEx استفاده کن و آرگومان دوم را 0b01000000 بگذار. روی بیشتر ماژولهای ساعتدار همین بیت دونقطه را روشن میکند.
ماژول TM1637 در شبیهساز رایگان است؟
باز کردن و خواندن مثالها رایگان است؛ اجرای خود ماژول TM1637 جزو ماژولهای حرفهای است و اشتراک Plus میخواهد.