آردوینو آردوینو Arduino Uno آموزش آردوینو پروژه های آردوینو

پروژه ساخت ساعت دیجیتال با ال سی دی TFT تمام رنگی و برد آردوینو

نوشته شده توسط Arman.H.R

شاید گاهی به این فکر افتاده باشید برای خودتان ساعت دیجیتال بسازید. اما اینکه چه طور و با چه روشی بسازید با چالش های زیادی رو به رو شدید، من اینجا هستم و به شما کمک میکنم که به راحتی ساعت دیجیتال خود را در نمایشگر رنگی بسازید. در این آموزش با استفاده از ماژول ساعت و نمایشگر tft رنگی به  همراه برد آردوینو و در نهایت توسط نرم افزار Arduino ide ساعت دیجیتال خود را میسازیم. در ادامه پروژه ساخت ساعت دیجیتال با ال سی دی TFT با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 


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


اکثریت شما با این برد بسیار محبوب آشنایی دارید. بردهای آردوینو از سری بردهای امبدد هستند که از پرتکل های spi, i2c, usart نیز پشتیبانی می‌کند. بردهای آردوینو در پروژه های دانشجویی و البته صنعتی هم کاربرد بسیاری دارد. برد آردوینو اونو از معروف ترین های این خانواده است. میکروکنترلر به کار رفته در آن atmega328 است. دارای ۶ ورودی آنالوگ، ۱۴ پایه دیجیتال که ۶ تای آنها پایه های pwm  هستند. در ادامه ماژول های به کار رفته معرفی و روش راه اندازی توضیح داده میشود.

 


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


برای ساخت ساعت دیجیتال با ال سی دی به ماژول ds3231 نیاز خواهیم داشت. تا زمان را به صورت دقیق محاسبه کند. ماژول ساعت DS3231 به دلیل داشتن سنسور دمایی داخلی، علاوه بر سنجش ساعت قابلیت سنجش دمای محیط را هم دارد. با توجه به دمای محیط از دقیق ترین ماژول های ساعت به شمار میرود. راه اندازی ماژول بسیار ساده است و میتوان با پروتکل دو سیم i2c  ان را به برد آردوینو متصل و راه اندازی کرد.

معرفی ماژول ساعت DS3231 - دیجی اسپارک

 

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


                                                   اتصالات ماژول ds3231  به آردوینو


                                    Arduino

                                         DS3231

                                      GND

                                            GND

                                       +۵

                                            VCC

                                       A4

                                            SDA

                                      A5

                                           SCK


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


توسط نمایشگر LCD TFT 1.44inch میتوان هر رنگی با استفاده از اعداد هگز روی صفحه به نمایش گذاشت. پروتکل ارتباطی این ماژول spi است. با متصل کردن ۸ پایه به آردوینو ماژول راه اندازی میشود.

 معرفی نمایشگر TFT 1.44 inch - دیجی اسپارک

 

کتابخانه هایی که برای شروکار با این ماژول استفاده کردیم , Adafruit_ST7735, Adafruit_GFX.h و SPI هستند. از سختی کار با این ماژول این است که وقتی دیتای جدید از طرف سنسور یا ماژولی دریافت میشود، ماژول دیتای قدیمی را از نمایشگر پاک نمی‌کند و دیتای جدید را به نمایش بگزارد. به همین دلیل خودمان باید این کار را انجام بدیم و دیتای قدیمی را پاک کنیم که وقتی دیتای جدید روی نمایشگر بازگزاری میشه , اختلالی ایجاد نشود. در ادامه این روش را هم توضیح خواهم داد.

 


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


                                  Arduino

         TFT

                                     +۵

         vcc

          GND

         GND

            ۱۰

           CS

             ۸

        RESET

             ۹

           A0

                                                ۱۱

                                               SDA

                                               ۱۳

                                               SCK

                                            ۳٫۳V

                                              LED

 

                  


کد پروژه ساعت دیجیتال


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

#include  <Adafruit_ST7735.h>

#include  <Adafruit_GFX.h>




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

#include <Wire.h>

#include "Sodaq_DS3231.h"

#include  <SPI.h>

 

  • معرفی شماه پایه هایی که از TFT به آردوینو متصل شدند.
#define TFT_CS     ۱۰

#define TFT_RST    ۸

#define TFT_DC     ۹

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 را تعریف تا کد نویسی کمتر بشه, رنگ , سایز و مختصات نوشته را در یک تابع بنویسیم  که به ترتیب در زیر میباشد :

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

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

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

 

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 =  ۰; 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);

}

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

 


کد نهایی پروژه


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

//******************************* 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);
}

 

 

پروژه ساعت دیجیتال با ال سی دی TFT - دیجی اسپارک

 

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

 


جمع بندی


در این آموزش ساعت, تاریخ و دما محیط را در لحظه بر روی نمایشگر tft تمام رنگ به نمایش گذاشتیم . و در بخش کد نویسی , برای کد نویسی بهنیه تر از آرایه نویسی برای ذخیره داده های ساعت و تاریخ استفاده کردیم. تفاوتی که این نمایشگر با oled داشت در این بود , زمانی که دیتای جدید وارد آردوینو میشه نمایشگر دیتای قدیم را پاک نمیکنه و اماده نمایش دیتای جدید بشه در نتیجه اگر این کار به صورت دستی با برنامه نویسی انجام نشه اعداد روی هم قرار میگیره و در نتیجه نمتوان دیتا را خواند به عنوان مثال عدد ۲ و ۳ در یک مختصات رسم کنید میبنید که دیگه نمیشه خواند

پشنهادی برای آموزش های بعدی داشتین حتما در بخش کامنت های همین آموزش بگید.

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

Arman.H.R

تبادل نظر و رفع عیب با ثبت دیدگاه

۷ دیدگاه