ساعة وتقويم في الوقت الحقيقي مع مراقبة درجة الحرارة وشاشة TFT مقاس 1.8 بوصة
يوضح هذا الموضوع كيفية إنشاء ساعة في الوقت الحقيقي مع شاشة مراقبة درجة الحرارة باستخدام Arduino و DS3231 RTC و ST7735R (ST7735S) شاشة TFT مقاس 1.8 بوصة.
يعد بناء هذا المشروع باستخدام Arduino أمرًا سهلاً للغاية ، حيث يوجد في الدائرة زرين ضغط لضبط الوقت بالإضافة إلى عرض التاريخ والوقت والتاريخ ودرجة الحرارة على شاشة TFT مقاس 1.8 بوصة (128 × 160) مع وحدة تحكم ST7735.
يوجد في الدائرة زري دفع (B1 & B2) متصلان بدبابيس Arduino 7 و 6 على التوالي ، يتم استخدام زري الضغط لضبط معلمات الوقت والتاريخ (الدقائق والساعات واليوم من الأسبوع والتاريخ والشهر والسنة) . يحدد الزر B1 المعلمة ويزيد B2 المعلمة المحددة.
اردوينو مع DS3231 RTC ورمز ST7735 TFT:
نحتاج إلى مكتبتين (Adafruit_ST7735 و Adafruit_GFX) من صناعات Adafruit من أجل تجميع كود Arduino أدناه ، ويمكن تنزيل هذه المكتبات من الرابط أدناه:
------------------------------------------------------------
// Project : Real time clock & calendar with temperature monitor and 1.8" TFT screen
// By : DIY Channel / ABDELLATIF MIMOUNE
// My Youtube Channel : https://www.youtube.com/c/DIYChannel2019
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
//---------ABDELLATIF-----------------------------
#define TFT_CS 9
#define TFT_DC 10
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC);
#define button1 7
#define button2 6
//--------MIMOUNE--------------------------------
void setup(void) {
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
tft.initR(INITR_BLACKTAB);
tft.fillScreen(ST7735_BLACK);
Wire.begin();
tft.drawFastHLine(0, 53, tft.width(), ST7735_BLUE);
tft.drawFastHLine(0, 106, tft.width(), ST7735_BLUE);
draw_text(45, 64, "T I M E", 1, ST7735_MAGENTA);
draw_text(30, 117, "TEMPERATURE", 1, ST7735_RED);
}
char Time[] = " : : ";
char Calendar[] = " | |20 ";
char temperature[] = " 00.00";
char temperature_msb;
byte i, second, minute, hour, day, date, month, year, temperature_lsb;
void display_day(){
switch(day){
case 1: draw_text(40, 10, " SUNDAY ", 1, ST7735_CYAN); break;
case 2: draw_text(40, 10, " MONDAY ", 1, ST7735_CYAN); break;
case 3: draw_text(40, 10, " TUESDAY ", 1, ST7735_CYAN); break;
case 4: draw_text(40, 10, "WEDNESDAY", 1, ST7735_CYAN); break;
case 5: draw_text(40, 10, "THURSDAY ", 1, ST7735_CYAN); break;
case 6: draw_text(40, 10, " FRIDAY ", 1, ST7735_CYAN); break;
default: draw_text(40, 10, "SATURDAY ", 1, ST7735_CYAN);
}
//------INSTAGRAM: DIYCHANNEL_OFFICAIL----------------------------
}
void DS3231_display(){
second = (second >> 4) * 10 + (second & 0x0F);
minute = (minute >> 4) * 10 + (minute & 0x0F);
hour = (hour >> 4) * 10 + (hour & 0x0F);
date = (date >> 4) * 10 + (date & 0x0F);
month = (month >> 4) * 10 + (month & 0x0F);
year = (year >> 4) * 10 + (year & 0x0F);
Time[7] = second % 10 + 48;
Time[6] = second / 10 + 48;
Time[4] = minute % 10 + 48;
Time[3] = minute / 10 + 48;
Time[1] = hour % 10 + 48;
Time[0] = hour / 10 + 48;
Calendar[9] = year % 10 + 48;
Calendar[8] = year / 10 + 48;
Calendar[4] = month % 10 + 48;
Calendar[3] = month / 10 + 48;
Calendar[1] = date % 10 + 48;
Calendar[0] = date / 10 + 48;
if(temperature_msb < 0){
temperature_msb = abs(temperature_msb);
temperature[0] = '-';
}
else
temperature[0] = ' ';
temperature_lsb >>= 6;
temperature[2] = temperature_msb % 10 + 48;
temperature[1] = temperature_msb / 10 + 48;
if(temperature_lsb == 0 || temperature_lsb == 2){
temperature[5] = '0';
if(temperature_lsb == 0) temperature[4] = '0';
else temperature[4] = '5';
}
if(temperature_lsb == 1 || temperature_lsb == 3){
temperature[5] = '5';
if(temperature_lsb == 1) temperature[4] = '2';
else temperature[4] = '7';
}
draw_text(4, 27, Calendar, 2, ST7735_YELLOW);
draw_text(16, 81, Time, 2, ST7735_GREEN);
draw_text(14, 134, temperature, 2, ST7735_WHITE);
tft.drawCircle(90, 134, 2, ST7735_WHITE);
draw_text(96, 134, "C", 2, ST7735_WHITE);
}
void blink_parameter(){
byte j = 0;
while(j < 10 && digitalRead(button1) && digitalRead(button2)){
j++;
delay(25);
}
//-----FACEBOOK : ABDEL LATIF---------------------------
}
byte edit(byte x_pos, byte y_pos, byte parameter){
char text[3];
uint16_t color = ST7735_YELLOW;
sprintf(text,"%02u", parameter);
if(i == 3 || i == 4)
color = ST7735_GREEN;
while(!digitalRead(button1));
while(true){
while(!digitalRead(button2)){
parameter++;
if(i == 0 && parameter > 31)
parameter = 1;
if(i == 1 && parameter > 12)
parameter = 1;
if(i == 2 && parameter > 99)
parameter = 0;
if(i == 3 && parameter > 23)
parameter = 0;
if(i == 4 && parameter > 59)
parameter = 0;
sprintf(text,"%02u", parameter);
draw_text(x_pos, y_pos, text, 2, color);
delay(200);
}
tft.fillRect(x_pos, y_pos, 22, 16, ST7735_BLACK);
blink_parameter();
draw_text(x_pos, y_pos, text, 2, color);
blink_parameter();
if(!digitalRead(button1)){
i++;
return parameter;
}
}
}
void draw_text(byte x_pos, byte y_pos, char *text, byte text_size, uint16_t text_color) {
tft.setCursor(x_pos, y_pos);
tft.setTextSize(text_size);
tft.setTextColor(text_color, ST7735_BLACK);
tft.print(text);
}
void loop() {
if(!digitalRead(button1)){
i = 0;
while(!digitalRead(button1));
while(true){
while(!digitalRead(button2)){
day++;
if(day > 7) day = 1;
display_day();
delay(200);
}
tft.fillRect(40, 10, 54, 8, ST7735_BLACK);
blink_parameter();
display_day();
blink_parameter();
if(!digitalRead(button1))
break;
}
date = edit(4, 27, date);
month = edit(40, 27, month);
year = edit(100, 27, year);
hour = edit(16, 81, hour);
minute = edit(52, 81, minute);
minute = ((minute / 10) << 4) + (minute % 10);
hour = ((hour / 10) << 4) + (hour % 10);
date = ((date / 10) << 4) + (date % 10);
month = ((month / 10) << 4) + (month % 10);
year = ((year / 10) << 4) + (year % 10);
Wire.beginTransmission(0x68);
Wire.write(0);
Wire.write(0);
Wire.write(minute);
Wire.write(hour);
Wire.write(day);
Wire.write(date);
Wire.write(month);
Wire.write(year);
Wire.endTransmission();
delay(200);
}
Wire.beginTransmission(0x68);
Wire.write(0);
Wire.endTransmission(false);
Wire.requestFrom(0x68, 7);
second = Wire.read();
minute = Wire.read();
hour = Wire.read();
day = Wire.read();
date = Wire.read();
month = Wire.read();
year = Wire.read();
Wire.beginTransmission(0x68);
Wire.write(0x11);
Wire.endTransmission(false);
Wire.requestFrom(0x68, 2);
temperature_msb = Wire.read();
temperature_lsb = Wire.read();
display_day();
DS3231_display();
delay(50);
}
No comments:
Post a Comment