WiFi Communication Between Two ESP8266 Based MCU Through the Home Router

31,376

73

35

Published

Introduction: WiFi Communication Between Two ESP8266 Based MCU Through the Home Router

Hello Makers!

Some months ago I started to experiment ESP8266 based NodeMCU and Wemos boards. At first I used them (in my previous POI hunter project) as a smarter Arduino, because they have higher clock frequency, more memory and built in "SD card" (SPIFFS).

In my Arduino projects sometimes I had to send messages between two MCUs. I used wired communications (serial, i2C) and wireless (bluetooth, RF transmitter / receiver and nRF24). So there was not question I will face this topic using ESP modules also.

I started to mine the internet for ready samples but I didn't find an easy solution for MCU-MCU WiFi communication. Finally I started from the basics. According to the description of the Arduino WiFi library and the WiFi library for ESP8266 I made what I wanted.

In the next pages I will share the result with you in two versions. At first two bare MCU will demonstrate the bare minimum solution of the TCP communication. After that I will show an easy application using an additional DHT22 sensor and some OLEDs.

Step 1: Bare Minimum, TCP Communication Between Two ESP8266 MCUs

Yo can see any HW you need in the picture. Only two MCUs (and a PC).

Both MCUs connect to your home WiFi router. (Don't forget to put your SSID and password into the code before upload the code.) One of the MCUs will be a server and the other will be the client. The client triggers the communication asking the server and the server will send an answer. Modifying the messages you will be able to send anything between the two modules.

Your router will give IP addresses to your MCUs during the connection. Launching the server you will see its IP address in the lower row of the OLED. You have to put this IP into the client's program, because the client will connect to the server using this address. Running the devices some days later you server will receive different IP address, and you will need to modify the client program again. To avoid this annoying thing give fix IP address to your server.

Things you have to do to launch the server:

  • Connect one MCU to a PC with USB cable.
  • Open the "wifi_server_01.ino".
  • Replace the asterisks "****" with the SSID and the password of your home WiFi router.
  • Open the settings of your home WiFi router and choose a free IP address which is out of the DHCP range.
  • Set the IP of your server (row15).
  • Gateway will be the IP of your WiFi router.
  • Upload the program.
  • Run the serial monitor of the Arduino IDE.

Things you have to do to launch the client(s):

  • Run an additional Arduino IDE.
  • Open the "wifi_client_01.ino".
  • Replace the asterisks "****" with the SSID and the password of your home WiFi router.
  • Put the IP address of your server into the 15th row.
  • Upload the program.
  • Run the serial monitor for the new Arduino IDE also.

The client connects to the server soon and you have to see the received messages in both terminal windows. During the communication the built in LEDs will flash for a short time.

Step 2: DHT Server With Clients

Here is an application which uses the TCP communication between ESP8266 MCUs.

A Wemos server listens, reads the DHT22 and shows the temperature and its own IP address on a small OLED screen. Two NodeMCU clients trigger the server and receives the temperature value as the answer. During the communication the server's OLED switches to inverse.

There is only a small modification in the server's program. After some hour work it sometimes stopped serving the clients. It readed the DHT22 and refreshed the OLED, but clients didn't received any answer. To solve this problem I started a timer. The program resets it after serving a client. If the timer reaches 30000 (30 seconds), the server disconnects from the WiFi network and reconnects again.

According to the attached schematics you can build the server and client hardware. Uploading the programs you will have a remote thermometer. Modifying the programs you can build your own project in which the ESP8266 based MCUs can communicate with each other.

Of course every device connected to your local network will be able to ask the DHT server. You can see a screenshot about my mobile also.

Share

    Recommendations

    • Clocks Contest

      Clocks Contest
    • Casting Contest

      Casting Contest
    • Woodworking Contest

      Woodworking Contest
    user

    We have a be nice policy.
    Please be positive and constructive.

    Tips

    7 Questions

    Hello, I have copied the client and server projects in a WeMos D1 mini PRO (Client) and in an WeMos D1 R2 (Server) board.
    What is happening is that I am not able to receive the Client messages sent by the WeMos D1 mini PRO in the Server.
    Messages sent by the PC webBrowser are received by the server, as well as Messages sent by my Phones webBrowser by WiFi.

    Extra remark, the same problems are there when using UDP Client And Server on these boards.

    I have NO idea where and how to start searching for what must be the problem.(in both cases TCP as well as UDP)

    1

    Hi mnalxz,

    I use D1 minis and D1 mini Pros also. They are compatibile, I have not faced any problem replacing them with each other. I do not have any experiences with Wemos D1 R2. I have never used it.

    If you had problems with UDP using this HW also then I would replace them to two minis at first.

    1 more answer

    0

    Hello Gyalu1,

    thanks for your relpy.

    The Wemos D1 R2 is an Arduino Uno sized version, but on this board my Server is running and seems to be working (because I can sent messages and receive replies from my PC and Phones WiFi connection).

    The mini PRO's (the Clients) are the ones giving me the problems.

    Also what can be seen in debug texts of the Serial connections of both boards.

    I Added some debug lines in the client application (see below : but they tell me the server address is 0.0.0.0 and should be 10.0.0.191 (what is defined in the top of the application (in serverIP)

    void loop () {

    client.connect(serverIP, 80); // Connection to the server

    digitalWrite(ledPin, LOW); // to show the communication only (inverted logic)

    client.println("Hello server! Are you sleeping?\r"); // sends the message to the server

    Serial.print("To server: "); Serial.println(client.remoteIP());

    Serial.print("Sent Data: "); Serial.println("Hello server! Are you sleeping?\r"); // The send message to the server

    String answer = client.readStringUntil('\r'); // receives the answer from the server

    if (answer.length() > 0) {

    Serial.print("From server: "); Serial.println(client.remoteIP());

    Serial.print("Received Data: "); Serial.println(answer);

    } else {

    Serial.println("NO data received from Server!\r");

    }

    client.flush();

    digitalWrite(ledPin, HIGH);

    delay(2000); // client will (Re-)trigger the communication after two seconds

    }

    Status: 3

    IP: 10.0.0.194

    Subnet: 255.255.255.0

    Gateway: 10.0.0.1

    SSID: mna_AP

    Signal: -31

    Networks: 26

    To server: 0.0.0.0

    Sent Data: Hello server! Are you sleeping?

    NO data received from Server!

    To server: 0.0.0.0

    Sent Data: Hello server! Are you sleeping?

    NO data received from Server!

    etc....

    what if i have to communicate between more than 2 MCU's?

    0

    See Step2.
    Then you need a server and some (max. five) clients.

    Hello .. Do you know if can use this configuration with two Uno Wifi's Arduino ?

    0

    Hi Bouteramti,

    as far as I know the ESP WiFi library is based on the Arduino library, but

    - I am not an expert, only a hobbist

    - there are several differences in the syntax and I think you will not find some commands in the Arduino library.

    So undersanding my code you may be able to write the Arduino version, but my code can not be translated for an Uno.

    See: https://www.arduino.cc/en/Reference/WiFi

    this way have limited for client? (can handel 200 client?)

    0

    I think this way you can connect unlimited ESP-s together. Each ESP connects only to one AP and to three clients which amount is below the limits. I tested this structure but I made only three layers with five or six ESPs.

    So I am not an expert in this topic only a hobbyst as you, but I think this way you can build a network with more than 200 ESPs.

    I am wondering what are you doing with 200 ESPs?

    how can i use it without router

    1 esp as acespoint

    1 esp as client

    client send strint to ap

    How many ESP8266 devices can be connected to a WiFi router?

    0

    Hi Keyur,
    I do not know. It depends on your router, not on ESPs.

    Does this uses TCP or UDP protocol. Because the ESP8266WiFi library uses only UDP, In which the packets might get lost.

    35 Comments

    Hello Gyalu1,

    this is a post on my pevious question (from mnalxz) because I was not able to (at least it seems that way) to reply to your answer.

    Thanks for your relpy.

    The Wemos D1 R2 is an Arduino Uno sized version, but on this board my Server is running and seems to be working (because I can sent messages and receive replies from my PC and Phones WiFi connection).

    The mini PRO's (the Clients) are the ones giving me the problems.

    Also what can be seen in debug texts of the Serial connections of both boards.

    I Added some debug lines in the client application (see below : but they tell me the server address is 0.0.0.0 and should be 10.0.0.191 (what is defined in the top of the application (in serverIP)

    void loop () {

    client.connect(serverIP, 80); // Connection to the server

    digitalWrite(ledPin, LOW); // to show the communication only (inverted logic)

    client.println("Hello server! Are you sleeping?\r"); // sends the message to the server

    Serial.print("To server: "); Serial.println(client.remoteIP());

    Serial.print("Sent Data: "); Serial.println("Hello server! Are you sleeping?\r"); // The send message to the server

    String answer = client.readStringUntil('\r'); // receives the answer from the server

    if (answer.length() > 0) {

    Serial.print("From server: "); Serial.println(client.remoteIP());

    Serial.print("Received Data: "); Serial.println(answer);

    } else {

    Serial.println("NO data received from Server!\r");

    }

    client.flush();

    digitalWrite(ledPin, HIGH);

    delay(2000); // client will (Re-)trigger the communication after two seconds

    }

    Status: 3

    IP: 10.0.0.194

    Subnet: 255.255.255.0

    Gateway: 10.0.0.1

    SSID: mna_AP

    Signal: -31

    Networks: 26

    To server: 0.0.0.0

    Sent Data: Hello server! Are you sleeping?

    NO data received from Server!

    To server: 0.0.0.0

    Sent Data: Hello server! Are you sleeping?

    NO data received from Server!

    etc....

    Hi, I'm using an ESP8166-01 to control an Arduino Mega. I was able to turn on and off an LED with a simple web page, when the computer and the esp8266 are both connected to the same wireless router. However, when I use the webpage on a computer that is not connected to my home router, nothing happens. Can you advise what to do? I think there must be an issue with port forwarding or something. Thanks!

    两个esp8266直接通讯可以实现?或者说多个esp8266通讯.

    Hi I want to transfer data by connecting Nodemakers. One accees point, connect to it on the other and I want to see this data on the computer screen Can I do this with the codes you share ? help mee please

    4 replies

    Hi PeldaD,

    I am sorry I don't understand well your question. If you would like to make an accesspoint-station communication then my other instructable will be better for you: https://www.instructables.com/id/Accesspoint-Station-Communication-Between-Two-ESP8/#CGDQ2RAJ6IFA8P1

    Hi

    I want to communicate data between multiple ESPs. Can I do it with these codes? How can I change these codes according to my program? can you speak Turkish ?

    能用Use English communication is very good, I also hope that we use is Chinese. Your problem solved?

    Yes. This code sends data from the client to the server and the server answers it.

    Both program contains comments, which explain the work of the code. Reading this comments you will find the program lines which sends a message and the other which receives.

    No, I am sorry, I don't speak Turkish.

    hello sir pls help me

    I am loaded above code into my two MCUs

    but i have doubt in server programe that is "

    Open the settings of your home WiFi router and choose a free IP address which is out of the DHCP range

    "

    IPAddress gateway(192,168,1,1); // gateway of your network

    my client is working but server dnt..

    1 reply

    Hi vinutp1989,
    there may be a conflict between the DHCP settings of your router and and the fix IP request of the server.
    There are two ways to solve this conflict.
    1, Set an IP range in your router in which DHCP can give IPs for the DHCP clients. The IP of your server (which is defined in this line: IPAddress ip(192, 168, 0, 80);), has to be outside of this range.
    2, Let DHCP to give IP to your server. To do this you have to comment this line: WiFi.config(ip, gateway, subnet);. This way let the server program to print the current IP address to the serial monitor by running this line: Serial.println(WiFi.localIP()); in the setup part of the server program.
    After that in the client program you have to replace this IP: IPAddress server(192,168,0,80); with the current IP of your server.

    Hello Gyalu,

    my application is bit similar to your project.

    My project is to communicate with 2 esp8266 (connected with arduino and relay each) thrugh the app via Home wifi router.

    Can you help in this?

    1 reply

    Hi Shayan,
    I am not an expert, I am hobbyist as you, but can we try. Do you have a concrete question / problem?

    How to set the IP for the server module. You mean its local IP. And is there a possibility of establishing a communication between two ESP modules without internet connection.

    7 replies

    Hi,

    1, you can find the answer in the attached program:

    WiFiServer server(80); // launches the server

    IPAddress ip(192, 168, 0, 80); // fix IP of the server

    IPAddress gateway(192,168,0,1); // WiFi router's IP

    IPAddress subnet(255,255,255,0);

    So the server's IP address will be: 192.168.0.80

    2, Yes, two ESPs can communicate with each other without internet connection. One has to an access point, the other has to be a client. See the links below.

    I am a beginner so kindly elaborate me on obtaining IP address of the server. How do I ascertain IP address of the module as 192.168.0.80. Is that a local IP.

    My other doubt : Will there be an ssid for the wifi module? Can I use this wifi module like a NRF to transmit and receive data?

    Thanks in advance.

    Hi,

    here is a sample ino, which prints out the local IP of your module to the serial monitor. https://www.arduino.cc/en/Reference/WiFiConfig

    Try to understand the program, make small modifications according the instructions and check the results.

    Hi Gyalu1 ,

    Is there a possibility to send integers instead of strings between two WIFI modules?

    My be, but I never tried.

    I converted the values to string because I always wanted to send more than one numbers in one message.

    Hi,

    see: https://www.instructables.com/id/Accesspoint-Station-Communication-Between-Two-ESP8/

    Hi Gyalu1,
    That was very helpful. Thank you!