#include "DHTesp.h"     //library untuk mengakses ke sensor dht pada esp
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>       //library untuk menghubungkan ke wifi
#include "ThingSpeak.h" //library untuk menghubungkan ke Thingspeak

const int DHT_PIN = 15; //pin data sensor DHT terhubung ke pin 15
const int RedlED = 5;
const int GreenlED = 18;
const int Buzzer = 2;
const char* WIFI_NAME = "Wokwi-GUEST";      //nama wifi (SSID wifi) [dalam simulasi ini pakai "Wokwi-GUEST"]
const char* WIFI_PASSWORD = "";             //password wifi (pass wifi) [dalam simulasi ini tidak ada {""}]
const int myChannelNumber = 2517811;        //kode channel number pada server thingspeak
const char* myWriteApiKey = "BZ3HS0JMLUY06DXN";  //kode write API KEY pada channel number di server thingspeak
const char* myReadApiKey = "RDFAJV0V5IU528CR";  //kode write API KEY pada channel number di server thingspeak
const char* server = "api.thingspeak.com";  //server API KEY di server thingspeak


// Set the LCD address to 0x27 for a 16 chars and 2 line display
DHTesp dhtSensor;   //memanggil fungsi dari library DHTesp dengan nama dhatSensor
LiquidCrystal_I2C lcd(0x27, 20, 4);
WiFiClient client;  //memanggil fungsi WifiClient dari library wifi dengan nama client


int count = 0, nomer_pasien=0;
char c;
String id,nama_pasien;
float temp;

int wait = 5000;

void setup()
{
  Serial.begin(115200);
  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);  //sensor dht di atur dengan membaca DHT_PIN dan tipe DHT22
  pinMode(RedlED, OUTPUT);
  pinMode(GreenlED, OUTPUT);
  pinMode(Buzzer, OUTPUT);
  lcd.init();
  lcd.backlight();
  
  WiFi.begin(WIFI_NAME, WIFI_PASSWORD);     //wifi di mulai dengan mencari SSID dan password yang diatur
  Serial.print("Wifi Connecting.");   //Mengirimkan data serial bertuliskan "Wifi Connecting" setelah itu ganti baris
  while (WiFi.status() != WL_CONNECTED){    //perulangan terus menerus jika status wifi belum tersambung
    delay(100);                            //Jeda waktu 1000ms atau 1 detik
    Serial.print(".");                      //Mengirimkan data serial bertuliskan "." tanpa ganti garis
  lcd.setCursor(0, 0);
  lcd.print("Connecting Wifi   ");
  delay(100);
  lcd.setCursor(0, 0);
  lcd.print("Connecting Wifi...");
  }
  Serial.println("Wifi connected !");      //Mengirimkan data serial bertuliskan "Wifi connected" setelah itu ganti baris
  Serial.println("Local IP: " + String(WiFi.localIP())); //Mengirimkan data serial bertuliskan "Local IP: [IP WIFI]" setelah itu ganti baris
  ThingSpeak.begin(client);     //Thingspeak di mulai dengan menhubungkan melalui client
  
  lcd.setCursor(0, 1);
  lcd.print("PENDATAAN SUHU RFID");
  lcd.setCursor(0, 2);
  lcd.print("CARD:   ");
  lcd.setCursor(0, 3);
  lcd.print("NAME:   ");
  delay(20);
  Serial.println("Please scan your RFID Card");
  lcd.setCursor(0, 1);
  lcd.print("                      ");
}



void loop()
{
  TempAndHumidity  data = dhtSensor.getTempAndHumidity(); //Membaca data suhu dan kelembaban pada sensor DHT kemudian di masukan ke variable data array
  temp = data.temperature;
  Serial.print("Temperature is: ");
  Serial.println(temp);
  lcd.setCursor(0, 0);
  lcd.print("Tap RFID Card Patien   ");
  lcd.setCursor(0, 1);
  lcd.print("Suhu: ");
  lcd.setCursor(6, 1);
  lcd.print(temp);
  lcd.setCursor(0, 2);
  lcd.print("CARD:           ");
  lcd.setCursor(0, 3);
  lcd.print("NAME:           ");
  delay(100);
  while (Serial.available() > 0)
  {
    c = Serial.read();
    count++;
    id += c;
    if (count == 12)
    {
      Serial.print(id);
      //break;
      data_pasien();
    }
  }
  count = 0;
  id = "";
  delay(500);
}

void kirimdata(){
  delay(100);
  ThingSpeak.setField(nomer_pasien,(float)temp);  //Thingspeak mengatur peletakan data pada field 1 dengan data yang akan dikirimkan adalah data suhu
  delay(100);
  ThingSpeak.writeFields(myChannelNumber,myWriteApiKey);  //Thingspeak mengirimkan data ke server sesuai kode channel dan Write API KEY
/*if (ThingSpeak.readField(myChannelNumber, myReadApiKey)) {
    nama_pasien = String(ThingSpeak.getFieldName(nomer_pasien));
  }*/
    Serial.println("");
    Serial.print("Valid Card \t Nama: ");
    Serial.println(nama_pasien);
    lcd.setCursor(0, 2);
    lcd.print("CARD: ");
    lcd.setCursor(6, 2);
    lcd.print(id);
    lcd.setCursor(0, 3);
    lcd.print("NAME: ");
    lcd.setCursor(6, 3);
    lcd.print(nama_pasien);
    digitalWrite(GreenlED, HIGH);
    delay(wait);
    digitalWrite(GreenlED, LOW);
    lcd.setCursor(0, 2);
    lcd.print("CARD:             ");
    lcd.setCursor(0, 3);
    lcd.print("NAME:             ");
  delay(100);
}

void data_pasien() {
  if (id == "E280689401A9")
  {
    nomer_pasien = 1;
    nama_pasien = "Amel";
    kirimdata();
  }

  else if (id == "E2000019060C")
  {
    nomer_pasien = 2;
    nama_pasien = "Meilinda";
    kirimdata();
  }

  else if (id == "G46RD9V40F3A")
  {
    nomer_pasien = 3;
    nama_pasien = "Ika";
    kirimdata();
  }

  else if (id == "B71001B76894")
  {
    nomer_pasien = 4;
    nama_pasien = "Galang";
    kirimdata();
  }

  else if (id == "1C81159073FD")
  {
    nomer_pasien = 5;
    nama_pasien = "Albab";
    kirimdata();
  }

  else
  {
    nomer_pasien=0;
    Serial.println("Invalid Card");
    lcd.setCursor(0, 2);
    lcd.print("CARD: INVALID   ");
    lcd.setCursor(0, 3);
    lcd.print("NAME: UNKNOWN     ");
    digitalWrite(RedlED, HIGH);
    digitalWrite(Buzzer, HIGH);
    delay(500);
    digitalWrite(Buzzer, LOW);
    delay(500);
    digitalWrite(RedlED, LOW);
    lcd.setCursor(0, 2);
    lcd.print("CARD:           ");
    lcd.setCursor(0, 3);
    lcd.print("NAME:           ");
  }
}
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
led1:A
led1:C
led2:A
led2:C
r1:1
r1:2
bz1:1
bz1:2
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND