ESP8266 webserver using AT commands, can work with any mbed platform, tested on STM32F407 and LPC1768. Only need to update pin configuration to make it work for respective board.

Dependencies:   mbed

Objective was to write ESP8266 interfacing code that should be able to work with any microcontroller and any C/C++ compiler. Speed was of prime importance, I've tested several mbed examples for ESP8266, all work too slow, is hard to run real server with available libraries, so I've written my own interrupt based functions. ESP8266 webserver using AT commands, can work with any mbed platform, tested on STM32F407 and LPC1768. Only need to update pin configuration to make it work for respective board. Also tested on PIC18 using mikroC PRO for PIC. Here are some videos that show how this project works

Interfacing esp8266 with stm32f407 https://youtu.be/nabJv9hEc64

Interfacing esp8266 with stm32f407 and using Android app for voice commands https://youtu.be/svKGvChiNWk

Interfacing ESP8266 with LPC1768 https://youtu.be/FOXCza6HQII

Interfacing ESP8266 with PIC18 https://youtu.be/F53VvpxJuWk

Complete course in progress, few tutorials uploaded already, https://www.youtube.com/watch?v=QVhWVu8NnZc&list=PLl7pvqnJQnZCON2TmYFSuAKT38ztHoK86

For Suggestion, Discussion, questions, join my microcontroller projects group https://web.facebook.com/groups/picMicrocontrollers/

