0% found this document useful (0 votes)
2 views

C Tutorial

The document provides essential information for users of Freenove products, including safety precautions, support options, and installation instructions for necessary drivers and software. It introduces the ESP32 microcontroller, its features, and the educational projects available for learning robotics and programming. Users are encouraged to reach out for support and feedback through provided contact information.

Uploaded by

Jamie Wardly
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views

C Tutorial

The document provides essential information for users of Freenove products, including safety precautions, support options, and installation instructions for necessary drivers and software. It introduces the ESP32 microcontroller, its features, and the educational projects available for learning robotics and programming. Users are encouraged to reach out for support and feedback through provided contact information.

Uploaded by

Jamie Wardly
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 85

█ www.freenove.

com

Important Information
Thank you for choosing Freenove products!

Getting Started

First, please read the Read Me First.pdf document in the unzipped folder you created.
If you have not yet downloaded the zip file, associated with this kit, please do so now and unzip it.

Get Support and Offer Input

Freenove provides free and responsive product and technical support, including but not limited to:
 Product quality issues
 Product use and build issues
 Questions regarding the technology employed in our products for learning and education
 Your input and opinions are always welcome
 We also encourage your ideas and suggestions for new products and product improvements
For any of the above, you may send us an email to:

[email protected]
Safety and Precautions

Please follow the following safety precautions when using or storing this product:
 Keep this product out of the reach of children under 6 years old.
 This product should be used only when there is adult supervision present as young children lack
necessary judgment regarding safety and the consequences of product misuse.
 This product contains small parts and parts, which are sharp. This product contains electrically conductive
parts. Use caution with electrically conductive parts near or around power supplies, batteries and
powered (live) circuits.
 When the product is turned ON, activated or tested, some parts will move or rotate. To avoid injuries
to hands and fingers keep them away from any moving parts!
 It is possible that an improperly connected or shorted circuit may cause overheating. Should this happen,
immediately disconnect the power supply or remove the batteries and do not touch anything until
it cools down! When everything is safe and cool, review the product tutorial to identify the cause.
 Only operate the product in accordance with the instructions and guidelines of this tutorial, otherwise
parts may be damaged or you could be injured.
 Store the product in a cool dry place and avoid exposing the product to direct sunlight.
 After use, always turn the power OFF and remove or unplug the batteries before storing.

Any concerns?  [email protected]


www.freenove.com █

About Freenove

Freenove provides open source electronic products and services worldwide.

Freenove is committed to assist customers in their education of robotics, programming and electronic circuits
so that they may transform their creative ideas into prototypes and new and innovative products. To this end,
our services include but are not limited to:

 Educational and Entertaining Project Kits for Robots, Smart Cars and Drones
 Educational Kits to Learn Robotic Software Systems for Arduino, Raspberry Pi and micro: bit
 Electronic Component Assortments, Electronic Modules and Specialized Tools
 Product Development and Customization Services

You can find more about Freenove and get our latest news and updates through our website:

http://www.freenove.com

[email protected]

Copyright

All the files, materials and instructional guides provided are released under Creative Commons Attribution-
NonCommercial-ShareAlike 3.0 Unported License. A copy of this license can be found in the folder containing
the Tutorial and software files associated with this product.

This means you can use these resource in your own derived works, in part or completely but NOT for the
intent or purpose of commercial use.

Freenove brand and logo are copyright of Freenove Creative Technology Co., Ltd. and cannot be used without
written permission.

TM

Any concerns?  [email protected]


█ www.freenove.com Preface 1

Contents

Important Information....................................................... 1
Contents ................................................................................. 1
Preface .................................................................................... 1
ESP32-WROOM ........................................................................................................................................................................ 2
CH340 (Importance) ................................................................................................................................................................. 4
Programming Software ......................................................................................................................................................... 14
Environment Configuration ................................................................................................................................................. 17
Notes for GPIO......................................................................................................................................................................... 21

Chapter 1 LED ................................................................... 22


Project 1.1 Blink ....................................................................................................................................................................... 22

Chapter 2 WS2812 .......................................................... 27


Project 2.1 WS2812 ................................................................................................................................................................ 27

Chapter 3 Bluetooth........................................................ 32
Project 3.1 Bluetooth Passthrough.................................................................................................................................... 32
Project 3.2 Bluetooth Low Energy Data Passthrough ................................................................................................. 38

Chapter 4 WiFi Working Modes .................................. 51


Project 4.1 Station mode ...................................................................................................................................................... 51
Project 4.2 AP mode .............................................................................................................................................................. 55
Project 4.3 AP+Station mode ............................................................................................................................................. 60

Chapter 5 TCP/IP.............................................................. 64
Project 5.1 As Client ............................................................................................................................................................... 64
Project 5.2 As Server .............................................................................................................................................................. 76

What’s next? ...................................................................... 81


End of the Tutorial ........................................................... 81

Any concerns?  [email protected]


█ www.freenove.com Preface 1

Preface
ESP32 is a micro control unit with integrated Wi-Fi launched by Espressif, which features strong properties
and integrates rich peripherals. It can be designed and studied as an ordinary Single Chip Micyoco(SCM) chip,
or connected to the Internet and used as an Internet of Things device.

ESP32 can be developed using the Arduino platform, which will definitely make it easier for people who have
learned arduino to master. Moreover, the code of ESP32 is completely open-source, so beginners can quickly
learn how to develop and design IOT smart household products including smart curtains, fans, lamps and
clocks.

Generally, ESP32 projects consist of code and circuits. Don't worry even if you've never learned code and
circuits, because we will gradually introduce the basic knowledge of C programming language and electronic
circuits, from easy to difficult. Our products contain all the electronic components and modules needed to
complete these projects. It's especially suitable for beginners.

We divide each project into four parts, namely Component List, Component Knowledge, Circuit and Code.
Component List helps you to prepare material for the experiment more quickly. Component Knowledge allows
you to quickly understand new electronic modules or components, while Circuit helps you understand the
operating principle of the circuit. And Code allows you to easily master the use of SEP32 and accessory kit.
After finishing all the projects in this tutorial, you can also use these components and modules to make
products such as smart household, smart cars and robots to transform your creative ideas into prototypes
and new and innovative products.

In addition, if you have any difficulties or questions with this tutorial or toolkit, feel free to ask for our quick
and free technical support through [email protected]

Any concerns?  [email protected]


2 Preface www.freenove.com █

ESP32-WROOM

ESP32-WROOM has launched a total of two antenna packages, PCB on-board antenna and IPEX antenna
respectively. The PCB on-board antenna is an integrated antenna in the chip module itself, so it is convenient
to carry and design. The IPEX antenna is a metal antenna derived from the integrated antenna of the chip
module itself, which is used to enhance the signal of the module.
PCB on-board antenna IPEX antenna

In this tutorial, the ESP32-WROOM is designed based on the PCB on-board antenna-packaged ESP32-
WROOM-32E module.
ESP32-WROOM

Any concerns?  [email protected]


█ www.freenove.com Preface 3

The hardware interfaces of ESP32-WROOM are distributed as follows:

Compare the left and right images. We've boxed off the resources on the ESP32-WROOM in different colors
to facilitate your understanding of the ESP32-WROOM.
Box color Corresponding resources introduction
GPIO pin

LED indicator

WS2812

Reset button, Boot mode selection button

Type C port

For more information, please visit: https://www.espressif.com/sites/default/files/documentation/esp32-


wroom-32e_esp32-wroom-32ue_datasheet_en.pdf

Any concerns?  [email protected]


4 Preface www.freenove.com █

CH340 (Importance)

ESP32 uses CH340 to download codes. So before using it, we need to install CH340 driver in our computers.

Windows

Check whether CH340 has been installed


1. Connect your computer and ESP32 with a USB cable.

2. Turn to the main interface of your computer, select “This PC” and right-click to select “Manage”.

Any concerns?  [email protected]


█ www.freenove.com Preface 5

3. Click “Device Manager”. If your computer has installed CH340, you can see“USB-SERIAL CH340 (COMx)”.
And you can click here to move to the next step.

