آموزش ESP32آموزش اینترنت اشیا

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

وقتی بخواهید یک ساعت دیجیتال، تایمر، کانتر یا پروژه ساده‌ای که اعداد را نمایش می‌دهد بسازید، نیاز به روشی ساده و خوانا برای نمایش اعداد دارید. ماژول TM1637 همین کار را انجام می‌دهد: یک نمایشگر 4 رقمی 7‑segment روشن و واضح که با ESP32 به‌سادگی کار می‌کند و سیم‌کشی و برنامه‌نویسی را ساده نگه می‌دارد.

در این راهنما می‌فهمید چگونه ماژول TM1637 را به ESP32 متصل کنید، کتابخانه مورد نیاز را نصب کنید و با چند مثال، اعداد و نمادهای ساده را روی نمایشگر نشان دهید.

معرفی سخت‌افزار ماژول TM1637

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

دوره آموزش ESP32 دوره آموزش اینترنت اشیا حرفه ای دوره آموزش اینترنت اشیا مقدماتی دوره آموزش آردوینو

ماژول TM1637 با نمایشگر 4 رقمی 7-segment از نمای نزدیک

این ماژول برای نمایش واضح اعداد مناسب است: ساعت‌های دیجیتال، تایمرها، شمارنده‌ها، تابلوهای امتیاز، نمایش دما یا خروجی سنسورها. بسیاری از ماژول‌های TM1637 یک کولون در وسط دارند که برای ساخت ساعت دیجیتال مفید است.

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

نمایی از ماژول TM1637 در حال نمایش اعداد و کنتراست روشن

ماژول می‌تواند با هر دو سطح ولتاژ 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

نمونه دیاگرام سیمکشی ماژول TM1637 به برد ESP32

تنظیم Arduino IDE برای ESP32

برای برنامه‌نویسی ESP32 از Arduino IDE استفاده خواهیم کرد، بنابراین قبل از ادامه مطمئن شوید افزونهٔ ESP32 برای Arduino IDE نصب شده باشد.

نصب کتابخانه

برای ارتباط با آی‌سی TM1637 از یک کتابخانه استفاده می‌کنیم. گزینهٔ مناسب کتابخانهٔ TM1637Display نوشتهٔ Avishay Orpaz است که توابع زیادی برای کنترل نمایشگر فراهم می‌کند.

مراحل نصب کتابخانه در Arduino IDE:

  1. آردوینو IDE را باز کنید و از منوی Library Manager استفاده کنید.
  2. عبارت “tm1637” را در کادر جستجو تایپ کنید.
  3. کتابخانهٔ TM1637 یا TM1637Display اثر Avishay Orpaz را پیدا کنید.
  4. دکمهٔ Install را بزنید تا کتابخانه نصب شود.

صفحه Library Manager آردوینو برای نصب کتابخانه TM1637

پس از نصب کتابخانه، آمادهٔ برنامه‌نویسی هستید.

مثال — تست پایهٔ نمایشگر

در این مثال ساده بررسی می‌کنیم که سیم‌کشی درست است و نمایشگر با 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 پس از اجرای تست اولیه نمایش 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) استفاده می‌شود.

5 (1 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *