222 lines
4.8 KiB
C++
222 lines
4.8 KiB
C++
#include <SPI.h>
|
|
#include <WiFi.h>
|
|
#include <HTTPClient.h>
|
|
#include <Ethernet.h>
|
|
|
|
#include <MFRC522v2.h>
|
|
#include <MFRC522DriverSPI.h>
|
|
#include <MFRC522DriverPinSimple.h>
|
|
|
|
// =========================
|
|
// USER CONFIG
|
|
// =========================
|
|
const String POST_URL = "https://cije.harryesses.com";
|
|
const char* LOCATION_ID = "office_1";
|
|
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
|
|
// WiFi fallback
|
|
// const char* WIFI_SSID = "Hillel_Student";
|
|
// const char* WIFI_PASS = "Hillel1025";
|
|
const char* WIFI_SSID = "Esses House Wifi";
|
|
const char* WIFI_PASS = "9175768551";
|
|
// =========================
|
|
// RC522 (Software SPI)
|
|
// =========================
|
|
#define SS_PIN 21
|
|
#define RST_PIN 38 // safer than 15
|
|
|
|
#define SCK_PIN 18
|
|
#define MISO_PIN 16
|
|
#define MOSI_PIN 17
|
|
|
|
SPIClass softSPI(HSPI);
|
|
|
|
MFRC522DriverPinSimple ss_pin(SS_PIN);
|
|
MFRC522DriverSPI driver{ss_pin, softSPI};
|
|
MFRC522 mfrc522(driver);
|
|
|
|
// =========================
|
|
// Ethernet pins (W5500)
|
|
// =========================
|
|
#define ETH_MOSI 11
|
|
#define ETH_MISO 12
|
|
#define ETH_SCK 13
|
|
#define ETH_CS 14
|
|
|
|
bool ethernetOK = false;
|
|
bool wifiOK = false;
|
|
String action = "";
|
|
// =========================
|
|
// NETWORK STATUS
|
|
// =========================
|
|
void checkEthernet() {
|
|
// ETH.begin(ETH_CS, ETH_MOSI, ETH_MISO, ETH_SCK);
|
|
// delay(2000);
|
|
|
|
if (!Ethernet.begin(mac) == 0) {
|
|
ethernetOK = true;
|
|
Serial.print("Ethernet IP: ");
|
|
Serial.println(Ethernet.localIP());
|
|
} else {
|
|
ethernetOK = false;
|
|
Serial.println("Ethernet failed");
|
|
}
|
|
}
|
|
|
|
void connectWiFi() {
|
|
WiFi.mode(WIFI_STA);
|
|
WiFi.begin(WIFI_SSID, WIFI_PASS);
|
|
|
|
Serial.print("Connecting WiFi");
|
|
unsigned long start = millis();
|
|
|
|
while (WiFi.status() != WL_CONNECTED && millis() - start < 10000) {
|
|
delay(500);
|
|
Serial.print(".");
|
|
}
|
|
|
|
if (WiFi.status() == WL_CONNECTED) {
|
|
wifiOK = true;
|
|
Serial.println();
|
|
Serial.print("WiFi IP: ");
|
|
Serial.println(WiFi.localIP());
|
|
} else {
|
|
wifiOK = false;
|
|
Serial.println("\nWiFi failed");
|
|
}
|
|
}
|
|
|
|
bool sendHTTP(String uid, String action) {
|
|
|
|
if (!ethernetOK && !wifiOK) return false;
|
|
if (action == "") {
|
|
action = "other";
|
|
}
|
|
HTTPClient http;
|
|
http.begin(POST_URL+"/scan");
|
|
http.addHeader("Content-Type", "application/json");
|
|
|
|
String payload =
|
|
"{"
|
|
"\"uid\":\"" + uid + "\","
|
|
"\"location_id\":\"" + String(LOCATION_ID) + "\","
|
|
"\"action\":\"" + action + "\""
|
|
"}";
|
|
|
|
int code = http.POST(payload);
|
|
|
|
// Serial.print("HTTP Code: ");
|
|
// Serial.println(code);
|
|
|
|
http.end();
|
|
|
|
return code > 0;
|
|
}
|
|
bool checkBathroom() {
|
|
|
|
if (!ethernetOK && !wifiOK) return false;
|
|
|
|
HTTPClient http;
|
|
http.begin(POST_URL+"/lights/bathroom/" + String(LOCATION_ID));
|
|
http.addHeader("Content-Type", "application/json");
|
|
|
|
|
|
|
|
int code = http.GET();
|
|
|
|
// Serial.print("HTTP Code: ");
|
|
// Serial.println(code);
|
|
|
|
http.end();
|
|
|
|
return code == 202;
|
|
}
|
|
|
|
// =========================
|
|
// SETUP
|
|
// =========================
|
|
void setup() {
|
|
|
|
Serial.begin(115200);
|
|
delay(3000);
|
|
|
|
Serial.println("\nBooting RFID Scanner...");
|
|
|
|
// RC522 SPI
|
|
softSPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, SS_PIN);
|
|
|
|
pinMode(RST_PIN, OUTPUT);
|
|
digitalWrite(RST_PIN, HIGH);
|
|
|
|
mfrc522.PCD_Init();
|
|
Serial.println("RC522 ready");
|
|
|
|
// NETWORK
|
|
checkEthernet();
|
|
|
|
if (!ethernetOK) {
|
|
connectWiFi();
|
|
}
|
|
pinMode(1, INPUT_PULLUP);
|
|
pinMode(2, INPUT_PULLUP);
|
|
pinMode(3, INPUT_PULLUP);
|
|
pinMode(48, OUTPUT);
|
|
}
|
|
|
|
// =========================
|
|
// LOOP
|
|
// =========================
|
|
void loop() {
|
|
// buttonState = digitalRead(1);/
|
|
if (checkBathroom()){
|
|
digitalWrite(48, LOW);
|
|
}
|
|
if (digitalRead(1) == LOW) { // Button is pressed
|
|
action = "bathroom";
|
|
delay(200); // Simple debounce
|
|
}
|
|
if (digitalRead(2) == LOW) { // Button is pressed
|
|
action = "other";
|
|
delay(200); // Simple debounce
|
|
}
|
|
if (digitalRead(3) == LOW) { // Button is pressed
|
|
action = "office";
|
|
delay(200); // Simple debounce
|
|
}
|
|
if (!mfrc522.PICC_IsNewCardPresent()) {
|
|
delay(50);
|
|
return;
|
|
}
|
|
|
|
if (!mfrc522.PICC_ReadCardSerial()) {
|
|
delay(50);
|
|
return;
|
|
}
|
|
|
|
// UID build
|
|
String uidString = "";
|
|
|
|
for (byte i = 0; i < mfrc522.uid.size; i++) {
|
|
if (mfrc522.uid.uidByte[i] < 0x10) {
|
|
uidString += "0";
|
|
}
|
|
uidString += String(mfrc522.uid.uidByte[i], HEX);
|
|
}
|
|
|
|
uidString.toUpperCase();
|
|
|
|
Serial.print("Card UID: ");
|
|
Serial.println(uidString);
|
|
|
|
// send to server
|
|
bool ok = sendHTTP(uidString, action);
|
|
action = "";
|
|
if (ok) {
|
|
Serial.println("Sent OK");
|
|
} else {
|
|
Serial.println("Send FAILED");
|
|
}
|
|
|
|
mfrc522.PICC_HaltA();
|
|
delay(2000);
|
|
}
|