diff --git a/esp32/app.ino b/esp32/app.ino new file mode 100644 index 0000000..6332860 --- /dev/null +++ b/esp32/app.ino @@ -0,0 +1,221 @@ +#include +#include +#include +#include + +#include +#include +#include + +// ========================= +// 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); +}