شاید گاهی به این فکر افتاده باشید برای خودتان ساعت دیجیتال بسازید. اما اینکه چه طور و با چه روشی بسازید با چالش های زیادی رو به رو شدید، من اینجا هستم و به شما کمک میکنم که به راحتی ساعت دیجیتال خود را در نمایشگر رنگی بسازید. در این آموزش با استفاده از ماژول ساعت و نمایشگر tft رنگی به همراه برد آردوینو و در نهایت توسط نرم افزار Arduino ide ساعت دیجیتال خود را میسازیم. در ادامه پروژه ساخت ساعت دیجیتال با ال سی دی TFT با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
معرفی برد آردوینو
اکثریت شما با این برد بسیار محبوب آشنایی دارید. بردهای آردوینو از سری بردهای امبدد هستند که از پرتکل های spi, i2c, usart نیز پشتیبانی میکند. بردهای آردوینو در پروژه های دانشجویی و البته صنعتی هم کاربرد بسیاری دارد. برد آردوینو اونو از معروف ترین های این خانواده است. میکروکنترلر به کار رفته در آن atmega328 است. دارای ۶ ورودی آنالوگ، ۱۴ پایه دیجیتال که ۶ تای آنها پایه های pwm هستند. در ادامه ماژول های به کار رفته معرفی و روش راه اندازی توضیح داده میشود.
معرفی ماژول ساعت DS3231
برای ساخت ساعت دیجیتال با ال سی دی به ماژول ds3231 نیاز خواهیم داشت. تا زمان را به صورت دقیق محاسبه کند. ماژول ساعت DS3231 به دلیل داشتن سنسور دمایی داخلی، علاوه بر سنجش ساعت قابلیت سنجش دمای محیط را هم دارد. با توجه به دمای محیط از دقیق ترین ماژول های ساعت به شمار میرود. راه اندازی ماژول بسیار ساده است و میتوان با پروتکل دو سیم i2c ان را به برد آردوینو متصل و راه اندازی کرد.
ماژول با استفاده از دو کتابخانه Sodag_DS3231 و wire قابل راه اندازیم است. حتی میتوان با دلیل وجود سنسور دمایی که داره, دما محیط را اندازه گیری و سپس به نمایش گذاشت. در ادامه اتصالات ماژول را به آردوینو اونو خواهیم گفت.
اتصالات ماژول ds3231 به آردوینو
Arduino |
DS3231 |
GND |
GND |
+۵ |
VCC |
A4 |
SDA |
A5 |
SCK |
معرفی نمایشگر TFT 1.44 inch
توسط نمایشگر LCD TFT 1.44inch میتوان هر رنگی با استفاده از اعداد هگز روی صفحه به نمایش گذاشت. پروتکل ارتباطی این ماژول spi است. با متصل کردن ۸ پایه به آردوینو ماژول راه اندازی میشود.
کتابخانه هایی که برای شروکار با این ماژول استفاده کردیم , 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); }
و در قسمت انتهایی void loop , مختصات و رنگ هارا برای نمایش ساعت زمان و دما کد نویسی کردیم.
جمع بندی
در این آموزش ساعت, تاریخ و دما محیط را در لحظه بر روی نمایشگر tft تمام رنگ به نمایش گذاشتیم . و در بخش کد نویسی , برای کد نویسی بهنیه تر از آرایه نویسی برای ذخیره داده های ساعت و تاریخ استفاده کردیم. تفاوتی که این نمایشگر با oled داشت در این بود , زمانی که دیتای جدید وارد آردوینو میشه نمایشگر دیتای قدیم را پاک نمیکنه و اماده نمایش دیتای جدید بشه در نتیجه اگر این کار به صورت دستی با برنامه نویسی انجام نشه اعداد روی هم قرار میگیره و در نتیجه نمتوان دیتا را خواند به عنوان مثال عدد ۲ و ۳ در یک مختصات رسم کنید میبنید که دیگه نمیشه خواند
پشنهادی برای آموزش های بعدی داشتین حتما در بخش کامنت های همین آموزش بگید.
خیلی خوب و کاربردی
عالی بود
متشکرم باعث افتخاره استاد
بسیار بسیار زیبا و کاربردی و آموزنده بود
لطفاً باز هم از این مطلب ها بزارین
متشکرم حتما
اگر پیشنهادی برای پروژه های جذاب تر دارید حتما در همین بخش ایده تون رو باگو کنید تا سریع تر آموزش آن را منتشر کنیم
سلام
اگر شماتیک و نحوه اتصالات پروژه رو در قالب یک تصویر میزاشتین خیلی عالی میشد ، ممنون از زحمات شما❤️
سلام خیلی ممنونم از پیشنهادی که دادین
پیشنهادتون رو برسی میکنم و در جهت ارتقاعِ آموزش ها استفاده میکنم
سلام برادر من اعداد روی هم قرار میگیره