{"id":273,"date":"2016-02-27T19:09:50","date_gmt":"2016-02-27T19:09:50","guid":{"rendered":"https:\/\/www.kolkataonweb.com\/code-bank\/?p=273"},"modified":"2016-07-18T21:34:26","modified_gmt":"2016-07-18T20:34:26","slug":"arduino-communicate-with-server-part-1","status":"publish","type":"post","link":"https:\/\/www.kolkataonweb.com\/code-bank\/arduino\/arduino-communicate-with-server-part-1\/","title":{"rendered":"Arduino &#8211; Communicate With Server &#8211; Part 1 &#8211; Arduino code"},"content":{"rendered":"<p>The below code send some data (temperature and pressure here) to a server and reads back some data from server. The send part works every 5 minutes and the read part works every 5 seconds. This code works by polling method.<\/p>\n<p><em>All delays might have room for optimization<\/em><\/p>\n<blockquote>\n<pre class='wp-code-highlight prettyprint'><span style=\"color: #333333;\">#include &lt;SFE_BMP180.h&gt; \/\/<a style=\"color: #333333;\" href=\"https:\/\/www.kolkataonweb.com\/code-bank\/arduino\/bmp-180-digital-barometric-pressure-sensor\/\" target=\"_blank\">from sparkfun<\/a> \r\n#include &lt;Wire.h&gt;\r\n#include &lt;SoftwareSerial.h&gt;\r\n\r\n#define _SS_MAX_RX_BUFF 512 \/\/ RX buffer size \/\/Default is 64\r\n\r\nSoftwareSerial esp8266(2,3);\r\n\r\nString inputBuffer = \"\";\r\nboolean stringComplete = false;\r\nint inputBufferIndex;\r\n\r\nint led1Pin = 9;\r\nint led2Pin = 10;\r\n\r\nbyte led1Status, led2Status;\r\n\r\nString data1 = \"\"; \r\nString data2 = \"\";\r\nString data3 = \"\";\r\nString data4 = \"\";\r\nString data5 = \"\";\r\n\r\nunsigned long startTimeDataCapture = 0;\r\nunsigned long lastDataSent = 0;\r\n\r\nSFE_BMP180 pressure;\r\n\r\nchar status;\r\ndouble T,P,temp,paH,paM;\r\n\r\n\r\nvoid setup() {\r\n\u00a0 \/\/ put your setup code here, to run once:\r\n\u00a0 \r\n\u00a0 inputBuffer.reserve(1024); \/\/to be optimized\r\n\u00a0 \r\n\u00a0 pinMode(led1Pin, OUTPUT);\r\n\u00a0 pinMode(led2Pin, OUTPUT);\r\n\u00a0 \r\n\u00a0 pressure.begin();\r\n\u00a0 \r\n\u00a0 \r\n\u00a0 \/\/Serial.begin(19200);\r\n\r\n\u00a0 esp8266.begin(9600);\r\n\u00a0 esp8266.println(\"AT\");\u00a0 delay(100);\r\n\u00a0 esp8266.println(\"AT+UART_CUR=4800,8,1,0,0\"); \/\/set the Baud rate \r\n  esp8266.flush(); delay(100);\r\n\u00a0 while(esp8266.available())\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.write(esp8266.read());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 esp8266.read();  \/\/clear the buffer\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 delay(80);\r\n\u00a0 }\r\n\u00a0 esp8266.end();\r\n\r\n\u00a0 esp8266.begin(4800);\r\n\u00a0 esp8266.println(\"AT\"); delay(100);\r\n\u00a0 \r\n\u00a0 esp8266.println(\"AT+CIPMUX=1\"); delay(100);\r\n\u00a0 esp8266.println(\"AT+CWMODE=1\"); delay(100); \r\n\u00a0 esp8266.println(\"AT+CWJAP=\"TP-LINK_POCKET_3020_304764\",\"password\"\"); esp8266.flush();\u00a0 delay(1000); \u00a0\r\n\u00a0 \r\n\u00a0 while(esp8266.available())\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.write(esp8266.read());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 esp8266.read(); \/\/clear the buffer\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 delay(80);\r\n\u00a0 }\r\n\u00a0\u00a0 \u00a0\r\n\u00a0 delay(5000);\r\n}\r\n\r\n\r\nvoid loop() {\r\n\r\n\u00a0 while(esp8266.available())\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.write(esp8266.read());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 esp8266.read();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 delay(10);\r\n\u00a0 }\r\n\r\n\u00a0 inputBuffer = \"\";\r\n\u00a0 stringComplete = false;\r\n\u00a0 \r\n\u00a0 \/***** Read the LED status for sending to server  -- will be implemented later *\/\r\n  if(digitalRead(led1Pin) == HIGH)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 led1Status = 1;\r\n\u00a0 }\r\n\u00a0 else\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 led1Status = 0;\r\n\u00a0 }\r\n\r\n\u00a0 if(digitalRead(led2Pin) == HIGH)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 led2Status = 1;\r\n\u00a0 }\r\n\u00a0 else\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 led2Status = 0;\r\n\u00a0 }\r\n\u00a0 \r\n\u00a0 status = pressure.startTemperature();\r\n\u00a0 if (status != 0)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 \/\/ Wait for the measurement to complete:\r\n\u00a0\u00a0\u00a0 delay(status);\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Retrieve the completed temperature measurement:\r\n\u00a0\u00a0\u00a0 \/\/ Note that the measurement is stored in the variable T.\r\n\u00a0\u00a0\u00a0 \/\/ Function returns 1 if successful, 0 if failure.\r\n\r\n\u00a0\u00a0\u00a0 status = pressure.getTemperature(T);\r\n\u00a0\u00a0\u00a0 if (status != 0)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 temp = T;\r\n\r\n\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Start a pressure measurement\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 status = pressure.startPressure(3);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if (status != 0)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Wait for the measurement to complete:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay(status);\r\n\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Note also that the function requires the previous temperature measurement (T).\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Function returns 1 if successful, 0 if failure.\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 status = pressure.getPressure(P,T);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (status != 0)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 paM = P;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 paH = P*0.0295333727;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 paM = -1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 paH = -1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 paM = -1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 paH = -1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 temp = -1;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0 }\r\n\u00a0 else\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 temp = -1;\r\n\u00a0 }\r\n\r\n\u00a0 \u00a0\r\n\u00a0\u00a0 \/\/send the data to server\r\n\u00a0 \r\n\u00a0 if(millis() - lastDataSent &gt; 300000) \/\/send data every 5 minutes \r\n\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 lastDataSent = millis();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 data1 = \"GET \/webservice.php?action=1&amp;temp=\"+String(temp)+\"&amp;paM=\"+String(paM)+\"&amp;paH=\"+String(paH)+\" HTTP\/1.1\";\r\n\u00a0 }\r\n\u00a0 else\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 data1 = \"GET \/webservice.php?action=2 HTTP\/1.1\";\r\n\u00a0 }\r\n\u00a0 \/\/Serial.println(data1);\r\n\u00a0 data2 = \"Host: xxx.xxx.xxx.xxx\";\r\n\u00a0 data3 = \"User-Agent: Mozilla\/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko\/20100101 Firefox\/43.0\";\r\n\u00a0 data4 = \"Accept: text\/html\";\r\n\u00a0 data5 = \"Connection: close\";\r\n\u00a0 \/\/Serial.println(data1.length()+data2.length()+data3.length()+data4.length()+data5.length());\r\n\u00a0 \r\n\u00a0 esp8266.println(\"AT+CIPSTART=4,\"TCP\",\"xxx.xxx.xxx.xxx\",80\");\u00a0 delay(1000); \r\n\u00a0\u00a0 while(esp8266.available())\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.write(esp8266.read());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 esp8266.read();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 delay(10);\r\n\u00a0 }\r\n\u00a0 esp8266.println(\"AT+CIPSEND=4,\"+String(data1.length()+data2.length()+data3.length()+data4.length()+data5.length()+12)); \/\/ the 12 here is related to the data being sent below. Each dataline is sent using println (required to sent) which adds a \\r\\n after every line. \\r and \\n makes 2 chars. So for every data sent using println 2 count is increased in the total data length paramter of AT+CIPSEND\r\n\u00a0 delay(1000);\r\n\u00a0 while(esp8266.available())\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.write(esp8266.read());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 esp8266.read();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 delay(10);\r\n\u00a0 }\r\n\u00a0 \r\n\u00a0 \r\n\u00a0 esp8266.println(data1); delay(1);\r\n\u00a0 esp8266.println(data2); delay(1);\r\n\u00a0 esp8266.println(data3); delay(1);\r\n\u00a0 esp8266.println(data4); delay(1);\r\n\u00a0 esp8266.println(data5); delay(1);\r\n\u00a0 esp8266.println();\u00a0 delay(1); esp8266.flush();\r\n\r\n\u00a0 startTimeDataCapture = millis();\r\n\u00a0 while(1)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 if(esp8266.available())\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 inputBuffer += (char)esp8266.read();\r\n\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 if(inputBuffer.indexOf(\"CLOSED\")&gt; 0 || millis() - startTimeDataCapture &gt; 10000) \/\/The server sends a close after a successful transmission. In case that didn't come (net failure, server failure whatever) then don't wait more than 20 seconds\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 stringComplete = true;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.println(inputBuffer);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/delay(1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 break;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0 }\r\n\r\n\u00a0 \/\/check if data came from server\r\n\u00a0 if(stringComplete)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 inputBufferIndex = inputBuffer.indexOf(\"led_1=\");\r\n\u00a0\u00a0\u00a0 if(inputBufferIndex &gt; -1)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 led1Status = (int)(inputBuffer[inputBufferIndex+6]-'0');  \/\/ int conversion required else it was being considered as string by the codes\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 inputBufferIndex = inputBuffer.indexOf(\"led_2=\");\r\n\u00a0\u00a0\u00a0 if(inputBufferIndex &gt; -1)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 led2Status = (int)(inputBuffer[inputBufferIndex+6]-'0');\r\n\r\n\u00a0\u00a0\u00a0 if(led1Status == 1)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 led1Status = 1;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(led1Status == 0)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 led1Status = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 if(led2Status == 1)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 led2Status = 1;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(led2Status == 0)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 led2Status = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0 \r\n\u00a0\u00a0\u00a0 digitalWrite(led1Pin,led1Status);\r\n\u00a0\u00a0\u00a0 digitalWrite(led2Pin,led2Status);\r\n\r\n\u00a0\u00a0\u00a0 stringComplete = false;\r\n\u00a0\u00a0\u00a0 inputBuffer = \"\";\r\n\u00a0 } \u00a0\r\n\u00a0 else\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 esp8266.println(\"AT+CIPCLOSE=4\"); \/\/ if for any reason  the server didn't reply properly, then close the connection\r\n\u00a0 }\r\n\u00a0 delay(5000); \/\/ wait 5 secs before making next server call\r\n}\r\n\r\n<\/span><\/pre>\n<\/blockquote>\n<p><em><span style=\"color: #333333;\">In future revision will implement exception handling (e.g &#8211; if the wi-fi is not found then go to sleep and try after certain intervals till connection is established, and only after connection is established move to the next step)<\/span><\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The below code send some data (temperature and pressure here) to a server and reads back some data from server. The send part works every 5 minutes and the read part works every 5 seconds. This code works by polling method. All delays might have room for optimization #include &lt;SFE_BMP180.h&gt; \/\/from sparkfun #include &lt;Wire.h&gt; #include&hellip; <a class=\"more-link\" href=\"https:\/\/www.kolkataonweb.com\/code-bank\/arduino\/arduino-communicate-with-server-part-1\/\">Continue reading <span class=\"screen-reader-text\">Arduino &#8211; Communicate With Server &#8211; Part 1 &#8211; Arduino code<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[13,30,31,28,32,29],"class_list":["post-273","post","type-post","status-publish","format-standard","hentry","category-arduino","tag-arduino","tag-read-data-from-cloud","tag-read-data-from-server","tag-save-data-to-cloud","tag-send-data-to-server","tag-webservice-call","entry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/posts\/273","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/comments?post=273"}],"version-history":[{"count":7,"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/posts\/273\/revisions"}],"predecessor-version":[{"id":449,"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/posts\/273\/revisions\/449"}],"wp:attachment":[{"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/media?parent=273"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/categories?post=273"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/tags?post=273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}