CH340 Port

Installing CH340
1. First, download CH340 driver, click http://www.wch-ic.com/search?q=CH340&t=downloads to download
the appropriate one based on your operating system.

Any concerns?  [email protected]


6 Preface www.freenove.com █

Windows

Linux

MAC

If you would not like to download the installation package, you can open
“Freenove_ESP32_WROOM_Board/CH340”, we have prepared the installation package.

Any concerns?  [email protected]


█ www.freenove.com Preface 7

2. Open the folder “Freenove_ESP32_WROOM_Board/CH340/Windows/”

3. Double click “CH341SER.EXE”.

Any concerns?  [email protected]


8 Preface www.freenove.com █

4. Click “INSTALL” and wait for the installation to complete.

5. Install successfully. Close all interfaces.

Any concerns?  [email protected]


█ www.freenove.com Preface 9

6. When ESP32 is connected to computer, select “This PC”, right-click to select “Manage” and click “Device
Manager” in the newly pop-up dialog box, and you can see the following interface.

7. So far, CH340 has been installed successfully. Close all dialog boxes.

Any concerns?  [email protected]


10 Preface www.freenove.com █

MAC

First, download CH340 driver, click http://www.wch-ic.com/search?q=CH340&t=downloads to download the


appropriate one based on your operating system.

Windows

Linux

MAC

If you would not like to download the installation package, you can open
“Freenove_ESP32_WROOM_Board/CH340”, we have prepared the installation package.
Second, open the folder “Freenove_ESP32_WROOM_Board/CH340/MAC/”

Run it.

Any concerns?  [email protected]


█ www.freenove.com Preface 11

Third, click Continue.

Fourth, click Install.

Any concerns?  [email protected]


12 Preface www.freenove.com █

Then, waiting Finsh.

Finally, restart your PC.

Any concerns?  [email protected]


█ www.freenove.com Preface 13

If you still haven't installed the CH340 by following the steps above, you can view readme.pdf to install it.

ReadMe

Any concerns?  [email protected]


14 Preface www.freenove.com █

Programming Software

Arduino Software (IDE) is used to write and upload the code for Arduino Board.
First, install Arduino Software (IDE): visit https://www.arduino.cc, click "Download" to enter the download page.

Select and download corresponding installer according to your operating system. If you are a windows user,
please select the "Windows" to download and install it correctly.

After the download completes, run the installer. For Windows users, there may pop up an installation dialog
box of driver during the installation process. When it popes up, please allow the installation.
After installation completes, an Arduino Software shortcut will be generated in the desktop. Run the Arduino
Software.

Any concerns?  [email protected]


█ www.freenove.com Preface 15

The interface of Arduino Software is as follows:

Menus

Toolbar

Text editor

Message
area

Console

Configured board
and serial port

Any concerns?  [email protected]


16 Preface www.freenove.com █

Programs written with Arduino Software (IDE) are called sketches. These sketches are written in the text editor
and saved with the file extension.ino. The editor features text cutting/pasting and searching/replacing. The
message area gives feedback while saving and exporting and also displays errors. The console displays text
output by the Arduino Software (IDE), including complete error messages and other information. The bottom
right-hand corner of the window displays the configured board and serial port. The toolbar buttons allow you
to verify and upload programs, create, open, and save sketches, and open the serial monitor.

Verify
Check your code for compile errors.
Upload
Compile your code and upload them to the configured board.
Debug
Debug code running on the board. (Some development boards do not
support this function)
Development board selection
Configure the support package and upload port of the development
board.
Serial Plotter
Receive serial port data and plot it in a discounted graph.
Serial Monitor
Open the serial monitor.

Additional commands are found within the five menus: File, Edit, Sketch, Tools, Help. The menus are context
sensitive, which means only those items relevant to the work currently being carried out are available.

Any concerns?  [email protected]


█ www.freenove.com Preface 17

Environment Configuration

First, open the software platform arduino, and then click File in Menus and select Preferences.

Second, click on the symbol behind "Additional Boards Manager URLs"

Any concerns?  [email protected]


18 Preface www.freenove.com █

Third, fill in https://espressif.github.io/arduino-esp32/package_esp32_index.json in the new window, click


OK, and click OK on the Preferences window again.

Note: if you copy and paste the URL directly, you may lose the "-". Please check carefully to make sure the
link is correct.

Fourth, click "Boards Manager". Enter “esp32” in Boards manager, select 2.0.9, and click “INSTALL”.

Any concerns?  [email protected]


█ www.freenove.com Preface 19

Arduino will download these files automaticly. Wait for the installation to complete.

When finishing installation, click Tools in the Menus again and select Board: "ESP32 Dev Module", and then
you can see information of ESP32.

Any concerns?  [email protected]


20 Preface www.freenove.com █

Keep the default Settings.

Any concerns?  [email protected]


█ www.freenove.com Preface 21

Notes for GPIO

Strapping Pin

There are five Strapping pins for ESP32:MTDI、GPIO0、GPIO2、MTDO、GPIO5。


With the release of the chip's system reset (power-on reset, RTC watchdog reset, undervoltage reset), the
strapping pins sample the level and store it in the latch as "0" or "1" ", and keep it until the chip is powered
off or turned off.
Each Strapping pin is connecting to internal pull-up/pull-down. Connecting to high-impedance external
circuit or without an external connection, a strapping pin's default value of input level will be determined by
internal weak pull-up/pull-down. To change the value of the Strapping, users can apply an external pull-
down/pull-up resistor, or use the GPIO of the host MCU to control the level of the strapping pin when the
ESP32's power on reset is released.
When releasing the reset, the strapping pin has the same function as a normal pin.
The followings are default configurations of these five strapping pins at power-on and their functions under
the corresponding configuration.

If you have any difficulties or questions with this tutorial or toolkit, feel free to ask for our quick and free
technical support through [email protected] at any time.

Any concerns?  [email protected]


22 Chapter 1 LED www.freenove.com █

Chapter 1 LED
This chapter is the Start Point in the journey to build and explore ESP32 electronic projects. We will start with
simple “Blink” project.

Project 1.1 Blink

In this project, we will use ESP32 to control blinking a common LED.

Component List

ESP32-WROOM x1 USB cable

Power
ESP32-WROOM needs 5v power supply. In this tutorial, we need connect ESP32-WROOM to computer via
USB cable to power it and program it. We can also use other 5v power source to power it.

In the following projects, we only use USB cable to power ESP32-WROOM by default.

Any concerns?  [email protected]


█ www.freenove.com Chapter 1 LED 23

Sketch

According to the circuit, when the GPIO2 of ESP32-WROOM output level is high, the LED turns ON. Conversely,
when the GPIO2 ESP32-WROOM output level is low, the LED turns OFF. Therefore, we can let GPIO2 circularly
output high and low level to make the LED blink.
Upload the following Sketch: s
Freenove_ESP32_WROOM_Board\Sketches\Sketch_01.1_Blink.
Before uploading the code, click "Tools", "Board" and select "ESP32 Dev Module".
Select the serial port.

Any concerns?  [email protected]


24 Chapter 1 LED www.freenove.com █

Note: For macOS users, if the uploading fails, please set the baud rate to 115200 before clicking
“Upload Using Programmer”.

Sketch_01.1_Blink

Click “Upload”,Download the code to ESP32-WROOM and your LED in the circuit starts Blink.

If you have any concerns, please contact us via: [email protected]

Any concerns?  [email protected]


█ www.freenove.com Chapter 1 LED 25

The following is the program code:


1 #define PIN_LED 2
2 // the setup function runs once when you press reset or power the board
3 void setup() {
4 // initialize digital pin LED_BUILTIN as an output.
5 pinMode(PIN_LED, OUTPUT);
6 }
7
8 // the loop function runs over and over again forever
9 void loop() {
10 digitalWrite(PIN_LED, HIGH); // turn the LED on (HIGH is the voltage level)
11 delay(1000); // wait for a second
12 digitalWrite(PIN_LED, LOW); // turn the LED off by making the voltage LOW
13 delay(1000); // wait for a second
14 }

