![](/media/cache/profiles/b695220be1dd4c41c3e66c3c6e8c845d.jpg.50x50_q85.jpg)
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.
main.cpp
00001 #include "mbed.h" 00002 00003 #define BUFFER_SIZE 3000 00004 #define REQ_LINE_BUFF_SIZE 100 00005 #define UNKNOWN 0 00006 #define OK 1 00007 #define ERROR 2 00008 #define FAIL 3 00009 #define READY 4 00010 #define READY_TO_WRITE_TCP 5 00011 00012 00013 const char get_analog_outputs_status[]="/analog_outputs"; 00014 const char get_Toggle_Output[]="/digital_outputs/toggle"; 00015 const char get_analog_inputs_status[]="/analog_inputs"; 00016 const char get_analog_output_update[]="/analog_outputs/update"; 00017 const char get_digital_output_status[]="/digital_outputs"; 00018 const char get_digital_inputs_html[]="/dinputs.html"; 00019 const char get_digital_input_status[]="/digital_inputs"; 00020 const char get_index_html[]="/index.html"; 00021 const char get_analog_outputs[]="/anoutputs.html"; 00022 const char get_analog_inputs_html[]="/aninputs.html"; 00023 00024 00025 const char jsonHeader[]="HTTP/1.1 200 OK\n" 00026 "Content-type: application/json\r\n\r\n"; 00027 00028 const char textPlainHeader[]="HTTP/1.1 200 OK\n" 00029 "Content-type: text/plain\r\n\r\n"; 00030 00031 const char index_html[]="HTTP/1.1 200 OK\n" 00032 "Content-type: text/html\r\n\r\n" 00033 "<!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>"; 00034 00035 const char digitalInputs_html[]="HTTP/1.1 200 OK\n" 00036 "Content-type: text/html\r\n\r\n" 00037 "<!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>"; 00038 00039 const char analog_outputs_html[]="HTTP/1.1 200 OK\n" 00040 "Content-type: text/html\r\n\r\n" 00041 "<!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>"; 00042 00043 const char analog_inputs_html[]="HTTP/1.1 200 OK\n" 00044 "Content-type: text/html\r\n\r\n" 00045 "<!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+\"℃\")},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>"; 00046 00047 const char style_css[]="HTTP/1.1 200 OK\n" 00048 "Content-type: text/css\r\n\r\n" 00049 "*{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}"; 00050 00051 const char not_found_text[]="HTTP/1.1 404 Not Found\n" 00052 "Content-type: text/plain\r\n\r\n" 00053 "page not found"; 00054 00055 //HTTP/1.1 200 OK 00056 //Content-type:image/jpeg 00057 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, 00058 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}; 00059 00060 // HTTP/1.1 200 OK 00061 //Content-type:image/x-icon 00062 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, 00063 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}; 00064 00065 char rxBuff[BUFFER_SIZE];//array to store data received from esp 00066 char reqLineBuff[REQ_LINE_BUFF_SIZE]; 00067 unsigned char reqLinBuffIndex=0; 00068 unsigned int bufferWritingIndex=0;//write pointer 00069 unsigned int bufferReadingIndex_IpdSearch=0;//read pointer 00070 unsigned int bufferReadingIndex_espRespSearch=0;//read pointer 00071 char serverIp[16]; 00072 00073 /********Serial ports to be used**************/ 00074 Serial debug(PB_6,PB_7);//TO BE used for debug info 00075 Serial esp(PC_6,PC_7);//TX,RX TO BE CONNECTED TO ESP 00076 Serial esp2(PC_6,PC_7);//TX,RX TO BE CONNECTED TO ESP 00077 00078 /*******Connections to relay*******************/ 00079 //relay works at logic LOW 00080 DigitalOut digital_out_1(PD_0,1);// High on initialization 00081 DigitalOut digital_out_2(PD_1,1);// High on initialization 00082 DigitalOut digital_out_3(PD_2,1);// High on initialization 00083 DigitalOut digital_out_4(PD_3,1);// High on initialization 00084 00085 /********digital inputs, connected to push buttons***********/ 00086 DigitalIn digital_in_1(PD_8); 00087 DigitalIn digital_in_2(PD_9); 00088 DigitalIn digital_in_3(PC_10); 00089 DigitalIn digital_in_4(PC_11); 00090 00091 /**********Analog output*******************/ 00092 PwmOut analog_out_1(PB_8); 00093 00094 /**********Analog Input*************/ 00095 AnalogIn tempSensor(PB_1); 00096 00097 Timer t; 00098 00099 void espRxInterrupt(); 00100 char readEspResponse(); 00101 void handleHttpRequests(); 00102 void processReqLine(char *stringToProcess); 00103 void sendMemArrayToEsp(const char*str,unsigned int len); 00104 void sendRequestedPageToClient(char id, const char* page,unsigned int len); 00105 void extractQueryFieldValue(char* someUrl,char* field, char* value); 00106 char toggleOutput(char* pinName); 00107 void sendDataToThingSpeak(char* dataToSend); 00108 00109 int main(){ 00110 //configure Pull down on all digital inputs 00111 digital_in_1.mode(PullDown); 00112 digital_in_2.mode(PullDown); 00113 digital_in_3.mode(PullDown); 00114 digital_in_4.mode(PullDown); 00115 00116 //configure baud rate for UART 00117 esp.baud(230400); 00118 debug.baud(460800); 00119 esp2.attach(&espRxInterrupt,Serial::RxIrq); 00120 00121 debug.printf("Sysem powerd up!\n"); 00122 00123 esp.printf("AT+RST\r\n"); 00124 while(readEspResponse()!=READY); 00125 debug.printf("Reset success\n"); 00126 00127 esp.printf("ATE0\r\n");//disable ECHO 00128 while(readEspResponse()!=OK); 00129 00130 esp.printf("AT+CWMODE=1\r\n");//enable station mode 00131 while(readEspResponse()!=OK); 00132 00133 esp.printf("AT+CIPMUX=1\r\n");// enable multiple connections 00134 while(readEspResponse()!=OK); 00135 00136 esp.printf("AT+CIPSERVER=1,80\r\n");//start server at port 80 00137 while(readEspResponse()!=OK); 00138 00139 esp.printf("AT+CIPSTO=5\r\n");//Server timeout=5 seconds 00140 while(readEspResponse()!=OK); 00141 00142 00143 00144 debug.printf("Connecting to WiFi.."); 00145 esp.printf("AT+CWJAP_CUR=\"smart\",\"myPassword$$\"\r\n"); 00146 char responseFromEsp; 00147 while(1) 00148 { 00149 responseFromEsp=readEspResponse(); 00150 wait_ms(100); 00151 debug.putc('.'); 00152 if(responseFromEsp==OK || responseFromEsp==FAIL) 00153 break; 00154 } 00155 debug.putc('\n'); 00156 if(responseFromEsp==OK) 00157 { 00158 debug.printf("Connected to Wifi\n"); 00159 __disable_irq(); 00160 esp.printf("AT+CIFSR\r\n");//check obtained IP 00161 esp.scanf("+CIFSR:STAIP,\"%[^\"]",&serverIp);//+CIFSR:STAIP,"192.168.8.109" 00162 __enable_irq(); 00163 while(readEspResponse()!=OK); 00164 } 00165 00166 00167 00168 char someArray[150]; 00169 sprintf(someArray,"GET /update?api_key=ZAFRRYPMMEMXST4P&field2=%s\r\n\r\n",serverIp); 00170 sendDataToThingSpeak(someArray); 00171 debug.printf("Server IP is %s\n",serverIp); 00172 00173 t.start();//start timer 00174 while(1){ 00175 handleHttpRequests(); 00176 if(t.read()>30)//if 30 seconds passed 00177 { 00178 t.reset();//reset timer 00179 //now send temperature value to thingspeak 00180 sprintf(someArray,"GET /update?api_key=ZAFRRYPMMEMXST4P&field1=%.2f\r\n\r\n",((tempSensor*3.3)-0.500)*100.0); 00181 sendDataToThingSpeak(someArray); 00182 debug.printf("temperature sent to thingspeak\n"); 00183 } 00184 00185 } 00186 } 00187 00188 void espRxInterrupt(){ 00189 if(esp2.readable()) 00190 { 00191 rxBuff[bufferWritingIndex++]=esp2.getc(); 00192 if(bufferWritingIndex>=BUFFER_SIZE) 00193 bufferWritingIndex=0; 00194 } 00195 00196 } 00197 00198 char readEspResponse(){ 00199 char rxByte; 00200 char espResponse=UNKNOWN; 00201 static char state=0; 00202 00203 while(bufferReadingIndex_espRespSearch!=bufferWritingIndex) 00204 { 00205 rxByte=rxBuff[bufferReadingIndex_espRespSearch++]; 00206 //debug.putc(rxByte); 00207 if(bufferReadingIndex_espRespSearch>=BUFFER_SIZE) 00208 bufferReadingIndex_espRespSearch=0; 00209 00210 switch(state) 00211 { 00212 case 0: 00213 if(rxByte=='O')//it may be OK response 00214 state=1; 00215 else if(rxByte=='E')//it may be ERROR response 00216 state=4; 00217 else if(rxByte=='F')//it may be FAIL response 00218 state=10; 00219 else if(rxByte=='r')//it may be 'ready' response 00220 state=15; 00221 else if(rxByte=='>')//it may be Ready To Write TCP '>' response 00222 state=21; 00223 break; 00224 00225 case 1: 00226 if(rxByte=='K') 00227 state=2; 00228 else state=0; 00229 break; 00230 00231 case 2: 00232 if(rxByte==0x0d) 00233 state=3; 00234 else state=0; 00235 break; 00236 00237 case 3: 00238 if(rxByte==0x0A) 00239 espResponse=OK; 00240 state=0; 00241 break; 00242 00243 case 4://ERROR 00244 if(rxByte=='R') 00245 state=5; 00246 else state=0; 00247 break; 00248 00249 case 5: 00250 if(rxByte=='R') 00251 state=6; 00252 else state=0; 00253 break; 00254 00255 case 6: 00256 if(rxByte=='O') 00257 state=7; 00258 else state=0; 00259 break; 00260 00261 00262 case 7: 00263 if(rxByte=='R') 00264 state=8; 00265 else state=0; 00266 break; 00267 00268 case 8: 00269 if(rxByte==0x0d) 00270 state=9; 00271 else state=0; 00272 break; 00273 00274 case 9: 00275 if(rxByte==0x0A) 00276 espResponse=ERROR; 00277 state=0; 00278 break; 00279 00280 00281 case 10://fail 00282 if(rxByte=='A') 00283 state=11; 00284 else state=0; 00285 break; 00286 00287 00288 case 11: 00289 if(rxByte=='I') 00290 state=12; 00291 else state=0; 00292 break; 00293 00294 00295 case 12: 00296 if(rxByte=='L') 00297 state=13; 00298 else state=0; 00299 00300 break; 00301 00302 case 13: 00303 if(rxByte==0x0d) 00304 state=14; 00305 else state=0; 00306 break; 00307 00308 case 14: 00309 if(rxByte==0x0A) 00310 espResponse=FAIL; 00311 state=0; 00312 break; 00313 00314 00315 case 15://READY 00316 if(rxByte=='e') 00317 state=16; 00318 else state=0; 00319 break; 00320 00321 00322 case 16: 00323 if(rxByte=='a') 00324 state=17; 00325 else state=0; 00326 break; 00327 00328 case 17: 00329 if(rxByte=='d') 00330 state=18; 00331 else state=0; 00332 break; 00333 00334 case 18: 00335 if(rxByte=='y') 00336 state=19; 00337 else state=0; 00338 break; 00339 00340 case 19: 00341 if(rxByte==0x0d) 00342 state=20; 00343 else state=0; 00344 break; 00345 00346 case 20: 00347 if(rxByte==0x0A) 00348 espResponse=READY; 00349 state=0; 00350 break; 00351 00352 case 21: 00353 if(rxByte==0x20) 00354 espResponse=READY_TO_WRITE_TCP; 00355 state=0; 00356 00357 default: 00358 state=0; 00359 break; 00360 } 00361 } 00362 return espResponse; 00363 } 00364 00365 00366 00367 void handleHttpRequests(){ 00368 char rxByte; 00369 static char state=0; 00370 00371 while(bufferReadingIndex_IpdSearch!=bufferWritingIndex) 00372 { 00373 rxByte=rxBuff[bufferReadingIndex_IpdSearch++]; 00374 //debug.putc(rxByte); 00375 if(bufferReadingIndex_IpdSearch>=BUFFER_SIZE) 00376 bufferReadingIndex_IpdSearch=0; 00377 switch(state) 00378 { 00379 case 0: 00380 if(rxByte=='+') 00381 state=1; 00382 break; 00383 00384 case 1: 00385 if(rxByte=='I') 00386 state=2; 00387 else state=0; 00388 break; 00389 00390 case 2: 00391 if(rxByte=='P') 00392 state=3; 00393 else state=0; 00394 break; 00395 00396 case 3: 00397 if(rxByte=='D') 00398 state=4; 00399 else state=0; 00400 break; 00401 00402 case 4: 00403 if(rxByte==',') 00404 state=5; 00405 else state=0; 00406 break; 00407 00408 case 5: 00409 if(rxByte!=0x0d) 00410 { 00411 reqLineBuff[reqLinBuffIndex++]=rxByte; 00412 } 00413 else 00414 { 00415 reqLineBuff[reqLinBuffIndex]=0x00; 00416 bufferReadingIndex_espRespSearch=bufferReadingIndex_IpdSearch; 00417 processReqLine(reqLineBuff); 00418 state=0; 00419 reqLinBuffIndex=0; 00420 } 00421 } 00422 } 00423 } 00424 00425 void processReqLine(char *stringToProcess) 00426 { 00427 //0,416:GET /?led=ON HTTP/1.1 00428 char requestType[6]; 00429 char request[50]; 00430 char linkId; 00431 int ipdLen; 00432 sscanf(stringToProcess,"%c,%d:%s %s",&linkId,&ipdLen,requestType,request); 00433 debug.printf("%s\n",request); 00434 if(request!=NULL) 00435 { 00436 if(strcmp(request,"/")==0 || strcmp(request,get_index_html)==0) 00437 { 00438 //send index.html 00439 sendRequestedPageToClient(linkId,index_html,sizeof(index_html)-1); 00440 } 00441 else if(strcmp(request,get_digital_inputs_html)==0) 00442 { 00443 sendRequestedPageToClient(linkId,digitalInputs_html,sizeof(digitalInputs_html)-1); 00444 } 00445 else if(strcmp(request,get_analog_inputs_html)==0) 00446 { 00447 sendRequestedPageToClient(linkId,analog_inputs_html,sizeof(analog_inputs_html)-1); 00448 00449 } 00450 else if(strcmp(request,get_analog_outputs)==0) 00451 { 00452 sendRequestedPageToClient(linkId,analog_outputs_html,sizeof(analog_outputs_html)-1); 00453 } 00454 00455 else if(strcmp(request,"/images/logo.jpg")==0) 00456 { 00457 sendRequestedPageToClient(linkId,logo_jpg,sizeof(logo_jpg)); 00458 } 00459 else if(strcmp(request,"/favicon.ico")==0) 00460 { 00461 sendRequestedPageToClient(linkId,favicon_ico,sizeof(favicon_ico)); 00462 } 00463 else if(strcmp(request,"/css/style.css")==0) 00464 { 00465 sendRequestedPageToClient(linkId,style_css,sizeof(style_css)-1); 00466 } 00467 else if(strncmp(request,get_Toggle_Output,strlen(get_Toggle_Output))==0) 00468 { 00469 //check query field and value, and toggle appropriate Output 00470 char field[10],value[10]; 00471 extractQueryFieldValue(request,field,value); 00472 if(value!=NULL) 00473 { 00474 char newPinState=toggleOutput(value); 00475 char responsePacket[100]; 00476 sprintf(responsePacket,"%s%c",textPlainHeader,newPinState+48); 00477 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket)); 00478 } 00479 } 00480 else if(strcmp(request,get_digital_output_status)==0) 00481 { 00482 //"{\"digital_outputs\":{\"dout1\":1,\"dout2\":0,\"dout3\":1,\"dout4\":1}}" 00483 char responsePacket[200]; 00484 sprintf(responsePacket,"%s{\"digital_outputs\":{\"dout1\":%c,\ 00485 \"dout2\":%c,\"dout3\":%c,\"dout4\":%c}}",jsonHeader,(!digital_out_1)+48, 00486 (!digital_out_2)+48,(!digital_out_3)+48,(!digital_out_4)+48); 00487 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket)); 00488 } 00489 else if(strcmp(request,get_digital_input_status)==0) 00490 { 00491 char responsePacket[200]; 00492 sprintf(responsePacket,"%s{\"digital_inputs\":{\"din1\":%c,\ 00493 \"din2\":%c,\"din3\":%c,\"din4\":%c}}",jsonHeader,(digital_in_1)+48, 00494 (digital_in_2)+48,(digital_in_3)+48,(digital_in_4)+48); 00495 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket)); 00496 00497 } 00498 else if(strncmp(request,get_analog_output_update,strlen(get_analog_output_update))==0) 00499 { 00500 char field[10],value[10]; 00501 extractQueryFieldValue(request,field,value); 00502 if(value!=NULL) 00503 { 00504 analog_out_1=atof(value)/12.0; 00505 char responsePacket[100]; 00506 sprintf(responsePacket,"%s%.2f",textPlainHeader,analog_out_1.read()*12.0); 00507 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket)); 00508 } 00509 } 00510 else if(strcmp(request,get_analog_outputs_status)==0) 00511 { 00512 char responsePacket[100]; 00513 sprintf(responsePacket,"%s%.2f",textPlainHeader,analog_out_1.read()*12.0); 00514 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket)); 00515 } 00516 else if(strcmp(request,get_analog_inputs_status)==0) 00517 { 00518 char responsePacket[100]; 00519 sprintf(responsePacket,"%s%.2f",textPlainHeader,((tempSensor*3.3)-0.500)*100.0); 00520 sendRequestedPageToClient(linkId,responsePacket,strlen(responsePacket)); 00521 } 00522 else 00523 { 00524 sendRequestedPageToClient(linkId,not_found_text,sizeof(not_found_text)-1); 00525 //send page not found message 00526 } 00527 } 00528 } 00529 00530 00531 void sendRequestedPageToClient(char id, const char* page,unsigned int len) 00532 { 00533 char atCommandArray[50]; 00534 unsigned int lenOfPacketToTx; 00535 unsigned int pageToSendAddress=0; 00536 char tempEspStatus; 00537 while(len>0) 00538 { 00539 if(len>2048){ 00540 len-=2048; 00541 lenOfPacketToTx=2048; 00542 } 00543 else{ 00544 lenOfPacketToTx=len; 00545 len=0; 00546 } 00547 00548 sprintf(atCommandArray,"AT+CIPSEND=%c,%d\r\n",id,lenOfPacketToTx); 00549 bufferReadingIndex_espRespSearch=bufferWritingIndex; 00550 esp.printf(atCommandArray); 00551 00552 while(1) 00553 { 00554 tempEspStatus=readEspResponse(); 00555 if(tempEspStatus==READY_TO_WRITE_TCP||tempEspStatus==ERROR ||tempEspStatus==FAIL) 00556 break; 00557 } 00558 //now send page 00559 if(tempEspStatus==READY_TO_WRITE_TCP) 00560 { 00561 sendMemArrayToEsp(page+pageToSendAddress,lenOfPacketToTx); 00562 do{ 00563 tempEspStatus=readEspResponse(); 00564 } 00565 while(tempEspStatus==UNKNOWN); 00566 if(tempEspStatus!=OK)//link broken, don't send more data to this link. 00567 break; 00568 00569 pageToSendAddress+=lenOfPacketToTx; 00570 } 00571 else 00572 break; 00573 } 00574 if(tempEspStatus==OK) 00575 { 00576 sprintf(atCommandArray,"AT+CIPCLOSE=%c\r\n",id); 00577 esp.printf(atCommandArray); 00578 while(readEspResponse()==UNKNOWN); 00579 } 00580 } 00581 00582 void sendMemArrayToEsp(const char*str,unsigned int len) 00583 { 00584 while(len--) 00585 esp.putc(*str++); 00586 } 00587 00588 void extractQueryFieldValue(char* someUrl,char* field, char* value) 00589 { 00590 sscanf(someUrl,"%*[^?]%*c%[^=]%*c%s",field,value); 00591 } 00592 00593 char toggleOutput(char* pinName) 00594 { 00595 if(strcmp(pinName,"dout1")==0) 00596 { 00597 digital_out_1=!digital_out_1; 00598 return !digital_out_1; 00599 } 00600 else if(strcmp(pinName,"dout2")==0) 00601 { 00602 digital_out_2=!digital_out_2; 00603 return !digital_out_2; 00604 } 00605 else if(strcmp(pinName,"dout3")==0) 00606 { 00607 digital_out_3=!digital_out_3; 00608 return !digital_out_3; 00609 } 00610 else if(strcmp(pinName,"dout4")==0) 00611 { 00612 digital_out_4=!digital_out_4; 00613 return !digital_out_4; 00614 } 00615 else return 2;//error 00616 00617 } 00618 00619 00620 00621 void sendDataToThingSpeak(char* dataToSend) 00622 { 00623 //first stop server 00624 char responseFromEsp; 00625 esp.printf("AT+CIPSERVER=0\r\n"); 00626 while(readEspResponse()!=OK); 00627 00628 esp.printf("AT+CIPSTART=4,\"TCP\",\"api.thingspeak.com\",80\r\n\r\n"); 00629 do{ 00630 responseFromEsp=readEspResponse(); 00631 }while(responseFromEsp==UNKNOWN); 00632 00633 if(responseFromEsp==OK)//connect success to thingspeak 00634 { 00635 sendRequestedPageToClient('4',dataToSend,strlen(dataToSend)); 00636 } 00637 00638 //Restart server 00639 esp.printf("AT+CIPSERVER=1,80\r\n");//start server at port 80 00640 while(readEspResponse()!=OK); 00641 }
Generated on Fri Jul 15 2022 21:00:43 by
![doxygen](doxygen.png)