آموزش اتصال سون سگمنت 4 تایی TM1637 به ESP32

وقتی بخواهید یک ساعت دیجیتال، تایمر، کانتر یا پروژه سادهای که اعداد را نمایش میدهد بسازید، نیاز به روشی ساده و خوانا برای نمایش اعداد دارید. ماژول TM1637 همین کار را انجام میدهد: یک نمایشگر 4 رقمی 7‑segment روشن و واضح که با ESP32 بهسادگی کار میکند و سیمکشی و برنامهنویسی را ساده نگه میدارد.
در این راهنما میفهمید چگونه ماژول TM1637 را به ESP32 متصل کنید، کتابخانه مورد نیاز را نصب کنید و با چند مثال، اعداد و نمادهای ساده را روی نمایشگر نشان دهید.
معرفی سختافزار ماژول TM1637
ماژول TM1637 در واقع ترکیبی از یک نمایشگر 4 رقمی 7‑segment با اندازهٔ 0.36 اینچ و آیسی درایور TM1637 ساخت Titan MicroElectronics است. این ترکیب اجازه میدهد با تنها دو پین از میکروکنترلر، چهار رقم نمایشگر کنترل شوند.

این ماژول برای نمایش واضح اعداد مناسب است: ساعتهای دیجیتال، تایمرها، شمارندهها، تابلوهای امتیاز، نمایش دما یا خروجی سنسورها. بسیاری از ماژولهای TM1637 یک کولون در وسط دارند که برای ساخت ساعت دیجیتال مفید است.
یکی از دلایل محبوبیت این ماژول این است که خودش فرایند تازهسازی نمایشگر (display refresh) را انجام میدهد. بنابراین ESP32 لازم نیست دائماً هر سگمنت را بهروزرسانی کند؛ این موضوع کدنویسی را سادهتر میکند و پردازندهٔ ESP32 زمان بیشتری برای کارهای دیگر خواهد داشت.

ماژول میتواند با هر دو سطح ولتاژ 3.3V و 5V کار کند، بنابراین با میکروکنترلرهای 3.3V مثل ESP32 و بردهای 5V مثل آردوینو سازگار است.
مصرف توان ماژول بستگی به تعداد سگمنتهای روشن و سطح روشنایی دارد. وقتی تمام سگمنتها در حداکثر روشنایی روشن باشند، ماژول حدود 80 mA جریان میکشد. کاهش سطح روشنایی بهصرفهجویی در مصرف انرژی کمک میکند.
ماژول از یک پروتکل دو سیمهٔ اختصاصی برای ارتباط استفاده میکند که مشابه I2C نیست، اما کتابخانههای آردوینو در دسترس هستند که پیچیدگی پروتکل را پنهان کرده و کار با نمایشگر را ساده میکنند.
مشخصات فنی
مشخصات مهم ماژول:
| ولتاژ کاری | 3.3 – 5 VDC |
| حداکثر جریان مصرفی | 80mA |
| محافظت در برابر قطبیت معکوس | Yes |
| ابعاد نمایشگر | 42 mm x 24 mm (1.65″ x .95″) |
| ارتفاع نمایشگر | 12 mm (0.47″) (typical) |
| ارتفاع کاراکتر | 9.14 mm (0.36″) |
برای اطلاعات دقیقتر دربارهٔ آیسی درایور TM1637 میتوانید به دیتاشیت مربوطه رجوع کنید (ذکر دیتاشیت به عنوان مرجع فنی در متن حفظ شده است؛ پیوندها حذف شدهاند).
پین اوت ماژول TM1637
ماژول TM1637 تنها چهار پین دارد که کار با آن را بسیار ساده میکند. پینها عبارتاند از:
- CLK: پین ورودی کلاک.
- DIO: پین داده ورودی/خروجی (I/O).
- VCC: تغذیه — به منبع 3.3V تا 5V وصل شود.
- GND: زمین.
سیمکشی ماژول TM1637 به ESP32
وصل کردن ماژول به ESP32 ساده است: دو پین برای تغذیه و دو پین برای ارتباط مورد استفاده قرار میگیرند. در این مثال مرجع:
- VCC ماژول → VIN بر روی ESP32
- GND ماژول → GND برد ESP32
- CLK ماژول → GPIO 26 (ESP32)
- DIO ماژول → GPIO 25 (ESP32)
جدول مرجع اتصالات:
| ماژول TM1637 | ESP32 | |
|---|---|---|
| VCC | VIN | |
| GND | GND | |
| DIO | 25 | |
| CLK | 26 |