The Arduino IDE code usually contains two basic functions: void setup() and void loop().
After the board is reset, the setup() function will be executed firstly, and then the loop() function.
setup() function is generally used to write code to initialize the hardware. And loop() function is used to write
code to achieve certain functions. loop() function is executed repeatedly. When the execution reaches the end
of loop(), it will jump to the beginning of loop() to run again.

Reset 1 // the setup function runs once when you press reset or power the board
2 void setup() {
… …
5 }
6
7 // the loop function runs over and over again forever
8 void loop() {
… …
13 }

Reset
Reset operation will lead the code to be executed from the beginning. Switching on the power, finishing
uploading the code and pressing the reset button will trigger reset operation.
In the circuit, ESP32-WROOM's GPIO2 is connected to the LED, so the LED pin is defined as 2.
1 #define PIN_LED 2
This means that after this line of code, all PIN_LED will be treated as 2.
In the setup () function, first, we set the PIN_LED as output mode, which can make the port output high level
or low level.
4 // initialize digital pin PIN_LED as an output.
5 pinMode(PIN_LED, OUTPUT);
Then, in the loop () function, set the PIN_LED to output high level to make LED light up.
10 digitalWrite(PIN_LED, HIGH); // turn the LED on (HIGH is the voltage level)

Any concerns?  [email protected]


26 Chapter 1 LED www.freenove.com █

Wait for 1000ms, that is 1s. Delay () function is used to make control board wait for a moment before executing
the next statement. The parameter indicates the number of milliseconds to wait for.
11 delay(1000); // wait for a second
Then set the PIN_LED to output low level, and LED light off. One second later, the execution of loop () function
will be completed.
12 digitalWrite(PIN_LED, LOW); // turn the LED off by making the voltage LOW
13 delay(1000); // wait for a second
The loop() function is constantly being executed, so LED will keep blinking.

Reference
void pinMode(int pin, int mode);
Configures the specified pin to behave either as an input or an output.
Parameters
pin: the pin number to set the mode of.
mode: INPUT, OUTPUT, INPUT_PULLDOWM, or INPUT_PULLUP.
void digitalWrite (int pin, int value);
Writes the value HIGH or LOW (1 or 0) to the given pin which must have been previously set as an output.
For more related functions, please refer to https://www.arduino.cc/reference/en/

Any concerns?  [email protected]


█ www.freenove.com Chapter 2 WS2812 27

Chapter 2 WS2812
This chapter will help you learn to use a more convenient RGB LED lamp, which requires only one GPIO
control and can be connected in infinite series in theory. Each LED can be controlled independently.

Project 2.1 WS2812

Learn the basic usage of ws2812 and use it to flash red, green, blue and white.

Circuit

Connect your computer and ESP32 with a USB cable.

Sketch

This code uses a library named "Freenove_WS2812_Lib_for_ESP32", if you have not installed it, please do so
first.
Library is an important feature of the open source world, and we know that Arduino is an open source platform
that everyone can contribute to. Libraries are generally licensed under the LGPL, which means you can use
them for free to apply to your creations.
How to install the library
There are two ways to add libraries.
The first way, open the Arduino IDE, click Tools Manager Libraries.

Any concerns?  [email protected]


28 Chapter 2 WS2812 www.freenove.com █

In the pop-up window, Library Manager, search for the name of the Library, “Freenove WS2812 Lib for ESP32”.
Then click Install.

The second way,open Arduino IDE,click SketchInclude LibraryAdd .ZIP Library,In the pop-up window,
find the file named “./Libraries/Freenove_WS2812_Lib_for_ESP32.Zip” which locates in this directory,and
click OPEN.

Sketch_02.1_WS2812

Download the code to ESP32-WROOM and RGB LED begins to light up in red, green, blue, white and black.

Any concerns?  [email protected]


█ www.freenove.com Chapter 2 WS2812 29

The following is the program code:


1 #include "Freenove_WS2812_Lib_for_ESP32.h"
2
3 #define LEDS_COUNT 1 // The number of led
4 #define LEDS_PIN 16 // define the pin connected to the led strip
5 #define CHANNEL 0 // RMT channel
6
7 Freenove_ESP32_WS2812 strip = Freenove_ESP32_WS2812(LEDS_COUNT, LEDS_PIN, CHANNEL, TYPE_GRB);
8
9 u8 m_color[5][3] = { {255, 0, 0}, {0, 255, 0}, {0, 0, 255}, {255, 255, 255}, {0, 0, 0} };
10 int delayval = 100;
11
12 void setup() {
13 strip.begin();
14 strip.setBrightness(10);
15 }
16 void loop() {
17 for (int j = 0; j < 5; j++) {
18 for (int i = 0; i < LEDS_COUNT; i++) {
19 strip.setLedColorData(i, m_color[j][0], m_color[j][1], m_color[j][2]);
20 strip.show();
21 delay(delayval);
22 }
23 delay(500);
24 }
25 }

Any concerns?  [email protected]


30 Chapter 2 WS2812 www.freenove.com █

To use some libraries, first you need to include the library's header file.
1 #include "Freenove_WS2812_Lib_for_ESP32.h"
Define the pins connected to the ring, the number of LEDs on the ring, and RMT channel values。
3 #define LEDS_COUNT 1 // The number of led
4 #define LEDS_PIN 16 // define the pin connected to the led strip
5 #define CHANNEL 0 // RMT channel
Use the above parameters to create a ws2812 object strip.
7 Freenove_ESP32_WS2812 strip = Freenove_ESP32_WS2812(LEDS_COUNT, LEDS_PIN, CHANNEL, TYPE_GRB);
Define the color values to be used, as red, green, blue, white, and black.
9 u8 m_color[5][3] = { {255, 0, 0}, {0, 255, 0}, {0, 0, 255}, {255, 255, 255}, {0, 0, 0} };
Define a variable to set the time interval for each led to light up. The smaller the value is, the faster it will
light up.
10 int delayval = 50;
Initialize strip() in setup() and set the brightness.
13 strip.begin();
14 strip.setBrightness(10);
In the loop(), there are two “for” loops, the internal for loop to light the LED one by one, and the external for
loop to switch colors. strip.setLedColorData() is used to set the color, but it does not change immediately.
Only when strip.show() is called will the color data be sent to the LED to change the color.
17 for (int j = 0; j < 5; j++) {
18 for (int i = 0; i < LEDS_COUNT; i++) {
19 strip.setLedColorData(i, m_color[j][0], m_color[j][1], m_color[j][2]);
20 strip.show();
21 delay(delayval);
22 }
23 delay(500);
24 }
Reference
Freenove_ESP32_WS2812(u16 n = 8, u8 pin_gpio = 2, u8 chn = 0, LED_TYPE t = TYPE_GRB)
Constructor to create a Ws2812 object.
Before each use of the constructor, please add “#include "Freenove_WS2812_Lib_for_ESP32.h”
Parameters
n:The number of led.
pin_gpio:A pin connected to an led.
Chn: RMT channel, which uses channel 0 by default, has a total of eight channels, 0-7. This means that you
can use eight LEDPixel modules for the display at the same time, and these modules do not interfere with
each other
t:Types of LED.
TYPE_RGB:The sequence of Ws2812 module loading color is red, green and blue.
TYPE_RBG:The sequence of Ws2812 module loading color is red, blue and green.
TYPE_GRB:The sequence of Ws2812 module loading color is green, red and blue.
TYPE_GBR:The sequence of Ws2812 module loading color is green, blue and red.
TYPE_BRG:The sequence of Ws2812 module loading color is blue, red and green.
TYPE_BGR:The sequence of Ws2812 module loading color is blue,g reen and red.
Any concerns?  [email protected]
█ www.freenove.com Chapter 2 WS2812 31

void begin(void);
Initialize the Ws2812 object
void setLedColorData (u8 index, u8 r, u8 g, u8 b);
void setLedColorData (u8 index, u32 rgb);
void setLedColor (u8 index, u8 r, u8 g, u8 b);
void setLedColor (u8 index, u32 rgb);
Set the color of led with order number n.
void show(void);
Send the color data to the led and display the set color immediately.
void setBrightness(uint8_t);
Set the brightness of the LED.
If you want to learn more about this library, you can visit the following website:
https://github.com/Freenove/Freenove_WS2812_Lib_for_ESP32

