ساخت ساعت دیجیتال با نمایشگر تمام رنگ TFT و ماژول DS3231

راه اندازی ماژول ساعت DS3231 و ساخت ساعت دیجیتالی با آردوینو
نوشته شده توسط

شاید گاهی به این فکر افتاده باشید برای خود یک ساعت دیجیتال بسازید. اما اینکه چطور و با چه روشی بسازید شاید با چالش های زیادی رو به رو شدید. در این مطلب قراره به راحتی ساعت دیجیتال خودتون رو بانمایشگر رنگی بسازید. در این آموزش با راه اندازی ماژول ساعت DS3231 و نمایشگر TFT رنگی به همراه برد آردوینو (Arduino) ساعت دیجیتال خودمون رو میسازیم. پس با من تا انتهای مطلب همراه باشید. همچنین شما میتونید سایر مطلب من رو از این قسمت مطالعه کنید.


معرفی برد آردوینو

اکثر شما با این برد بسیار محبوب آشنایی دارید. برد های آردوینو Arduino از سری برد های امبدد بوده که در بحث اینترنت اشیا نیز معروف می‌باشد. برد آردوینو اونو (Arduinio UNO) از معروف ترین های این دسته بندی می‌باشد. میکروکنترلر به کار رفته در آن ATMEGA328P بوده و دارای 6 ورودی آنالوگ، 14 پایه دیجیتال که 6 عدد از آنها پایه های PWM هستند.

برد آردوینو Arduino UNO
برد آردوینو Arduino UNO

معرفی ماژول ساعت DS3231

ماژول ساعت DS3231 به دلیل داشتن سنسور دمایی داخلی , تنظیم تاخیر با توجه به دمای محیط انجام میشه در نتیجه از دقیق ترین ماژول ها ساعت به شمار میرود. راه اندازی ماژول ساده بوده و میتوان با پروتکل I2C آن را راه اندازی کرد.

ماژول ساعت DS3231
ماژول ساعت DS3231

ماژول ساعت DS3231 با استفاده از دو کتابخانه Sodag_DS3231 و wire قابل راه اندازی می‌باشد. حتی میتوان به دلیل وجود سنسور دمایی که دارد دما محیط را اندازه گیری و سپس آن را نمایش داد.

اتصالات ماژول ساعت DS321 به برد آردوینو

DS3231 Arduino
GND GND
5+ VCC
SDA A4
SCK A5

معرفی نمایشگر TFT 1.44 inch

با این نمایشگر میتوان هر رنگی با استفاده از اعداد هگز روی صفحه به نمایش گذاشت. پروتکل ارتباطی این ماژول SPI بوده و با متصل کردن 8 پایه به آردوینو ماژول را میتوان راه اندازی کرد.

نمایش ساعت و دما برروی نمایشگر TFT
نمایش ساعت و دما برروی نمایشگر TFT

کتاب خانه هایی که برای شروع کار با این ماژول استفاده کردیم، Adafruit_ST7735، Adafruit_GFX.h و SPI می‌باشد.

سختی کار با این ماژول این است که وقتی دیتای جدید از طرف سنسور یا ماژولی دریافت می‌شود، ماژول دیتای قدیمی را از نمایشگر پاک نمی‌کند تا دیتای جدید را نمایش دهد. به همین دلیل خودمان باید این کار را انجام دهیم و دیتای قدیمی را پاک کنیم که وقتی دیتای جدید روی نمایشگر بارگزاری شد اختلالی ایجاد نشود.

اتصالات ماژول نمایشگر TFT 1.4 inch به آردوینو

1.44 inch TFT Arduino
5+ VCC
GND GND
10 CS
8 Reset
9 A0
11 SDA
13 SCK
LED 3.3V


برنامه نویسی

در ابتدا کتابخانه های مورد نیاز ر برای راه اندازی ماژول ساعت و نمایشگر TFT را  فراخوانی می‌کنیم.

//******************************* TFT

#include  <Adafruit_ST7735.h>

#include  <Adafruit_GFX.h>


//**************************** DS3231

#include <Wire.h>

#include "Sodaq_DS3231.h"

#include  <SPI.h>

معرفی شماره پایه هایی که از TFT به آردوینو متصل شده اند.

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);


#define TFT_SCLK 13

#define TFT_MOSI 11

کانفیگ اولیه ماژول DS3231 برای ساعت و تاریخ

Wire.begin();

  rtc.begin();

  DateTime dt(2021, 03, 01, 12, 24, 0, 0);

  rtc.setDateTime(dt);

تابع DateTime  برای دادن اطلاعات اولیه زمان می‌باشد.

(روزهفته ,ثانیه, دقیقه, ساعت, روز, ماه, سال)DateTime

دستور tft.fillScreen(color)

این دستور مربوط به رنگ بک گراند نمایشگر می‌باشد.

دستور ()printText

