#include <DHT.h>
#include <WiFi.h>
#include <ThingSpeak.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define DHTPIN 4
#define DHTTYPE DHT22
#define led_hijau 18
#define led_merah 19
#define BUZZER_PIN 2
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
const int myChannelNumber = 2518832;
const char* myWriteApiKey = "BX91UFZBK77J3P9G";
const char* myReadApiKey = "UQRJIH0AJ511TOHY";
const char* server = "api.thingspeak.com";
WiFiClient client;
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int VALID_CARD_COUNT = 6;
const int INVALID_CARD_COUNT = 4;
const int CARD_LENGTH = 12;
struct Card {
char number[CARD_LENGTH + 1];
char name[20];
int thingspeak_field; //
};
Card valid_cards[VALID_CARD_COUNT] = {
{"E280689401A9", "Farhan", 1},
{"E2000019060C", "Putra", 2},
{"G46RD9V40F3A", "Ario", 3},
{"B71001B76894", "Zalfa", 4},
{"1C81159073FD", "Nafis", 5},
{"B710D0186022", "Zoro", 6}
};
Card invalid_cards[INVALID_CARD_COUNT] = {
{"3FD659840001", "Invalid Card "},
{"8115907B710E", "Invalid Card "},
{"66D9V45E6E77", "Invalid Card "},
{"E291450A556D", "Invalid Card "}
};
bool isValidCard(const char* cardNumber) {
for (int i = 0; i < VALID_CARD_COUNT; ++i) {
if (strcmp(valid_cards[i].number, cardNumber) == 0) {
return true;
}
}
return false;
}
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init();
lcd.backlight();
pinMode(led_hijau, OUTPUT);
pinMode(led_merah, OUTPUT);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
ThingSpeak.begin(client);
lcd.setCursor(0, 0);
lcd.print("Connecting");
for (int i = 10; i < 14; i++) {
lcd.setCursor(i, 0);
lcd.print(".");
delay(1000);
}
lcd.clear();
}
void loop() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tap RFID Card Patient");
lcd.setCursor(0, 1);
lcd.print("Suhu:");
lcd.setCursor(0, 2);
lcd.print("CARD:");
lcd.setCursor(0, 3);
lcd.print("NAME:");
while (!Serial.available()) {
delay(100);
}
char cardNumber[CARD_LENGTH + 1];
Serial.readBytesUntil('\n', cardNumber, CARD_LENGTH + 1);
cardNumber[CARD_LENGTH] = '\0';
lcd.clear();
if (strlen(cardNumber) == CARD_LENGTH) {
for (int i = 0; i < VALID_CARD_COUNT; ++i) {
if (strcmp(valid_cards[i].number, cardNumber) == 0) {
digitalWrite(led_hijau, HIGH);
tone(BUZZER_PIN, 500);
delay(500);
noTone(BUZZER_PIN);
float temperature = dht.readTemperature();
ThingSpeak.writeField(myChannelNumber, valid_cards[i].thingspeak_field, temperature, myWriteApiKey);
lcd.setCursor(4, 0);
lcd.print("Card Valid");
lcd.setCursor(0, 1);
lcd.print("Suhu: ");
lcd.print(temperature);
lcd.print(" C");
// Menampilkan nama kartu yang valid
lcd.setCursor(0, 2);
lcd.print("CARD: ");
lcd.print(valid_cards[i].number);
lcd.setCursor(0, 3);
lcd.print("NAME: ");
lcd.print(valid_cards[i].name);
delay(15000);
digitalWrite(led_hijau,LOW);
return;
}
}
for (int i = 0; i < INVALID_CARD_COUNT; ++i) {
if (strcmp(invalid_cards[i].number, cardNumber) == 0) {
lcd.setCursor(4, 0);
lcd.print("Card Invalid");
digitalWrite(led_merah, HIGH);
tone(BUZZER_PIN, 500);
delay(3000);
digitalWrite(led_merah, LOW);
noTone(BUZZER_PIN);
return;
}
}
lcd.print("Kartu Tidak Dikenali");
delay(3000);
} else {
lcd.print("Format Salah");
delay(3000);
}
}