182 lines
5.4 KiB
C++
182 lines
5.4 KiB
C++
#include <ESP8266WebServer.h>
|
|
#include <ESP8266HTTPClient.h>
|
|
#include <SPI.h>
|
|
#include <MFRC522.h>
|
|
#include <Wire.h>
|
|
#include <LiquidCrystal_I2C.h>
|
|
|
|
#define SS_PIN D2 // SDA / SS is connected to pinout D2
|
|
#define RST_PIN D1 // RST is connected to pinout D1
|
|
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
|
|
|
|
#define ON_Board_LED 2
|
|
#define BUZZER_PIN D8 // Define the pin for the buzzer
|
|
|
|
const char* ssid = ":)";
|
|
const char* password = "hanadulset";
|
|
|
|
ESP8266WebServer server(80); // Server on port 80
|
|
|
|
int readsuccess;
|
|
byte readcard[4];
|
|
char str[32] = "";
|
|
String StrUID;
|
|
String receivedData = "";
|
|
String newBalance = "";
|
|
|
|
// Set the LCD address to 0x27 for a 16 chars and 2 line display
|
|
LiquidCrystal_I2C lcd(0x27, 16, 2);
|
|
|
|
void setup() {
|
|
Wire.begin(D3, D4);
|
|
Serial.begin(115200); // Initialize serial communications with the PC
|
|
SPI.begin(); // Init SPI bus
|
|
mfrc522.PCD_Init(); // Init MFRC522 card
|
|
|
|
delay(500);
|
|
|
|
// Initialize the LCD
|
|
lcd.begin(16, 2);
|
|
lcd.clear();
|
|
lcd.backlight();
|
|
|
|
WiFi.begin(ssid, password); // Connect to your WiFi router
|
|
Serial.println("");
|
|
|
|
pinMode(ON_Board_LED, OUTPUT);
|
|
pinMode(BUZZER_PIN, OUTPUT); // Set buzzer pin as output
|
|
digitalWrite(ON_Board_LED, HIGH); // Turn off Led On Board
|
|
digitalWrite(BUZZER_PIN, LOW); // Ensure the buzzer is off initially
|
|
|
|
Serial.print("Connecting");
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
Serial.print(".");
|
|
digitalWrite(ON_Board_LED, LOW);
|
|
delay(250);
|
|
digitalWrite(ON_Board_LED, HIGH);
|
|
delay(250);
|
|
}
|
|
digitalWrite(ON_Board_LED, HIGH); // Turn off the On Board LED when it is connected to the wifi router.
|
|
Serial.println("");
|
|
Serial.print("Successfully connected to : ");
|
|
Serial.println(ssid);
|
|
Serial.print("IP address: ");
|
|
Serial.println(WiFi.localIP());
|
|
|
|
// Setup server routes
|
|
server.on("/", HTTP_GET, handleRoot);
|
|
server.begin();
|
|
|
|
Serial.println("Please tag a card or keychain to see the UID !");
|
|
Serial.println("");
|
|
}
|
|
|
|
|
|
void loop() {
|
|
// Handle client requests
|
|
server.handleClient();
|
|
|
|
// Read RFID card
|
|
readsuccess = getid();
|
|
|
|
if (readsuccess) {
|
|
digitalWrite(ON_Board_LED, LOW);
|
|
digitalWrite(BUZZER_PIN, HIGH) ; //DO note 523 Hz
|
|
delay (250); // Turn on the buzzer
|
|
digitalWrite(BUZZER_PIN, LOW) ;
|
|
|
|
HTTPClient http; // Declare object of class HTTPClient
|
|
WiFiClient client;
|
|
|
|
String UIDresultSend = StrUID;
|
|
String postData = "UIDresult=" + UIDresultSend;
|
|
|
|
http.begin(client, "http://bersyukur.cloud/IOTKK/getUIDBayar.php");
|
|
http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // Specify content-type header
|
|
|
|
int httpCode = http.POST(postData); // Send the request
|
|
String payload = http.getString(); // Get the response payload
|
|
|
|
Serial.println(UIDresultSend);
|
|
Serial.println(httpCode); // Print HTTP return code
|
|
Serial.println(payload); // Print request response payload
|
|
|
|
receivedData = payload; // Store received data
|
|
|
|
http.end(); // Close connection
|
|
|
|
// Make a GET request to receive new balance data
|
|
if (WiFi.status() == WL_CONNECTED) {
|
|
http.begin(client, "http://bersyukur.cloud/IOTKK/sendNewBalance.php");
|
|
int httpCode = http.GET();
|
|
Serial.println("HTTP GET code: " + String(httpCode)); // Print HTTP return code
|
|
if (httpCode > 0) {
|
|
if (httpCode == HTTP_CODE_OK) {
|
|
newBalance = http.getString();
|
|
String balance = newBalance;
|
|
Serial.println("New balance received: " + newBalance);
|
|
|
|
// Display the new balance on the LCD with scrolling
|
|
scrollText(balance);
|
|
} else {
|
|
Serial.println("Failed to get new balance, response code: " + String(httpCode));
|
|
}
|
|
} else {
|
|
Serial.printf("[HTTP] GET request failed, error: %s\n", http.errorToString(httpCode).c_str());
|
|
}
|
|
http.end();
|
|
} else {
|
|
Serial.println("WiFi not connected");
|
|
}
|
|
|
|
delay(250);
|
|
digitalWrite(BUZZER_PIN, LOW); // Turn off the buzzer
|
|
digitalWrite(ON_Board_LED, HIGH);
|
|
}
|
|
}
|
|
|
|
int getid() {
|
|
if (!mfrc522.PICC_IsNewCardPresent()) {
|
|
return 0;
|
|
}
|
|
if (!mfrc522.PICC_ReadCardSerial()) {
|
|
return 0;
|
|
}
|
|
|
|
Serial.print("THE UID OF THE SCANNED CARD IS : ");
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
readcard[i] = mfrc522.uid.uidByte[i]; // Storing the UID of the tag in readcard
|
|
array_to_string(readcard, 4, str);
|
|
StrUID = str;
|
|
}
|
|
mfrc522.PICC_HaltA();
|
|
return 1;
|
|
}
|
|
|
|
void array_to_string(byte array[], unsigned int len, char buffer[]) {
|
|
for (unsigned int i = 0; i < len; i++) {
|
|
byte nib1 = (array[i] >> 4) & 0x0F;
|
|
byte nib2 = (array[i] >> 0) & 0x0F;
|
|
buffer[i * 2 + 0] = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA;
|
|
buffer[i * 2 + 1] = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA;
|
|
}
|
|
buffer[len * 2] = '\0';
|
|
}
|
|
|
|
void handleRoot() {
|
|
server.send(200, "text/plain", receivedData);
|
|
}
|
|
|
|
// Function to scroll text on the LCD from right to left
|
|
void scrollText(String message) {
|
|
message = " " + message + " "; // Add spaces to the start and end for scrolling effect
|
|
for (int i = 0; i < message.length() - 16; i++) {
|
|
lcd.clear();
|
|
lcd.setCursor(0, 0);
|
|
lcd.print(message.substring(i, i + 16)); // Print a substring of the message
|
|
delay(300); // Delay to control the scroll speed
|
|
lcd.clear();
|
|
}
|
|
}
|