Communication between two NodeMCU too slow??
Posted: Sat Jul 08, 2017 10:31 am
Hi @ all so I am working on this Project and I want to send values via a Client-Server communication from one to another NodeMCU.
It all works like a charm but since I analogRead values on the Client, it Would be great to have them as fast as possible on the Server-NodeMCU. Withe the Code below, I get like 2 Values in a Second but I want -so to say- a higher resolution of the different Values. For Example when my Values change gradientially from 1023 to 0 I dont want to receive on the Server-NodeMCU
more Something like:
And that in the same time of reading and sending the Values.
Is there any way to speed up the communication (in my Code)??
Thank you!
Server-NodeMCU Code:
Client-NodeMCU code:
It all works like a charm but since I analogRead values on the Client, it Would be great to have them as fast as possible on the Server-NodeMCU. Withe the Code below, I get like 2 Values in a Second but I want -so to say- a higher resolution of the different Values. For Example when my Values change gradientially from 1023 to 0 I dont want to receive on the Server-NodeMCU
Code: Select all
Client No 0 - 1023
Client No 0 - 0
more Something like:
Code: Select all
Client No 0 - 1023
Client No 0 - 1000
Client No 0 - 990
.
.
.
.
Client No 0 - 0
And that in the same time of reading and sending the Values.
Is there any way to speed up the communication (in my Code)??
Thank you!
Server-NodeMCU Code:
Code: Select all
//-- Libraries Included --------------------------------------------------------------
#include <ESP8266WiFi.h>
//------------------------------------------------------------------------------------
// Define I/O Pins
#define LED0 2 // WIFI Module LED
#define LED1 D0 // Connectivity With Client #1
#define LED2 D2 // Connectivity With Client #2
#define BUTTON D1 // Connectivity ReInitiate Button
//------------------------------------------------------------------------------------
// Authentication Variables
char* TKDssid; // SERVER WIFI NAME
char* TKDpassword; // SERVER PASSWORD
//------------------------------------------------------------------------------------
#define MAXSC 1 // MAXIMUM NUMBER OF CLIENTS
/*
* MAXSC => Maximum Server Clients
* They Are 6 Because
* 1. Blue Fighter Suit
* 2. Red Fighter Suit
* 3. Corner Referee 1
* 4. Corner Referee 2
* 5. Corner Referee 3
* 6. Corner Referee 4
*/
WiFiServer TKDServer(9001); // THE SERVER AND THE PORT NUMBER
WiFiClient TKDClient[MAXSC]; // THE SERVER CLIENTS (Devices)
//====================================================================================
void setup()
{
// Setting The Serial Port
Serial.begin(115200); // Computer Communication
// Setting The Mode Of Pins
pinMode(LED0, OUTPUT); // WIFI OnBoard LED Light
pinMode(LED1, OUTPUT); // Indicator For Client #1 Connectivity
pinMode(LED2, OUTPUT); // Indicator For Client #2 Connectivity
pinMode(BUTTON, INPUT_PULLUP); // Initiate Connectivity
// Print Message Of I/O Setting Progress
Serial.println();
Serial.println("I/O Pins Modes Set .... Done");
// Setting Up A Wifi Access Point
SetWifi("TAKEONE", "");
}
//====================================================================================
void loop()
{
// Checking For Available Clients
AvailableClients();
// Checking For Available Client Messages
AvailableMessage();
}
//====================================================================================
void SetWifi(char* Name, char* Password)
{
// Stop Any Previous WIFI
WiFi.disconnect();
// Setting The Wifi Mode
WiFi.mode(WIFI_AP_STA);
Serial.println("WIFI Mode : AccessPoint Station");
// Setting The AccessPoint Name & Password
TKDssid = "Hellowifi";
TKDpassword = "1234567890";
// Starting The Access Point
WiFi.softAP(TKDssid, TKDpassword);
Serial.println("WIFI < " + String(TKDssid) + " > ... Started");
// Wait For Few Seconds
delay(1000);
// Getting Server IP
IPAddress IP = WiFi.softAPIP();
// Printing The Server IP Address
Serial.print("AccessPoint IP : ");
Serial.println(IP);
// Printing MAC Address
Serial.print("AccessPoint MC : ");
Serial.println(String(WiFi.softAPmacAddress()));
// Starting Server
TKDServer.begin();
TKDServer.setNoDelay(true);
Serial.println("Server Started");
}
//====================================================================================
void AvailableClients()
{
if (TKDServer.hasClient())
{
// Read LED0 Switch To Low If High.
if(digitalRead(LED0) == HIGH) digitalWrite(LED0, LOW);
// Light Up LED1
digitalWrite(LED1, HIGH);
for(uint8_t i = 0; i < MAXSC; i++)
{
//find free/disconnected spot
if (!TKDClient[i] || !TKDClient[i].connected())
{
// Checks If Previously The Client Is Taken
if(TKDClient[i])
{
TKDClient[i].stop();
}
// Checks If Clients Connected To The Server
if(TKDClient[i] = TKDServer.available())
{
Serial.println("New Client: " + String(i));
}
// Continue Scanning
continue;
}
}
//no free/disconnected spot so reject
WiFiClient TKDClient = TKDServer.available();
TKDClient.stop();
}
else
{
// This LED Blinks If No Clients Where Available
digitalWrite(LED0, HIGH);
delay(250);
digitalWrite(LED0, LOW);
delay(250);
}
}
//====================================================================================
void AvailableMessage()
{
//check clients for data
for(uint8_t i = 0; i < MAXSC; i++)
{
if (TKDClient[i] && TKDClient[i].connected() && TKDClient[i].available())
{
while(TKDClient[i].available())
{
String Message = TKDClient[i].readStringUntil('\r');
TKDClient[i].flush();
Serial.println("Client No " + String(i) + " - " + Message);
}
}
}
}
//====================================================================================
Client-NodeMCU code:
Code: Select all
//------------------------------------------------------------------------------------
// Libraries Needed For This Project
//------------------------------------------------------------------------------------
#include <Wire.h> // To Be Able To Use Sensors Like IMU9050
#include <EEPROM.h> // To Be Able To Store & Read Data Between Power Off
#include <ESP8266WiFi.h> // The Basic Function Of The ESP NOD MCU
//------------------------------------------------------------------------------------
// Defining I/O Pins
//------------------------------------------------------------------------------------
#define LED0 2 // WIFI Module LED
#define LED1 D0 // Indicate Connectivity With Client #1
#define LED2 D2 // Indicate Connectivity With Client #2
#define BUTTON D1 // Connectivity ReInitiate Button
//------------------------------------------------------------------------------------
// BUTTON Variables
//------------------------------------------------------------------------------------
int ButtonState;
int LastButtonState = LOW;
int LastDebounceTime = 0;
int DebounceDelay = 50;
const String Type = "Remote";
//------------------------------------------------------------------------------------
// LED Delay Variables
//------------------------------------------------------------------------------------
int LEDState = LOW;
unsigned long CurrMillis = 0;
unsigned long PrevMillis = 0;
unsigned long Interval = 1000;
//------------------------------------------------------------------------------------
// WIFI Authentication Variables
//------------------------------------------------------------------------------------
/* This Client Is Going To Connect To A WIFI Server Access Point
* So You Have To Specify Server WIFI SSID & Password In The Code Not Here
* Please See The Function Below Name (WiFi.Begin)
* If WIFI dont need Any password Then WiFi.begin("SSIDNAME")
* If WIFI needs a Password Then WiFi.begin("SSIDNAME", "PASSWORD")
*/
char* TKDssid; // Wifi Name
char* TKDpassword; // Wifi Password
//------------------------------------------------------------------------------------
// WIFI Module Role & Port
//------------------------------------------------------------------------------------
/* This WIFI Module Code Works As A Client
* That Will Connect To A Server WIFI Modul With (IP ADDress 192.168.4.1)
*/
int TKDServerPort = 9001;
IPAddress TKDServer(192,168,4,1);
WiFiClient TKDClient;
//====================================================================================
void setup()
{
// Setting The Serial Port ----------------------------------------------
Serial.begin(115200); // Computer Communication
// Setting The Mode Of Pins ---------------------------------------------
pinMode(LED0, OUTPUT); // WIFI OnBoard LED Light
pinMode(LED1, OUTPUT); // Indicator For Client #1 Connectivity
pinMode(LED2, OUTPUT); // Indicator For Client #2 Connectivity
pinMode(BUTTON, INPUT_PULLUP); // Initiate Connectivity
digitalWrite(LED0, !LOW); // Turn WiFi LED Off
// Print Message Of I/O Setting Progress --------------------------------
Serial.println("\nI/O Pins Modes Set .... Done");
// Starting To Connect --------------------------------------------------
if(WiFi.status() == WL_CONNECTED)
{
WiFi.disconnect();
WiFi.mode(WIFI_OFF);
delay(50);
}
/* in this part it should load the ssid and password
* from eeprom they try to connect using them */
WiFi.mode(WIFI_STA); // To Avoid Broadcasting An SSID
WiFi.begin("Hellowifi", "1234567890"); // The SSID That We Want To Connect To
// Printing Message For User That Connetion Is On Process ---------------
Serial.println("!--- Connecting To " + WiFi.SSID() + " ---!");
// WiFi Connectivity ----------------------------------------------------
CheckWiFiConnectivity(); // Checking For Connection
// Stop Blinking To Indicate Connected ----------------------------------
digitalWrite(LED0, !HIGH);
Serial.println("!-- Client Device Connected --!");
// Printing IP Address --------------------------------------------------
Serial.println("Connected To : " + String(WiFi.SSID()));
Serial.println("Signal Strenght : " + String(WiFi.RSSI()) + " dBm");
Serial.print ("Server IP Address : ");
Serial.println(TKDServer);
Serial.print ("Server Port Num : ");
Serial.println(TKDServerPort);
// Printing MAC Address
Serial.print ("Device MC Address : ");
Serial.println(String(WiFi.macAddress()));
// Printing IP Address
Serial.print ("Device IP Address : ");
Serial.println(WiFi.localIP());
// Conecting The Device As A Client -------------------------------------
TKDRequest();
}
//====================================================================================
void loop()
{
SendValues();
}
//====================================================================================
void SendValues()
{
// Reading The Button
int reading = analogRead(BUTTON);
TKDClient.println(reading);
TKDClient.flush();
}
//====================================================================================
void CheckWiFiConnectivity()
{
while(WiFi.status() != WL_CONNECTED)
{
for(int i=0; i < 10; i++)
{
digitalWrite(LED0, !HIGH);
delay(250);
digitalWrite(LED0, !LOW);
delay(250);
Serial.print(".");
}
Serial.println("");
}
}
//====================================================================================
void I2C_Begin()
{
/* ----------------------------------------------------------------------
* Setting The I2C Pins SDA, SCL
* Because We Didnt Specify Any Pins The Defult
* SDA = D4 <GPIO2>, SCL = D5 <GPIO14> For ESP8266 Dev Kit Node MCU v3
--------------------------------------------------------------------- */
// Frequency Of The I2C
#define TWI_FREQ 400000L // I2C Frequency Setting To 400KHZ
// If Ever You Needed To Use Wire I2C
Wire.begin(); // Begginning The I2C
// Setting Up The I2C Of The MPU9250 ------------------------------------
Wire.setClock(TWI_FREQ); // Setting The Frequency MPU9250 Require
}
//====================================================================================
void TKDRequest()
{
// First Make Sure You Got Disconnected
TKDClient.stop();
// If Sucessfully Connected Send Connection Message
if(TKDClient.connect(TKDServer, TKDServerPort))
{
Serial.println ("<" + Type + "-CONNECTED>");
TKDClient.println ("<" + Type + "-CONNECTED>");
}
}
//====================================================================================