تنظیم Arduino IDE برای ESP32
برای برنامهنویسی ESP32 از Arduino IDE استفاده خواهیم کرد، بنابراین قبل از ادامه مطمئن شوید افزونهٔ ESP32 برای Arduino IDE نصب شده باشد.
نصب کتابخانه
برای ارتباط با آیسی TM1637 از یک کتابخانه استفاده میکنیم. گزینهٔ مناسب کتابخانهٔ TM1637Display نوشتهٔ Avishay Orpaz است که توابع زیادی برای کنترل نمایشگر فراهم میکند.
مراحل نصب کتابخانه در Arduino IDE:
- آردوینو IDE را باز کنید و از منوی Library Manager استفاده کنید.
- عبارت “tm1637” را در کادر جستجو تایپ کنید.
- کتابخانهٔ TM1637 یا TM1637Display اثر Avishay Orpaz را پیدا کنید.
- دکمهٔ Install را بزنید تا کتابخانه نصب شود.

پس از نصب کتابخانه، آمادهٔ برنامهنویسی هستید.
مثال — تست پایهٔ نمایشگر
در این مثال ساده بررسی میکنیم که سیمکشی درست است و نمایشگر با ESP32 کار میکند. برنامه الگوهای مختلفی روی نمایشگر نشان میدهد: روشن کردن تمام سگمنتها، شمارش 0 تا 9، نمایش اعداد منفی، روشن کردن کولون و در نهایت نمایش کلمهٔ “dOnE”.
#include <TM1637Display.h>
// TM1637 connections to ESP32
#define CLK 26
#define DIO 25
// Create display object
TM1637Display display(CLK, DIO);
// An array that turns every segments ON
const uint8_t allON[] = { 0xff, 0xff, 0xff, 0xff };
// An array that sets individual segments per digit to display the word "dOnE"
const uint8_t done[] = {
SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // d
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // O
SEG_C | SEG_E | SEG_G, // n
SEG_A | SEG_D | SEG_E | SEG_F | SEG_G // E
};
// An array that displays the °C symbol
const uint8_t celsius[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // degree symbol
SEG_A | SEG_D | SEG_E | SEG_F // C
};
void setup() {
// Start with a medium brightness
// Brightness range is 0 (dimmest) to 7 (brightest)
display.setBrightness(5);
// Set every segments ON
display.setSegments(allON);
delay(2000);
// Clear the display
display.clear();
// Count from 0 to 9
for (int i = 0; i < 10; i++) {
display.showNumberDec(i);
delay(200);
}
delay(1000);
display.clear();
// Show negative numbers
display.showNumberDec(-12); // shows " -12"
delay(2000);
display.clear();
display.showNumberDec(-999); // shows "-999"
delay(2000);
display.clear();
// Show number without leading zeros
display.showNumberDec(31, false); // shows " 31"
delay(2000);
display.clear();
// Show number with leading zeros
display.showNumberDec(31, true); // shows "0031"
delay(2000);
display.clear();
// Show number in the middle
display.showNumberDec(14, false, 2, 1); // shows " 14 "
delay(2000);
display.clear();
// Show a negative number in the middle
display.showNumberDec(-5, false, 2, 1); // shows " -5 "
delay(2000);
display.clear();
// Show 12:34 using the colon
display.showNumberDecEx(1234, 0b01000000, false, 4, 0);
delay(2000);
display.clear();
// Show 15°C
int temperature = 15;
display.showNumberDec(temperature, false, 2, 0);
display.setSegments(celsius, 2, 2);
delay(2000);
display.clear();
// Show dOnE
display.setSegments(done);
}
void loop() {
}
کد بالا را روی ESP32 آپلود کنید. اگر همه چیز درست وصل شده باشد، نمایشگر یک دنبالهٔ کوتاه تست را نشان میدهد و در پایان “dOnE” را نمایش میدهد.

