Regenerating PPM signal based on distances from ultrasonic sensors, ESP8266 for connectin via wifi. Autonomous quadcopter behaviour, autonomou height holding. Flying direction based on front and back ultrasonic sensors.

Dependencies:   ConfigFile HCSR04 PID PPM2 mbed-rtos mbed

Committer:
edy05
Date:
Fri Dec 01 11:11:23 2017 +0000
Branch:
DistanceRegulation
Revision:
26:11539036f0fb
Parent:
25:69190c222dbf
Child:
27:5956d5e3ff63
Stable

Who changed what in which revision?

UserRevisionLine numberNew contents of line
edy05 2:d172c9963f87 1 #include "mbed.h"
edy05 2:d172c9963f87 2 #include "rtos.h"
edy05 9:86a5af9935b1 3 #include "hardware.h"
edy05 2:d172c9963f87 4
edy05 2:d172c9963f87 5
edy05 2:d172c9963f87 6 RawSerial esp(p9, p10); // tx, rx
edy05 2:d172c9963f87 7 DigitalOut reset(p8);
edy05 2:d172c9963f87 8
edy05 2:d172c9963f87 9 // Standard Mbed LED definitions
edy05 2:d172c9963f87 10 DigitalOut led1(LED1); // (PTB18)
edy05 2:d172c9963f87 11 DigitalOut led3(LED3); // (PTD1)
edy05 2:d172c9963f87 12
edy05 2:d172c9963f87 13 Timer t1;
edy05 2:d172c9963f87 14 Timer t2;
edy05 2:d172c9963f87 15
edy05 2:d172c9963f87 16 char cmdbuff[32];
edy05 2:d172c9963f87 17 char replybuff[1024];
edy05 2:d172c9963f87 18 char webcount[8];
edy05 2:d172c9963f87 19 char webdata[1024]; // This may need to be bigger depending on WEB browser used
edy05 2:d172c9963f87 20 char webbuff[4096]; // Currently using 1986 characters, Increase this if more web page data added
edy05 2:d172c9963f87 21 char type[16];
edy05 2:d172c9963f87 22 char channel[2];
edy05 2:d172c9963f87 23 char ip_address[20];
edy05 2:d172c9963f87 24 int bufflen, DataRX, count, getcount, replycount, servreq, timeout;
edy05 2:d172c9963f87 25 int bufl, ipdLen, linkID, weberror, webcounter;
edy05 25:69190c222dbf 26 bool start = true;
edy05 2:d172c9963f87 27
edy05 2:d172c9963f87 28 void getreply(); void SendCMD();
edy05 2:d172c9963f87 29 void startserver();
edy05 2:d172c9963f87 30 void ReadWebData();
edy05 2:d172c9963f87 31 void sendpage();
edy05 2:d172c9963f87 32 void sendcheck();
edy05 2:d172c9963f87 33 void get_ip_address(char web_data[1024]);
edy05 2:d172c9963f87 34 void SendWEB();
edy05 2:d172c9963f87 35
edy05 2:d172c9963f87 36 void serverRun();
edy05 2:d172c9963f87 37 void serverMain();
edy05 2:d172c9963f87 38 void serverLoop();
edy05 2:d172c9963f87 39 void callback();
edy05 2:d172c9963f87 40
edy05 2:d172c9963f87 41 int port =80; // set server port
edy05 2:d172c9963f87 42 int SERVtimeout =5; // set server timeout in seconds in case link breaks.
edy05 2:d172c9963f87 43
edy05 9:86a5af9935b1 44
edy05 2:d172c9963f87 45
edy05 2:d172c9963f87 46 //serverThread.start(serverRun);
edy05 2:d172c9963f87 47
edy05 2:d172c9963f87 48 void callback(){
edy05 2:d172c9963f87 49 //pc.printf("callback!!!!!!!!!!!!!!!!_________________________\n\r");
edy05 2:d172c9963f87 50 led3 = 1;
edy05 2:d172c9963f87 51 while (esp.readable()) {
edy05 2:d172c9963f87 52 webbuff[count] = esp.getc();
edy05 2:d172c9963f87 53 count++;
edy05 2:d172c9963f87 54 }
edy05 2:d172c9963f87 55 if(strlen(webbuff)>bufflen) {
edy05 2:d172c9963f87 56 DataRX=1;
edy05 2:d172c9963f87 57 led3=0;
edy05 2:d172c9963f87 58 }
edy05 2:d172c9963f87 59 }
edy05 2:d172c9963f87 60
edy05 2:d172c9963f87 61
edy05 2:d172c9963f87 62 void serverRun(){
edy05 2:d172c9963f87 63 reset=0;
edy05 25:69190c222dbf 64
edy05 2:d172c9963f87 65 pc.printf("\f\n\r------------ ESP8266 Hardware Reset --------------\n\r");
edy05 2:d172c9963f87 66 wait(0.5);
edy05 2:d172c9963f87 67 reset=1;
edy05 2:d172c9963f87 68 timeout=6000;
edy05 2:d172c9963f87 69 getcount=500;
edy05 2:d172c9963f87 70 getreply();
edy05 2:d172c9963f87 71 esp.baud(115200); // ESP8266 baudrate. Maximum on KLxx' is 115200, 230400 works on K20 and K22F
edy05 2:d172c9963f87 72 startserver();
edy05 9:86a5af9935b1 73 loadConfigFile();
edy05 26:11539036f0fb 74 webcounter = 0;
edy05 2:d172c9963f87 75 while(1){
edy05 2:d172c9963f87 76 if(DataRX==1) {
edy05 2:d172c9963f87 77 ReadWebData();
edy05 11:002927b2675d 78 // Save data to configFile
edy05 11:002927b2675d 79 writeSettingsToConfig();
edy05 25:69190c222dbf 80 if ((servreq == 1 && weberror == 0) || start) {
edy05 25:69190c222dbf 81 start = false;
edy05 10:bb9c778f8e3e 82 // send HTTP Response
edy05 2:d172c9963f87 83 sendpage();
edy05 2:d172c9963f87 84 }
edy05 2:d172c9963f87 85 esp.attach(&callback);
edy05 2:d172c9963f87 86 pc.printf(" IPD Data:\r\n\n Link ID = %d,\r\n IPD Header Length = %d \r\n IPD Type = %s\r\n", linkID, ipdLen, type);
edy05 2:d172c9963f87 87 pc.printf("\n\n HTTP Packet: \n\n%s\n", webdata);
edy05 2:d172c9963f87 88 pc.printf(" Web Characters sent : %d\n\n", bufl);
edy05 2:d172c9963f87 89 pc.printf(" -------------------------------------\n\n");
edy05 2:d172c9963f87 90 servreq=0;
edy05 15:9cdf757269fb 91 memset(_serverMessage, '\0', sizeof(_serverMessage));
edy05 2:d172c9963f87 92 }
edy05 26:11539036f0fb 93 Thread::wait(5);
edy05 2:d172c9963f87 94 }
edy05 2:d172c9963f87 95 }
edy05 2:d172c9963f87 96
edy05 2:d172c9963f87 97
edy05 2:d172c9963f87 98 // Static WEB page
edy05 2:d172c9963f87 99 void sendpage(){
edy05 2:d172c9963f87 100 strcpy(webbuff, "<!DOCTYPE html>");
edy05 2:d172c9963f87 101 strcat(webbuff, "<html><head><title>ESP8266 Mbed LPC1768</title></head>");
edy05 2:d172c9963f87 102 strcat(webbuff, "<body>");
edy05 2:d172c9963f87 103 strcat(webbuff, "<div style=\"text-align:center; background-color:#F4F4F4; color:#00AEDB;\"><h1>ESP8266 Mbed IoT Web PID Controller</h1>");
edy05 2:d172c9963f87 104 strcat(webbuff, "Hit Count - ");
edy05 2:d172c9963f87 105 strcat(webbuff, webcount);
edy05 2:d172c9963f87 106 strcat(webbuff, "</div><br /><hr>");
edy05 15:9cdf757269fb 107 //server message (mostly errors)
edy05 15:9cdf757269fb 108 strcat(webbuff, "<div stye=\"text-align:center; background-color:#F4F4F4; color:#00AEDB;\"><h3>Server messages</h3>");
edy05 15:9cdf757269fb 109 strcat(webbuff, _serverMessage);
edy05 15:9cdf757269fb 110 strcat(webbuff, "</div><br><hr>");
edy05 2:d172c9963f87 111 strcat(webbuff, "<p><form method=\"POST\">");
edy05 2:d172c9963f87 112 if(led1==0) {
edy05 2:d172c9963f87 113 strcat(webbuff, "<p><input type=\"radio\" name=\"led1\" value=\"0\" checked> LED 1 off");
edy05 2:d172c9963f87 114 strcat(webbuff, "<br><input type=\"radio\" name=\"led1\" value=\"1\" > LED 1 on<br>");
edy05 2:d172c9963f87 115 } else {
edy05 2:d172c9963f87 116 strcat(webbuff, "<p><input type=\"radio\" name=\"led1\" value=\"0\" > LED 1 off");
edy05 2:d172c9963f87 117 strcat(webbuff, "<br><input type=\"radio\" name=\"led1\" value=\"1\" checked> LED 1 on<br>");
edy05 2:d172c9963f87 118 }
edy05 21:0afb91824792 119 // ground regulation
edy05 21:0afb91824792 120 if(_groundRegulation) {
edy05 21:0afb91824792 121 strcat(webbuff, "<p><input type=\"radio\" name=\"groundRegulation\" value=\"1\" checked> Ground regulation ON");
edy05 21:0afb91824792 122 strcat(webbuff, "<br><input type=\"radio\" name=\"groundRegulation\" value=\"0\" > Ground regulation OFF<br>");
edy05 21:0afb91824792 123 } else {
edy05 21:0afb91824792 124 strcat(webbuff, "<p><input type=\"radio\" name=\"groundRegulation\" value=\"1\" > Ground regulation ON");
edy05 25:69190c222dbf 125 strcat(webbuff, "<br><input type=\"radio\" name=\"groundRegulation\" value=\"0\" checked> Ground regulation OFF<br>");
edy05 21:0afb91824792 126 }
edy05 25:69190c222dbf 127 // pid ground min output
edy05 25:69190c222dbf 128 strcat(webbuff, "pid min Output: <input type=\"text\" name=\"groundPidMinOutput\" size=6 value=\"");
edy05 25:69190c222dbf 129 ConvertToCharArray(_groundPidMinOutput);
edy05 25:69190c222dbf 130 strcat(webbuff, _str);
edy05 25:69190c222dbf 131 strcat(webbuff, "\"><br>");
edy05 25:69190c222dbf 132 //pid ground max output
edy05 25:69190c222dbf 133 strcat(webbuff, "pid max Output: <input type=\"text\" name=\"groundPidMaxOutput\" size=6 value=\"");
edy05 25:69190c222dbf 134 ConvertToCharArray(_groundPidMaxOutput);
edy05 25:69190c222dbf 135 strcat(webbuff, _str);
edy05 25:69190c222dbf 136 strcat(webbuff, "\"><br>");
edy05 25:69190c222dbf 137 //ground regulation bias
edy05 25:69190c222dbf 138 strcat(webbuff, "Bias: <input type=\"text\" name=\"bias\" size=6 value=\"");
edy05 25:69190c222dbf 139 ConvertToCharArray(_bias);
edy05 25:69190c222dbf 140 strcat(webbuff, _str);
edy05 25:69190c222dbf 141 strcat(webbuff, "\"><br>");
edy05 2:d172c9963f87 142 strcat(webbuff, "P: <input type=\"text\" name=\"proportional\" size=6 value=\"");
edy05 9:86a5af9935b1 143 ConvertToCharArray(_P);
edy05 9:86a5af9935b1 144 strcat(webbuff, _str);
edy05 2:d172c9963f87 145 strcat(webbuff, "\"><br>");
edy05 2:d172c9963f87 146 strcat(webbuff, "I: <input type=\"text\" name=\"integral\" size=6 value=\"");
edy05 9:86a5af9935b1 147 ConvertToCharArray(_I);
edy05 9:86a5af9935b1 148 strcat(webbuff, _str);
edy05 2:d172c9963f87 149 strcat(webbuff, "\"><br>");
edy05 2:d172c9963f87 150 strcat(webbuff, "D: <input type=\"text\" name=\"derivative\" size=6 value=\"");
edy05 9:86a5af9935b1 151 ConvertToCharArray(_D);
edy05 9:86a5af9935b1 152 strcat(webbuff, _str);
edy05 2:d172c9963f87 153 strcat(webbuff, "\"><br>");
edy05 14:076ef843e1ba 154 //Ground set Point
edy05 14:076ef843e1ba 155 strcat(webbuff, "Ground setPoint: <input type=\"text\" name=\"groundSetPoint\" size=6 value=\"");
edy05 14:076ef843e1ba 156 ConvertToCharArray(_groundSetPoint);
edy05 14:076ef843e1ba 157 strcat(webbuff, _str);
edy05 14:076ef843e1ba 158 strcat(webbuff, "\"><br>");
edy05 2:d172c9963f87 159 strcat(webbuff, "<p><input type=\"radio\" name=\"nothing\" value=\"1\" checked>");
edy05 2:d172c9963f87 160 strcat(webbuff, "<p><input type=\"submit\" value=\"send-refresh\" style=\"background: #3498db;");
edy05 2:d172c9963f87 161 strcat(webbuff, "background-image:-webkit-linear-gradient(top, #3498db, #2980b9);");
edy05 2:d172c9963f87 162 strcat(webbuff, "background-image:linear-gradient(to bottom, #3498db, #2980b9);");
edy05 2:d172c9963f87 163 strcat(webbuff, "-webkit-border-radius:12;border-radius: 12px;font-family: Arial;color:#ffffff;font-size:20px;padding:");
edy05 2:d172c9963f87 164 strcat(webbuff, "10px 20px 10px 20px; border:solid #103c57 3px;text-decoration: none;");
edy05 2:d172c9963f87 165 strcat(webbuff, "background: #3cb0fd;");
edy05 2:d172c9963f87 166 strcat(webbuff, "background-image:-webkit-linear-gradient(top,#3cb0fd,#1a5f8a);");
edy05 2:d172c9963f87 167 strcat(webbuff, "background-image:linear-gradient(to bottom,#3cb0fd,#1a5f8a);");
edy05 2:d172c9963f87 168 strcat(webbuff, "text-decoration:none;\"></form>");
edy05 2:d172c9963f87 169 strcat(webbuff, "</body></html>");
edy05 2:d172c9963f87 170 // end of WEB page data
edy05 2:d172c9963f87 171 bufl = strlen(webbuff); // get total page buffer length
edy05 2:d172c9963f87 172 sprintf(cmdbuff,"AT+CIPSEND=%d,%d\r\n", linkID, bufl); // send IPD link channel and buffer character length.
edy05 2:d172c9963f87 173 timeout=200;
edy05 2:d172c9963f87 174 getcount=7;
edy05 2:d172c9963f87 175 SendCMD();
edy05 2:d172c9963f87 176 getreply();
edy05 2:d172c9963f87 177 SendWEB(); // send web page
edy05 2:d172c9963f87 178 memset(webbuff, '\0', sizeof(webbuff));
edy05 2:d172c9963f87 179 sendcheck();
edy05 2:d172c9963f87 180
edy05 2:d172c9963f87 181 }
edy05 2:d172c9963f87 182
edy05 2:d172c9963f87 183 void sendcheck(){
edy05 2:d172c9963f87 184 weberror=1;
edy05 2:d172c9963f87 185 timeout=500;
edy05 2:d172c9963f87 186 getcount=24;
edy05 2:d172c9963f87 187 t2.reset();
edy05 2:d172c9963f87 188 t2.start();
edy05 2:d172c9963f87 189 while(weberror==1 && t2.read() <5) {
edy05 2:d172c9963f87 190 getreply();
edy05 2:d172c9963f87 191 if (strstr(replybuff, "SEND OK") != NULL) {
edy05 2:d172c9963f87 192 weberror=0; // wait for valid SEND OK
edy05 2:d172c9963f87 193 }
edy05 2:d172c9963f87 194 }
edy05 2:d172c9963f87 195 if(weberror==1) { // restart connection
edy05 2:d172c9963f87 196 strcpy(cmdbuff, "AT+CIPMUX=1\r\n");
edy05 2:d172c9963f87 197 timeout=500;
edy05 2:d172c9963f87 198 getcount=10;
edy05 2:d172c9963f87 199 SendCMD();
edy05 2:d172c9963f87 200 getreply();
edy05 2:d172c9963f87 201 pc.printf(replybuff);
edy05 2:d172c9963f87 202 sprintf(cmdbuff,"AT+CIPSERVER=1,%d\r\n", port);
edy05 2:d172c9963f87 203 timeout=500;
edy05 2:d172c9963f87 204 getcount=10;
edy05 2:d172c9963f87 205 SendCMD();
edy05 2:d172c9963f87 206 getreply();
edy05 2:d172c9963f87 207 pc.printf(replybuff);
edy05 2:d172c9963f87 208 } else {
edy05 2:d172c9963f87 209 sprintf(cmdbuff, "AT+CIPCLOSE=%s\r\n",channel); // close current connection
edy05 2:d172c9963f87 210 SendCMD();
edy05 2:d172c9963f87 211 getreply();
edy05 2:d172c9963f87 212 pc.printf(replybuff);
edy05 2:d172c9963f87 213 }
edy05 2:d172c9963f87 214 t2.reset();
edy05 2:d172c9963f87 215 }
edy05 2:d172c9963f87 216
edy05 2:d172c9963f87 217 // Large WEB buffer data send
edy05 2:d172c9963f87 218 void SendWEB()
edy05 2:d172c9963f87 219 {
edy05 2:d172c9963f87 220 int i=0;
edy05 2:d172c9963f87 221 if(esp.writeable()) {
edy05 2:d172c9963f87 222 while(webbuff[i]!='\0') {
edy05 2:d172c9963f87 223 esp.putc(webbuff[i]);
edy05 2:d172c9963f87 224 i++;
edy05 2:d172c9963f87 225 }
edy05 2:d172c9963f87 226 }
edy05 2:d172c9963f87 227 }
edy05 2:d172c9963f87 228
edy05 2:d172c9963f87 229 // Reads and processes GET and POST web data
edy05 2:d172c9963f87 230 void ReadWebData(){
edy05 2:d172c9963f87 231 wait_ms(200);
edy05 2:d172c9963f87 232 esp.attach(NULL);
edy05 2:d172c9963f87 233 count=0;
edy05 2:d172c9963f87 234 DataRX=0;
edy05 2:d172c9963f87 235 weberror=0;
edy05 2:d172c9963f87 236 memset(webdata, '\0', sizeof(webdata));
edy05 2:d172c9963f87 237 int x = strcspn (webbuff,"+");
edy05 2:d172c9963f87 238 if(x) {
edy05 2:d172c9963f87 239 strcpy(webdata, webbuff + x);
edy05 2:d172c9963f87 240 pc.printf("webdata received: %s", webdata);
edy05 2:d172c9963f87 241 weberror=0;
edy05 2:d172c9963f87 242 int numMatched = sscanf(webdata,"+IPD,%d,%d:%s", &linkID, &ipdLen, type);
edy05 2:d172c9963f87 243 if (strstr(webdata, "led1=1") != NULL ) {
edy05 2:d172c9963f87 244 led1=1;
edy05 2:d172c9963f87 245 }
edy05 2:d172c9963f87 246 if (strstr(webdata, "led1=0") != NULL ) {
edy05 2:d172c9963f87 247 led1=0;
edy05 2:d172c9963f87 248 }
edy05 21:0afb91824792 249 //ground regulation
edy05 21:0afb91824792 250 if (strstr(webdata, "groundRegulation=1") != NULL )
edy05 21:0afb91824792 251 _groundRegulation = true;
edy05 21:0afb91824792 252 if (strstr(webdata, "groundRegulation=0") != NULL )
edy05 21:0afb91824792 253 _groundRegulation = false;
edy05 25:69190c222dbf 254 // pid min Output
edy05 25:69190c222dbf 255 if (strstr(webdata, "groundPidMinOutput") != NULL ){
edy05 25:69190c222dbf 256 pc.printf("\n\r looking for data \n\r");
edy05 25:69190c222dbf 257 char* p_webdata = strstr(webdata, "groundPidMinOutput");
edy05 25:69190c222dbf 258 p_webdata = p_webdata + strlen("groundPidMinOutput") + 1;
edy05 25:69190c222dbf 259 int i = 0;
edy05 25:69190c222dbf 260 while(*p_webdata != '&'){
edy05 25:69190c222dbf 261 pc.printf("%c", *p_webdata);
edy05 25:69190c222dbf 262 _str[i] = *p_webdata;
edy05 25:69190c222dbf 263 p_webdata += 1;
edy05 25:69190c222dbf 264 i++;
edy05 25:69190c222dbf 265 }
edy05 25:69190c222dbf 266 pc.printf("\n\r");
edy05 25:69190c222dbf 267 _str[i] = '\0';
edy05 25:69190c222dbf 268 pc.printf("groundPidMinOutput: %s", _str);
edy05 25:69190c222dbf 269 _groundPidMinOutput = atof(_str);
edy05 25:69190c222dbf 270 pc.printf("\n\r end of looking for data \n\r");
edy05 25:69190c222dbf 271 }
edy05 25:69190c222dbf 272 //pid max output
edy05 25:69190c222dbf 273 if (strstr(webdata, "groundPidMaxOutput") != NULL ){
edy05 25:69190c222dbf 274 pc.printf("\n\r looking for data \n\r");
edy05 25:69190c222dbf 275 char* p_webdata = strstr(webdata, "groundPidMaxOutput");
edy05 25:69190c222dbf 276 p_webdata = p_webdata + strlen("groundPidMaxOutput") + 1;
edy05 25:69190c222dbf 277 int i = 0;
edy05 25:69190c222dbf 278 while(*p_webdata != '&'){
edy05 25:69190c222dbf 279 pc.printf("%c", *p_webdata);
edy05 25:69190c222dbf 280 _str[i] = *p_webdata;
edy05 25:69190c222dbf 281 p_webdata += 1;
edy05 25:69190c222dbf 282 i++;
edy05 25:69190c222dbf 283 }
edy05 25:69190c222dbf 284 pc.printf("\n\r");
edy05 25:69190c222dbf 285 _str[i] = '\0';
edy05 25:69190c222dbf 286 pc.printf("groundPidMaxOutput: %s", _str);
edy05 25:69190c222dbf 287 _groundPidMaxOutput = atof(_str);
edy05 25:69190c222dbf 288 pc.printf("\n\r end of looking for data \n\r");
edy05 25:69190c222dbf 289 }
edy05 25:69190c222dbf 290 //bias
edy05 25:69190c222dbf 291 if (strstr(webdata, "bias") != NULL ){
edy05 25:69190c222dbf 292 pc.printf("\n\r looking for data \n\r");
edy05 25:69190c222dbf 293 char* p_webdata = strstr(webdata, "bias");
edy05 25:69190c222dbf 294 p_webdata = p_webdata + strlen("bias") + 1;
edy05 25:69190c222dbf 295 int i = 0;
edy05 25:69190c222dbf 296 while(*p_webdata != '&'){
edy05 25:69190c222dbf 297 pc.printf("%c", *p_webdata);
edy05 25:69190c222dbf 298 _str[i] = *p_webdata;
edy05 25:69190c222dbf 299 p_webdata += 1;
edy05 25:69190c222dbf 300 i++;
edy05 25:69190c222dbf 301 }
edy05 25:69190c222dbf 302 pc.printf("\n\r");
edy05 25:69190c222dbf 303 _str[i] = '\0';
edy05 25:69190c222dbf 304 pc.printf("bias: %s", _str);
edy05 25:69190c222dbf 305 _bias = atof(_str);
edy05 25:69190c222dbf 306 pc.printf("\n\r end of looking for data \n\r");
edy05 25:69190c222dbf 307 }
edy05 21:0afb91824792 308 // PID values
edy05 2:d172c9963f87 309 if (strstr(webdata, "proportional") != NULL ){
edy05 2:d172c9963f87 310 pc.printf("\n\r looking for data \n\r");
edy05 2:d172c9963f87 311 char* p_webdata = strstr(webdata, "proportional");
edy05 2:d172c9963f87 312 p_webdata = p_webdata + strlen("proportional") + 1;
edy05 2:d172c9963f87 313 int i = 0;
edy05 2:d172c9963f87 314 while(*p_webdata != '&'){
edy05 2:d172c9963f87 315 pc.printf("%c", *p_webdata);
edy05 9:86a5af9935b1 316 _str[i] = *p_webdata;
edy05 2:d172c9963f87 317 p_webdata += 1;
edy05 2:d172c9963f87 318 i++;
edy05 2:d172c9963f87 319 }
edy05 2:d172c9963f87 320 pc.printf("\n\r");
edy05 9:86a5af9935b1 321 _str[i] = '\0';
edy05 9:86a5af9935b1 322 pc.printf("proportional: %s", _str);
edy05 9:86a5af9935b1 323 _P = atof(_str);
edy05 2:d172c9963f87 324 pc.printf("\n\r end of looking for data \n\r");
edy05 2:d172c9963f87 325 }
edy05 2:d172c9963f87 326 if (strstr(webdata, "integral") != NULL){
edy05 2:d172c9963f87 327 pc.printf("\n\r looking for data \n\r");
edy05 2:d172c9963f87 328 char* p_webdata = strstr(webdata, "integral");
edy05 2:d172c9963f87 329 p_webdata = p_webdata + strlen("integral") + 1;
edy05 2:d172c9963f87 330 int i = 0;
edy05 2:d172c9963f87 331 while(*p_webdata != '&'){
edy05 2:d172c9963f87 332 pc.printf("%c", *p_webdata);
edy05 9:86a5af9935b1 333 _str[i] = *p_webdata;
edy05 2:d172c9963f87 334 p_webdata += 1;
edy05 2:d172c9963f87 335 i++;
edy05 2:d172c9963f87 336 }
edy05 2:d172c9963f87 337 pc.printf("\n\r");
edy05 9:86a5af9935b1 338 _str[i] = '\0';
edy05 9:86a5af9935b1 339 pc.printf("integral: %s", _str);
edy05 9:86a5af9935b1 340 _I = atof(_str);
edy05 2:d172c9963f87 341 pc.printf("\n\r end of looking for data \n\r");
edy05 2:d172c9963f87 342
edy05 2:d172c9963f87 343 }
edy05 2:d172c9963f87 344 if (strstr(webdata, "derivative") != NULL){
edy05 2:d172c9963f87 345 pc.printf("\n\r looking for data \n\r");
edy05 2:d172c9963f87 346 char* p_webdata = strstr(webdata, "derivative");
edy05 2:d172c9963f87 347 p_webdata = p_webdata + strlen("derivative") + 1;
edy05 2:d172c9963f87 348 int i = 0;
edy05 2:d172c9963f87 349 while(*p_webdata != '&'){
edy05 2:d172c9963f87 350 pc.printf("%c", *p_webdata);
edy05 9:86a5af9935b1 351 _str[i] = *p_webdata;
edy05 2:d172c9963f87 352 p_webdata += 1;
edy05 2:d172c9963f87 353 i++;
edy05 2:d172c9963f87 354 }
edy05 2:d172c9963f87 355 pc.printf("\n\r");
edy05 9:86a5af9935b1 356 _str[i] = '\0';
edy05 9:86a5af9935b1 357 pc.printf("derivative: %s", _str);
edy05 9:86a5af9935b1 358 _D = atof(_str);
edy05 2:d172c9963f87 359 pc.printf("\n\r end of looking for data \n\r");
edy05 2:d172c9963f87 360 }
edy05 14:076ef843e1ba 361 if (strstr(webdata, "groundSetPoint") != NULL){
edy05 14:076ef843e1ba 362 pc.printf("\n\r looking for data \n\r");
edy05 14:076ef843e1ba 363 char* p_webdata = strstr(webdata, "groundSetPoint");
edy05 14:076ef843e1ba 364 p_webdata = p_webdata + strlen("groundSetPoint") + 1;
edy05 14:076ef843e1ba 365 int i = 0;
edy05 14:076ef843e1ba 366 while(*p_webdata != '&'){
edy05 14:076ef843e1ba 367 pc.printf("%c", *p_webdata);
edy05 14:076ef843e1ba 368 _str[i] = *p_webdata;
edy05 14:076ef843e1ba 369 p_webdata += 1;
edy05 14:076ef843e1ba 370 i++;
edy05 14:076ef843e1ba 371 }
edy05 14:076ef843e1ba 372 pc.printf("\n\r");
edy05 14:076ef843e1ba 373 _str[i] = '\0';
edy05 14:076ef843e1ba 374 pc.printf("groundSetPoint: %s", _str);
edy05 14:076ef843e1ba 375 _groundSetPoint = atof(_str);
edy05 14:076ef843e1ba 376 pc.printf("\n\r end of looking for data \n\r");
edy05 14:076ef843e1ba 377 }
edy05 2:d172c9963f87 378 sprintf(channel, "%d",linkID);
edy05 2:d172c9963f87 379 if (strstr(webdata, "GET") != NULL) {
edy05 2:d172c9963f87 380 servreq=1;
edy05 2:d172c9963f87 381 }
edy05 2:d172c9963f87 382 if (strstr(webdata, "POST") != NULL) {
edy05 2:d172c9963f87 383 servreq=1;
edy05 2:d172c9963f87 384 }
edy05 2:d172c9963f87 385 webcounter++;
edy05 2:d172c9963f87 386 sprintf(webcount, "%d",webcounter);
edy05 2:d172c9963f87 387 }else{
edy05 2:d172c9963f87 388 memset(webbuff, '\0', sizeof(webbuff));
edy05 2:d172c9963f87 389 esp.attach(&callback);
edy05 2:d172c9963f87 390 weberror=1;
edy05 2:d172c9963f87 391 }
edy05 2:d172c9963f87 392
edy05 2:d172c9963f87 393 }
edy05 2:d172c9963f87 394
edy05 2:d172c9963f87 395 void startserver(){
edy05 2:d172c9963f87 396 pc.printf("++++++++++ Resetting ESP ++++++++++\r\n");
edy05 2:d172c9963f87 397 strcpy(cmdbuff,"AT+RST\r\n");
edy05 2:d172c9963f87 398 timeout=8000;
edy05 2:d172c9963f87 399 getcount=1000;
edy05 2:d172c9963f87 400 SendCMD();
edy05 2:d172c9963f87 401 getreply();
edy05 2:d172c9963f87 402 pc.printf(replybuff);
edy05 2:d172c9963f87 403 pc.printf("%d",count);
edy05 2:d172c9963f87 404 if (strstr(replybuff, "OK") != NULL) {
edy05 2:d172c9963f87 405 pc.printf("\n++++++++++ Starting Server ++++++++++\r\n");
edy05 2:d172c9963f87 406 strcpy(cmdbuff, "AT+CIPMUX=1\r\n"); // set multiple connections.
edy05 2:d172c9963f87 407 timeout=500;
edy05 2:d172c9963f87 408 getcount=20;
edy05 2:d172c9963f87 409 SendCMD();
edy05 2:d172c9963f87 410 getreply();
edy05 2:d172c9963f87 411 pc.printf(replybuff);
edy05 2:d172c9963f87 412 sprintf(cmdbuff,"AT+CIPSERVER=1,%d\r\n", port);
edy05 2:d172c9963f87 413 timeout=500;
edy05 2:d172c9963f87 414 getcount=20;
edy05 2:d172c9963f87 415 SendCMD();
edy05 2:d172c9963f87 416 getreply();
edy05 2:d172c9963f87 417 pc.printf(replybuff);
edy05 2:d172c9963f87 418 wait(1);
edy05 2:d172c9963f87 419 sprintf(cmdbuff,"AT+CIPSTO=%d\r\n",SERVtimeout);
edy05 2:d172c9963f87 420 timeout=500;
edy05 2:d172c9963f87 421 getcount=50;
edy05 2:d172c9963f87 422 SendCMD();
edy05 2:d172c9963f87 423 getreply();
edy05 2:d172c9963f87 424 pc.printf(replybuff);
edy05 2:d172c9963f87 425 wait(5);
edy05 2:d172c9963f87 426 pc.printf("\n Getting Server IP \r\n");
edy05 2:d172c9963f87 427 strcpy(cmdbuff, "AT+CIFSR\r\n");
edy05 2:d172c9963f87 428 timeout=2500;
edy05 2:d172c9963f87 429 getcount=200;
edy05 2:d172c9963f87 430 while(weberror==0) {
edy05 2:d172c9963f87 431 SendCMD();
edy05 2:d172c9963f87 432 getreply();
edy05 2:d172c9963f87 433 if (strstr(replybuff, "0.0.0.0") == NULL) {
edy05 2:d172c9963f87 434 weberror=1; // wait for valid IP
edy05 2:d172c9963f87 435 }
edy05 2:d172c9963f87 436 }
edy05 2:d172c9963f87 437 pc.printf("\n Enter WEB address (IP) found below in your browser \r\n\n");
edy05 2:d172c9963f87 438 pc.printf("\n The MAC address is also shown below,if it is needed \r\n\n");
edy05 2:d172c9963f87 439 replybuff[strlen(replybuff)-1] = '\0';
edy05 2:d172c9963f87 440 //char* IP = replybuff + 5;
edy05 2:d172c9963f87 441 sprintf(webdata,"%s", replybuff);
edy05 2:d172c9963f87 442 //SAVE IP ADDRESS
edy05 2:d172c9963f87 443 get_ip_address(webdata);
edy05 2:d172c9963f87 444 pc.printf("ip_address: %s\n\r",ip_address);
edy05 2:d172c9963f87 445 pc.printf(webdata);
edy05 2:d172c9963f87 446 pc.printf("\n\n++++++++++ Ready ++++++++++\r\n\n");
edy05 2:d172c9963f87 447 esp.attach(&callback);
edy05 2:d172c9963f87 448 } else {
edy05 2:d172c9963f87 449 pc.printf("\n++++++++++ ESP8266 error, check power/connections ++++++++++\r\n");
edy05 2:d172c9963f87 450 while(1) {}
edy05 2:d172c9963f87 451 }
edy05 2:d172c9963f87 452 t2.reset();
edy05 2:d172c9963f87 453 t2.start();
edy05 2:d172c9963f87 454 }
edy05 2:d172c9963f87 455
edy05 2:d172c9963f87 456 void SendCMD()
edy05 2:d172c9963f87 457 {
edy05 2:d172c9963f87 458 esp.printf("%s", cmdbuff);
edy05 2:d172c9963f87 459 }
edy05 2:d172c9963f87 460
edy05 2:d172c9963f87 461 void getreply()
edy05 2:d172c9963f87 462 {
edy05 2:d172c9963f87 463 memset(replybuff, '\0', sizeof(replybuff));
edy05 2:d172c9963f87 464 t1.reset();
edy05 2:d172c9963f87 465 t1.start();
edy05 2:d172c9963f87 466 replycount=0;
edy05 2:d172c9963f87 467 while(t1.read_ms()< timeout && replycount < getcount) {
edy05 2:d172c9963f87 468 if(esp.readable()) {
edy05 2:d172c9963f87 469 replybuff[replycount] = esp.getc();
edy05 2:d172c9963f87 470 replycount++;
edy05 2:d172c9963f87 471 }
edy05 2:d172c9963f87 472 }
edy05 2:d172c9963f87 473 t1.stop();
edy05 2:d172c9963f87 474 }
edy05 2:d172c9963f87 475
edy05 2:d172c9963f87 476 void get_ip_address(char web_data[1024]){
edy05 2:d172c9963f87 477 char pre_text[] = "+CIFSR:STAIP,\"";
edy05 2:d172c9963f87 478 char* p_text = strstr(webdata, pre_text);
edy05 2:d172c9963f87 479 p_text = p_text+strlen(pre_text);
edy05 2:d172c9963f87 480 char* p_text2 = strstr(p_text, "\"");
edy05 2:d172c9963f87 481 for(int i = 0;;i++){
edy05 2:d172c9963f87 482 if(*(p_text+i) == *p_text2){
edy05 2:d172c9963f87 483 ip_address[i] = '\0';
edy05 2:d172c9963f87 484 break;
edy05 2:d172c9963f87 485 }
edy05 2:d172c9963f87 486 ip_address[i] = *(p_text+i);
edy05 2:d172c9963f87 487
edy05 2:d172c9963f87 488 }
edy05 2:d172c9963f87 489 }