#include <RTClib.h>
#include <WiFi.h>
#include <ThingSpeak.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#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;
RTC_DS1307 rtc;
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);
rtc.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");
lcd.setCursor(0, 1);
lcd.print("Nama:");
lcd.setCursor(0, 2);
lcd.print("Tanggal:");
lcd.setCursor(0, 3);
lcd.print("Jam:");
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, 1000);
delay(2000);
noTone(BUZZER_PIN);
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
DateTime now = rtc.now();
ThingSpeak.writeField(myChannelNumber, valid_cards[i].thingspeak_field, now.hour(), myWriteApiKey);
lcd.setCursor(4, 0);
lcd.print("Selamat datang");
lcd.setCursor(0, 1);
lcd.print("Nama: ");
lcd.print(valid_cards[i].name);
lcd.setCursor(0, 2);
lcd.print("Tanggal: ");
lcd.print(now.timestamp(DateTime::TIMESTAMP_DATE));
lcd.setCursor(0, 3);
lcd.print("Jam: ");
lcd.print(now.timestamp(DateTime::TIMESTAMP_TIME));
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("Data Invalid");
digitalWrite(led_merah, HIGH);
tone(BUZZER_PIN, 500);
delay(3000);
digitalWrite(led_merah, LOW);
noTone(BUZZER_PIN);
return;
}
}
lcd.print("Kartu Tidak Dikenali");
} else {
lcd.print("Format Salah");
delay(7000);
}
}
Loading
esp32-devkit-c-v4
esp32-devkit-c-v4