The ESP-12 is soldered to a smd adapter with onboard LDO from Electrodragon. I am powering the relay and esp via a 5V 1A power brick.
This example works but I may work on stream lining it a bit. Possibly add more features.
/* IoT Garage Door Opener
/ This is a sketch for the ESP8266, ESP-12 in my case, using the Arduino IDE for ESP8266. This sketch will allow you to see the current
/ state of the garage door using a magnetic switch on the garage door, one side connected to pin 4 of the ESP-12 and the other side
/ connected to ground. Doing this pulls pin 4 LOW when the Garage Door is closed completely. The webpage updates every 10 seconds
/ in order to update the status of the door. It is possible to add another magnetic switch to show when the door is fully open by
/ tieing it to another pin the same way. You would have to change the code for the new pin.
/ Activating the button for the door requires a 4 digit pass code.
/
/ To open the door I am using a High level triggered single 5V relay. I am pulling pin 5 LOW in setup then high for 1 second to
/ trigger the door. ESP os on a smd adapter frpm Electrodragon. I am powering the ESP and the relay using a 5V 1A power adapter.
*/
#include <ESP8266WiFi.h>
int openClosePin = 5;
int statusPin = 4;
String doorClosed = "<form action='/GDOOR=ACTIVATE'><input type='submit' VALUE='Open the Door' style='height:50px; width:225px'></form>";
String doorOpen = "<form action='/GDOOR=ACTIVATE'><input type='submit' VALUE='Close the Door' style='height:50px; width:225px'></form>";
String passCode = "<form METHOD=get action=''><input type=password name='code' size='4' maxlength='4'><input type=submit name='Submit' value='Code'></form>";
WiFiServer server(8100);
//*-- IoT Information
const char* SSID = "network_name";
const char* PASS = "network_pass";
char codeOK='0';//start Code is blank....
void setup() {
Serial.begin(115200);
pinMode(openClosePin, OUTPUT);
pinMode(statusPin, INPUT);
digitalWrite(openClosePin, LOW);
delay(50);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(SSID);
WiFi.begin(SSID, PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
delay(1000);
//Start the server
server.begin();
Serial.println("Server started");
//Print the IP Address
Serial.print("Use this URL to connect: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
delay(1000);
}
void loop() {
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}
// Wait until the client sends some data
Serial.println("new client");
while(!client.available()){
delay(1);
}
// Read the first line of the request
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Set the code
if (request.indexOf("/?code=xxxx&Submit=Code")>0) {
codeOK='1';
Serial.print("codeOK=");
Serial.println(codeOK);
}
// Match the request
if (codeOK == '1') {
if (request.indexOf("/GDOOR=ACTIVATE") != -1) {
digitalWrite(openClosePin, HIGH);
Serial.println("Relay is On");
delay(1000);
digitalWrite(openClosePin, LOW);
Serial.println("Relay is Off");
codeOK='0';
}
}
// Return the response
client.println("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
//client.println("Content-Type: text/html");
//client.println(""); // do not forget this one
client.println("<!DOCTYPE HTML>\r\n<html>\r\n<head>\r\n<title>IoT Garage Door</title>");
//client.println("<html>");
//client.println("<head>");
//client.println("<title>IoT Garage Door</title>");
client.println("<meta name='viewport' content='width=device-width', initial-scale='1'>");
client.println("<meta http-equiv='refresh' content='9; URL=http://xxx.xxx.xxx.xxx:8100'>\r\n</head>");
//client.println("</head>");
client.println("<body>\r\n<center>\r\n<h1>IoT Garage Door Opener</h1>\r\n<hr>\r\n<br><form name='counter'>Refreshing page in: <input type='text' size='1' name='d2'>seconds</form><br>\r\nGarage Door is now: ");
//client.println("<center>");
//client.println("<h1>IoT Garage Door Opener</h1>");
//client.println("<hr>");
//client.print("<br>");
//client.print("Garage Door is now: ");
int closed;
int doorState = digitalRead(statusPin);
if (doorState == LOW) {
client.print("<span style='background-color:#00FF00; font-size:18pt'>Closed</span>\r\n<br>");
Serial.println("Closed");
closed = 1;
}
else {
client.print("<span style='background-color:#FF0000; font-size:18pt'>Open</span>\r\n<br>");
Serial.println("Open");
closed = 0;
}
client.println("<script>\r\n<!--\r\n'//'\r\nvar milisec=0\r\nvar seconds=11\r\ndocument.counter.d2.value='15'\r\nfunction display(){\r\nif (milisec<=0){\r\nmilisec=9\r\nseconds-=1\r\n}\r\nif (seconds<=-1){\r\nmilisec=0\r\nseconds+=1\r\n}\r\nelse\r\nmilisec-=1\r\ndocument.counter.d2.value=seconds\r\nsetTimeout('display()',100)\r\n}\r\ndisplay()\r\n-->\r\n</script>\r\n<br><br>");
client.println(passCode);
client.println("<br>");
if (closed == 1) {
client.println(doorClosed + "</center>\r\n</html>");
} else
{
client.println(doorOpen + "</center>\r\n</html>");
}
//client.println("</center>\r\n</html>");
//client.println("</html>");
delay(1);
Serial.println("Client disconnected");
Serial.println("");
}