diff --git a/ResQTemp/Circuit/circuit-diagram.jpeg b/ResQTemp/Circuit/circuit-diagram.jpeg new file mode 100644 index 0000000..6394e69 Binary files /dev/null and b/ResQTemp/Circuit/circuit-diagram.jpeg differ diff --git a/ResQTemp/README.md b/ResQTemp/README.md index 64ce47e..4e01a41 100644 --- a/ResQTemp/README.md +++ b/ResQTemp/README.md @@ -5,7 +5,7 @@ **Submitted To:** Prof. Ghulam Mustafa **Submitted By:** - 🧠 *Moavia Amir* (2k24_BSAI_72) — [📧 contactmuawia@gmail.com](mailto:contactmuawia@gmail.com) -- ⚙️ *Muhammad Dawood* (2k24_BSAI_31) — [📧 muhammaddawood@vu.edu.pk](mailto:muhammad.dawood@vu.edu.pk) +- ⚙️ *Muhammad Dawood* (2k24_BSAI_31) — [📧 Mirzamuhammaddawood0098@gmail.com](mailto:Mirzamuhammaddawood0098@gmail.com) --- diff --git a/ResQTemp/RQT-Proposal.pdf b/ResQTemp/RQT-Proposal.pdf deleted file mode 100644 index 00d6a66..0000000 Binary files a/ResQTemp/RQT-Proposal.pdf and /dev/null differ diff --git a/ResQTemp/assembly/esp.c++ b/ResQTemp/assembly/esp.c++ new file mode 100644 index 0000000..f665fa4 --- /dev/null +++ b/ResQTemp/assembly/esp.c++ @@ -0,0 +1,332 @@ +#include +#include +#include +#include + +#define GREEN_LED D1 +#define RED_LED D2 +#define BLUE_LED D3 +#define BUZZER D4 +#define LM35_PIN A0 + +const char* ssid = "ResQTemp"; +const char* password = "11223344"; +ESP8266WebServer server(80); + +const float REAL_TEMP_THRESHOLD = 33.0; +const unsigned long HOLD_TIME_REAL = 5000UL; +const unsigned long HOLD_TIME_DEMO = 10000UL; +const unsigned long LOOP_PERIOD_MS = 500UL; + +float temperature = REAL_TEMP_THRESHOLD - 5; +bool demoMode = false; +bool alertSent = false; +bool isGsmActive = false; +bool cancelCallFlag = false; +unsigned long tempStartTime = 0; +unsigned long lastLoopTime = 0; + +const int EEPROM_DEMO_ADDRESS = 0; +const int EEPROM_LOG_COUNT_ADDRESS = 1; +String phoneNumber = "03218010098"; + +const char PAGE[] PROGMEM = R"====( + + + + +ResQTemp + + + +
+

ResQTemp System

