شاید گاهی به این فکر افتاده باشید برای خود یک ساعت دیجیتال بسازید. اما اینکه چطور و با چه روشی بسازید شاید با چالش های زیادی رو به رو شدید. در این مطلب قراره به راحتی ساعت دیجیتال خودتون رو بانمایشگر رنگی بسازید. در این آموزش با راه اندازی ماژول ساعت DS3231 و نمایشگر TFT رنگی به همراه برد آردوینو (Arduino) ساعت دیجیتال خودمون رو میسازیم. پس با من تا انتهای مطلب همراه باشید. همچنین شما میتونید سایر مطلب من رو از این قسمت مطالعه کنید.
معرفی برد آردوینو
اکثر شما با این برد بسیار محبوب آشنایی دارید. برد های آردوینو Arduino از سری برد های امبدد بوده که در بحث اینترنت اشیا نیز معروف میباشد. برد آردوینو اونو (Arduinio UNO) از معروف ترین های این دسته بندی میباشد. میکروکنترلر به کار رفته در آن ATMEGA328P بوده و دارای 6 ورودی آنالوگ، 14 پایه دیجیتال که 6 عدد از آنها پایه های PWM هستند.
معرفی ماژول ساعت DS3231
ماژول ساعت DS3231 به دلیل داشتن سنسور دمایی داخلی , تنظیم تاخیر با توجه به دمای محیط انجام میشه در نتیجه از دقیق ترین ماژول ها ساعت به شمار میرود. راه اندازی ماژول ساده بوده و میتوان با پروتکل I2C آن را راه اندازی کرد.
ماژول ساعت DS3231 با استفاده از دو کتابخانه Sodag_DS3231 و wire قابل راه اندازی میباشد. حتی میتوان به دلیل وجود سنسور دمایی که دارد دما محیط را اندازه گیری و سپس آن را نمایش داد.
اتصالات ماژول ساعت DS321 به برد آردوینو
DS3231 | Arduino |
GND | GND |
5+ | VCC |
SDA | A4 |
SCK | A5 |
معرفی نمایشگر TFT 1.44 inch
با این نمایشگر میتوان هر رنگی با استفاده از اعداد هگز روی صفحه به نمایش گذاشت. پروتکل ارتباطی این ماژول SPI بوده و با متصل کردن 8 پایه به آردوینو ماژول را میتوان راه اندازی کرد.
کتاب خانه هایی که برای شروع کار با این ماژول استفاده کردیم، 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@) رو هم منشن کنید.
سلام. خیلی عاااالی بود. ممنون از شما 🌹🌹
تشکر از نظرتون
اگر پیشنهادی برای بهبودی آموزش ها هست، حتما در این قسمت به صورت کامنت مطرح کنید
ممنون از توجهتون
بسیار عالی و مفید
ممنون از ساده نویسی و آموزشهای مفیدتون
خواهش میکنم ، اگر پیشنهادی برای آموزش جدیدی هست حتما داخل همین قسمت به صورت کامنت مطرح کنید
بسیار عالی و کاربردی بود لطفا بیشتر از این مطالب مفید بگذارید
ممنون
نظر لطفتون هست بله حتما باعث افتخاره بتونم مطالب بیشتری رو منتشر کنم
بسیار عالی
مچکرم جناب
امیدوارم آموزش کاربردی برای شما بوده باشه
بسیار عالی بود .
متن کوتاه مفید و کاربردی بود .
تشکر از نظری که دادین
و ممنون از حمایتی که انجام میدین