Any concerns?  [email protected]


32 Chapter 3 Bluetooth www.freenove.com █

Chapter 3 Bluetooth
This chapter mainly introduces how to make simple data transmission through Bluetooth of ESP32-WROOM
and mobile phones.
Project 3.1 is classic Bluetooth and Project 3.2 is low power Bluetooth.If you are an iPhone user, please start
with Project 3.2.

Project 3.1 Bluetooth Passthrough

Component List

ESP32-WROOM x1 Type C Wire x1

In this tutorial we need to use a Bluetooth APP called Serial Bluetooth Terminal to assist in the experiment. If
you've not installed it yet, please do so by clicking: https://www.appsapk.com/serial-bluetooth-terminal/ The
following is its logo.

Any concerns?  [email protected]


█ www.freenove.com Chapter 3 Bluetooth 33

Component knowledge

ESP32's integrated Bluetooth function Bluetooth is a short-distance communication system, which can be
divided into two types, namely Bluetooth Low Energy(BLE) and Classic Bluetooth. There are two modes for
simple data transmission: master mode and slave mode.
Master mode
In this mode, works are done in the master device and it can connect with a slave device. And we can search
and select slave devices nearby to connect with. When a device initiates connection request in master mode,
it requires information of the other Bluetooth devices including their address and pairing passkey. After
finishing pairing, it can connect with them directly.
Slave mode
The Bluetooth module in slave mode can only accept connection request from a host computer, but cannot
initiate a connection request. After connecting with a host device, it can send data to or receive from the host
device.
Bluetooth devices can make data interaction with each other, as one is in master mode and the other in slave
mode. When they are making data interaction, the Bluetooth device in master mode searches and selects
devices nearby to connect to. When establishing connection, they can exchange data. When mobile phones
exchange data with ESP32, they are usually in master mode and ESP32 in slave mode.

Any concerns?  [email protected]


34 Chapter 3 Bluetooth www.freenove.com █

Circuit

Connect Freenove ESP32 to the computer using the USB cable.

Sketch

Sketch_03.1_SerialToSerialBT

Compile and upload the code to the ESP32-WROOM, open the serial monitor, and set the baud rate to
115200. When you see the serial printing out the character string as below, it indicates that the Bluetooth of
ESP32 is ready and waiting to connect with the mobile phone.

Any concerns?  [email protected]


█ www.freenove.com Chapter 3 Bluetooth 35

Make sure that the Bluetooth of your phone has been turned on and Serial Bluetooth Terminal has been
installed.

Click "Search" to search Bluetooth devices nearby and select "ESP32 test" to connect to.

Turn on software APP, click the left of the terminal. Select "Devices"

Any concerns?  [email protected]


36 Chapter 3 Bluetooth www.freenove.com █

Select ESP32test in classic Bluetooth mode, and a successful connecting prompt will appear as shown on the
right illustration.

And now data can be transferred between your mobile phone and computer via ESP32-WROOM.

Send 'Hello!'' from your phone, when the computer receives it, reply "Hi" to your phone.

Any concerns?  [email protected]


█ www.freenove.com Chapter 3 Bluetooth 37

Reference
Class BluetoothSerial
This is a class library used to operate BluetoothSerial, which can directly read and set BluetoothSerial.
Here are some member functions:
begin(localName,isMaster): Initialization function of the Bluetooth
name: name of Bluetooth module; Data type: String
isMaster: bool type, whether to set Bluetooth as Master. By default, it is false.
available(): acquire digits sent from the buffer, if not, return 0.
read(): read data from Bluetooth, data type of return value is int.
readString(): read data from Bluetooth, data type of return value is String.
write(val): send an int data val to Bluetooth.
write(str): send an Srtring data str to Bluetooth.
write(buf, len): Sends the first len data in the buf Array to Bluetooth.
setPin(const char *pin): set a four-digit Bluetooth pairing code. By default, it is 1234
connet(remoteName): connect a Bluetooth named remoteName, data type: String
connect(remoteAddress[]): connect the physical address of Bluetooth, data type: uint8-t.
disconnect():disconnect all Bluetooth devices.
end(): disconnect all Bluetooth devices and turn off the Bluetooth, release all occupied space

Any concerns?  [email protected]


38 Chapter 3 Bluetooth www.freenove.com █

Project 3.2 Bluetooth Low Energy Data Passthrough

Component List

ESP32-WROOM x1 Type C Wire x1

Circuit

Connect Freenove ESP32 to the computer using the USB cable.

Any concerns?  [email protected]


█ www.freenove.com Chapter 3 Bluetooth 39

Sketch

Sketch_03.2_BLE

Serial Bluetooth
Compile and upload code to ESP32, the operation is similar to the last section.
First, make sure you've turned on the mobile phone Bluetooth, and then open the software.

Any concerns?  [email protected]


40 Chapter 3 Bluetooth www.freenove.com █

Click "Search" to search Bluetooth devices nearby and select "ESP32 test" to connect to.

Turn on software APP, click the left of the terminal. Select "Devices"

Select BLUETOOTHLE, click SCAN to scan Low Energy Bluetooth devices nearby.

Any concerns?  [email protected]


█ www.freenove.com Chapter 3 Bluetooth 41

Select"ESP32-Bluetooth"

Lightblue
If you can't install Serial Bluetooth on your phone, try LightBlue.If you do not have this software installed on
your phone, you can refer to this link:
https://apps.apple.com/us/app/lightblue/id557428110#?platform=iphone.

Any concerns?  [email protected]


42 Chapter 3 Bluetooth www.freenove.com █

Step1. Upload the code to ESP32.


Step2. Click on serial monitor.

1 2

Step3. Set baud rate to 115200.

Turn ON Bluetooth on your phone, and open the Lightblue APP.

Any concerns?  [email protected]


█ www.freenove.com Chapter 3 Bluetooth 43

In the Scan page, swipe down to refresh the name of Bluetooth that the phone searches for. Click
ESP32_Bluetooth.

Receive

Click “Receive”. Select the appropriate Data format in the box to the right of Data Format. For example, HEX
for hexadecimal, utf-string for character, Binary for Binary, etc. Then click SUBSCRIBE.

Any concerns?  [email protected]


44 Chapter 3 Bluetooth www.freenove.com █

Any concerns?  [email protected]


█ www.freenove.com Chapter 3 Bluetooth 45

Back to the serial monitor on your computer. You can type anything in the left border of Send, and then click
Send.

And then you can see the mobile Bluetooth has received the message.

Any concerns?  [email protected]


46 Chapter 3 Bluetooth www.freenove.com █

Similarly, you can select “Send” on your phone. Set Data format, and then enter anything in the sending box
and click Write to send.

Send

And the computer will receive the message from the mobile Bluetooth.

Any concerns?  [email protected]


█ www.freenove.com Chapter 3 Bluetooth 47

