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:
Sun Feb 18 17:10:48 2018 +0000
Branch:
DistanceRegulation
Revision:
33:a2f9fea05cb9
Parent:
32:c729e6da7f9a
Child:
34:5dca557e982f
stable Rel1

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