//wifi 라이브러리
#include <WiFi.h>
#include <Wire.h>
//현재 시간 불러오는 라이브러리
#include "time.h" 
#include "SPI.h" 
#include "Adafruit_GFX.h" // Adafruit의 그래픽 관련 라이브러리
#include "Adafruit_ILI9341.h"// ILI9341 제어용 라이브러리
//온습도 센서 라이브러리
#include "DHT.h" 
#include <Adafruit_SSD1306.h>

#include "TM1637Display.h"
TM1637Display TMdisplay(17, 16); 


#define LED 23

#define TFT_BLACK       0x0000
#define TFT_WHITE       0xFFFF
#define TFT_CS 15
#define TFT_DC 2
#define TFT_MOSI 23
#define TFT_CLK 18
#define TFT_RST 4
#define TFT_MISO 19
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
Adafruit_SSD1306 display(128, 32, &Wire, -1);
//온습도 센서
DHT dht(15, DHT22); // (DHTPIN, DHTTYPE)

#include <LiquidCrystal_I2C.h> // LiquidCrystal_I2C.h 라이브러리추가
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // (주소, 16 문자, 2 라인)

const char *ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600 * 9;
const int daylightOffset_sec = 0;

void setup()
{
  Serial.begin(115200);
  tft.begin();

  Serial.println("WiFi ");

  WiFi.begin("Wokwi-GUEST", "", 6);
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

  pinMode(LED, OUTPUT);
  
  //LCD에 IoT 응용 제어 과제 출력
  lcd.init();
  lcd.backlight();
  
  lcd.clear();
  
  lcd.setCursor(0,0);
  lcd.print("IoT Application");
  lcd.setCursor(0,1);
  lcd.print("Control Task");

  //오늘 날짜, 시간
  printLocalTime();

  //온습도 측정
  dht.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0, 0);
  printHumidityTemperature();
  TMdisplay.setBrightness(0x03);
}
void loop()
{
 for(uint8_t rotation=0; ; rotation++) {
    tft.setRotation(rotation);
    printLocalTime();
    printHumidityTemperature();
    delay(500);
  }
} 

void printLocalTime()
{
    struct tm timeinfo;
    if (!getLocalTime(&timeinfo))
    {
        Serial.println("Failed to obtain time");
        return;
    }
    Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");

    
    tft.setRotation(4); // 화면 회전
    
    tft.setCursor(10, 30);
    tft.setTextColor(ILI9341_WHITE,ILI9341_BLACK);
    tft.setTextSize(3);
    tft.println(&timeinfo, "%B %d %Y"); // month
    tft.setCursor(10, 70);
    tft.setTextSize(3);
    tft.println(&timeinfo, "%a %H:%M:%S"); // clock
}
void printHumidityTemperature()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  Serial.println(h);
  Serial.println(t);
  display.clearDisplay();
  display.setCursor(2,10);
  display.setTextColor(WHITE);
  display.print("Humidity: " + String(h) +" "+ char(37));
  display.setCursor(2,25);
  display.print("Temperature: " + String(t) + " `C");
  display.display();
}
$abcdeabcde151015202530354045505560fghijfghij