And now data can be transferred between your mobile phone and computer via ESP32-WROOM.
The following is the program code:
1 #include <BLEDevice.h>
2 #include <BLEServer.h>
3 #include <BLEUtils.h>
4 #include <BLE2902.h>
5 #include <String.h>
6
7 BLECharacteristic *pCharacteristic;
8 bool deviceConnected = false;
9 uint8_t txValue = 0;
10 long lastMsg = 0;
11 String rxload="Test\n";
12
13 #define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
14 #define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
15 #define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
16
17 class MyServerCallbacks: public BLEServerCallbacks {
18 void onConnect(BLEServer* pServer) {
19 deviceConnected = true;
20 };
21 void onDisconnect(BLEServer* pServer) {
22 deviceConnected = false;
23 }
24 };
25
26 class MyCallbacks: public BLECharacteristicCallbacks {
27 void onWrite(BLECharacteristic *pCharacteristic) {
28 String rxValue = pCharacteristic->getValue();
29 if (rxValue.length() > 0) {
30 rxload="";
31 for (int i = 0; i < rxValue.length(); i++){
32 rxload +=(char)rxValue[i];
33 }
34 }
35 }
36 };
37
38 void setupBLE(String BLEName){
39 const char *ble_name=BLEName.c_str();
40 BLEDevice::init(ble_name);
41 BLEServer *pServer = BLEDevice::createServer();
42 pServer->setCallbacks(new MyServerCallbacks());

Any concerns?  [email protected]


48 Chapter 3 Bluetooth www.freenove.com █

43 BLEService *pService = pServer->createService(SERVICE_UUID);


44 pCharacteristic=
pService->createCharacteristic(CHARACTERISTIC_UUID_TX,BLECharacteristic::PROPERTY_NOTIFY);
45 pCharacteristic->addDescriptor(new BLE2902());
46 BLECharacteristic *pCharacteristic =
pService->createCharacteristic(CHARACTERISTIC_UUID_RX,BLECharacteristic::PROPERTY_WRITE);
47 pCharacteristic->setCallbacks(new MyCallbacks());
48 pService->start();
49 pServer->getAdvertising()->start();
50 Serial.println("Waiting a client connection to notify...");
51 }
52
53 void setup() {
54 Serial.begin(115200);
55 setupBLE("ESP32_Bluetooth");
56 }
57
58 void loop() {
59 long now = millis();
60 if (now - lastMsg > 1000) {
61 if (deviceConnected&&rxload.length()>0) {
62 Serial.println(rxload);
63 rxload="";
64 }
65 if(Serial.available()>0){
66 String str=Serial.readString();
67 const char *newValue=str.c_str();
68 pCharacteristic->setValue(newValue);
69 pCharacteristic->notify();
70 }
71 lastMsg = now;
72 }
73 }
Define the specified UUID number for BLE vendor.
13 #define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
14 #define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
15 #define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"

Any concerns?  [email protected]


█ www.freenove.com Chapter 3 Bluetooth 49

Write a Callback function for BLE server to manage connection of BLE.


17 class MyServerCallbacks: public BLEServerCallbacks {
18 void onConnect(BLEServer* pServer) {
19 deviceConnected = true;
20 };
21 void onDisconnect(BLEServer* pServer) {
22 deviceConnected = false;
23 }
24 };
Write Callback function with BLE features. When it is called, as the mobile terminal send data to ESP32, it will
store them into reload.
26 class MyCallbacks: public BLECharacteristicCallbacks {
27 void onWrite(BLECharacteristic *pCharacteristic) {
28 std::string rxValue = pCharacteristic->getValue();
29 if (rxValue.length() > 0) {
30 rxload="";
31 for (int i = 0; i < rxValue.length(); i++){
32 rxload +=(char)rxValue[i];
33 }
34 }
35 }
36 };
Initialize the BLE function and name it.
55 setupBLE("ESP32_Bluetooth");
When the mobile phone send data to ESP32 via BLE Bluetooth, it will print them out with serial port; When
the serial port of ESP32 receive data, it will send them to mobile via BLE Bluetooth.
59 long now = millis();
60 if (now - lastMsg > 1000) {
61 if (deviceConnected&&rxload.length()>0) {
62 Serial.println(rxload);
63 rxload="";
64 }
65 if(Serial.available()>0){
66 String str=Serial.readString();
67 const char *newValue=str.c_str();
68 pCharacteristic->setValue(newValue);
69 pCharacteristic->notify();
70 }
71 lastMsg = now;
72 }

Any concerns?  [email protected]


50 Chapter 3 Bluetooth www.freenove.com █

The design for creating the BLE server is:


1. Create a BLE Server
2. Create a BLE Service
3. Create a BLE Characteristic on the Service
4. Create a BLE Descriptor on the characteristic
5. Start the service.
6. Start advertising.
38 void setupBLE(String BLEName){
39 const char *ble_name=BLEName.c_str();
40 BLEDevice::init(ble_name);
41 BLEServer *pServer = BLEDevice::createServer();
42 pServer->setCallbacks(new MyServerCallbacks());
43 BLEService *pService = pServer->createService(SERVICE_UUID);
44 pCharacteristic=
pService->createCharacteristic(CHARACTERISTIC_UUID_TX,BLECharacteristic::PROPERTY_NOTIFY);
45 pCharacteristic->addDescriptor(new BLE2902());
46 BLECharacteristic *pCharacteristic =
pService->createCharacteristic(CHARACTERISTIC_UUID_RX,BLECharacteristic::PROPERTY_WRITE);
47 pCharacteristic->setCallbacks(new MyCallbacks());
48 pService->start();
49 pServer->getAdvertising()->start();
50 Serial.println("Waiting a client connection to notify...");
51 }

Any concerns?  [email protected]


█ www.freenove.com Chapter 4 WiFi Working Modes 51

Chapter 4 WiFi Working Modes


In this chapter, we'll focus on the WiFi infrastructure for ESP32-WROOM.
ESP32-WROOM has 3 different WiFi operating modes: station mode, AP mode and AP+station mode. All
WiFi programming projects must be configured with WiFi operating mode before using WiFi, otherwise WiFi
cannot be used.

Project 4.1 Station mode

Component List

Type C Wire x1 ESP32-WROOM x1

Component knowledge

Station mode
When ESP32 selects Station mode, it acts as a WiFi client. It can connect to the router network and
communicate with other devices on the router via WiFi connection. As shown below, the PC is connected to
the router, and if ESP32 wants to communicate with the PC, it needs to be connected to the router.

Any concerns?  [email protected]


52 Chapter 4 WiFi Working Modes www.freenove.com █

Circuit

Connect Freenove ESP32 to the computer using the USB cable.

Sketch

Sketch_04.1_Station_mode

Enter the correct Router


name and password.

Because the names and passwords of routers in various places are different, before the Sketch runs, users
need to enter the correct router’s name and password in the box as shown in the illustration above.
After making sure the router name and password are entered correctly, compile and upload codes to ESP32-
WROOM, open serial monitor and set baud rate to 115200. And then it will display as follows:

Any concerns?  [email protected]


█ www.freenove.com Chapter 4 WiFi Working Modes 53

When ESP32-WROOM successfully connects to “ssid_Router”, serial monitor will print out the IP address
assigned to ESP32-WROOM by the router.
The following is the program code:
1 #include <WiFi.h>
2
3 const char *ssid_Router = "********"; //Enter the router name
4 const char *password_Router = "********"; //Enter the router password
5
6 void setup(){
7 Serial.begin(115200);
8 delay(2000);
9 Serial.println("Setup start");
10 WiFi.begin(ssid_Router, password_Router);
11 Serial.println(String("Connecting to ")+ssid_Router);
12 while (WiFi.status() != WL_CONNECTED){
13 delay(500);
14 Serial.print(".");
15 }
16 Serial.println("\nConnected, IP address: ");
17 Serial.println(WiFi.localIP());
18 Serial.println("Setup End");
19 }
20
21 void loop() {
22 }
Include the WiFi Library header file of ESP32.
1 #include <WiFi.h>
Enter correct router name and password.
3 const char *ssid_Router = "********"; //Enter the router name
4 const char *password_Router = "********"; //Enter the router password
Set ESP32 in Station mode and connect it to your router.
10 WiFi.begin(ssid_Router, password_Router);

Any concerns?  [email protected]


54 Chapter 4 WiFi Working Modes www.freenove.com █

Check whether ESP32 has connected to router successfully every 0.5s.