+
+
+
--
+
Waiting...
+
+
+
+ + + + +
+
Location: NFC-IET Multan Lab 114 AI Depart
+
+
+ + + +)===="; + +void runGsmSequence(){ + static int gsmState=0; + static unsigned long stateStartTime=0; + + if(cancelCallFlag){ // Stop GSM immediately + gsmState = 0; + cancelCallFlag = false; + isGsmActive = false; + return; + } + + if(!isGsmActive) return; + + unsigned long now = millis(); + unsigned long dialDelay = demoMode ? HOLD_TIME_DEMO : HOLD_TIME_REAL; + + switch(gsmState){ + case 0: + stateStartTime = now; + gsmState = 1; + break; + case 1: + if(now - stateStartTime >= 500){ + Serial.println("AT+CMGF=1"); + stateStartTime = now; + gsmState = 2; + } + break; + case 2: + if(now - stateStartTime >= 500){ + Serial.print("AT+CMGS=\""); + Serial.print(phoneNumber); + Serial.println("\""); + stateStartTime = now; + gsmState = 3; + } + break; + case 3: + if(now - stateStartTime >= 500){ + Serial.println("ResQTemp Emergency: Temperature has crossed the safe limit!"); + stateStartTime = now; + gsmState = 4; + } + break; + case 4: + if(now - stateStartTime >= 300){ + Serial.write(26); // CTRL+Z + stateStartTime = now; + gsmState = 5; + } + break; + case 5: + if(now - stateStartTime >= dialDelay){ + Serial.print("ATD"); + Serial.print(phoneNumber); + Serial.println(";"); + stateStartTime = now; + gsmState = 6; + } + break; + case 6: + if(now - stateStartTime >= 15000){ + Serial.println("ATH"); + isGsmActive = false; + gsmState = 0; + } + break; + default: + gsmState = 0; + break; + } + + server.handleClient(); +} + +void startGsmAlert(){ + if(!isGsmActive){ + isGsmActive=true; + cancelCallFlag=false; + unsigned int count; + EEPROM.get(EEPROM_LOG_COUNT_ADDRESS,count); + count++; + EEPROM.put(EEPROM_LOG_COUNT_ADDRESS,count); + EEPROM.commit(); + } +} + +void handleRoot(){ server.send_P(200,"text/html",PAGE); } +void handleResetEsp(){ server.send(200,"text/plain","Restarting..."); delay(500); ESP.restart(); } +void handleData(){ + StaticJsonDocument<200> doc; + float limit = REAL_TEMP_THRESHOLD; + String state = "NORMAL"; + unsigned long holdTime = demoMode ? HOLD_TIME_DEMO : HOLD_TIME_REAL; + unsigned long remainingSec = 0; + + if(isGsmActive) state = "CALLING"; + else if(temperature>=limit){ + state = alertSent ? "CALLING" : "ALARM"; + if(tempStartTime>0) remainingSec = max(0UL,(holdTime-(millis()-tempStartTime))/1000UL); + } + + doc["temp"] = String(temperature,1); + doc["demo"] = demoMode ? "true" : "false"; + doc["state"] = state; + doc["limit"] = String(limit,1); + doc["countdown"] = remainingSec; + + String json; serializeJson(doc,json); + server.send(200,"application/json",json); +} + +void handleDemo(){ + demoMode = !demoMode; + EEPROM.write(EEPROM_DEMO_ADDRESS, demoMode?1:0); + EEPROM.commit(); + alertSent=false; + tempStartTime=0; + isGsmActive=false; + cancelCallFlag=false; + temperature = REAL_TEMP_THRESHOLD - 5; + server.send(200,"text/plain", demoMode?"DEMO_ON":"DEMO_OFF"); +} + +void handleCancelCall(){ + if(isGsmActive || alertSent){ + cancelCallFlag = true; + alertSent = false; + isGsmActive = false; + } + server.send(200,"text/plain","CALL_CANCELED"); +} + + +void setup(){ + Serial.begin(9600); + delay(1000); + + EEPROM.begin(32); + demoMode = (EEPROM.read(EEPROM_DEMO_ADDRESS)==1); + + pinMode(GREEN_LED,OUTPUT); + pinMode(RED_LED,OUTPUT); + pinMode(BLUE_LED,OUTPUT); + pinMode(BUZZER,OUTPUT); + + digitalWrite(GREEN_LED,LOW); + digitalWrite(RED_LED,LOW); + digitalWrite(BLUE_LED,LOW); + digitalWrite(BUZZER,LOW); + WiFi.mode(WIFI_AP); + WiFi.softAP(ssid, password); + + server.on("/", handleRoot); + server.on("/data", handleData); + server.on("/demo", handleDemo); + server.on("/reset", handleResetEsp); + server.on("/cancelCall", handleCancelCall); + + server.begin(); +} + +void readTemperature(){ + if(!demoMode) temperature = analogRead(LM35_PIN)*(3.3/1024.0)*100.0; +} + +void simulateTempRise(){ + if(demoMode) temperature = min(temperature + 0.5 * (LOOP_PERIOD_MS/1000.0), REAL_TEMP_THRESHOLD + 5.0); +} + +void handleAlert(float limit, unsigned long hold){ + unsigned long now = millis(); + if(temperature < limit){ + alertSent=false; + tempStartTime=0; + isGsmActive=false; + cancelCallFlag=false; + digitalWrite(GREEN_LED,HIGH); + digitalWrite(RED_LED,LOW); + digitalWrite(BLUE_LED,LOW); + digitalWrite(BUZZER,LOW); + } else { + digitalWrite(GREEN_LED,LOW); + digitalWrite(RED_LED,HIGH); + digitalWrite(BLUE_LED,LOW); + digitalWrite(BUZZER,HIGH); + if(tempStartTime==0) tempStartTime=now; + if(now-tempStartTime>=hold && !alertSent && !isGsmActive && !cancelCallFlag){ + alertSent=true; + startGsmAlert(); + } + if(alertSent){ + digitalWrite(GREEN_LED,LOW); + digitalWrite(RED_LED,LOW); + digitalWrite(BLUE_LED,HIGH); + digitalWrite(BUZZER,LOW); + } + } +} + +void loop(){ + runGsmSequence(); + server.handleClient(); + unsigned long now = millis(); + if(now - lastLoopTime >= LOOP_PERIOD_MS){ + lastLoopTime = now; + readTemperature(); + simulateTempRise(); + unsigned long hold = demoMode ? HOLD_TIME_DEMO : HOLD_TIME_REAL; + handleAlert(REAL_TEMP_THRESHOLD, hold); + } +} \ No newline at end of file diff --git a/ResQTemp/doc/RQT-Report.pdf b/ResQTemp/doc/RQT-Report.pdf new file mode 100644 index 0000000..841dc0e Binary files /dev/null and b/ResQTemp/doc/RQT-Report.pdf differ diff --git a/ResQTemp/esp_web/main.html b/ResQTemp/esp_web/main.html index e69de29..c404297 100644 --- a/ResQTemp/esp_web/main.html +++ b/ResQTemp/esp_web/main.html @@ -0,0 +1,85 @@ + + + + +ResQTemp + + + +
+

ResQTemp System

+
+
+
--
+
Waiting...
+
+
+
+ + + + +
+
Location: NFC-IET Multan Lab 114 AI Depart
+
+
+ + +