Committer:
programmer5
Date:
Sun Jun 18 09:57:20 2017 +0000
Revision:
0:89cb04c5c613
ESP8266 webserver using AT commands, can work with any mbed platform, tested on STM32F407 and LPC1768. Only need to update pin configuration to make it work for respective board.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
programmer5 0:89cb04c5c613 1 #include "mbed.h"
programmer5 0:89cb04c5c613 2
programmer5 0:89cb04c5c613 3 #define BUFFER_SIZE 3000
programmer5 0:89cb04c5c613 4 #define REQ_LINE_BUFF_SIZE 100
programmer5 0:89cb04c5c613 5 #define UNKNOWN 0
programmer5 0:89cb04c5c613 6 #define OK 1
programmer5 0:89cb04c5c613 7 #define ERROR 2
programmer5 0:89cb04c5c613 8 #define FAIL 3
programmer5 0:89cb04c5c613 9 #define READY 4
programmer5 0:89cb04c5c613 10 #define READY_TO_WRITE_TCP 5
programmer5 0:89cb04c5c613 11
programmer5 0:89cb04c5c613 12
programmer5 0:89cb04c5c613 13 const char get_analog_outputs_status[]="/analog_outputs";
programmer5 0:89cb04c5c613 14 const char get_Toggle_Output[]="/digital_outputs/toggle";
programmer5 0:89cb04c5c613 15 const char get_analog_inputs_status[]="/analog_inputs";
programmer5 0:89cb04c5c613 16 const char get_analog_output_update[]="/analog_outputs/update";
programmer5 0:89cb04c5c613 17 const char get_digital_output_status[]="/digital_outputs";
programmer5 0:89cb04c5c613 18 const char get_digital_inputs_html[]="/dinputs.html";
programmer5 0:89cb04c5c613 19 const char get_digital_input_status[]="/digital_inputs";
programmer5 0:89cb04c5c613 20 const char get_index_html[]="/index.html";
programmer5 0:89cb04c5c613 21 const char get_analog_outputs[]="/anoutputs.html";
programmer5 0:89cb04c5c613 22 const char get_analog_inputs_html[]="/aninputs.html";
programmer5 0:89cb04c5c613 23
programmer5 0:89cb04c5c613 24
programmer5 0:89cb04c5c613 25 const char jsonHeader[]="HTTP/1.1 200 OK\n"
programmer5 0:89cb04c5c613 26 "Content-type: application/json\r\n\r\n";
programmer5 0:89cb04c5c613 27
programmer5 0:89cb04c5c613 28 const char textPlainHeader[]="HTTP/1.1 200 OK\n"
programmer5 0:89cb04c5c613 29 "Content-type: text/plain\r\n\r\n";
programmer5 0:89cb04c5c613 30
programmer5 0:89cb04c5c613 31 const char index_html[]="HTTP/1.1 200 OK\n"
programmer5 0:89cb04c5c613 32 "Content-type: text/html\r\n\r\n"
programmer5 0:89cb04c5c613 33 "<!DOCTYPE html>\n<html>\n<head>\n<title>esp</title>\n<link rel=stylesheet type=text/css href=css/style.css>\n<script src=https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js></script>\n<script>$(document).ready(function(){setInterval(\"get_digital_output_status()\",2000)});function get_digital_output_status(){var a=\"/digital_outputs\";$.ajax({url:a,dataType:\"json\",success:function(b){if(b.digital_outputs.dout1==1){$(\"#dout1\").html(\"HIGH\")}else{$(\"#dout1\").html(\"LOW\")}if(b.digital_outputs.dout2==1){$(\"#dout2\").html(\"HIGH\")}else{$(\"#dout2\").html(\"LOW\")}if(b.digital_outputs.dout3==1){$(\"#dout3\").html(\"HIGH\")}else{$(\"#dout3\").html(\"LOW\")}if(b.digital_outputs.dout4==1){$(\"#dout4\").html(\"HIGH\")}else{$(\"#dout4\").html(\"LOW\")}},timeout:2000})}function digital_output_toggle(a){var b=\"/digital_outputs/toggle?pin=\"+a;$.ajax({url:b,dataType:\"text\",success:function(c){if(c==\"1\"){$(\"#\"+a).html(\"HIGH\")}else{if(c==\"0\"){$(\"#\"+a).html(\"LOW\")}else{alert(\"failed to toggle digital output\")}}},timeout:2000})};</script>\n</head>\n<body>\n<header>\n<img src=images/logo.jpg>\n<h1>ESP8266 BASED WEBSERVER</h1>\n</header>\n<nav>\n<ul>\n<li><a class=active href=index.html>Digital Outputs</a></li>\n<li><a href=dinputs.html>Digital inputs</a></li>\n<li><a href=anoutputs.html>Analog Outputs</a></li>\n<li><a href=aninputs.html>Analog Inputs</a></li>\n</ul>\n</nav>\n<section>\n<table>\n<tr>\n<th>Digital Ouput</th>\n<th>Status</th>\n<th>Option</th>\n</tr>\n<tr>\n<td>DOut1</td>\n<td id=dout1>waiting..</td>\n<td><button class=button onclick=\"digital_output_toggle('dout1')\">Toggle</button>\n</td>\n</tr>\n<tr>\n<td>DOut2</td>\n<td id=dout2>waiting..</td>\n<td><button class=button onclick=\"digital_output_toggle('dout2')\">Toggle</button>\n</tr>\n<tr>\n<td>DOut3</td>\n<td id=dout3>waiting..</td>\n<td><button class=button onclick=\"digital_output_toggle('dout3')\">Toggle</button>\n</tr>\n<tr>\n<td>DOut4</td>\n<td id=dout4>waiting..</td>\n<td><button class=button onclick=\"digital_output_toggle('dout4')\">Toggle</button>\n</tr>\n</table>\n</section>\n</body>\n</html>";
programmer5 0:89cb04c5c613 34
programmer5 0:89cb04c5c613 35 const char digitalInputs_html[]="HTTP/1.1 200 OK\n"
programmer5 0:89cb04c5c613 36 "Content-type: text/html\r\n\r\n"
programmer5 0:89cb04c5c613 37 "<!DOCTYPE html>\n<html>\n<head>\n<title>esp</title>\n<link rel=stylesheet type=text/css href=css/style.css>\n<script src=https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js></script>\n<script>$(document).ready(function(){setInterval(\"get_digital_input_status()\",2000)});function get_digital_input_status(){var a=\"/digital_inputs\";$.ajax({url:a,dataType:\"json\",success:function(b){if(b.digital_inputs.din1==1){$(\"#din1\").html(\"HIGH\")}else{$(\"#din1\").html(\"LOW\")}if(b.digital_inputs.din2==1){$(\"#din2\").html(\"HIGH\")}else{$(\"#din2\").html(\"LOW\")}if(b.digital_inputs.din3==1){$(\"#din3\").html(\"HIGH\")}else{$(\"#din3\").html(\"LOW\")}if(b.digital_inputs.din4==1){$(\"#din4\").html(\"HIGH\")}else{$(\"#din4\").html(\"LOW\")}},timeout:2000})};</script>\n</head>\n<body>\n<header>\n<img src=images/logo.jpg>\n<h1>ESP8266 BASED WEBSERVER</h1>\n</header>\n<nav>\n<ul>\n<li><a href=index.html>Digital Outputs</a></li>\n<li><a class=active href=dinputs.html>Digital inputs</a></li>\n<li><a href=anoutputs.html>Analog Outputs</a></li>\n<li><a href=aninputs.html>Analog Inputs</a></li>\n</ul>\n</nav>\n<section>\n<table id=inputsTable>\n<tr>\n<th>Digital Input</th>\n<th>Status</th>\n</tr>\n<tr>\n<td>DIn1</td>\n<td id=din1>waiting..</td>\n</td>\n</tr>\n<tr>\n<td>DIn2</td>\n<td id=din2>waiting..</td>\n</tr>\n<tr>\n<td>DIn3</td>\n<td id=din3>waiting..</td>\n</tr>\n<tr>\n<td>DIn4</td>\n<td id=din4>waiting..</td>\n</tr>\n</table>\n</section>\n</body>\n</html>";
programmer5 0:89cb04c5c613 38
programmer5 0:89cb04c5c613 39 const char analog_outputs_html[]="HTTP/1.1 200 OK\n"
programmer5 0:89cb04c5c613 40 "Content-type: text/html\r\n\r\n"
programmer5 0:89cb04c5c613 41 "<!DOCTYPE html>\n<html>\n<head>\n<title>esp</title>\n<link rel=stylesheet type=text/css href=css/style.css>\n<script src=https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js></script>\n<script type=text/javascript src=https://www.gstatic.com/charts/loader.js></script>\n<script>$(document).ready(function(){setInterval(\"getAnalogOutputStatus()\",2000);displayVoltageLevel()});var voltage_level=0;function getAnalogOutputStatus(){var a=\"/analog_outputs\";$.ajax({url:a,dataType:\"text\",success:function(b){voltage_level=parseFloat(b)},timeout:2000})}function setNewVoltageLevel(a){var b=\"/analog_outputs/update?value=\"+a;$.ajax({url:b,dataType:\"text\",success:function(c){voltage_level=parseFloat(c)},timeout:2000})}function displayVoltageLevel(){google.charts.load(\"current\",{packages:[\"gauge\"]});google.charts.setOnLoadCallback(a);function a(){var d=google.visualization.arrayToDataTable([[\"Label\",\"Value\"],[\"Volts\",0],]);var b={width:300,height:250,redFrom:8,redTo:12,yellowFrom:4,yellowTo:8,greenFrom:0,greenTo:4,min:0,max:12,minorTicks:5};var c=new google.visualization.Gauge(document.getElementById(\"chart_div\"));c.draw(d,b);setInterval(function(){d.setValue(0,1,voltage_level);c.draw(d,b)},500)}};</script>\n</head>\n<body>\n<header>\n<img src=images/logo.jpg>\n<h1>ESP8266 BASED WEBSERVER</h1>\n</header>\n<nav>\n<ul>\n<li><a href=index.html>Digital Outputs</a>\n</li>\n<li><a href=dinputs.html>Digital inputs</a>\n</li>\n<li><a class=active href=anoutputs.html>Analog Outputs</a>\n</li>\n<li><a href=aninputs.html>Analog Inputs</a>\n</li>\n</ul>\n</nav>\n<section>\n<h3>Enter new voltage value and press Update btton</h3>\n<input type=text id=volts maxlength=5 placeholder=Voltage..(0.00-12.00)>\n<button class=button onclick=\"setNewVoltageLevel(document.getElementById('volts').value)\">Update</button>\n<div id=chart_div style=width:300px;height:250px></div>\n<h1 style=color:blue;margin-left:50px>Voltage Level</h1>\n</section>\n</body>\n</html>";
programmer5 0:89cb04c5c613 42
programmer5 0:89cb04c5c613 43 const char analog_inputs_html[]="HTTP/1.1 200 OK\n"
programmer5 0:89cb04c5c613 44 "Content-type: text/html\r\n\r\n"
programmer5 0:89cb04c5c613 45 "<!DOCTYPE html>\n<html>\n<head>\n<title>esp</title>\n<link rel=stylesheet type=text/css href=css/style.css>\n<script src=https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js></script>\n<script>$(document).ready(function(){setInterval(\"getTemperature()\",2000)});function getTemperature(){var a=\"/analog_inputs\";$.ajax({url:a,dataType:\"text\",success:function(b){$(\"#temp\").html(b+\"&#8451;\")},timeout:2000})};</script>\n</head>\n<body>\n<header>\n<img src=images/logo.jpg>\n<h1>ESP8266 BASED WEBSERVER</h1>\n</header>\n<nav>\n<ul>\n<li><a href=index.html>Digital Outputs</a>\n</li>\n<li><a href=dinputs.html>Digital inputs</a>\n</li>\n<li><a href=anoutputs.html>Analog Outputs</a>\n</li>\n<li><a class=active href=aninputs.html>Analog Inputs</a>\n</li>\n</ul>\n</nav>\n<section>\n<h1 id=temp style=border-style:solid;border-width:6px;border-color:red;border-radius:20px;background-color:#aeb5b7;width:100px;margin-top:20px;margin-left:40px;padding:20px>Waiting..</h1>\n<h2 style=margin-left:25px;color:blue>Temperature Value</h2>\n<br><br><h2>Temperature history</h2>\n<iframe width=450 height=260 style=\"border:1px solid #ccc\" src=\"https://thingspeak.com/channels/243141/charts/1?bgcolor=%23ffffff&color=%23d62020&dynamic=true&results=100&type=line\"></iframe>\n</section>\n</body>\n</html>";
programmer5 0:89cb04c5c613 46
programmer5 0:89cb04c5c613 47 const char style_css[]="HTTP/1.1 200 OK\n"
programmer5 0:89cb04c5c613 48 "Content-type: text/css\r\n\r\n"
programmer5 0:89cb04c5c613 49 "*{padding:0;margin:0}header{background-color:#27ace5}body{font-family:calibri}header h1{text-align:center;font-size:4em;color:#fff;padding:10px}header img{width:110px;margin-top:10px;float:left}ul{list-style-type:none;margin:0;padding:0;overflow:hidden;background-color:#333}li{float:left}li a{display:block;color:#fff;text-align:center;padding:14px 16px;text-decoration:none}li a:hover:not(.active){background-color:#111}.active{background-color:#4CAF50}table{border-collapse:collapse;width:100%}table#inputsTable{border-collapse:collapse;width:70%}th,td{text-align:left;padding:8px}tr:nth-child(even){background-color:#f2f2f2}th{background-color:#4CAF50;color:#fff}section{width:60%;margin:10px}.button{display:inline-block;padding:10px 15px;font-size:15px;cursor:pointer;text-align:center;text-decoration:none;outline:none;color:#fff;background-color:#4CAF50;border:none;border-radius:15px;box-shadow:0 9px #999}.button:hover{background-color:#3e8e41}.button:active{background-color:#3e8e41;box-shadow:0 5px #666;transform:translateY(4px)}input[type=text],select{width:25%;padding:12px 20px;margin:8px 0;display:inline-block;border:1px solid #ccc;border-radius:4px;box-sizing:border-box}";
programmer5 0:89cb04c5c613 50
programmer5 0:89cb04c5c613 51 const char not_found_text[]="HTTP/1.1 404 Not Found\n"
programmer5 0:89cb04c5c613 52 "Content-type: text/plain\r\n\r\n"
programmer5 0:89cb04c5c613 53 "page not found";
programmer5 0:89cb04c5c613 54
programmer5 0:89cb04c5c613 55 //HTTP/1.1 200 OK
programmer5 0:89cb04c5c613 56 //Content-type:image/jpeg
programmer5 0:89cb04c5c613 57 const char logo_jpg[]={0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x31, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x6A, 0x70, 0x65, 0x67, 0x0D,0x0A,0x0D, 0x0A,
programmer5 0:89cb04c5c613 58 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x3A, 0x43, 0x52, 0x45, 0x41, 0x54, 0x4F, 0x52, 0x3A, 0x20, 0x67, 0x64, 0x2D, 0x6A, 0x70, 0x65, 0x67, 0x20, 0x76, 0x31, 0x2E, 0x30, 0x20, 0x28, 0x75, 0x73, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x4A, 0x47, 0x20, 0x4A, 0x50, 0x45, 0x47, 0x20, 0x76, 0x38, 0x30, 0x29, 0x2C, 0x20, 0x71, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x20, 0x3D, 0x20, 0x35, 0x0A, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0xA0, 0x6E, 0x78, 0x8C, 0x78, 0x64, 0xA0, 0x8C, 0x82, 0x8C, 0xB4, 0xAA, 0xA0, 0xBE, 0xF0, 0xFF, 0xFF, 0xF0, 0xDC, 0xDC, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0xAA, 0xB4, 0xB4, 0xF0, 0xD2, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0x71, 0x00, 0x96, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, 0x1F, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0x9A, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x29, 0x8D, 0x20, 0x07, 0x8E, 0x68, 0x01, 0xF4, 0x50, 0x08, 0x23, 0x22, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x28, 0xA2, 0x8A, 0x00, 0x29, 0x19, 0x82, 0x8E, 0x69, 0xAC, 0xFC, 0x1D, 0xB5, 0x18, 0x04, 0xF2, 0xC7, 0x02, 0x80, 0x14, 0xB3, 0x39, 0xC0, 0xA5, 0x55, 0x03, 0xDC, 0xFE, 0x82, 0x91, 0x8E, 0xDE, 0x00, 0xE3, 0xF9, 0xD2, 0xE4, 0x10, 0x31, 0xFF, 0x00, 0x7C, 0x8A, 0x00, 0x5C, 0x9C, 0xE5, 0x7F, 0x13, 0xD8, 0xD3, 0xC1, 0x04, 0x54, 0x7D, 0xFD, 0x4F, 0xA7, 0x61, 0x40, 0xEE, 0xC0, 0xF3, 0xDF, 0xD2, 0x80, 0x25, 0xA2, 0x91, 0x58, 0x30, 0xE2, 0x96, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA6, 0x34, 0x98, 0xE1, 0x68, 0x01, 0xCC, 0xC1, 0x7A, 0xD4, 0x4E, 0xE4, 0x9C, 0x74, 0xF6, 0xA6, 0xEE, 0x39, 0xCE, 0x79, 0xA4, 0xCD, 0x30, 0x14, 0x1E, 0xC7, 0x9A, 0x56, 0xE7, 0xBE, 0x4F, 0xE9, 0x4D, 0xA5, 0x07, 0xB8, 0xE2, 0x80, 0x14, 0x1C, 0x0C, 0x1E, 0x56, 0x8E, 0x50, 0xE4, 0x72, 0x29, 0xD1, 0xE1, 0xB8, 0x27, 0xF0, 0xA5, 0x60, 0x17, 0xFD, 0xD3, 0xD4, 0x7F, 0x51, 0x48, 0x04, 0x1F, 0x32, 0xE7, 0x1C, 0x7A, 0x0F, 0xEB, 0x48, 0x48, 0x1F, 0x7B, 0xFE, 0xF9, 0x1F, 0xD6, 0x99, 0x9C, 0x1E, 0x0D, 0x25, 0x3B, 0x01, 0x22, 0xB6, 0x79, 0x1C, 0x37, 0xF3, 0xA9, 0x55, 0xB7, 0x7D, 0x7D, 0x2A, 0xBD, 0x3D, 0x4B, 0x31, 0x18, 0xEB, 0x45, 0x84, 0x4D, 0x45, 0x14, 0x52, 0x18, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x52, 0x33, 0x05, 0x1C, 0xD2, 0xD4, 0x0E, 0x08, 0x6E, 0x68, 0x01, 0x59, 0xCB, 0x7B, 0x0A, 0x6E, 0x3A, 0x67, 0xBD, 0x07, 0x00, 0x0E, 0x0D, 0x04, 0x82, 0x29, 0x88, 0x52, 0xA0, 0x00, 0x73, 0xD7, 0xF4, 0xA6, 0xD3, 0xB2, 0x06, 0x7B, 0xFB, 0xD3, 0x4F, 0xB7, 0x4A, 0x06, 0x25, 0x2E, 0x38, 0xE7, 0x8A, 0x00, 0xFC, 0xFD, 0x69, 0x3A, 0xD2, 0x01, 0xCA, 0x07, 0x5C, 0xF4, 0xA5, 0x2D, 0xEA, 0x39, 0xF7, 0xA6, 0xD3, 0xBE, 0xF7, 0xD7, 0xDC, 0xD0, 0x03, 0x48, 0xA4, 0xA7, 0x63, 0x9C, 0x54, 0x89, 0x1E, 0x39, 0x34, 0xC4, 0x35, 0x10, 0xB7, 0xD2, 0xA5, 0x00, 0x01, 0xC5, 0x2D, 0x14, 0x86, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0xD9, 0x00, 0x2A, 0x73, 0x4E, 0xA0, 0xF3, 0x40, 0x10, 0x12, 0x4E, 0x01, 0x3C, 0x1A, 0x1B, 0xEF, 0x64, 0x0F, 0xC2, 0x95, 0xD7, 0x61, 0xF5, 0x06, 0x9A, 0x38, 0x39, 0xCF, 0xD2, 0x80, 0x0C, 0xE4, 0xF2, 0x3A, 0x76, 0xA4, 0xEE, 0x45, 0x28, 0x04, 0xE4, 0x8E, 0xD4, 0x29, 0x18, 0x20, 0xF7, 0xA6, 0x21, 0x41, 0x04, 0x6D, 0x38, 0x03, 0xBF, 0xBD, 0x23, 0x03, 0xD7, 0x9C, 0x9E, 0x07, 0xD2, 0x92, 0x9E, 0x1B, 0x23, 0xA6, 0x5B, 0xDE, 0x80, 0x23, 0x3C, 0x53, 0x91, 0x0B, 0x1F, 0x6A, 0x91, 0x62, 0xEE, 0xD5, 0x27, 0x4A, 0x43, 0x11, 0x54, 0x2F, 0x4A, 0x5A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x02, 0x8A, 0x28, 0xA0, 0x04, 0x23, 0x27, 0xDA, 0xA1, 0x61, 0xB7, 0x38, 0x1F, 0x2D, 0x4F, 0x48, 0x47, 0x06, 0x80, 0x21, 0x04, 0xA8, 0xE3, 0xA5, 0x36, 0x9E, 0x54, 0x83, 0xC0, 0xC8, 0x34, 0xA2, 0x3C, 0x1E, 0x69, 0xDC, 0x06, 0xAA, 0x16, 0xA9, 0x95, 0x42, 0xD2, 0x81, 0x8A, 0x29, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x84, 0x70, 0x29, 0x68, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x3F, 0xFF, 0xD9};
programmer5 0:89cb04c5c613 59
programmer5 0:89cb04c5c613 60 // HTTP/1.1 200 OK
programmer5 0:89cb04c5c613 61 //Content-type:image/x-icon
programmer5 0:89cb04c5c613 62 const char favicon_ico[]={0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x31, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x74, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x78, 0x2D, 0x69, 0x63, 0x6F, 0x6E,0x0D, 0x0A,0x0D, 0x0A,
programmer5 0:89cb04c5c613 63 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x68, 0x03, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xED, 0xED, 0xED, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF6, 0xF6, 0xF6, 0xAD, 0xB4, 0xB3, 0xD9, 0xE0, 0xDF, 0xFA, 0xFA, 0xFA, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF5, 0xF5, 0xF5, 0xC8, 0xC8, 0xC8, 0x82, 0x5E, 0x64, 0x79, 0x56, 0x5C, 0xDF, 0xDF, 0xDF, 0xF7, 0xF7, 0xF7, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF7, 0xF7, 0xF7, 0xE4, 0xE4, 0xE4, 0x6F, 0x6F, 0x6F, 0xA6, 0x66, 0x66, 0x7C, 0x3A, 0x37, 0x64, 0x5B, 0x4F, 0xE1, 0xDC, 0xD5, 0xF8, 0xF8, 0xF8, 0xF6, 0xF6, 0xF6, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF9, 0xF9, 0xF9, 0x9B, 0x9B, 0x9B, 0x5B, 0x5B, 0x5B, 0x74, 0x5A, 0x3A, 0x7F, 0x62, 0x3E, 0x7A, 0x5F, 0x3A, 0x8B, 0x7D, 0x6A, 0xBC, 0xBC, 0xBC, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF6, 0xF6, 0xF6, 0x87, 0x86, 0x84, 0x67, 0x64, 0x61, 0x79, 0x5E, 0x41, 0x69, 0x4B, 0x2A, 0x97, 0x7F, 0x5E, 0x50, 0x41, 0x34, 0x2F, 0x2F, 0x2F, 0xBE, 0xBC, 0xBA, 0xF9, 0xF8, 0xF5, 0xF8, 0xF8, 0xF7, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xC6, 0xC6, 0xC6, 0x6C, 0x5B, 0x46, 0x7C, 0x60, 0x3D, 0x8C, 0x62, 0x64, 0x5E, 0x3A, 0x3F, 0x42, 0x42, 0x41, 0x39, 0x39, 0x39, 0x5B, 0x5B, 0x5B, 0x77, 0x61, 0x46, 0xC0, 0xAC, 0x8B, 0xF8, 0xF8, 0xF7, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF4, 0xF4, 0xF4, 0xA3, 0x93, 0x7E, 0x7C, 0x5F, 0x3A, 0x95, 0x6D, 0x6F, 0x5F, 0x3B, 0x41, 0x35, 0x35, 0x35, 0x47, 0x47, 0x47, 0x71, 0x71, 0x71, 0x69, 0x53, 0x37, 0x57, 0x3C, 0x19, 0xA0, 0xA0, 0x9F, 0xF3, 0xF3, 0xF3, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF6, 0xF2, 0xAD, 0xA7, 0x9F, 0x66, 0x3E, 0x44, 0x61, 0x37, 0x3E, 0x5D, 0x3A, 0x3F, 0x60, 0x4D, 0x50, 0xB8, 0xB8, 0xB8, 0x81, 0x42, 0x46, 0x7A, 0x26, 0x2A, 0x89, 0x46, 0x31, 0xD7, 0xB1, 0xA2, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF6, 0xF6, 0xF6, 0xD2, 0xB6, 0xBD, 0x7A, 0x4E, 0x55, 0x7C, 0x50, 0x57, 0x7F, 0x67, 0x6B, 0x7B, 0x7B, 0x7B, 0x82, 0x6C, 0x6F, 0x7B, 0x5D, 0x5F, 0x85, 0x75, 0x4F, 0xE6, 0xDC, 0xC5, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xF6, 0xF9, 0xD2, 0xC1, 0xC4, 0x8C, 0x77, 0x7A, 0x83, 0x78, 0x7A, 0x68, 0x68, 0x68, 0x94, 0x9A, 0x99, 0x8A, 0x92, 0x90, 0xBB, 0xC8, 0xB4, 0xF2, 0xF9, 0xEE, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF7, 0xF7, 0xF7, 0xCC, 0xCC, 0xCC, 0x70, 0x70, 0x70, 0x9C, 0x9C, 0x9C, 0x9A, 0x9A, 0x9A, 0xAA, 0xAA, 0xAA, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xDC, 0xDC, 0xDC, 0x79, 0x79, 0x79, 0xA8, 0xA8, 0xA8, 0xEE, 0xEE, 0xEE, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xEA, 0xEA, 0xEA, 0xEB, 0xEB, 0xEB, 0xF7, 0xF7, 0xF7, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
programmer5 0:89cb04c5c613 64
programmer5 0:89cb04c5c613 65 char rxBuff[BUFFER_SIZE];//array to store data received from esp
programmer5 0:89cb04c5c613 66 char reqLineBuff[REQ_LINE_BUFF_SIZE];
programmer5 0:89cb04c5c613 67 unsigned char reqLinBuffIndex=0;
programmer5 0:89cb04c5c613 68 unsigned int bufferWritingIndex=0;//write pointer
programmer5 0:89cb04c5c613 69 unsigned int bufferReadingIndex_IpdSearch=0;//read pointer
programmer5 0:89cb04c5c613 70 unsigned int bufferReadingIndex_espRespSearch=0;//read pointer
programmer5 0:89cb04c5c613 71 char serverIp[16];
programmer5 0:89cb04c5c613 72
programmer5 0:89cb04c5c613 73 /********Serial ports to be used**************/
programmer5 0:89cb04c5c613 74 Serial debug(PB_6,PB_7);//TO BE used for debug info
programmer5 0:89cb04c5c613 75 Serial esp(PC_6,PC_7);//TX,RX TO BE CONNECTED TO ESP
programmer5 0:89cb04c5c613 76 Serial esp2(PC_6,PC_7);//TX,RX TO BE CONNECTED TO ESP
programmer5 0:89cb04c5c613 77
programmer5 0:89cb04c5c613 78 /*******Connections to relay*******************/
programmer5 0:89cb04c5c613 79 //relay works at logic LOW
programmer5 0:89cb04c5c613 80 DigitalOut digital_out_1(PD_0,1);// High on initialization
programmer5 0:89cb04c5c613 81 DigitalOut digital_out_2(PD_1,1);// High on initialization
programmer5 0:89cb04c5c613 82 DigitalOut digital_out_3(PD_2,1);// High on initialization
programmer5 0:89cb04c5c613 83 DigitalOut digital_out_4(PD_3,1);// High on initialization
programmer5 0:89cb04c5c613 84
programmer5 0:89cb04c5c613 85 /********digital inputs, connected to push buttons***********/
programmer5 0:89cb04c5c613 86 DigitalIn digital_in_1(PD_8);
programmer5 0:89cb04c5c613 87 DigitalIn digital_in_2(PD_9);
programmer5 0:89cb04c5c613 88 DigitalIn digital_in_3(PC_10);
programmer5 0:89cb04c5c613 89 DigitalIn digital_in_4(PC_11);
programmer5 0:89cb04c5c613 90
programmer5 0:89cb04c5c613 91 /**********Analog output*******************/
programmer5 0:89cb04c5c613 92 PwmOut analog_out_1(PB_8);
programmer5 0:89cb04c5c613 93
programmer5 0:89cb04c5c613 94 /**********Analog Input*************/
programmer5 0:89cb04c5c613 95 AnalogIn tempSensor(PB_1);
programmer5 0:89cb04c5c613 96
programmer5 0:89cb04c5c613 97 Timer t;
programmer5 0:89cb04c5c613 98
programmer5 0:89cb04c5c613 99 void espRxInterrupt();
programmer5 0:89cb04c5c613 100 char readEspResponse();
programmer5 0:89cb04c5c613 101 void handleHttpRequests();
programmer5 0:89cb04c5c613 102 void processReqLine(char *stringToProcess);
programmer5 0:89cb04c5c613 103 void sendMemArrayToEsp(const char*str,unsigned int len);
programmer5 0:89cb04c5c613 104 void sendRequestedPageToClient(char id, const char* page,unsigned int len);
programmer5 0:89cb04c5c613 105 void extractQueryFieldValue(char* someUrl,char* field, char* value);
programmer5 0:89cb04c5c613 106 char toggleOutput(char* pinName);
programmer5 0:89cb04c5c613 107 void sendDataToThingSpeak(char* dataToSend);
programmer5 0:89cb04c5c613 108
programmer5 0:89cb04c5c613 109 int main(){
programmer5 0:89cb04c5c613 110 //configure Pull down on all digital inputs
programmer5 0:89cb04c5c613 111 digital_in_1.mode(PullDown);
programmer5 0:89cb04c5c613 112 digital_in_2.mode(PullDown);
programmer5 0:89cb04c5c613 113 digital_in_3.mode(PullDown);
programmer5 0:89cb04c5c613 114 digital_in_4.mode(PullDown);
programmer5 0:89cb04c5c613 115
programmer5 0:89cb04c5c613 116 //configure baud rate for UART
programmer5 0:89cb04c5c613 117 esp.baud(230400);
programmer5 0:89cb04c5c613 118 debug.baud(460800);
programmer5 0:89cb04c5c613 119 esp2.attach(&espRxInterrupt,Serial::RxIrq);
programmer5 0:89cb04c5c613 120
programmer5 0:89cb04c5c613 121 debug.printf("Sysem powerd up!\n");
programmer5 0:89cb04c5c613 122
programmer5 0:89cb04c5c613 123 esp.printf("AT+RST\r\n");
programmer5 0:89cb04c5c613 124 while(readEspResponse()!=READY);
programmer5 0:89cb04c5c613 125 debug.printf("Reset success\n");
programmer5 0:89cb04c5c613 126
programmer5 0:89cb04c5c613 127 esp.printf("ATE0\r\n");//disable ECHO
programmer5 0:89cb04c5c613 128 while(readEspResponse()!=OK);
programmer5 0:89cb04c5c613 129
programmer5 0:89cb04c5c613 130 esp.printf("AT+CWMODE=1\r\n");//enable station mode
programmer5 0:89cb04c5c613 131 while(readEspResponse()!=OK);
programmer5 0:89cb04c5c613 132
programmer5 0:89cb04c5c613 133 esp.printf("AT+CIPMUX=1\r\n");// enable multiple connections
programmer5 0:89cb04c5c613 134 while(readEspResponse()!=OK);
programmer5 0:89cb04c5c613 135
programmer5 0:89cb04c5c613 136 esp.printf("AT+CIPSERVER=1,80\r\n");//start server at port 80
programmer5 0:89cb04c5c613 137 while(readEspResponse()!=OK);
programmer5 0:89cb04c5c613 138
programmer5 0:89cb04c5c613 139 esp.printf("AT+CIPSTO=5\r\n");//Server timeout=5 seconds
programmer5 0:89cb04c5c613 140 while(readEspResponse()!=OK);
programmer5 0:89cb04c5c613 141
programmer5 0:89cb04c5c613 142
programmer5 0:89cb04c5c613 143
programmer5 0:89cb04c5c613 144 debug.printf("Connecting to WiFi..");
programmer5 0:89cb04c5c613 145 esp.printf("AT+CWJAP_CUR=\"smart\",\"myPassword$$\"\r\n");
programmer5 0:89cb04c5c613 146 char responseFromEsp;
programmer5 0:89cb04c5c613 147 while(1)
programmer5 0:89cb04c5c613 148 {
programmer5 0:89cb04c5c613 149 responseFromEsp=readEspResponse();
programmer5 0:89cb04c5c613 150 wait_ms(100);
programmer5 0:89cb04c5c613 151 debug.putc('.');
programmer5 0:89cb04c5c613 152 if(responseFromEsp==OK || responseFromEsp==FAIL)
programmer5 0:89cb04c5c613 153 break;
programmer5 0:89cb04c5c613 154 }
programmer5 0:89cb04c5c613 155 debug.putc('\n');
programmer5 0:89cb04c5c613 156 if(responseFromEsp==OK)
programmer5 0:89cb04c5c613 157 {
programmer5 0:89cb04c5c613 158 debug.printf("Connected to Wifi\n");
programmer5 0:89cb04c5c613 159 __disable_irq();
programmer5 0:89cb04c5c613 160 esp.printf("AT+CIFSR\r\n");//check obtained IP
programmer5 0:89cb04c5c613 161 esp.scanf("+CIFSR:STAIP,\"%[^\"]",&serverIp);//+CIFSR:STAIP,"192.168.8.109"
programmer5 0:89cb04c5c613 162 __enable_irq();
programmer5 0:89cb04c5c613 163 while(readEspResponse()!=OK);
programmer5 0:89cb04c5c613 164 }
programmer5 0:89cb04c5c613 165
programmer5 0:89cb04c5c613 166
programmer5 0:89cb04c5c613 167
programmer5 0:89cb04c5c613 168 char someArray[150];
programmer5 0:89cb04c5c613 169 sprintf(someArray,"GET /update?api_key=ZAFRRYPMMEMXST4P&field2=%s\r\n\r\n",serverIp);
programmer5 0:89cb04c5c613 170 sendDataToThingSpeak(someArray);
programmer5 0:89cb04c5c613 171 debug.printf("Server IP is %s\n",serverIp);
programmer5 0:89cb04c5c613 172
programmer5 0:89cb04c5c613 173 t.start();//start timer
programmer5 0:89cb04c5c613 174 while(1){
programmer5 0:89cb04c5c613 175 handleHttpRequests();
programmer5 0:89cb04c5c613 176 if(t.read()>30)//if 30 seconds passed
programmer5 0:89cb04c5c613 177 {
programmer5 0:89cb04c5c613 178 t.reset();//reset timer
programmer5 0:89cb04c5c613 179 //now send temperature value to thingspeak
programmer5 0:89cb04c5c613 180 sprintf(someArray,"GET /update?api_key=ZAFRRYPMMEMXST4P&field1=%.2f\r\n\r\n",((tempSensor*3.3)-0.500)*100.0);
programmer5 0:89cb04c5c613 181 sendDataToThingSpeak(someArray);
programmer5 0:89cb04c5c613 182 debug.printf("temperature sent to thingspeak\n");
programmer5 0:89cb04c5c613 183 }
programmer5 0:89cb04c5c613 184
programmer5 0:89cb04c5c613 185 }
programmer5 0:89cb04c5c613 186 }
programmer5 0:89cb04c5c613 187
programmer5 0:89cb04c5c613 188 void espRxInterrupt(){
programmer5 0:89cb04c5c613 189 if(esp2.readable())
programmer5 0:89cb04c5c613 190 {
programmer5 0:89cb04c5c613 191 rxBuff[bufferWritingIndex++]=esp2.getc();
programmer5 0:89cb04c5c613 192 if(bufferWritingIndex>=BUFFER_SIZE)
programmer5 0:89cb04c5c613 193 bufferWritingIndex=0;
programmer5 0:89cb04c5c613 194 }
programmer5 0:89cb04c5c613 195
programmer5 0:89cb04c5c613 196 }
programmer5 0:89cb04c5c613 197
programmer5 0:89cb04c5c613 198 char readEspResponse(){
programmer5 0:89cb04c5c613 199 char rxByte;
programmer5 0:89cb04c5c613 200 char espResponse=UNKNOWN;
programmer5 0:89cb04c5c613 201 static char state=0;
programmer5 0:89cb04c5c613 202
programmer5 0:89cb04c5c613 203 while(bufferReadingIndex_espRespSearch!=bufferWritingIndex)
programmer5 0:89cb04c5c613 204 {
programmer5 0:89cb04c5c613 205 rxByte=rxBuff[bufferReadingIndex_espRespSearch++];
programmer5 0:89cb04c5c613 206 //debug.putc(rxByte);
programmer5 0:89cb04c5c613 207 if(bufferReadingIndex_espRespSearch>=BUFFER_SIZE)
programmer5 0:89cb04c5c613 208 bufferReadingIndex_espRespSearch=0;
programmer5 0:89cb04c5c613 209
programmer5 0:89cb04c5c613 210 switch(state)
programmer5 0:89cb04c5c613 211 {
programmer5 0:89cb04c5c613 212 case 0:
programmer5 0:89cb04c5c613 213 if(rxByte=='O')//it may be OK response
programmer5 0:89cb04c5c613 214 state=1;
programmer5 0:89cb04c5c613 215 else if(rxByte=='E')//it may be ERROR response
programmer5 0:89cb04c5c613 216 state=4;
programmer5 0:89cb04c5c613 217 else if(rxByte=='F')//it may be FAIL response
programmer5 0:89cb04c5c613 218 state=10;
programmer5 0:89cb04c5c613 219 else if(rxByte=='r')//it may be 'ready' response
programmer5 0:89cb04c5c613 220 state=15;
programmer5 0:89cb04c5c613 221 else if(rxByte=='>')//it may be Ready To Write TCP '>' response
programmer5 0:89cb04c5c613 222 state=21;
programmer5 0:89cb04c5c613 223 break;
programmer5 0:89cb04c5c613 224
programmer5 0:89cb04c5c613 225 case 1:
programmer5 0:89cb04c5c613 226 if(rxByte=='K')
programmer5 0:89cb04c5c613 227 state=2;
programmer5 0:89cb04c5c613 228 else state=0;
programmer5 0:89cb04c5c613 229 break;
programmer5 0:89cb04c5c613 230
programmer5 0:89cb04c5c613 231 case 2:
programmer5 0:89cb04c5c613 232 if(rxByte==0x0d)
programmer5 0:89cb04c5c613 233 state=3;
programmer5 0:89cb04c5c613 234 else state=0;
programmer5 0:89cb04c5c613 235 break;
programmer5 0:89cb04c5c613 236
programmer5 0:89cb04c5c613 237 case 3:
programmer5 0:89cb04c5c613 238 if(rxByte==0x0A)
programmer5 0:89cb04c5c613 239 espResponse=OK;
programmer5 0:89cb04c5c613 240 state=0;
programmer5 0:89cb04c5c613 241 break;
programmer5 0:89cb04c5c613 242
programmer5 0:89cb04c5c613 243 case 4://ERROR
programmer5 0:89cb04c5c613 244 if(rxByte=='R')
programmer5 0:89cb04c5c613 245 state=5;
programmer5 0:89cb04c5c613 246 else state=0;
programmer5 0:89cb04c5c613 247 break;
programmer5 0:89cb04c5c613 248
programmer5 0:89cb04c5c613 249 case 5:
programmer5 0:89cb04c5c613 250 if(rxByte=='R')
programmer5 0:89cb04c5c613 251 state=6;
programmer5 0:89cb04c5c613 252 else state=0;
programmer5 0:89cb04c5c613 253 break;
programmer5 0:89cb04c5c613 254
programmer5 0:89cb04c5c613 255 case 6:
programmer5 0:89cb04c5c613 256 if(rxByte=='O')
programmer5 0:89cb04c5c613 257 state=7;
programmer5 0:89cb04c5c613 258 else state=0;
programmer5 0:89cb04c5c613 259 break;
programmer5 0:89cb04c5c613 260
programmer5 0:89cb04c5c613 261
programmer5 0:89cb04c5c613 262 case 7:
programmer5 0:89cb04c5c613 263 if(rxByte=='R')
programmer5 0:89cb04c5c613 264 state=8;
programmer5 0:89cb04c5c613 265 else state=0;
programmer5 0:89cb04c5c613 266 break;
programmer5 0:89cb04c5c613 267
programmer5 0:89cb04c5c613 268 case 8:
programmer5 0:89cb04c5c613 269 if(rxByte==0x0d)
programmer5 0:89cb04c5c613 270 state=9;
programmer5 0:89cb04c5c613 271 else state=0;
programmer5 0:89cb04c5c613 272 break;
programmer5 0:89cb04c5c613 273
programmer5 0:89cb04c5c613 274 case 9:
programmer5 0:89cb04c5c613 275 if(rxByte==0x0A)
programmer5 0:89cb04c5c613 276 espResponse=ERROR;
programmer5 0:89cb04c5c613 277 state=0;
programmer5 0:89cb04c5c613 278 break;
programmer5 0:89cb04c5c613 279
programmer5 0:89cb04c5c613 280
programmer5 0:89cb04c5c613 281 case 10://fail
programmer5 0:89cb04c5c613 282 if(rxByte=='A')
programmer5 0:89cb04c5c613 283 state=11;
programmer5 0:89cb04c5c613 284 else state=0;
programmer5 0:89cb04c5c613 285 break;
programmer5 0:89cb04c5c613 286
programmer5 0:89cb04c5c613 287
programmer5 0:89cb04c5c613 288 case 11:
programmer5 0:89cb04c5c613 289 if(rxByte=='I')
programmer5 0:89cb04c5c613 290 state=12;
programmer5 0:89cb04c5c613 291 else state=0;
programmer5 0:89cb04c5c613 292 break;
programmer5 0:89cb04c5c613 293
programmer5 0:89cb04c5c613 294
programmer5 0:89cb04c5c613 295 case 12:
programmer5 0:89cb04c5c613 296 if(rxByte=='L')
programmer5 0:89cb04c5c613 297 state=13;
programmer5 0:89cb04c5c613 298 else state=0;
programmer5 0:89cb04c5c613 299
programmer5 0:89cb04c5c613 300 break;
programmer5 0:89cb04c5c613 301
programmer5 0:89cb04c5c613 302 case 13:
programmer5 0:89cb04c5c613 303 if(rxByte==0x0d)
programmer5 0:89cb04c5c613 304 state=14;
programmer5 0:89cb04c5c613 305 else state=0;
programmer5 0:89cb04c5c613 306 break;
programmer5 0:89cb04c5c613 307
programmer5 0:89cb04c5c613 308 case 14:
programmer5 0:89cb04c5c613 309 if(rxByte==0x0A)
programmer5 0:89cb04c5c613 310 espResponse=FAIL;
programmer5 0:89cb04c5c613 311 state=0;
programmer5 0:89cb04c5c613 312 break;
programmer5 0:89cb04c5c613 313
programmer5 0:89cb04c5c613 314
programmer5 0:89cb04c5c613 315 case 15://READY
programmer5 0:89cb04c5c613 316 if(rxByte=='e')
programmer5 0:89cb04c5c613 317 state=16;
programmer5 0:89cb04c5c613 318 else state=0;
programmer5 0:89cb04c5c613 319 break;
programmer5 0:89cb04c5c613 320
programmer5 0:89cb04c5c613 321
programmer5 0:89cb04c5c613 322 case 16:
programmer5 0:89cb04c5c613 323 if(rxByte=='a')
programmer5 0:89cb04c5c613 324 state=17;
programmer5 0:89cb04c5c613 325 else state=0;
programmer5 0:89cb04c5c613 326 break;
programmer5 0:89cb04c5c613 327
programmer5 0:89cb04c5c613 328 case 17:
programmer5 0:89cb04c5c613 329 if(rxByte=='d')
programmer5 0:89cb04c5c613 330 state=18;
programmer5 0:89cb04c5c613 331 else state=0;
programmer5 0:89cb04c5c613 332 break;
programmer5 0:89cb04c5c613 333
programmer5 0:89cb04c5c613 334 case 18:
programmer5 0:89cb04c5c613 335 if(rxByte=='y')
programmer5 0:89cb04c5c613 336 state=19;
programmer5 0:89cb04c5c613 337 else state=0;
programmer5 0:89cb04c5c613 338 break;
programmer5 0:89cb04c5c613 339
programmer5 0:89cb04c5c613 340 case 19:
programmer5 0:89cb04c5c613 341 if(rxByte==0x0d)
programmer5 0:89cb04c5c613 342 state=20;
programmer5 0:89cb04c5c613 343 else state=0;
programmer5 0:89cb04c5c613 344 break;
programmer5 0:89cb04c5c613 345
programmer5 0:89cb04c5c613 346 case 20:
programmer5 0:89cb04c5c613 347 if(rxByte==0x0A)
programmer5 0:89cb04c5c613 348 espResponse=READY;
programmer5 0:89cb04c5c613 349 state=0;
programmer5 0:89cb04c5c613 350 break;
programmer5 0:89cb04c5c613 351
programmer5 0:89cb04c5c613 352 case 21:
programmer5 0:89cb04c5c613 353 if(rxByte==0x20)
programmer5 0:89cb04c5c613 354 espResponse=READY_TO_WRITE_TCP;
programmer5 0:89cb04c5c613 355 state=0;
programmer5 0:89cb04c5c613 356
programmer5 0:89cb04c5c613 357 default:
programmer5 0:89cb04c5c613 358 state=0;
programmer5 0:89cb04c5c613 359 break;
programmer5 0:89cb04c5c613 360 }
programmer5 0:89cb04c5c613 361 }
programmer5 0:89cb04c5c613 362 return espResponse;
programmer5 0:89cb04c5c613 363 }
programmer5 0:89cb04c5c613 364
programmer5 0:89cb04c5c613 365
programmer5 0:89cb04c5c613 366
programmer5 0:89cb04c5c613 367 void handleHttpRequests(){
programmer5 0:89cb04c5c613 368 char rxByte;
programmer5 0:89cb04c5c613 369 static char state=0;
programmer5 0:89cb04c5c613 370
programmer5 0:89cb04c5c613 371 while(bufferReadingIndex_IpdSearch!=bufferWritingIndex)
programmer5 0:89cb04c5c613 372 {
programmer5 0:89cb04c5c613 373 rxByte=rxBuff[bufferReadingIndex_IpdSearch++];
programmer5 0:89cb04c5c613 374 //debug.putc(rxByte);
programmer5 0:89cb04c5c613 375 if(bufferReadingIndex_IpdSearch>=BUFFER_SIZE)
programmer5 0:89cb04c5c613 376 bufferReadingIndex_IpdSearch=0;
programmer5 0:89cb04c5c613 377 switch(state)
programmer5 0:89cb04c5c613 378 {
programmer5 0:89cb04c5c613 379 case 0:
programmer5 0:89cb04c5c613 380 if(rxByte=='+')
programmer5 0:89cb04c5c613 381 state=1;
programmer5 0:89cb04c5c613 382 break;
programmer5 0:89cb04c5c613 383
programmer5 0:89cb04c5c613 384 case 1:
programmer5 0:89cb04c5c613 385 if(rxByte=='I')
programmer5 0:89cb04c5c613 386 state=2;
programmer5 0:89cb04c5c613 387 else state=0;
programmer5 0:89cb04c5c613 388 break;
programmer5 0:89cb04c5c613 389
programmer5 0:89cb04c5c613 390 case 2:
programmer5 0:89cb04c5c613 391 if(rxByte=='P')
programmer5 0:89cb04c5c613 392 state=3;
programmer5 0:89cb04c5c613 393 else state=0;
programmer5 0:89cb04c5c613 394 break;
programmer5 0:89cb04c5c613 395
programmer5 0:89cb04c5c613 396 case 3:
programmer5 0:89cb04c5c613 397 if(rxByte=='D')
programmer5 0:89cb04c5c613 398 state=4;
programmer5 0:89cb04c5c613 399 else state=0;
programmer5 0:89cb04c5c613 400 break;
programmer5 0:89cb04c5c613 401
programmer5 0:89cb04c5c613 402 case 4:
programmer5 0:89cb04c5c613 403 if(rxByte==',')
programmer5 0:89cb04c5c613 404 state=5;
programmer5 0:89cb04c5c613 405 else state=0;
programmer5 0:89cb04c5c613 406 break;
programmer5 0:89cb04c5c613 407
programmer5 0:89cb04c5c613 408 case 5:
programmer5 0:89cb04c5c613 409 if(rxByte!=0x0d)
programmer5 0:89cb04c5c613 410 {
programmer5 0:89cb04c5c613 411 reqLineBuff[reqLinBuffIndex++]=rxByte;
programmer5 0:89cb04c5c613 412 }
programmer5 0:89cb04c5c613 413 else
programmer5 0:89cb04c5c613 414 {
programmer5 0:89cb04c5c613 415 reqLineBuff[reqLinBuffIndex]=0x00;
programmer5 0:89cb04c5c613 416 bufferReadingIndex_espRespSearch=bufferReadingIndex_IpdSearch;
programmer5 0:89cb04c5c613 417 processReqLine(reqLineBuff);
programmer5 0:89cb04c5c613 418 state=0;
programmer5 0:89cb04c5c613 419 reqLinBuffIndex=0;
programmer5 0:89cb04c5c613 420 }
programmer5 0:89cb04c5c613 421 }
programmer5 0:89cb04c5c613 422 }
programmer5 0:89cb04c5c613 423 }
programmer5 0:89cb04c5c613 424
programmer5 0:89cb04c5c613 425 void processReqLine(char *stringToProcess)
programmer5 0:89cb04c5c613 426 {
programmer5 0:89cb04c5c613 427 //0,416:GET /?led=ON HTTP/1.1
programmer5 0:89cb04c5c613 428 char requestType[6];
programmer5 0:89cb04c5c613 429 char request[50];
programmer5 0:89cb04c5c613 430 char linkId;
programmer5 0:89cb04c5c613 431 int ipdLen;
programmer5 0:89cb04c5c613 432 sscanf(stringToProcess,"%c,%d:%s %s",&linkId,&ipdLen,requestType,request);
programmer5 0:89cb04c5c613 433 debug.printf("%s\n",request);
programmer5 0:89cb04c5c613 434 if(request!=NULL)
programmer5 0:89cb04c5c613 435 {
programmer5 0:89cb04c5c613 436 if(strcmp(request,"/")==0 || strcmp(request,get_index_html)==0)
programmer5 0:89cb04c5c613 437 {
programmer5 0:89cb04c5c613 438 //send index.html
programmer5 0:89cb04c5c613 439 sendRequestedPageToClient(linkId,index_html,sizeof(index_html)-1);
programmer5 0:89cb04c5c613 440 }
programmer5 0:89cb04c5c613 441 else if(strcmp(request,get_digital_inputs_html)==0)
programmer5 0:89cb04c5c613 442 {
programmer5 0:89cb04c5c613 443 sendRequestedPageToClient(linkId,digitalInputs_html,sizeof(digitalInputs_html)-1);
programmer5 0:89cb04c5c613 444 }
programmer5 0:89cb04c5c613 445 else if(strcmp(request,get_analog_inputs_html)==0)
programmer5 0:89cb04c5c613 446 {
programmer5 0:89cb04c5c613 447 sendRequestedPageToClient(linkId,analog_inputs_html,sizeof(analog_inputs_html)-1);
programmer5 0:89cb04c5c613 448
programmer5 0:89cb04c5c613 449 }
programmer5 0:89cb04c5c613 450 else if(strcmp(request,get_analog_outputs)==0)
programmer5 0:89cb04c5c613 451 {
programmer5 0:89cb04c5c613 452 sendRequestedPageToClient(linkId,analog_outputs_html,sizeof(analog_outputs_html)-1);
programmer5 0:89cb04c5c613 453 }
programmer5 0:89cb04c5c613 454
programmer5 0:89cb04c5c613 455 else if(strcmp(request,"/images/logo.jpg")==0)
programmer5 0:89cb04c5c613 456 {
programmer5 0:89cb04c5c613 457 sendRequestedPageToClient(linkId,logo_jpg,sizeof(logo_jpg));
programmer5 0:89cb04c5c613 458 }
programmer5 0:89cb04c5c613 459 else if(strcmp(request,"/favicon.ico")==0)
programmer5 0:89cb04c5c613 460 {
programmer5 0:89cb04c5c613 461 sendRequestedPageToClient(linkId,favicon_ico,sizeof(favicon_ico));
programmer5 0:89cb04c5c613 462 }
programmer5 0:89cb04c5c613 463 else if(strcmp(request,"/css/style.css")==0)
programmer5 0:89cb04c5c613 464 {
programmer5 0:89cb04c5c613 465 sendRequestedPageToClient(linkId,style_css,sizeof(style_css)-1);
programmer5 0:89cb04c5c613 466 }
programmer5 0:89cb04c5c613 467 else if(strncmp(request,get_Toggle_Output,strlen(get_Toggle_Output))==0)
programmer5 0:89cb04c5c613 468 {
programmer5 0:89cb04c5c613 469 //check query field and value, and toggle appropriate Output
programmer5 0:89cb04c5c613 470 char field[10],value[10];
programmer5 0:89cb04c5c613 471 extractQueryFieldValue(request,field,value);
programmer5 0:89cb04c5c613 472 if(value!=NULL)
programmer5 0:89cb04c5c613 473 {
programmer5 0:89cb04c5c613 474 char newPinState=toggleOutput(value);
programmer5 0:89cb04c5c613 475 char responsePacket[100];
programmer5 0:89cb04c5c613 476 sprintf(responsePacket,"%s%c",textPlainHeader,newPinState+48);
programmer5 0:89cb04c5c613 477 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
programmer5 0:89cb04c5c613 478 }
programmer5 0:89cb04c5c613 479 }
programmer5 0:89cb04c5c613 480 else if(strcmp(request,get_digital_output_status)==0)
programmer5 0:89cb04c5c613 481 {
programmer5 0:89cb04c5c613 482 //"{\"digital_outputs\":{\"dout1\":1,\"dout2\":0,\"dout3\":1,\"dout4\":1}}"
programmer5 0:89cb04c5c613 483 char responsePacket[200];
programmer5 0:89cb04c5c613 484 sprintf(responsePacket,"%s{\"digital_outputs\":{\"dout1\":%c,\
programmer5 0:89cb04c5c613 485 \"dout2\":%c,\"dout3\":%c,\"dout4\":%c}}",jsonHeader,(!digital_out_1)+48,
programmer5 0:89cb04c5c613 486 (!digital_out_2)+48,(!digital_out_3)+48,(!digital_out_4)+48);
programmer5 0:89cb04c5c613 487 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
programmer5 0:89cb04c5c613 488 }
programmer5 0:89cb04c5c613 489 else if(strcmp(request,get_digital_input_status)==0)
programmer5 0:89cb04c5c613 490 {
programmer5 0:89cb04c5c613 491 char responsePacket[200];
programmer5 0:89cb04c5c613 492 sprintf(responsePacket,"%s{\"digital_inputs\":{\"din1\":%c,\
programmer5 0:89cb04c5c613 493 \"din2\":%c,\"din3\":%c,\"din4\":%c}}",jsonHeader,(digital_in_1)+48,
programmer5 0:89cb04c5c613 494 (digital_in_2)+48,(digital_in_3)+48,(digital_in_4)+48);
programmer5 0:89cb04c5c613 495 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
programmer5 0:89cb04c5c613 496
programmer5 0:89cb04c5c613 497 }
programmer5 0:89cb04c5c613 498 else if(strncmp(request,get_analog_output_update,strlen(get_analog_output_update))==0)
programmer5 0:89cb04c5c613 499 {
programmer5 0:89cb04c5c613 500 char field[10],value[10];
programmer5 0:89cb04c5c613 501 extractQueryFieldValue(request,field,value);
programmer5 0:89cb04c5c613 502 if(value!=NULL)
programmer5 0:89cb04c5c613 503 {
programmer5 0:89cb04c5c613 504 analog_out_1=atof(value)/12.0;
programmer5 0:89cb04c5c613 505 char responsePacket[100];
programmer5 0:89cb04c5c613 506 sprintf(responsePacket,"%s%.2f",textPlainHeader,analog_out_1.read()*12.0);
programmer5 0:89cb04c5c613 507 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
programmer5 0:89cb04c5c613 508 }
programmer5 0:89cb04c5c613 509 }
programmer5 0:89cb04c5c613 510 else if(strcmp(request,get_analog_outputs_status)==0)
programmer5 0:89cb04c5c613 511 {
programmer5 0:89cb04c5c613 512 char responsePacket[100];
programmer5 0:89cb04c5c613 513 sprintf(responsePacket,"%s%.2f",textPlainHeader,analog_out_1.read()*12.0);
programmer5 0:89cb04c5c613 514 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
programmer5 0:89cb04c5c613 515 }
programmer5 0:89cb04c5c613 516 else if(strcmp(request,get_analog_inputs_status)==0)
programmer5 0:89cb04c5c613 517 {
programmer5 0:89cb04c5c613 518 char responsePacket[100];
programmer5 0:89cb04c5c613 519 sprintf(responsePacket,"%s%.2f",textPlainHeader,((tempSensor*3.3)-0.500)*100.0);
programmer5 0:89cb04c5c613 520 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket));
programmer5 0:89cb04c5c613 521 }
programmer5 0:89cb04c5c613 522 else
programmer5 0:89cb04c5c613 523 {
programmer5 0:89cb04c5c613 524 sendRequestedPageToClient(linkId,not_found_text,sizeof(not_found_text)-1);
programmer5 0:89cb04c5c613 525 //send page not found message
programmer5 0:89cb04c5c613 526 }
programmer5 0:89cb04c5c613 527 }
programmer5 0:89cb04c5c613 528 }
programmer5 0:89cb04c5c613 529
programmer5 0:89cb04c5c613 530
programmer5 0:89cb04c5c613 531 void sendRequestedPageToClient(char id, const char* page,unsigned int len)
programmer5 0:89cb04c5c613 532 {
programmer5 0:89cb04c5c613 533 char atCommandArray[50];
programmer5 0:89cb04c5c613 534 unsigned int lenOfPacketToTx;
programmer5 0:89cb04c5c613 535 unsigned int pageToSendAddress=0;
programmer5 0:89cb04c5c613 536 char tempEspStatus;
programmer5 0:89cb04c5c613 537 while(len>0)
programmer5 0:89cb04c5c613 538 {
programmer5 0:89cb04c5c613 539 if(len>2048){
programmer5 0:89cb04c5c613 540 len-=2048;
programmer5 0:89cb04c5c613 541 lenOfPacketToTx=2048;
programmer5 0:89cb04c5c613 542 }
programmer5 0:89cb04c5c613 543 else{
programmer5 0:89cb04c5c613 544 lenOfPacketToTx=len;
programmer5 0:89cb04c5c613 545 len=0;
programmer5 0:89cb04c5c613 546 }
programmer5 0:89cb04c5c613 547
programmer5 0:89cb04c5c613 548 sprintf(atCommandArray,"AT+CIPSEND=%c,%d\r\n",id,lenOfPacketToTx);
programmer5 0:89cb04c5c613 549 bufferReadingIndex_espRespSearch=bufferWritingIndex;
programmer5 0:89cb04c5c613 550 esp.printf(atCommandArray);
programmer5 0:89cb04c5c613 551
programmer5 0:89cb04c5c613 552 while(1)
programmer5 0:89cb04c5c613 553 {
programmer5 0:89cb04c5c613 554 tempEspStatus=readEspResponse();
programmer5 0:89cb04c5c613 555 if(tempEspStatus==READY_TO_WRITE_TCP||tempEspStatus==ERROR ||tempEspStatus==FAIL)
programmer5 0:89cb04c5c613 556 break;
programmer5 0:89cb04c5c613 557 }
programmer5 0:89cb04c5c613 558 //now send page
programmer5 0:89cb04c5c613 559 if(tempEspStatus==READY_TO_WRITE_TCP)
programmer5 0:89cb04c5c613 560 {
programmer5 0:89cb04c5c613 561 sendMemArrayToEsp(page+pageToSendAddress,lenOfPacketToTx);
programmer5 0:89cb04c5c613 562 do{
programmer5 0:89cb04c5c613 563 tempEspStatus=readEspResponse();
programmer5 0:89cb04c5c613 564 }
programmer5 0:89cb04c5c613 565 while(tempEspStatus==UNKNOWN);
programmer5 0:89cb04c5c613 566 if(tempEspStatus!=OK)//link broken, don't send more data to this link.
programmer5 0:89cb04c5c613 567 break;
programmer5 0:89cb04c5c613 568
programmer5 0:89cb04c5c613 569 pageToSendAddress+=lenOfPacketToTx;
programmer5 0:89cb04c5c613 570 }
programmer5 0:89cb04c5c613 571 else
programmer5 0:89cb04c5c613 572 break;
programmer5 0:89cb04c5c613 573 }
programmer5 0:89cb04c5c613 574 if(tempEspStatus==OK)
programmer5 0:89cb04c5c613 575 {
programmer5 0:89cb04c5c613 576 sprintf(atCommandArray,"AT+CIPCLOSE=%c\r\n",id);
programmer5 0:89cb04c5c613 577 esp.printf(atCommandArray);
programmer5 0:89cb04c5c613 578 while(readEspResponse()==UNKNOWN);
programmer5 0:89cb04c5c613 579 }
programmer5 0:89cb04c5c613 580 }
programmer5 0:89cb04c5c613 581
programmer5 0:89cb04c5c613 582 void sendMemArrayToEsp(const char*str,unsigned int len)
programmer5 0:89cb04c5c613 583 {
programmer5 0:89cb04c5c613 584 while(len--)
programmer5 0:89cb04c5c613 585 esp.putc(*str++);
programmer5 0:89cb04c5c613 586 }
programmer5 0:89cb04c5c613 587
programmer5 0:89cb04c5c613 588 void extractQueryFieldValue(char* someUrl,char* field, char* value)
programmer5 0:89cb04c5c613 589 {
programmer5 0:89cb04c5c613 590 sscanf(someUrl,"%*[^?]%*c%[^=]%*c%s",field,value);
programmer5 0:89cb04c5c613 591 }
programmer5 0:89cb04c5c613 592
programmer5 0:89cb04c5c613 593 char toggleOutput(char* pinName)
programmer5 0:89cb04c5c613 594 {
programmer5 0:89cb04c5c613 595 if(strcmp(pinName,"dout1")==0)
programmer5 0:89cb04c5c613 596 {
programmer5 0:89cb04c5c613 597 digital_out_1=!digital_out_1;
programmer5 0:89cb04c5c613 598 return !digital_out_1;
programmer5 0:89cb04c5c613 599 }
programmer5 0:89cb04c5c613 600 else if(strcmp(pinName,"dout2")==0)
programmer5 0:89cb04c5c613 601 {
programmer5 0:89cb04c5c613 602 digital_out_2=!digital_out_2;
programmer5 0:89cb04c5c613 603 return !digital_out_2;
programmer5 0:89cb04c5c613 604 }
programmer5 0:89cb04c5c613 605 else if(strcmp(pinName,"dout3")==0)
programmer5 0:89cb04c5c613 606 {
programmer5 0:89cb04c5c613 607 digital_out_3=!digital_out_3;
programmer5 0:89cb04c5c613 608 return !digital_out_3;
programmer5 0:89cb04c5c613 609 }
programmer5 0:89cb04c5c613 610 else if(strcmp(pinName,"dout4")==0)
programmer5 0:89cb04c5c613 611 {
programmer5 0:89cb04c5c613 612 digital_out_4=!digital_out_4;
programmer5 0:89cb04c5c613 613 return !digital_out_4;
programmer5 0:89cb04c5c613 614 }
programmer5 0:89cb04c5c613 615 else return 2;//error
programmer5 0:89cb04c5c613 616
programmer5 0:89cb04c5c613 617 }
programmer5 0:89cb04c5c613 618
programmer5 0:89cb04c5c613 619
programmer5 0:89cb04c5c613 620
programmer5 0:89cb04c5c613 621 void sendDataToThingSpeak(char* dataToSend)
programmer5 0:89cb04c5c613 622 {
programmer5 0:89cb04c5c613 623 //first stop server
programmer5 0:89cb04c5c613 624 char responseFromEsp;
programmer5 0:89cb04c5c613 625 esp.printf("AT+CIPSERVER=0\r\n");
programmer5 0:89cb04c5c613 626 while(readEspResponse()!=OK);
programmer5 0:89cb04c5c613 627
programmer5 0:89cb04c5c613 628 esp.printf("AT+CIPSTART=4,\"TCP\",\"api.thingspeak.com\",80\r\n\r\n");
programmer5 0:89cb04c5c613 629 do{
programmer5 0:89cb04c5c613 630 responseFromEsp=readEspResponse();
programmer5 0:89cb04c5c613 631 }while(responseFromEsp==UNKNOWN);
programmer5 0:89cb04c5c613 632
programmer5 0:89cb04c5c613 633 if(responseFromEsp==OK)//connect success to thingspeak
programmer5 0:89cb04c5c613 634 {
programmer5 0:89cb04c5c613 635 sendRequestedPageToClient('4',dataToSend,strlen(dataToSend));
programmer5 0:89cb04c5c613 636 }
programmer5 0:89cb04c5c613 637
programmer5 0:89cb04c5c613 638 //Restart server
programmer5 0:89cb04c5c613 639 esp.printf("AT+CIPSERVER=1,80\r\n");//start server at port 80
programmer5 0:89cb04c5c613 640 while(readEspResponse()!=OK);
programmer5 0:89cb04c5c613 641 }