#include "DHT.h" // Memasukkan library DHT yang diperlukan
#define DHTPIN 2 // Mendefinisikan pin yang digunakan untuk sensor DHT
#define DHTTYPE DHT22 // Mendefinisikan tipe sensor DHT yang digunakan DHT22

DHT dht(DHTPIN, DHTTYPE); // Inisialisasi objek DHT untuk berkomunikasi dengan sensor

const int segment[] = {6, 7, 8, 9, 10, 11, 12, 13}; // Mendefinisikan pin-pins untuk tujuh segmen katoda
const int digit[] = {3, 4, 5}; // Mendefinisikan pin-pins untuk 3 digit

float suhu = 0.0; // Variabel untuk menyimpan nilai suhu dalam derajat Celsius

void setup() {
  dht.begin(); // Inisialisasi sensor DHT

  // Inisialisasi komunikasi serial
  Serial.begin(9600);

  for (int i = 0; i < 8; i++) {
    pinMode(segment[i], OUTPUT); // Mengatur pin segmen sebagai OUTPUT
  }
  for (int i = 0; i < 3; i++) {
    pinMode(digit[i], OUTPUT); // Mengatur pin digit sebagai OUTPUT
  }
}

void loop() {
  suhu = dht.readTemperature(); // Membaca suhu dari sensor DHT 22

  // Menampilkan suhu pada Serial Monitor
  Serial.print("Suhu: ");
  Serial.print(suhu);
  Serial.println("°C");

  tampilan(suhu * 10); // Memanggil fungsi tampilan() untuk menampilkan suhu di tampilan tujuh segmen 3 digit katoda
}

void hidup(int nilai) { // Fungsi untuk mengatur segmen-segmen pada tampilan tujuh segmen katoda
  const int pola[10][8] = {  // Matriks pola (lampu) untuk digit dari 0 sampai 9
    {1, 1, 1, 1, 1, 1, 0, 0}, // Pola untuk angka 0
    {0, 1, 1, 0, 0, 0, 0, 0}, // Pola untuk angka 1
    {1, 1, 0, 1, 1, 0, 1, 1}, // Pola untuk angka 2
    {1, 1, 1, 1, 0, 0, 1, 1}, // Pola untuk angka 3
    {0, 1, 1, 0, 0, 1, 1, 1}, // Pola untuk angka 4
    {1, 0, 1, 1, 0, 1, 1, 1}, // Pola untuk angka 5
    {1, 0, 1, 1, 1, 1, 1, 1}, // Pola untuk angka 6
    {1, 1, 1, 0, 0, 0, 0, 0}, // Pola untuk angka 7
    {1, 1, 1, 1, 1, 1, 1, 1}, // Pola untuk angka 8
    {1, 1, 1, 1, 0, 1, 1, 1}  // Pola untuk angka 9
  };

  for (int i = 0; i < 8; i++) {
    digitalWrite(segment[i], pola[nilai][i]); // Mengatur segmen-segmen sesuai dengan digit
  }
  digitalWrite(segment[7], 0); // Mengaktifkan titik desimal (jika ada)
}

void tampilan(int a) { // Fungsi untuk menampilkan suhu pada tampilan tujuh segmen katoda
  hidup(a / 100); // Menampilkan digit pertama
  digitalWrite(digit[0], 0);   // Mengaktifkan digit pertama
  digitalWrite(digit[1], 1);   // Menonaktifkan digit kedua
  digitalWrite(digit[2], 1);   // Menonaktifkan digit ketiga
  digitalWrite(digit[0], 1);   // Menonaktifkan digit pertama
  delay(10);

  hidup(a % 100 / 10);         // Menampilkan digit kedua
  digitalWrite(digit[0], 1);   // Menonaktifkan digit pertama
  digitalWrite(digit[1], 0);   // Mengaktifkan digit kedua
  digitalWrite(digit[2], 1);   // Menonaktifkan digit ketiga
  digitalWrite(segment[7], 1); // Mengaktifkan titik desimal
  digitalWrite(digit[1], 1);   // Menonaktifkan digit kedua
  delay(10);

  hidup(a % 10);               // Menampilkan digit ketiga
  digitalWrite(digit[0], 1);   // Menonaktifkan digit pertama
  digitalWrite(digit[1], 1);   // Menonaktifkan digit kedua
  digitalWrite(digit[2], 0);   // Mengaktifkan digit ketiga
  digitalWrite(digit[2], 1);   // Menonaktifkan digit ketiga
  delay(10);
}