12 while (WiFi.status() != WL_CONNECTED){
13 delay(500);
14 Serial.print(".");
15 }
Serial monitor prints out the IP address assigned to ESP32-WROOM
17 Serial.println(WiFi.localIP());
Reference
Class Station
Every time when using WiFi, you need to include header file "WiFi.h.".
begin(ssid, password,channel, bssid, connect): ESP32 is used as Station to connect hotspot.
ssid: WiFi hotspot name
password: WiFi hotspot password
channel: WiFi hotspot channel number; communicating through specified channel; optional parameter
bssid: mac address of WiFi hotspot, optional parameter
connect: blloean optional parameter, defaulting to true. If set as false, then ESP32 won't connect WiFi.
config(local_ip, gateway, subnet, dns1, dns2): set static local IP address.
local_ip: station fixed IP address.
subnet:subnet mask
dns1,dns2: optional parameter. define IP address of domain name server
status: obtain the connection status of WiFI
local IP(): obtian IP address in Station mode
disconnect(): disconnect wifi
setAutoConnect(boolen): set automatic connection Every time ESP32 is power on, it will connect WiFi
aitomatically.
setAutoReconnect(boolen): set automatic reconnection Every time ESP32 disconnects WiFi, it will
reconnect to WiFi automatically.

Any concerns?  [email protected]


█ www.freenove.com Chapter 4 WiFi Working Modes 55

Project 4.2 AP mode

Component List & Circuit

Component List & Circuit are the same as in Section 30.1.

Component knowledge

AP mode
When ESP32 selects AP mode, it creates a hotspot network that is separate from the Internet and waits for
other WiFi devices to connect. As shown in the figure below, ESP32 is used as a hotspot. If a mobile phone or
PC wants to communicate with ESP32, it must be connected to the hotspot of ESP32. Only after a connection
is established with ESP32 can they communicate.

Circuit

Connect Freenove ESP32 to the computer using the USB cable.

Any concerns?  [email protected]


56 Chapter 4 WiFi Working Modes www.freenove.com █

Sketch

Set a name and a


password for ESP32 AP.

Before the Sketch runs, you can make any changes to the AP name and password for ESP32 in the box as
shown in the illustration above. Of course, you can leave it alone by default.

Any concerns?  [email protected]


█ www.freenove.com Chapter 4 WiFi Working Modes 57

Compile and upload codes to ESP32-WROOM, open the serial monitor and set the baud rate to 115200. And
then it will display as follows.

When observing the print information of the serial monitor, turn on the WiFi scanning function of your phone,
and you can see the ssid_AP on ESP32, which is called "WiFi_Name" in this Sketch. You can enter the password
"12345678" to connect it or change its AP name and password by modifying Sketch.

Any concerns?  [email protected]


58 Chapter 4 WiFi Working Modes www.freenove.com █

Sketch_04.2_AP_mode
The following is the program code:
1 #include <WiFi.h>
2
3 const char *ssid_AP = "WiFi_Name"; //Enter the router name
4 const char *password_AP = "12345678"; //Enter the router password
5
6 IPAddress local_IP(192,168,1,100);//Set the IP address of ESP32 itself
7 IPAddress gateway(192,168,1,10); //Set the gateway of ESP32 itself
8 IPAddress subnet(255,255,255,0); //Set the subnet mask for ESP32 itself
9
10 void setup(){
11 Serial.begin(115200);
12 delay(2000);
13 Serial.println("Setting soft-AP configuration ... ");
14 WiFi.disconnect();
15 WiFi.mode(WIFI_AP);
16 Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
17 Serial.println("Setting soft-AP ... ");
18 boolean result = WiFi.softAP(ssid_AP, password_AP);
19 if(result){
20 Serial.println("Ready");
21 Serial.println(String("Soft-AP IP address = ") + WiFi.softAPIP().toString());
22 Serial.println(String("MAC address = ") + WiFi.softAPmacAddress().c_str());
23 }else{
24 Serial.println("Failed!");
25 }
26 Serial.println("Setup End");
27 }
28
29 void loop() {
30 }
Include WiFi Library header file of ESP32.
1 #include <WiFi.h>
Enter correct AP name and password.
3 const char *ssid_AP = "WiFi_Name"; //Enter the router name
4 const char *password_AP = "12345678"; //Enter the router password
Set ESP32 in AP mode.
15 WiFi.mode(WIFI_AP);
Configure IP address, gateway and subnet mask for ESP32.
16 WiFi.softAPConfig(local_IP, gateway, subnet)
Turn on an AP in ESP32, whose name is set by ssid_AP and password is set by password_AP.
18 WiFi.softAP(ssid_AP, password_AP);

Any concerns?  [email protected]


█ www.freenove.com Chapter 4 WiFi Working Modes 59

Check whether the AP is turned on successfully. If yes, print out IP and MAC address of AP established by
ESP32. If no, print out the failure prompt.
19 if(result){
20 Serial.println("Ready");
21 Serial.println(String("Soft-AP IP address = ") + WiFi.softAPIP().toString());
22 Serial.println(String("MAC address = ") + WiFi.softAPmacAddress().c_str());
23 }else{
24 Serial.println("Failed!");
25 }
26 Serial.println("Setup End");
Reference
Class AP
Every time when using WiFi, you need to include header file "WiFi.h.".
softAP(ssid, password, channel, ssid_hidden, max_connection):
ssid: WiFi hotspot name
password: WiFi hotspot password
channel: Number of WiFi connection channels, range 1-13. The default is 1.
ssid_hidden: Whether to hide WiFi name from scanning by other devices. The default is not hide.
max_connection: Maximum number of WiFi connected devices. The range is 1-4. The default is 4.
softAPConfig(local_ip, gateway, subnet): set static local IP address.
local_ip: station fixed IP address.
Gateway: gateway IP address
subnet:subnet mask
softAP(): obtian IP address in AP mode
softAPdisconnect (): disconnect AP mode.

Any concerns?  [email protected]


60 Chapter 4 WiFi Working Modes www.freenove.com █

Project 4.3 AP+Station mode

Component List

Type C Wire x1 ESP32-WROOM x1

Component knowledge

AP+Station mode
In addition to AP mode and station mode, ESP32 can also use AP mode and station mode at the same time.
This mode contains the functions of the previous two modes. Turn on ESP32's station mode, connect it to the
router network, and it can communicate with the Internet via the router. At the same time, turn on its AP
mode to create a hotspot network. Other WiFi devices can choose to connect to the router network or the
hotspot network to communicate with ESP32.

Any concerns?  [email protected]


█ www.freenove.com Chapter 4 WiFi Working Modes 61

Circuit

Connect Freenove ESP32 to the computer using the USB cable.

Sketch

Sketch_04.3_AP_Station_mode

Please enter the correct


names and passwords of
Router and AP.

It is analogous to Project 4.1 and Project 4.2. Before running the Sketch, you need to modify ssid_Router,
password_Router, ssid_AP and password_AP shown in the box of the illustration above.

Any concerns?  [email protected]


62 Chapter 4 WiFi Working Modes www.freenove.com █

After making sure that Sketch is modified correctly, compile and upload codes to ESP32-WROOM, open serial
monitor and set baud rate to 115200. And then it will display as follows:

When observing the print information of the serial monitor, turn on the WiFi scanning function of your phone,
and you can see the ssid_AP on ESP32.

The following is the program code:


1 #include <WiFi.h>
2
3 const char *ssid_Router = "********"; //Enter the router name
4 const char *password_Router = "********"; //Enter the router password
5 const char *ssid_AP = "WiFi_Name"; //Enter the AP name
6 const char *password_AP = "12345678"; //Enter the AP password
7
8 void setup(){
9 Serial.begin(115200);

Any concerns?  [email protected]


█ www.freenove.com Chapter 4 WiFi Working Modes 63

10 Serial.println("Setting soft-AP configuration ... ");


11 WiFi.disconnect();
12 WiFi.mode(WIFI_AP);
13 Serial.println("Setting soft-AP ... ");
14 boolean result = WiFi.softAP(ssid_AP, password_AP);
15 if(result){
16 Serial.println("Ready");
17 Serial.println(String("Soft-AP IP address = ") + WiFi.softAPIP().toString());
18 Serial.println(String("MAC address = ") + WiFi.softAPmacAddress().c_str());
19 }else{
20 Serial.println("Failed!");
21 }
22
23 Serial.println("\nSetting Station configuration ... ");
24 WiFi.begin(ssid_Router, password_Router);
25 Serial.println(String("Connecting to ")+ ssid_Router);
26 while (WiFi.status() != WL_CONNECTED){
27 delay(500);
28 Serial.print(".");
29 }
30 Serial.println("\nConnected, IP address: ");
31 Serial.println(WiFi.localIP());
32 Serial.println("Setup End");
33 }
34
35 void loop() {
36 }

