مشروع الساعة مع درجة الحرارة باستخدام اردوينو | arduino uno with DS1307 RTC and ST7735 TFT - DIY Channel3

DIY Channel3

Arduino│ESP8266│ESP32│Drone│Robot

مشروع الساعة مع درجة الحرارة باستخدام اردوينو | arduino uno with DS1307 RTC and ST7735 TFT

مشاركة هذا


 ساعة وتقويم في الوقت الحقيقي مع مراقبة درجة الحرارة وشاشة 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