در کد ها تابعی به نام printText تعریف شده تا کد نویسی کمتر شود. در این تابع رنگ، سایز و مختصات نوشته را مانند زیر به تابع خواهیم داد.

(سایز نوشته ,مختصات محورy ,مختصات محورx ,رنگ نوشته)DateTime

و در آخرین قسمت کد به نام void printText تابع را تعریف کردیم.

در نهایت با دستور tft.println نوشته مورد نظر در نمایشگر TFT نمایش داده خواهد شد.

now = rtc.now();

  int i1 = now.year() - 621;

  int i2 = now.month();

  int i3 = now.date();

  int i4 = now.hour();

  int i5 = now.minute();

  int i6 = now.second();

این قسمت مربوط به بدست آوردن اطلاعات سال، ماه، روز و… می‌باشد.

  • Now.year  سال
  • Now.month ماه
  • Now.date روز
  • Now.hour ساعت
  • Now.minute دقیقه
  • Now.second ثانیه

میتوان با نوشتن هر کدوم از این دستورات جدا گانه به اطلاعات هرکدوم از داده ها برسید.

همچنین با دستور ()rtc.getTemperature اطلاعات مربوط به دما برای ما ارسال می‌شود که در ادامه از این دستور استفاده شده است.

long sosis [6] = {i1, i2, i3, i4, i5, i6};


  String value_D = "";

  String value_T = "";

  for ( int x =  0; x <= 2 ; x++) {

    int arman = sosis[x];

    value_D += String(arman);

    if (x <= 1)

      value_D += "/";

  }

  for (int x = 3; x >= 3 && x < 6; x++) {

    int arman = sosis[x];

    value_T += String(arman);

    if (x <= 4)

      value_T += ":";

  }

در این قسمت با استفاده از آرایه، اطلاعات مربوط به ساعت و زمان را در دو متغیر از نوع String ذخیره کردیم.

Value_T: مربوط به اطلاعات زمان

Value_D: مربوط به اطلاعات تاریخ

با توجه به اینکه نمایشگر TFT مانند OLED وقتی دیتای جدیدی میخواهد نمایش داده شود در نتیجه این کار باید بصورت دستی توسط برنامه نویسی انجام شود. که در کد زیر هر زمانی دیتا جدید وارد آردوینو شود، دیتا قدیم توسط رسم یک مستطیل که همرنگ بک گراند هست پاک می‌شود. بدین صورت دیتا جدید را به نمایش خواهیم گذ اشت.

بر همین اساس با استفاده از دستور tft.fillRect مستطیل خود را رسم کردیم. که این تابع به صورت زیر است:

(رنگ مستطیل ,عرض, طول, مختصات محور ,yممختصات محور x)tft.fillRect


if (Year != i1) {

    Year = i1;

    tft.fillRect(35, 150, 30, 10, ST7735_BLACK);

  }

در مثال گفته شده است که اگر اطلاعات مربوط به سال تغییر کرد، مستطیلی در مختصات مشخص شده با رنگ مشکی رسم کرده که دیتا قدیمی پاک شود. به این شکل هنگامی که دیتای جدیدی روی نمایشگر بارگزاری شود تداخلی ایجاد نخواهد شد.

و در قسمت انتهایی void loop مختصات و رنگ ها را برای نمایش ساعت، زمان و دما  کد نویسی کردیم.

کد های کامل پروژه

//******************************* TFT
#include  <Adafruit_ST7735.h>
#include  <Adafruit_GFX.h>

//**************************** DS3231
#include <Wire.h>
#include "Sodaq_DS3231.h"
#include  <SPI.h>

//************************ paye TFT
//#define TFT_CS     10
//#define TFT_RST    8
//#define TFT_DC     9
Adafruit_ST7735 tft = Adafruit_ST7735(10,  9, 8);

#define TFT_SCLK 13
#define TFT_MOSI 11