Any concerns?  [email protected]


64 Chapter 5 TCP/IP www.freenove.com █

Chapter 5 TCP/IP
In this chapter, we will introduce how ESP32 implements network communications based on TCP/IP protocol.
There are two roles in TCP/IP communication, namely Server and Client, which will be implemented
respectively with two projects in this chapter.

Project 5.1 As Client

In this section, ESP32 is used as Client to connect Server on the same LAN and communicate with it.

Component List

ESP32-WROOM x1 Type C Wire x1

Component knowledge

TCP connection
Before transmitting data, TCP needs to establish a logical connection between the sending end and the
receiving end. It provides reliable and error-free data transmission between the two computers. In the TCP
connection, the client and the server must be clarified. The client sends a connection request to the server,
and each time such a request is proposed, a "three-times handshake" is required.

Three-times handshake: In the TCP protocol, during the preparation phase of sending data, the client and the
server interact three times to ensure the reliability of the connection, which is called "three-times handshake".
The first handshake, the client sends a connection request to the server and waits for the server to confirm.
The second handshake, the server sends a response back to the client informing that it has received the
connection request.
The third handshake, the client sends a confirmation message to the server again to confirm the connection.

Any concerns?  [email protected]


█ www.freenove.com Chapter 5 TCP/IP 65

the first handshake

the second handshake

the third handshake

TCP is a connection-oriented, low-level transmission control protocol. After TCP establishes a connection, the
client and server can send and receive messages to each other, and the connection will always exist as long
as the client or server does not initiate disconnection. Each time one party sends a message, the other party
will reply with an ack signal.

The client sends a data


message, and the server
replies with a
confirmation signal.

The server sends a data


message, and the client
replies with a
confirmation signal.

Any concerns?  [email protected]


66 Chapter 5 TCP/IP www.freenove.com █

Install Processing
In this tutorial, we use Processing to build a simple TCP/IP communication platform.
If you've not installed Processing, you can download it by clicking https://processing.org/download/. You can
choose an appropriate version to download according to your PC system.

Unzip the downloaded file to your computer. Click "processing.exe" as the figure below to run this software.

Any concerns?  [email protected]


█ www.freenove.com Chapter 5 TCP/IP 67

Use Server mode for communication


Install ControlP5.

Any concerns?  [email protected]


68 Chapter 5 TCP/IP www.freenove.com █

Open the “Freenove_ESP32_WROOM_Board\Sketches\Sketches\Sketch_05.1_WiFiClient\


sketchWiFi\sketchWiFi.pde”, and click "Run".

Stop

Run

The new pop-up interface is as follows. If ESP32 is used as client, select TCP SERVER mode for sketchWiFi.

Server mode

Receiving
Local IP address
box

Local port
number
Clear receive

Send box
Listening
Clear send

Send button

When sketchWiFi selects TCP SERVER mode, ESP32 Sketch needs to be changed according to sketchWiFi's
displaying of LOCAL IP or LOCAL PORT.

Any concerns?  [email protected]


█ www.freenove.com Chapter 5 TCP/IP 69

If ESP32 serves as server, select TCP CLIENT mode for sketchWiFi.

Client mode

Remote IP
address

Remote port
number

When sketchWiFi selects TCP CLIENT mode, the LOCAL IP and LOCAL PORT of sketchWiFi need to be
changed according to the IP address and port number printed by the serial monitor.

Mode selection: select Server mode/Client mode.


IP address: In server mode, this option does not need to be filled in, and the computer will automatically
obtain the IP address.
In client mode, fill in the remote IP address to be connected.
Port number: In server mode, fill in a port number for client devices to make an access connection.
In client mode, fill in port number given by the Server devices to make an access connection.
Start button: In server mode, push the button, then the computer will serve as server and open a port number
for client to make access connection. During this period, the computer will keep monitoring.
In client mode, before pushing the button, please make sure the server is on, remote IP address
and remote port number is correct; push the button, and the computer will make access
connection to the remote port number of the remote IP as a client.
clear receive: clear out the content in the receiving text box
clear send: clear out the content in the sending text box
Sending button: push the sending button, the computer will send the content in the text box to others.

Circuit

Connect Freenove ESP32 to the computer using USB cable.

Any concerns?  [email protected]


70 Chapter 5 TCP/IP www.freenove.com █

Sketch

Before running the Sketch, please open “sketchWiFi.pde.” first, and click “Run”.

The newly pop up window will use the computer’s IP address by default and open a data monitor port.

Next, open Sketch_05.1_WiFiClient.ino. Before running it, please change the following information based on
"LOCAL IP" and "LOCAL PORT" in the figure above.

REMOTE_IP needs to be filled in according to the interface of sketchWiFi.pde. Taking this tutorial as an
example, its REMOTE_IP is “192.168.1.80”. Generally, by default, the ports do not need to change its value.

Any concerns?  [email protected]


█ www.freenove.com Chapter 5 TCP/IP 71

Click LISTENING, turn on TCP SERVER's data listening function and wait for ESP32 to connect.

Click it

Compile and upload code to ESP32-WROOM, open the serial monitor and set the baud rate to 115200. ESP32
connects router, obtains IP address and sends access request to server IP address on the same LAN till the
connection is successful. When connect successfully, ESP32 can send messages to server.

Any concerns?  [email protected]


72 Chapter 5 TCP/IP www.freenove.com █

ESP32 connects with TCP SERVER, and TCP SERVER receives messages from ESP32, as shown in the figure
below.

Any concerns?  [email protected]


█ www.freenove.com Chapter 5 TCP/IP 73

Sketch_05.1_As_Client
The following is the program code:
1 #include <WiFi.h>
2
3 const char *ssid_Router = "********"; //Enter the router name
4 const char *password_Router = "********"; //Enter the router password
5 #define REMOTE_IP "********" //input the remote server which is you want to connect
#define REMOTE_PORT 8888 //input the remote port which is the remote provide
6 WiFiClient client;
7
8 void setup() {
9 Serial.begin(115200);
10 delay(10);
11
12 WiFi.begin(ssid_Router, password_Router);
13 Serial.print("\nWaiting for WiFi... ");
14 while (WiFi.status() != WL_CONNECTED) {
15 Serial.print(".");
16 delay(500);
17 }
18 Serial.println("");
19 Serial.println("WiFi connected");
20 Serial.println("IP address: ");
21 Serial.println(WiFi.localIP());
22 delay(500);
23
24 Serial.print("Connecting to ");
25 Serial.println(REMOTE_IP);
26
27 while (!client.connect(REMOTE_IP, REMOTE_PORT)) {
28 Serial.println("Connection failed.");
29 Serial.println("Waiting a moment before retrying...");
30 }
31 Serial.println("Connected");
32 client.print("Hello\n");
33 client.print("This is my IP.\n");
34 }
35
36 void loop() {
37 if (client.available() > 0) {
38 delay(20);
39 //read back one line from the server
40 String line = client.readString();
41 Serial.println(REMOTE_IP + String(":") + line);

Any concerns?  [email protected]


74 Chapter 5 TCP/IP www.freenove.com █

42 }
43 if (Serial.available() > 0) {
44 delay(20);
45 String line = Serial.readString();
46 client.print(line);
47 }
48 if (client.connected () == 0) {
49 client.stop();
50 WiFi.disconnect();
51 }
52 }
Add WiFi function header file.
1 #include <WiFi.h>
Enter the actual router name, password, remote server IP address, and port number.
3 const char *ssid_Router = "********"; //Enter the router name
4 const char *password_Router = "********"; //Enter the router password
5 #define REMOTE_IP "********" //input the remote server which is you want to connect
6 #define REMOTE_PORT 8888 //input the remote port which is the remote provide
Apply for the method class of WiFiClient.
7 WiFiClient client;
Connect specified WiFi until it is successful. If the name and password of WiFi are correct but it still fails to
connect, please push the reset key.
13 WiFi.begin(ssid_Router, password_Router);
14 Serial.print("\nWaiting for WiFi... ");
15 while (WiFi.status() ! = WL_CONNECTED) {
16 Serial.print(".");
17 delay(500);
18 }
Send connection request to remote server until connect successfully. When connect successfully, print out the
connecting prompt on the serial monitor and send messages to remote server.
28 while (!client.connect(REMOTE_IP, REMOTE_PORT)) {//Connect to Server
29 Serial.println("Connection failed.");
30 Serial.println("Waiting a moment before retrying...");
31 }
32 Serial.println("Connected");
33 client.print("Hello\n");
When ESP32 receive messages from servers, it will print them out via serial port; Users can also send messages
to servers from serial port.
37 if (client.available() > 0) {
38 delay(20);
39 //read back one line from the server
40 String line = client.readString();
41 Serial.println(REMOTE_IP + String(":") + line);
42 }