توضیح کد
ابتدا کتابخانهٔ TM1637 را شامل میکنیم و مشخص میکنیم کدام دو پین ESP32 به ماژول متصل هستند — یکی برای کلاک (CLK) و دیگری برای داده (DIO).
#include <TM1637Display.h> // TM1637 connections to ESP32 #define CLK 26 #define DIO 25
سپس یک شی به نام display از کلاس TM1637Display میسازیم. این شی به ما امکان میدهد دستوراتی به TM1637 ارسال کنیم و هنگام ساخت شی، پینهای استفادهشده را مشخص میکنیم.
// Create display object TM1637Display display(CLK, DIO);
کتابخانه اجازه میدهد هر سگمنت نمایشگر را بهصورت جداگانه کنترل کنیم؛ با این امکان میتوانیم اعداد، حروف و چند نماد ساده را نمایش دهیم. برای نشان دادن این موضوع، سه آرایه آماده میکنیم که الگوهای روشن/خاموش شدن سگمنتها را نگه میدارند:
- آرایهای که تمام سگمنتها را روشن میکند.
- آرایهای که کلمهٔ “dOnE” را میسازد.
- آرایهای که نماد “°C” را میسازد.
برای ارسال این آرایهها به نمایشگر از تابع setSegments() استفاده میکنیم.
دو روش برای تعریف آرایهها وجود دارد:
1. استفاده از اعداد هگزادسیمال: در این روش هر بیت یک سگمنت را نشان میدهد با ترتیب (dot) G F E D C B A. مثلاً 0xFF (11111111b) همهٔ سگمنتها و نقطه را روشن میکند و 0x00 همه را خاموش میکند. حرف “C” را میتوان با 0x39 نمایش داد که در باینری 00111001 است و سگمنتهای A، D، E و F را روشن میکند.
// An array that turns every segments ON
const uint8_t allON[] = { 0xff, 0xff, 0xff, 0xff };
2. استفاده از نامهای سگمنتها: روش دوم سادهتر است: میتوان نام سگمنتها را با عملگر | کنار هم نوشت، مثلاً SEG_A، SEG_B، SEG_C و … .
// An array that sets individual segments per digit to display the word "dOnE"
const uint8_t done[] = {
SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // d
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // O
SEG_C | SEG_E | SEG_G, // n
SEG_A | SEG_D | SEG_E | SEG_F | SEG_G // E
};
// An array that displays the °C symbol
const uint8_t celsius[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // degree symbol
SEG_A | SEG_D | SEG_E | SEG_F // C
};
setBrightness(brightness, on)
این تابع روشنایی نمایشگر را کنترل میکند با بازهٔ 0 (تیرهترین) تا 7 (روشنترین). آرگومان دوم اختیاری است: اگر false بدهید نمایشگر خاموش میشود و اگر true یا این آرگومان حذف شود نمایشگر روشن میماند. مثال: display.setBrightness(5) روشنایی را در سطح متوسط قرار میدهد.
setSegments(segments[], length, position)
این تابع به شما اجازه میدهد سگمنتهای مشخصی از نمایشگر را بهروزرسانی کنید. پارامترها عبارتاند از: آرایهٔ الگوها، تعداد رقمهایی که میخواهید بهروزرسانی شوند (0 تا 4) و موقعیت شروع (0 چپترین رقم، 3 راستترین رقم). آرگومانهای دوم و سوم اختیاریاند؛ اگر میخواهید کل نمایشگر را بهروزرسانی کنید میتوانید آنها را حذف کنید. مثلاً برای چاپ “dOnE” که چهار رقم را از موقعیت 0 میپوشاند کافی است:
// Prints dOnE display.setSegments(done);
برای نمایش نماد “°C” که فقط دو رقم آخر را قرار است درگیر کند، آرگومانهای طول و موقعیت را مشخص میکنیم:
// Prints __°C display.setSegments(celsius, 2, 2);
showNumberDec(number, leading_zeros, length, position)
تابع دیگری که زیاد استفاده میشود showNumberDec() است که برای نمایش سریع اعداد طراحی شده است. کافی است عدد را بدهید و این تابع تشخیص میدهد چه سگمنتهایی روشن شوند. میتوان از آن برای شمارش، نمایش اعداد منفی و کنترل صفرهای پیشرو استفاده کرد.
// Show counter 0-9
int i;
for (i = 0; i < 10; i++) {
display.showNumberDec(i);
delay(50);
}
این تابع اعداد منفی را هم پشتیبانی میکند و علامت منفی را در جای مناسب قرار میدهد:
display.showNumberDec(-12); // Prints _-12 display.showNumberDec(-999); // Prints -999
آرگومان دوم تعیین میکند صفرهای پیشرو نمایش داده شوند یا نه. اگر true باشد صفرها اضافه میشوند تا عدد تمام چهار رقم را پر کند؛ اگر false باشد عدد همانطور که هست نمایش داده میشود.
display.showNumberDec(31, false); // Prints __31 display.showNumberDec(31, true); // Prints 0031
آرگومانهای سوم و چهارم مانند setSegments مشخص میکنند چه تعداد رقم بهروزرسانی شوند و از کدام موقعیت شروع شود؛ بنابراین برای وسطچین کردن عدد میتوان از آنها استفاده کرد:
display.showNumberDec(14, false, 2, 1); // Prints _14_ display.showNumberDec(-5, false, 2, 1); // Prints _-5_
showNumberDecEx(number, dots, leading_zeros, length, position)
این نسخهٔ توسعهیافتهٔ showNumberDec() است که آرگومان دوم آن برای کنترل نقاط یا کولونها استفاده میشود؛ بنابراین برای نمایش زمان یا اعداد اعشاری مناسب است. برای کنترل این نقاط یک عدد باینری میدهید که مشخص میکند کدام نقطهها روشن شوند؛ هر بیت موقعیتی را در نمایشگر نشان میدهد.
مثالهایی برای نمایشگرهایی با نقاط بین ارقام:
| آرگومان | نقاط | مثال |
|---|---|---|
| 0b10000000 | . نمایش نقطه در سمت چپترین | 1.234 |
| 0b01000000 | نقطه در بین رقم دوم و سوم | 12.34 |
| 0b00100000 | نقطه در بین رقم سوم و چهارم | 123.4 |
| 0b11100000 | ترکیبی از نقاط در چند موقعیت | 1.2.3.4 |
بعضی نمایشگرهای TM1637 بهجای نقاط یک کولون (:) دارند. در این حالت عدد باینری مورد استفاده برای روشن کردن کولون معمولاً 0b01000000 است که مثال آن نمایش “12:34” است.
| آرگومان | نقاط | مثال |
|---|---|---|
| 0b01000000 | کولون وسط روشن | 12:34 |
در بعضی نمایشگرها هم نقاط و کولون هر دو وجود دارند و میتوان ترکیبی از آنها را با یک عدد باینری کنترل کرد.
برای مثال ساخت ساعت دیجیتال که “12:34” را نشان دهد از این فراخوانی استفاده میکنیم:
// Prints 12:34 display.showNumberDecEx(1234, 0b01000000, false, 4, 0);
در این فراخوانی عدد 1234 نمایش داده میشود و عدد باینری 0b01000000 کولون وسط را روشن میکند؛ پارامترهای آخر مشخص میکنند صفرهای پیشرو اضافه نشوند، تمام 4 رقم بهروزرسانی شوند و از موقعیت 0 (چپترین) شروع شود.
در مثال اول چون نیازی به اجرای مکرر در حلقه نیست، loop() خالی گذاشته شده است:
void loop() {
}
نمونهٔ کاملتر: نمایش اعداد، هگز و تست روشنایی
در قطعهٔ کد کامل زیر مجموعهٔ توابعی را میبینید که نمایش اعداد اعشاری، هگزادسیمال، کنترل کولون، قرار دادن نماد °C و تست روشنایی را نشان میدهد:
#include <TM1637Display.h>
// ESP32 pins connected to the TM1637 module
#define CLK 26
#define DIO 25
// Create the display object
TM1637Display display(CLK, DIO);
// An array that turns every segments ON
const uint8_t SEG_ALL_ON[] = {0xFF, 0xFF, 0xFF, 0xFF};
// An array that sets individual segments per digit to display the word "dOnE"
const uint8_t WORD_DONE[] = {
SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // d
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // O
SEG_C | SEG_E | SEG_G, // n
SEG_A | SEG_D | SEG_E | SEG_F | SEG_G // E
};
// An array that displays the degree celsius symbol
const uint8_t SYMBOL_CELSIUS[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // degree symbol
SEG_A | SEG_D | SEG_E | SEG_F // C
};
void setup() {
// Start with a medium brightness and display enabled.
// Brightness range is 0 (dimmest) to 7 (brightest)
display.setBrightness(5, true);
}
void loop() {
// Set every segments ON
display.setSegments(SEG_ALL_ON);
delay(1500);
// Clear the display
display.clear();
// Show decimal numbers
// Demonstrates positive, negative, leading zeros, length and position
display.showNumberDec(42, false); // " 42"
delay(1500);
display.showNumberDec(42, true); // "0042"
delay(1500);
display.showNumberDec(-18, false); // " -18"
delay(1500);
display.clear();
display.showNumberDec(14, false, 2, 1); // "_14_"
delay(1500);
display.clear();
display.showNumberDec(4, true, 2, 0); // "04__"
delay(1500);
display.clear();
display.showNumberDec(-5, false, 3, 0); // "_-5_"
delay(1500);
// Show hexadecimal numbers
display.showNumberHexEx(0x1A2F); // "1A2F"
delay(1500);
display.showNumberHexEx(0x2c); // "__2C"
delay(1500);
display.showNumberHexEx(0xd1, 0, true); // "00d1"
delay(1500);
display.clear();
display.showNumberHexEx(0xd1, 0, true, 2); // "d1__"
delay(1500);
// Show decimal number with colon control
display.showNumberDecEx(1234, 0b01000000, true); // "12:34"
delay(1500);
// Show temperature
display.setSegments(SYMBOL_CELSIUS, 2, 2); // put "°C" on the right
display.showNumberDec(25, false, 2, 0); // "25°C"
delay(1500);
// Brightness Test
for (int i = 0; i < 7; i++) {
display.setBrightness(i);
display.setSegments(SEG_ALL_ON);
delay(1000);
}
// Final screen
display.setSegments(WORD_DONE);
while (true) {
// Stop here
}
}
سوالات متداول
آیا ماژول TM1637 با ولتاژ 3.3V و ESP32 سازگار است؟
بله. ماژول TM1637 میتواند با دامنهٔ ولتاژ 3.3V تا 5V کار کند، بنابراین اتصال به بردهای 3.3V مانند ESP32 مشکلی ایجاد نمیکند.
چه کتابخانهای برای کار با TM1637 در Arduino IDE استفاده شود و چگونه آن را نصب کنم؟
کتابخانهٔ پیشنهادی TM1637Display نوشتهٔ Avishay Orpaz است. برای نصب آن در Arduino IDE از Library Manager استفاده کنید، عبارت “tm1637” را جستجو کنید و کتابخانهٔ TM1637/TM1637Display اثر Avishay Orpaz را نصب نمایید.
چطور کولون یا نقاط بین ارقام را با نمایشگر کنترل کنم؟
برای کنترل کولون یا نقاط از آرگومان دوم در توابعی مانند showNumberDecEx یا showNumberHexEx استفاده میکنید. این آرگومان یک عدد باینری است که هر بیت موقعیت یک نقطه یا کولون را مشخص میکند؛ مثلاً برای روشن کردن کولون وسط معمولاً از 0b01000000 استفاده میشود و برای نمایش “12:34” از فراخوانی showNumberDecEx(1234, 0b01000000, false, 4, 0) استفاده میشود.