//*************** tafir moteghayer marbot be pak kardan data ghdim
int Second = 0;
int Minute = 0;
int Houre = 0;
int Day = 0;
int Month = 0;
int Year = 0;
float Temperture = 0;
DateTime now;
void setup() {
  //************************************* comfing avaleye mazhole ha
  Wire.begin();
  rtc.begin();
  DateTime dt(2021, 03, 01, 12, 24, 0, 0);
  rtc.setDateTime(dt);
  //__________________________________________
  Serial.begin(9600);

  //**************************** backgraound tft aval siah bashe
  tft.initR(INITR_BLACKTAB);
  tft.fillScreen(ST7735_BLACK);

  //**************************** neveshe avalie tft
  printText(0xAFE5, 10, 70, 1);
  tft.print("In the name of god");
  delay(600);
  printText(0xAFE5, 10, 90, 2);
  tft.print("Arman.H.R");
  delay(2000);

  tft.fillScreen(ST7735_BLACK);
  tft.drawFastHLine(10, 35, 105, 0xFD20);
  printText(0xFD20, 40, 40, 2);
  tft.print("Time");

  tft.drawFastHLine(10, 85, 105, 0xFD20);
  printText(0xFD20, 25, 90, 2);
  tft.print("Waether");
  printText(0xFFFF, 100, 110, 1);
  tft.print("o");

  tft.drawFastHLine(28, 135, 70, 0xFD20);
  printText(0xFD20, 55, 140, 1);
  tft.print("Date");
}
uint32_t old_ts;
void loop() {
  //***********************♣♣♣ tarif moteghayer, data haye tarikh va zaman
  now = rtc.now();
  int i1 = now.year() - 621;
  int i2 = now.month();
  int i3 = now.date();
  int i4 = now.hour();
  int i5 = now.minute();
  int i6 = now.second();
  //******************************************♣♣♣ khondan data tarikh va saat ba araye behtare, ghodrat manovr bishtari darim
  long sosis [6] = {i1, i2, i3, i4, i5, i6};

  String value_D = "";
  String value_T = "";
  for ( int x =  0; x <= 2 ; x++) {
    int arman = sosis[x];
    value_D += String(arman);
    if (x <= 1)
      value_D += "/";
  }
  for (int x = 3; x >= 3 && x < 6; x++) {
    int arman = sosis[x];
    value_T += String(arman);
    if (x <= 4)
      value_T += ":";
  }
  //***************************************************♣♣♣ pak kardan data haye ghdim
  if (Second != i6) {
    Second = i6;
    tft.fillRect(85, 65, 35, 15, ST7735_BLACK);
  }

  if (Minute != i5) {
    Minute = i5;
    tft.fillRect(55, 65, 35, 20, ST7735_BLACK);
  }

  if (Houre != i4) {
    Houre = i4;
    tft.fillRect(20, 65, 35, 20, ST7735_BLACK);
  }

  if (Day != i3) {
    Day = i3;
    tft.fillRect(65, 110, 20, 10, ST7735_BLACK);
  }

  if (Month != i2) {
    Month = i2;
    tft.fillRect(35, 110, 20, 10, ST7735_BLACK);
  }

  if (Year != i1) {
    Year = i1;
    tft.fillRect(35, 150, 30, 10, ST7735_BLACK);
  }
  //**********************************************♣♣♣ pak kardan dama ghadim va ovordan dama jadid
  if (Temperture != rtc.getTemperature()) {
    Temperture = rtc.getTemperature();
    tft.fillRect(35, 115, 65, 20, ST7735_BLACK);
  }
  //********************************************♣♣♣ hala data haro serial print mikonim va hamchenin ro tft miarim
  //Serial.println(value_D);
  //Serial.println(value_T);
  printText(0xFFFF, 20, 65, 2);
  tft.println(value_T);
  printText(0xFFFF, 40, 150, 1);
  tft.println(value_D);
  printText(0xFFFF, 35, 115, 2);
  tft.println(rtc.getTemperature());
}
//***********************************************************♣♣♣ voidi ke khodemon tarif kardim baraye rahati kar ba tft, to ye khat size,rag va mokhtasat neveshtaro migim
void printText( uint16_t color, int x, int y, int textSize) {

  tft.setCursor(x, y);
  tft.setTextColor(color);
  tft.setTextSize(textSize);
  tft.setTextWrap(true);
}

جمع بندی

در این مطلب به بررسی و معرفی ماژول DS3231 و نحوه راه اندازی آن و نمایش دما و زمان برروی نمایشگر رنگی TFT پرداخته شد. با استفاده از این ماژول میتوان یک ساعت دیجیتال دقیق طراحی کرد. 

امیدوارم از این آموزش کمال بهره را برده باشید. در صورتی که هرگونه نظر یا سوال داشتید درباره این آموزش لطفا اون رو در انتهای همین صفحه در قسمت دیدگاه ها قرار بدید. در کوتاه ترین زمان ممکن به اون ها پاسخ خواهم داد. اگر این مطلب براتون مفید بود، اون رو حتما به اشتراک بگذارید. همینطور میتونید این آموزش را پس از اجرای عملی توی اینستاگرام با هشتگ microelecom# به اشتراک بگذارید و پیج مایکروالکام (microelecom@) رو هم منشن کنید.

۱۰ دیدگاه برای “ساخت ساعت دیجیتال با نمایشگر تمام رنگ TFT و ماژول DS3231

    1. تشکر از نظرتون
      اگر پیشنهادی برای بهبودی آموزش ها هست، حتما در این قسمت به صورت کامنت مطرح کنید

      ممنون از توجهتون

    1. خواهش میکنم ، اگر پیشنهادی برای آموزش جدیدی هست حتما داخل همین قسمت به صورت کامنت مطرح کنید

    1. ممنون
      نظر لطفتون هست بله حتما باعث افتخاره بتونم مطالب بیشتری رو منتشر کنم

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

نشانی ایمیل شما منتشر نخواهد شد.