🔢 نمایشگر سون‌سگمنت ۴ رقمی TM1637 با آردوینو: عدد، دونقطه و تایمر معکوس

✍️ تیم ووکوی فارسی ·

اگر بخواهی با آردوینو یک ساعت، تایمر آشپزخانه یا شمارنده‌ی امتیاز بسازی، سون‌سگمنت ۴ رقمی TM1637 بهترین شروع است. چهار رقم درشت و خوانا، یک دونقطه برای ساعت، و نکته‌ی اصلی: فقط دو سیم داده لازم دارد. در این آموزش TM1637 با آردوینو را با کتابخانه‌ی TM1637Display راه می‌اندازیم، عدد و ساعت نشان می‌دهیم و در آخر یک تایمر معکوس با دکمه و بوق می‌سازیم. اگر این پروژه را قبلاً در ووکوی (Wokwi) دیده‌ای، این‌جا نسخه‌ی فارسی و قدم‌به‌قدم آن است.

TM1637 چطور کار می‌کند؟

هر رقم یک سون‌سگمنت است: هفت LED باریک به شکل عدد ۸ (به اسم a تا g) و گاهی یک نقطه. چهار رقم یعنی بیش از سی LED. اگر بخواهی همه را مستقیم به آردوینو وصل کنی، پایه کم می‌آوری. راه‌حل، تراشه‌ی کوچک TM1637 پشت ماژول است: آردوینو فقط به آن می‌گوید «رقم اول را ۱ کن، رقم دوم را ۲»، و خود تراشه با سرعت زیاد رقم‌ها را یکی‌یکی روشن می‌کند. این‌قدر سریع که چشم ما همه را با هم روشن می‌بیند. به این روش مالتی‌پلکس می‌گویند. روشنایی هم هشت پله دارد (۰ تا ۷) که با یک دستور عوض می‌شود.

اگر هنوز با یک رقم تکی کار نکرده‌ای، صفحه‌ی قطعه‌ی سون‌سگمنت تک‌رقمی را ببین تا بفهمی هر سگمنت چطور روشن می‌شود؛ TM1637 همان کار را برایت خودکار انجام می‌دهد.

پایه‌های ماژول

پایهکار
CLKساعت؛ آهنگ فرستادن داده را تعیین می‌کند
DIOداده؛ عددها از این سیم می‌روند
VCCتغذیه‌ی ۵ ولت (۳٫۳ ولت هم کار می‌کند)
GNDزمین

قطعه‌ها و سیم‌کشی

پایه‌ی TM1637آردوینو Unoتوضیح
CLKD2هر پایه‌ی دیجیتال دیگری هم می‌شود
DIOD3در کد باید با همین ترتیب بیاید
VCC5V—
GNDGND—

کد کامل

کتابخانه‌ی 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);
}

توضیح خط به خط

💡 میلیس بعد از قطع برق صفر می‌شود و در طول یک روز چند ثانیه جلو یا عقب می‌رود. برای ساعت واقعی، TM1637 را با ماژول ساعت ترکیب کن: ماژول DS3231 با آردوینو.

پروژه‌ی کوچک: تایمر معکوس با دکمه و بوق

یک تایمر آشپزخانه که از 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 نیاز داری. سون‌سگمنت تک‌رقمی معمولی ولی رایگان است: پروژه‌ی سون‌سگمنت.

اشکال‌های رایج

نمایشگر متنی می‌خواهی؟ LCD ۱۶×۲ با I2C را بخوان. برای نقش و تصویر هم ماتریس LED با MAX7219 را ببین. همه‌ی آموزش‌های ماژول‌ها در بخش سنسورها و ماژول‌ها و همه‌ی پروژه‌های آردوینو در صفحه‌ی آردوینو است.

تایمر معکوس TM1637 را باز کن 🔢

سؤال‌های رایج

TM1637 همان I2C است؟

نه. TM1637 هم دو سیم دارد (CLK و DIO) ولی پروتکلش I2C نیست و آدرس ندارد. برای همین می‌توانی آن را به هر دو پایه‌ی دیجیتال آزاد وصل کنی و نباید آن را با ماژول‌های I2C روی یک باس بگذاری.

چطور دونقطه‌ی وسط ساعت را روشن کنم؟

از showNumberDecEx استفاده کن و آرگومان دوم را 0b01000000 بگذار. روی بیشتر ماژول‌های ساعت‌دار همین بیت دونقطه را روشن می‌کند.

ماژول TM1637 در شبیه‌ساز رایگان است؟

باز کردن و خواندن مثال‌ها رایگان است؛ اجرای خود ماژول TM1637 جزو ماژول‌های حرفه‌ای است و اشتراک Plus می‌خواهد.

مقاله‌های مرتبط

⏰

ماژول ساعت DS3231 با آردوینو: ساعت و تاریخی که با قطع برق هم گم نمی‌شود

⚙️

استپر موتور 28BYJ-48 با درایور ULN2003 و آردوینو: چرخش دقیق به درجه

🔌

ماژول رله با آردوینو: روشن و خاموش کردن یک مدار جدا، با نکات ایمنی

📈

سریال مانیتور و نمودار سریال آردوینو در شبیه‌ساز آنلاین

همه‌ی آموزش‌های سنسورها و ماژول‌ها ← · همه‌ی مقاله‌ها