Any concerns?  [email protected]


█ www.freenove.com Chapter 5 TCP/IP 75

43 if (Serial.available() > 0) {
44 delay(20);
45 String line = Serial.readString();
46 client.print(line);
47 }
If the server is disconnected, turn off WiFi of ESP32.
48 if (client.connected () == false) {
49 client.stop();
50 WiFi.disconnect();
51 }
Reference
Class Client
Every time when using Client, you need to include header file "WiFi.h."
connect(ip, port, timeout)/connect(*host, port, timeout): establish a TCP connection.
ip, *host:ip address of target server
port: port number of target server
timeout: connection timeout
connected(): judge whether client is connecting. If return value is 1, then connect successfully; If return
value is 0, then fail to connect.
stop(): stop tcp connection
print(): send data to server connecting to client
available(): return to the number of bytes readable in receive buffer, if no, return to 0 or -1.
read(): read one byte of data in receive buffer
readString(): read string in receive buffer

Any concerns?  [email protected]


76 Chapter 5 TCP/IP www.freenove.com █

Project 5.2 As Server

In this section, ESP32 is used as a server to wait for the connection and communication of client on the same
LAN.

Component List

ESP32-WROOM x1 Type C Wire x1

Circuit

Connect Freenove ESP32 to the computer using a USB cable.

Any concerns?  [email protected]


█ www.freenove.com Chapter 5 TCP/IP 77

Sketch

Before running Sketch, please modify the contents of the box below first.
Sketch_05.2_As_Server

Compile and upload code to ESP32-WROOM board, open the serial monitor and set the baud rate to
115200. Turn on server mode for ESP32, waiting for the connection of other devices on the same LAN. Once
a device connects to server successfully, they can send messages to each other.
If the ESP32 fails to connect to router, press the reset button as shown below and wait for ESP32 to run again.

Any concerns?  [email protected]


78 Chapter 5 TCP/IP www.freenove.com █

Serial Monitor

IP address and
IP port

Processing:
Open the “Freenove_ESP32_WROOM_Board\Sketches\Sketches\Sketch_05.2_WiFiServer\
sketchWiFi\sketchWiFi.pde”.
Based on the messages printed by the serial monitor, enter correct IP address and IP port in Processing to
establish connection and make communication.

Enter IP address and


serial port of the serial
monitor.

The following is the program code:


1 #include <WiFi.h>
2
3 #define port 80
4 const char *ssid_Router = "********"; //input your wifi name
5 const char *password_Router = "********"; //input your wifi passwords
6 WiFiServer server(port);
7
8 void setup()
9 {
10 Serial.begin(115200);

Any concerns?  [email protected]


█ www.freenove.com Chapter 5 TCP/IP 79

11 Serial.printf("\nConnecting to ");
12 Serial.println(ssid_Router);
13 WiFi.disconnect();
14 WiFi.begin(ssid_Router, password_Router);
15 delay(1000);
16 while (WiFi.status() != WL_CONNECTED) {
17 delay(500);
18 Serial.print(".");
19 }
20 Serial.println("");
21 Serial.println("WiFi connected.");
22 Serial.print("IP address: ");
23 Serial.println(WiFi.localIP());
24 Serial.printf("IP port: %d\n",port);
25 server.begin(port);
26 WiFi.setAutoConnect(true);
27 WiFi.setAutoReconnect(true);
28 }
29
30 void loop(){
31 WiFiClient client = server.accept(); // listen for incoming clients
32 if (client) { // if you get a client
33 Serial.println("Client connected.");
34 while (client.connected()) { // loop while the client's connected
35 if (client.available()) { // if there's bytes to read from the
client
36 Serial.println(client.readStringUntil('\n')); // print it out the serial monitor
37 while(client.read()>0); // clear the wifi receive area cache
38 }
39 if(Serial.available()){ // if there's bytes to read from the
serial monitor
40 client.print(Serial.readStringUntil('\n')); // print it out the client.
41 while(Serial.read()>0); // clear the wifi receive area cache
42 }
43 }
44 client.stop(); // stop the client connecting.
45 Serial.println("Client Disconnected.");
46 }
47 }
Apply for method class of WiFiServer.
6 WiFiServer server(port); //Apply for a Server object whose port number is 80
Connect specified WiFi until it is successful. If the name and password of WiFi are correct but it still fails to
connect, please push the reset key.
13 WiFi.disconnect();

Any concerns?  [email protected]


80 Chapter 5 TCP/IP www.freenove.com █

14 WiFi.begin(ssid_Router, password_Router);
15 delay(1000);
16 while (WiFi.status() != WL_CONNECTED) {
17 delay(500);
18 Serial.print(".");
19 }
20 Serial.println("");
21 Serial.println("WiFi connected.");
Print out the IP address and port number of ESP32.
22 Serial.print("IP address: ");
23 Serial.println(WiFi.localIP()); //print out IP address of ESP32
24 Serial.printf("IP port: %d\n",port); //Print out ESP32's port number
Turn on server mode of ESP32, start automatic connection and turn on automatic reconnection.
25 server.begin(); //Turn ON ESP32 as Server mode
26 WiFi.setAutoConnect(true);
27 WiFi.setAutoReconnect(true);
When ESP32 receive messages from servers, it will print them out via serial port; Users can also send messages
to servers from serial port.
35 if (client.available()) { // if there's bytes to read from the
client
36 Serial.println(client.readStringUntil('\n')); // print it out the serial monitor
37 while(client.read()>0); // clear the wifi receive area cache
38 }
39 if(Serial.available()){ // if there's bytes to read from the
serial monitor
40 client.print(Serial.readStringUntil('\n')); // print it out the client.
41 while(Serial.read()>0); // clear the wifi receive area cache
42 }
Reference
Class Server
Every time use Server functionality, we need to include header file"WiFi.h".
WiFiServer(uint16_t port=80, uint8_t max_clients=4): create a TCP Server.
port: ports of Server; range from 0 to 65535 with the default number as 80.
max_clients: maximum number of clients with default number as 4.
begin(port): start the TCP Server.
port: ports of Server; range from 0 to 65535 with the default number as 0.
setNoDelay(bool nodelay): whether to turn off the delay sending functionality.
nodelay: true stands for forbidden Nagle algorithm.
close(): close tcp connection.
stop(): stop tcp connection.

Any concerns?  [email protected]


█ www.freenove.com What’s next? 81

What’s next?
Thanks for your reading. This tutorial is all over here. If you find any mistakes, omissions or you have other
ideas and questions about contents of this tutorial or the kit and etc., please feel free to contact us:

[email protected]
We will check and correct it as soon as possible.

If you want learn more about ESP32, you view our ultimate tutorial:
https://github.com/Freenove/Freenove_ESP32_WROOM_Board/archive/master.zip

If you want to learn more about Arduino, Raspberry Pi, smart cars, robots and other interesting products in
science and technology, please continue to focus on our website. We will continue to launch cost-effective,
innovative and exciting products.

http://www.freenove.com/

End of the Tutorial


Thank you again for choosing Freenove products.

Any concerns?  [email protected]

You might also like