· 5 months ago · May 01, 2025, 01:55 PM
1#include <ESP8266WiFi.h>
2#include <SoftwareSerial.h>
3
4// WiFi credentials
5const char* ssid = "WIFI_NAMW;
6const char* password = "WIFI_PASSWORD";
7
8// Trusted phone number
9String trustedNumber = "+91XXXXXXXXXX"; // Replace with your SIM number
10
11// GPIO definitions for NodeMCU
12#define RELAY1 5 // D1
13#define RELAY2 4 // D2
14#define RELAY3 14 // D5
15#define RELAY4 12 // D6
16#define GSM_RX 13 // D7 (NodeMCU receives from GSM TX)
17#define GSM_TX 15 // D8 (NodeMCU sends to GSM RX, use level shifter!)
18
19// Relay pins array
20const int relayPins[4] = {RELAY1, RELAY2, RELAY3, RELAY4};
21
22// GSM Serial
23SoftwareSerial gsm(GSM_RX, GSM_TX);
24
25// Web server
26WiFiServer server(80);
27
28void setup() {
29 Serial.begin(9600);
30 gsm.begin(9600);
31
32 // Initialize GSM for SMS text mode
33 delay(1000);
34 gsm.println("AT");
35 delay(500);
36 gsm.println("AT+CMGF=1"); // Set SMS text mode
37 delay(500);
38 gsm.println("AT+CNMI=2,2,0,0,0"); // Show new SMS on serial
39 delay(500);
40
41 // Relay pin setup
42 for (int i = 0; i < 4; i++) {
43 pinMode(relayPins[i], OUTPUT);
44 digitalWrite(relayPins[i], HIGH); // Active LOW = OFF
45 }
46
47 // Connect to WiFi
48 WiFi.begin(ssid, password);
49 Serial.print("Connecting to WiFi");
50 while (WiFi.status() != WL_CONNECTED) {
51 delay(500);
52 Serial.print(".");
53 }
54
55 server.begin();
56 Serial.println("\n✅ WiFi connected");
57 Serial.print("📡 IP Address: ");
58 Serial.println(WiFi.localIP());
59}
60
61void loop() {
62 handleSMS(); // Handle SMS commands
63 handleWebRequest(); // Handle web browser control
64}
65
66// Handle incoming SMS from trusted number
67void handleSMS() {
68 static String buffer = "";
69
70 while (gsm.available()) {
71 char c = gsm.read();
72 Serial.write(c); // Debug output
73 buffer += c;
74
75 // Check if there's a new SMS notification
76 if (buffer.indexOf("+CMT:") != -1) {
77 int senderStart = buffer.indexOf("\"") + 1;
78 int senderEnd = buffer.indexOf("\"", senderStart);
79 String senderNumber = buffer.substring(senderStart, senderEnd);
80 senderNumber.trim();
81
82 Serial.println("📞 Sender: " + senderNumber);
83
84 int msgStart = buffer.indexOf("\n", senderEnd) + 1;
85 String messageBody = buffer.substring(msgStart);
86 messageBody.trim();
87 messageBody.toUpperCase();
88
89 Serial.println("📩 Message: " + messageBody);
90
91 if (senderNumber == trustedNumber) {
92 // Relay control via SMS commands
93 if (messageBody.indexOf("ON1") >= 0) {
94 digitalWrite(relayPins[0], LOW);
95 Serial.println("Relay 1 ON");
96 }
97 if (messageBody.indexOf("OFF1") >= 0) {
98 digitalWrite(relayPins[0], HIGH);
99 Serial.println("Relay 1 OFF");
100 }
101 if (messageBody.indexOf("ON2") >= 0) {
102 digitalWrite(relayPins[1], LOW);
103 Serial.println("Relay 2 ON");
104 }
105 if (messageBody.indexOf("OFF2") >= 0) {
106 digitalWrite(relayPins[1], HIGH);
107 Serial.println("Relay 2 OFF");
108 }
109 if (messageBody.indexOf("ON3") >= 0) {
110 digitalWrite(relayPins[2], LOW);
111 Serial.println("Relay 3 ON");
112 }
113 if (messageBody.indexOf("OFF3") >= 0) {
114 digitalWrite(relayPins[2], HIGH);
115 Serial.println("Relay 3 OFF");
116 }
117 if (messageBody.indexOf("ON4") >= 0) {
118 digitalWrite(relayPins[3], LOW);
119 Serial.println("Relay 4 ON");
120 }
121 if (messageBody.indexOf("OFF4") >= 0) {
122 digitalWrite(relayPins[3], HIGH);
123 Serial.println("Relay 4 OFF");
124 }
125 if (messageBody.indexOf("ONALL") >= 0) {
126 for (int i = 0; i < 4; i++) {
127 digitalWrite(relayPins[i], LOW);
128 }
129 Serial.println("All Relays ON");
130 }
131 if (messageBody.indexOf("OFFALL") >= 0) {
132 for (int i = 0; i < 4; i++) {
133 digitalWrite(relayPins[i], HIGH);
134 }
135 Serial.println("All Relays OFF");
136 }
137 } else {
138 Serial.println("⚠️ Unauthorized sender: " + senderNumber);
139 }
140
141 buffer = ""; // Clear buffer for next message
142 }
143 }
144}
145
146// Handle HTTP requests to control relays
147void handleWebRequest() {
148 WiFiClient client = server.available();
149 if (!client) return;
150
151 while (!client.available()) delay(1);
152
153 String request = client.readStringUntil('\r');
154 client.readStringUntil('\n');
155
156 // Relay control via web
157 if (request.indexOf("/on1") != -1) digitalWrite(relayPins[0], LOW);
158 if (request.indexOf("/off1") != -1) digitalWrite(relayPins[0], HIGH);
159 if (request.indexOf("/on2") != -1) digitalWrite(relayPins[1], LOW);
160 if (request.indexOf("/off2") != -1) digitalWrite(relayPins[1], HIGH);
161 if (request.indexOf("/on3") != -1) digitalWrite(relayPins[2], LOW);
162 if (request.indexOf("/off3") != -1) digitalWrite(relayPins[2], HIGH);
163 if (request.indexOf("/on4") != -1) digitalWrite(relayPins[3], LOW);
164 if (request.indexOf("/off4") != -1) digitalWrite(relayPins[3], HIGH);
165
166 // Simple HTML page for control
167 client.println("HTTP/1.1 200 OK");
168 client.println("Content-Type: text/html");
169 client.println();
170 client.println("<h1>Relay Control Panel</h1>");
171 for (int i = 0; i < 4; i++) {
172 client.print("Relay ");
173 client.print(i + 1);
174 client.print(": <a href='/on");
175 client.print(i + 1);
176 client.print("'>ON</a> | <a href='/off");
177 client.print(i + 1);
178 client.println("'>OFF</a><br>");
179 }
180
181 delay(10);
182 client.stop();
183}
184