#include <LiquidCrystal_I2C.h>       //memasukan library LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); //Setting alamat I2C dan ukuran LCD

char * LargeText = " RAFIF PUTRA HADITAMA EK2D/16 ";                               // Tulisan baris ke 2
int iLineNumber = 0;                                                                   // Line number to show your string (Either 0 or 1)
int iCursor = 0;

#include "DHT.h"
#define DHTPIN 0     // DHT PIN 2
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);

byte suhu1[] =
{
  B00000,
  B01110,
  B01010,
  B01010,
  B01010,
  B10001,
  B10001,
  B01110
};

byte suhu2[] = {
  B00000,
  B01110,
  B01110,
  B01110,
  B01110,
  B11111,
  B11111,
  B01110
};

byte api1[] = {
  B00000,
  B00000,
  B00100,
  B01110,
  B11011,
  B10001,
  B10001,
  B01110
};

byte api2[] = {
  B00000,
  B00000,
  B00100,
  B01110,
  B11111,
  B11111,
  B11111,
  B01110
};


void setup() {
  lcd.init();    //memanggil lcd I2C
  lcd.backlight(); //menyalakan backlight LCD
  dht.begin(); //memulai DHT
  lcd.createChar(1, suhu1);
  lcd.createChar(2, suhu2);
  lcd.createChar(3, api1);
  lcd.createChar(4, api2);
}

void loop() {
  delay(1000);
  float h = dht.readHumidity(); //membaca kelembaban
  float t = dht.readTemperature(); //membaca suhu dalam celsius
  float f = dht.readTemperature(true); // Membaca suhu dalam satuan Fahrenheit

  if (isnan(h) || isnan(t) ) {
    Serial.println("Gagal Baca"); //menampilkan peringkatan bila sensor tidak terbaca
    return;
  }

{
  UpdateLCDDisplay();                                                                 
  lcd.setCursor(0,1);
  lcd.write(3); 
  lcd.print(h); //MENAMPILKAN HUMIDITY
  lcd.print("%");
  lcd.setCursor(9,1);
  lcd.write(2); 
  lcd.print(t); //MENAMPILKAN SUHU
  lcd.print("C");
  delay(100);
}
{
  UpdateLCDDisplay();                                                                 
  lcd.setCursor(0,1);
  lcd.write(4); 
  lcd.print(h); //MENAMPILKAN HUMIDITY
  lcd.print("%");
  lcd.setCursor(9,1);
  lcd.write(1); 
  lcd.print(t); //MENAMPILKAN SUHU
  lcd.print("C");
  delay(100);
}

}

void UpdateLCDDisplay()
{
  int iLenOfLargeText = strlen(LargeText);                                            // Calculate lenght of string.
  if (iCursor == (iLenOfLargeText - 1) )                                              // Reset variable for rollover effect.
  {
    iCursor = 0;
  }
  //lcd.clear();
  lcd.setCursor(0,iLineNumber);
  
  if(iCursor < iLenOfLargeText - 16)                                                  // This loop exicuted for normal 16 characters.
  {
    for (int iChar = iCursor; iChar < iCursor + 16 ; iChar++)
    {
      lcd.print(LargeText[iChar]);
    }
  }
  else
  {
    for (int iChar = iCursor; iChar < (iLenOfLargeText - 1) ; iChar++)                //  This code takes care of printing charecters of current string.
    {
      lcd.print(LargeText[iChar]);
    }
    for (int iChar = 0; iChar <= 16 - (iLenOfLargeText - iCursor); iChar++)           //  Reamining charecter will be printed by this loop.
    {
      lcd.print(LargeText[iChar]);   
    }
  }
  iCursor++;
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND