0

I am trying to connect my nodemcu client with nodemcu server, while my client is connected with two sensors (DHT11 and Soil Moisture) and it is workign perfectly, but on the server side I am unable to get all values, it is only giving me value of one parameter. Server Side Code

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
String apiWritekey = "PBD5LAJC4BSV3OKC"; // replace with your THINGSPEAK WRITEAPI key here
const char* ssid = "Dhamaal";// your wifi SSID name
const char* password = "03334204224" ;// wifi pasword
///~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~///
///~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~///
const char* httpserver = "api.thingspeak.com";
ESP8266WebServer server;
WiFiClient client;
// Configuration parameters for Access Point
char * ssid_ap = "ESP_AP";
char * password_ap = "123456789";
IPAddress ip(192,168,11,4); // arbitrary IP address (doesn't conflict w/ local network)
IPAddress gateway(192,168,11,1);
IPAddress subnet(255,255,255,0);
// Set up the server object
// Keep track of the sensor data that's going to be sent by the client
float t1=0.0;
float h1=0.0;
float s1=0.0;
void setup() {
 Serial.begin(115200);
 WiFi.mode(WIFI_AP);
 WiFi.softAPConfig(ip,gateway,subnet);
 WiFi.softAP(ssid_ap,password_ap);
 // Configure the server's routes
 server.on("/",handleIndex); // use the top root path to report the last sensor value
 server.on("/update",handleUpdate); // use this route to update the sensor value
 server.begin();
}
void handleIndex() {
 server.send(200,"text/plain",String(t1));
 server.send(200,"text/plain",String(h1));
 server.send(200,"text/plain",String(s1));// we'll need to refresh the page for getting the latest value
}
void handleUpdate() {
 // The value will be passed as a URL argument
 t1 = server.arg("value").toFloat();
 h1 = server.arg("value").toFloat();
 s1 = server.arg("value").toFloat();
 delay(100);
 WiFi.begin(ssid, password);
 Serial.println();
 Serial.println();
 Serial.print("Connecting to ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }
 Serial.println();
 Serial.println("");
 Serial.print("NodeMcu connected to wifi...");
 Serial.println(ssid);
 Serial.println();
 Serial.println(WiFi.localIP() );
 delay(1000);
 ///~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~///
 float t2 = t1;
 float h2 = h1;
 float s2 = s1;
 if (client.connect(httpserver,80))
 { 
 String tsData = apiWritekey;
 tsData+="&field1=";
 tsData+=String(t2);
 tsData+="&field2=";
 tsData+=String(h2);
 tsData +="&field3=";
 tsData += String(s2);
 tsData += "\r\n\r\n";
 client.print("POST /update HTTP/1.1\n");//command to update
 client.print("Host: api.thingspeak.com\n");//host name here thingspeak.com
 client.print("Connection: close\n");//closing connection
 client.print("X-THINGSPEAKAPIKEY: "+apiWritekey+"\n");
 client.print("Content-Type: application/x-www-form-urlencoded\n");
 client.print("Content-Length: ");
 client.print(tsData.length());
 client.print("\n\n"); // the 2 carriage returns indicate closing of Header fields & starting of data
 client.print(tsData);
 Serial.print("Temp: ");
 Serial.print(t2);//printing on serial monitor
 Serial.print("Humi: ");
 Serial.print(h2);
 Serial.print("Soil: ");
 Serial.print(s2);
 Serial.println("uploaded to Thingspeak server....");//dialogue box
 //}
 digitalWrite(D4, LOW); 
 client.stop();//stopping client
 Serial.println("Waiting to upload next reading...");
 Serial.println();
 delay(5000);
} }
void loop() {
server.handleClient();
}

and the output of it is Server side output

while the code of my client is

#include <DHT.h>
#include <ESP8266WiFi.h>
// Initialize sensor parameters
// Initialize network parameters
const char* ssid = "ESP_AP";
const char* password = "123456789";
const char* host = "192.168.11.4"; // as specified in server.ino
#define DHTPIN 0 //pin where the dht11 is connected
DHT dht(DHTPIN, DHT11);
// Set up the client objet
WiFiClient client;
// Configure deep sleep in between measurements
const int sleepTimeSeconds = 2;
void setup() {
 // Connect to the server
 WiFi.begin(ssid,password);
 Serial.begin(115200);
 dht.begin();
 while(WiFi.status() != WL_CONNECTED) {
 Serial.print(".");
 delay(500);
 }
 Serial.println();
 Serial.print("IP Address (AP): "); Serial.println(WiFi.localIP());
void loop() {
 // put your main code here, to run repeatedly:
 while (WiFi.status() == WL_CONNECTED) {
 delay(500);
 int s = analogRead(A0);
 float h = dht.readHumidity();
 float t = dht.readTemperature();
 Serial.print("Temperature: "); Serial.println(t);
 Serial.print("Humidity: "); Serial.println(h);
 Serial.print("Soil Moisture: "); Serial.println(s);
 // Connect to the server and send the data as a URL parameter
 if(client.connect(host,80)) {
 String url = "/update?value=";
 url += String(t);
 String url1 = "/update?value=";
 url1 += String(h);
 String url2 = "/update?value=";
 url2 += String(s);
 client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + 
 "Connection: keep-alive\r\n\r\n"); // minimum set of required URL headers
 client.print(String("GET ") + url1 + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + 
 "Connection: keep-alive\r\n\r\n"); // minimum set of required URL headers
 client.print(String("GET ") + url2 + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + 
 "Connection: keep-alive\r\n\r\n"); // minimum set of required URL headers
 delay(5000);
 }
 // Read all the lines of the response and print them to Serial
 Serial.println("Response: ");
 while(client.available()){
 String line = client.readStringUntil('\r');
 Serial.print(line);
 }
}
}

and its output is Client side output

Kindly help me to get all values at server side, Thanks

VE7JRO
2,51519 gold badges27 silver badges29 bronze badges
asked Sep 8, 2019 at 13:24
1
  • Using a web server for communication between two NodeMCUs is insanely over-engineering it. Far simpler to use a basic TCP connection and treat it much like a serial communication channel. Commented Sep 8, 2019 at 16:25

1 Answer 1

1

You use the same name value for all /update? parameters. And the format of url parameters is ?name1=value1&name2=value2

Use

String url = "/update?t=";
url += String(t);
String url1 = "&h=";
url1 += String(h);
String url2 = "&s=";
url2 += String(s);

send it as one GET request

and read server.arg("t"), server.arg("h") and server.arg("s").

Note 1: Sending more responses with serverSend to one request from browser has no effect. Only the first will work.

Note 2: this kind of use of String class will fragment the memory and cause a crash

Note 3: You don't need to use HTTP to communicate between your devices over TCP network. You can use simple TCP socket connections without HTTP protocol overhead.

answered Sep 8, 2019 at 14:41
5
  • kindly can you tell me what should be my 'serversend' command? Commented Sep 8, 2019 at 14:57
  • now all values are showing as zero :-( Commented Sep 8, 2019 at 15:06
  • sorry, I edited the Answer Commented Sep 8, 2019 at 15:47
  • @MuhammadJahanzaib, does it work now? Commented Sep 12, 2019 at 9:30
  • Yes it worked any how, now I have different situation, I want to connect 2 clients to the same server, one client is working perfectly but confused how to connect server with other client Commented Sep 14, 2019 at 16:29

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.