esp-01-wifi-ir-relay
  1. #include <dummy.h>
  2. #include <Arduino.h>
  3. #include <IRremoteESP8266.h>
  4. #include <IRrecv.h>
  5. #include <IRutils.h>
  6. #include <ESP8266WiFi.h>
  7. #include <ESP8266WebServer.h>
  8.  
  9. //ir receiver
  10. const uint16_t kRecvPin = 0;
  11. IRrecv irrecv(kRecvPin);
  12. decode_results results;
  13.  
  14. //wifi credentials, change to your wifi credentials
  15. const char* ssid = "YOUR-SSID";
  16. const char* password = "YOUR-PASSWORD";
  17.  
  18. //pin definition
  19. //output to driving relay
  20. int RELAY = 2;
  21. //relay toggling array
  22. int swval[] = {0};
  23. //physical button
  24. int BUTTON = 3;
  25.  
  26. //start web server
  27. ESP8266WebServer server(80);
  28.  
  29. //http auth credentials, change USER and PASS to you requested login info
  30. const char* www_username = "USER";
  31. const char* www_password = "PASS";
  32. const char* www_realm = "ESP-01 relay realm";
  33. string authFailResponse = "401 Unauthorized";
  34.  
  35. //html main page
  36. const char MAIN_page[] PROGMEM = R"=====(
  37. <!DOCTYPE HTML>
  38. <html><head>
  39. <meta http-equiv='refresh' content='5;url=/'>
  40. <meta name='viewport' content='width=device-width, initial-scale=0.8, maximum-scale=1'>
  41. <link rel='bookmark icon' href='data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBI
  42. WXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAYAAAAGAB4TKWmAAAG7klEQVRIx3WVeWxc1RWHv3ff
  43. m+3N5hmPZ+zYsWPHscnCEshGYkiBQBASjdqillYBqa0ojdQWpFL+qKqGSlWrVqJL1DatulCpSalQ
  44. C6lUEEkBBQhZaNIQk+AEL8k4ccae8XjWt8ybee/2D6MqCDjS0dXv6J7vSFe656fwibENyGtKYqSv
  45. rafnxkQyPqzrgQ4pJaZpz5eK5fOVmZkzsnwsCx0teOVjKdpHKzugdVmLrth8y4o1Q19avbJ329BA
  46. urcrHdXDIb8AiWE6Xi5fNS9Mzk6ffW/jKxPnxp+tT1ZPoi1p0TrwIZxyrdBX/BhzfrJ9aP2t3xgZ                                                                                                                                                                
  47. uf7RLeuWdy3taiPgEyCvafqgq+G4ZHMljpx4P3fkyJnfTZz6z69Cqf6iNflDwAFAXbyaJnnDU1jl                                                                                                                                                                
  48. q70333HXL3bsuP3rW9YPx/WQTsNRMG0wG+C0wHag/oFutARhXWdwYEk0lU6N1F1/f27i/Nux/h0V                                                                                                                                                                
  49. O38KsBcHRJd/k8rspdSNd97z8+333vaFvu4uYViLYMtZhAkFNgxDZwIuzkK5DqYDhgVmQ5BIJER7                                                                                                                                                                
  50. un1N2XK7s6MnDkeW3GY65aOoofhOjNxv1MGtjz+x+Y4tuzra06JSl1gNMGxJ3VrMZBRuXakQ0+Hc                                                                                                                                                                
  51. tCRbkJi2xGwsnnVLEghFCUUj15UNx86f/u6bettOqSVuGiFYHF6/fPXqr0X0iDo3V158ZAkRXaW/                                                                                                                                                                
  52. y0+u6FIzBKADYJgW8ZCCJuDibBPX9QCQUhKNtakDK1c9spD73svBZPtxtZb9l7ps067vLBsc2GZW                                                                                                                                                                
  53. 6xh1A8u0CPpafPGuGPdv0vGrTS5dNdi4SseTMHnZ4DMjOhtX+vBch7PjJao1A8syMQ0LLRiI1gzL                                                                                                                                                                
  54. unx41yEt3PdEfzSV3latVLGrNYQQBPwaO+8ZYP11Ok7TY2xqgUqlgZQdgGS2UGF8GjatSXDfpii1                                                                                                                                                                
  55. msH+ly/juh6u66IG/ESSqW16z+MDIrakb63U/L25mavk83nm8gW62z22rk0iJex/aYo/vTBGcaGM                                                                                                                                                                
  56. 50mkhKnLRZ7a+w4vHZlBFQr3bU7R2eYyN1egUCgwl5tFCl9vJNN9kxaIJYcbTTdUni8iW02EqrJh                                                                                                                                                                
  57. 1TARXeP9bIU/HxhjYcHmnbEGL7x2EYAzYzkKJZs9+0dZNRCjvzvKrWvaOHx8Es9zkUAongr5o/Fh                                                                                                                                                                
  58. TdG0TrOcE7X5SwgtQjgSZbA3BsCpc3NMXy0hhEIu32D3r08A4HoSBZjIWrz97iz93VFW9MWQXhPL                                                                                                                                                                
  59. cvCkROhNofj8nZqiClrVK9SnD+KJCDK1DB93ALBQqlGrVfD5fAihoijXfnxJs+VRLBkA+FUPu16g                                                                                                                                                                
  60. Vi7iNRbQlGG0UEpoKCKvBuOeUP2iZZeozbfI5XLAIH0ZH2ZxgqbnQ6h+FKH9f09Iz8WvSnrTtwFw                                                                                                                                                                
  61. deYK89ljNK0SAgc6eyVCzArXtc9rervliywBLUzL9fH6sTEARjYMcufGAVpmFceq0rDKNMwyDWMB                                                                                                                                                                
  62. p1Zk6y2djKxbBsDrR8/StBsgNLRQO1o4bXnSOy/sWvG0Gope1juGQAuDpnPg0Cgnz1ykLabz9O4H                                                                                                                                                                
  63. +fS96wmGwiD9IH0Eg2Hu334zT3//87TFdU6NXuLAobPgC4MaIpjoR4u0Tzft6mkFMtrww/v2NI3q                                                                                                                                                                
  64. riunX8SxG6AEuHvrTfz+Jzvp60lQqdkcOXmJ0fNzANxwXYaRdcuIR4NkZ0o88uR+/v3GKMgGqirJ                                                                                                                                                                
  65. DG8mmOjaO/Xc7m8pQ185iF2a3xJJ9f9jfvxUpnDxXSQ+UALcvnGY3Y/dzci6Xvw+9UN73mm6vHVy                                                                                                                                                                
  66. mqf2vMobJy6AdFBkg1h6KakVN8816vMP+OOJI6qjLKPw5rO55I1bY3py6ZamZQvHskENks0ZvHh4                                                                                                                                                                
  67. gv++N0thwaJQshnPlnjl6EV+9sxxfvqHtzg/tQBCBRT0RIaOwbWu4lP2ZA/+dl/LE54C0P25v9Cs                                                                                                                                                                
  68. l9KpwQ17XVt+dvbCKLX5PCBRNY1QSCceixIJ6yiKgmHa1Op1TMOg2XSQEkKxNjqWD+MP+58vX3l3                                                                                                                                                                
  69. l6bH81eff3jRD2qTr9Gz/UmjOnvh7XCqqzeS7hvSNJ+g5RCLhOnMZMhkMiST7cRicSKRMMFAACEU                                                                                                                                                                
  70. PEUlmukhtWKl64v4/1mbn/h2bOmqmezfHgK3cY1lpm5naOePqM5cyCR7rn9M80W/Kiw7HZY28aBG                                                                                                                                                                
  71. PBohHAojhIJl21Trdcpmg4qr0vT58y3X+GNl9sIvo53L58b//gPIvfpRTwZof2AvVmnG17XqUxui                                                                                                                                                                
  72. bV0PxcORO1ORYE9HLBhsC/sVoShUTEfmK5ZdqJpXSvXaa7Xy3L658aMngm2dzeJzj36y6V8bsS//
  73. lUZhyp/qv2UgGu9YGw5HVoaCgSRILLuxUDeMsVq5cHo++85UINXv1J558GM5/wMruCq7ur5YjgAA
  74. AC56VFh0Y3JlYXRlLWRhdGUAAHjaMzIwsNA1MNM1MggxsLAyNrEytdA2MLIyMAAAQhEFGJDcnCMA
  75. AAAuelRYdG1vZGlmeS1kYXRlAAB42jMyMLDQNTDTNTIIMbCwMjaxMrXQNjCyMjAAAEIRBRjy5Gvc
  76. AAAAAElFTkSuQmCC' type='image/x-icon'>
  77.  
  78. <title>WEB page title</title></head><body bgcolor='#000000' text='silver'><center>
  79. <h2><strong>ESP-01 relay</strong></h2>
  80.  
  81. <!--relay status-->
  82. <h2>Relay is: <iframe src='/STAT' name='frame' width='100' height='40' frameborder='0' scrolling='no'></iframe></h2><br>
  83.  
  84. <!--relay on-->
  85. <a target='frame' href='/ON'><button><font size='18px'><br> TURN <strong>ON</strong> <br> </font></button></a><br><br><br>
  86.  
  87. <!--relay off-->
  88. <a target='frame' href='/OFF'><button><font size='18px'><br>TURN <strong>OFF</strong><br> </font></button></a>
  89.  
  90. <!--relay toggle-->
  91. <a target='frame' href='/TOG'><button><font size='18px'><br><strong>TOGGLE</strong><br> </font></button></a>
  92.  
  93. </center></body></html>
  94. )=====";
  95.  
  96. //relay toggle loop
  97. //for custom relay leave as is, for ebay relay change LOW to HIGH and HIGH to LOW
  98. void relayswitch(int i,int j){
  99. if(swval[j]==1){
  100. digitalWrite(i, HIGH);
  101. swval[j]=0;
  102. }else if(swval[j]==0){
  103. digitalWrite(i, LOW);
  104. swval[j]=1;
  105. }
  106. }
  107.  
  108. void STAT() {
  109. //for custom relay leave as is, for ebay relay change LOW to HIGH
  110. if (digitalRead(RELAY)==LOW) {
  111. server.send(200, "text/html", "<strong><font size='6px' color='red'> OFF </font></strong>");
  112. }
  113. //for custom relay leave as is, for ebay relay change HIGH to LOW
  114. if (digitalRead(RELAY)==HIGH) {
  115. server.send(200, "text/html", "<strong><font size='6px' color='green'> ON </font></strong>");
  116. }
  117. }
  118.  
  119. void setup(void) {
  120. //ir receiver
  121. irrecv.enableIRIn();
  122. delay(50);
  123.  
  124. //set pin mode
  125. pinMode(RELAY, OUTPUT);
  126. //for custom relay leave as is, for ebay relay change LOW to HIGH
  127. digitalWrite(RELAY, LOW);
  128. pinMode(BUTTON, INPUT);
  129.  
  130. //nastaveni wifi
  131. WiFi.mode(WIFI_STA);
  132. WiFi.begin(ssid, password);
  133. //if you want to use static ip, change it here, if you want to use DHCP, comment out next four lines
  134. IPAddress ip(192,168,1,222);
  135. IPAddress gateway(192,168,1,1);
  136. IPAddress subnet(255,255,255,0);
  137. WiFi.config(ip, gateway, subnet);
  138. delay(50);
  139.  
  140. //connecting loop, if is uncommented, physical button and ir will not work without wifi connection, leave as is ideally
  141. //while (WiFi.status() != WL_CONNECTED)
  142. //{
  143. //delay(1000);
  144. //}
  145.  
  146. //web auth and pages
  147. server.on("/", []() {
  148. if (!server.authenticate(www_username, www_password)) {
  149. return server.requestAuthentication(BASIC_AUTH, www_realm, authFailResponse);
  150. }
  151. server.send(200, "text/html", MAIN_page);
  152. });
  153.  
  154. server.on("/ON", []() {
  155. if (!server.authenticate(www_username, www_password)) {
  156. return server.requestAuthentication(BASIC_AUTH, www_realm, authFailResponse);
  157. }
  158. server.send(200, "text/html", "<strong><font size='6px' color='green'> ON </font></strong>");
  159. //for custom relay leave as is, for ebay relay change HIGH to LOW
  160. digitalWrite(RELAY, HIGH);
  161. swval[1] = 1;
  162. });
  163.  
  164. server.on("/OFF", []() {
  165. if (!server.authenticate(www_username, www_password)) {
  166. return server.requestAuthentication(BASIC_AUTH, www_realm, authFailResponse);
  167. }
  168. server.send(200, "text/html", "<strong><font size='6px' color='red'> OFF </font></strong>");
  169. //for custom relay leave as is, for ebay relay change LOW to HIGH
  170. digitalWrite(RELAY, LOW);
  171. swval[1] = 0;
  172. });
  173.  
  174. server.on("/TOG", []() {
  175. if (!server.authenticate(www_username, www_password)) {
  176. return server.requestAuthentication(BASIC_AUTH, www_realm, authFailResponse);
  177. }
  178. server.sendHeader("Location", string("/"), true);
  179. server.send(302, "text/plain", "");
  180. relayswitch(RELAY, 1);
  181. });
  182.  
  183. server.on("/STAT", STAT);
  184.  
  185. server.begin();
  186. }
  187.  
  188. void loop(void) {
  189. //ir receiver and hex codes
  190. if (irrecv.decode(&results)) {
  191. serialPrintUint64(results.value, HEX);
  192. //use your own HEX code for desired button on ir remote control, you can scan codes by using IRrecvDumpV3 from library IRremoteESP8266
  193. if (results.value==0xAABBCCDD) {
  194. relayswitch(RELAY, 1);
  195. }
  196. irrecv.resume();
  197. }
  198. delay(100);
  199.  
  200. //physical button, leave as is
  201. if (digitalRead(BUTTON)==HIGH){
  202. relayswitch(RELAY, 1);
  203. delay(200);
  204. }
  205.  
  206. //start web server
  207. server.handleClient();
  208. }
Parsed in 0.087 seconds