Beginner
10 min

Provide wireless connectivity to your projects with ESP-WROOM-02 and PIC18F87J11

Empowering your IoT ecosystem with supercharged WiFi!

WiFi ESP Click with EasyPIC PRO v8

Published Nov 02, 2023

Click board™

WiFi ESP Click

Dev Board

EasyPIC PRO v8

Compiler

NECTO Studio

MCU

PIC18F87J11

Transform your environment into a smart oasis with our WiFi module, designed to effortlessly integrate into your projects, providing the connectivity backbone for your connected lifestyle.

A

A

Hardware Overview

How does it work?

WiFi ESP Click is based on the ESP-WROOM-02, a fully integrated WiFi module from Espressif. It carries the well-known work-horse ESP8266EX, a highly integrated SoC solution that meets continuous demands for efficient power usage, compact design, and reliable performance in the industry. Besides the WiFi functionalities, ESP8266EX integrates an enhanced version of Tensilica’s L106 Diamond series 32-bit processor and on-chip SRAM, as well as antenna switches, RF balun, power amplifier, low noise receiver amplifier, filters, and power management modules. The module also includes 2MB of SPI flash to store a user program. With the complete and self-contained WiFi networking capabilities, it

can perform as either a standalone application (WROOM module itself) or the slave to an MCU host, which is the primary intention of the click board as a whole. So, this click board is applied to any microcontroller design as a WiFi adaptor through the UART interface (RX, TX lines on mikroBUS pin socket). The WiFi ESP Click comes with exposed 5 GPIOs of the module, which are part of the HSPI/GPIO interface of the module. The GPIO0 is used to enter the ESP8266EX’s UART download mode by shortening it with the GND just next to it. This way, you can upgrade the module’s firmware or upload a custom one. WiFi ESP Click communicates with the host MCU using the UART interface as its default communication

protocol at the 115200 baud rate. Besides standard UART RX and TX lines, the host MCU is also connected to the WiFi ESP Click with EN and RST lines. The first one turns off the module with a LOW logic state, while the latter is used to reset the ESP8266EX. You can also use the UART interface to communicate with the ESP-WROOM-O2 module by the AT commands set. This Click board™ can be operated only with a 3.3V logic voltage level. The board must perform appropriate logic voltage level conversion before using MCUs with different logic levels. Also, it comes equipped with a library containing functions and an example code that can be used as a reference for further development.

WiFi ESP Click hardware overview image

Features overview

Development board

EasyPIC PRO v8 is a development board specially designed for the needs of rapid development of embedded applications. It supports many high pin count 8-bit PIC microcontrollers from Microchip, regardless of their number of pins, and a broad set of unique functions, such as the first-ever embedded debugger/programmer over WiFi. The development board is well organized and designed so that the end-user has all the necessary elements, such as switches, buttons, indicators, connectors, and others, in one place. Thanks to innovative manufacturing technology, EasyPIC PRO v8 provides a fluid and immersive working experience, allowing access anywhere and under

any circumstances at any time. Each part of the EasyPIC PRO v8 development board contains the components necessary for the most efficient operation of the same board. In addition to the advanced integrated CODEGRIP programmer/debugger module, which offers many valuable programming/debugging options and seamless integration with the Mikroe software environment, the board also includes a clean and regulated power supply module for the development board. It can use a wide range of external power sources, including a battery, an external 12V power supply, and a power source via the USB Type-C (USB-C) connector.

Communication options such as USB-UART, USB DEVICE, and Ethernet are also included, including the well-established mikroBUS™ standard, a standardized socket for the MCU card (SiBRAIN standard), and two display options (graphical and character-based LCD). EasyPIC PRO v8 is an integral part of the Mikroe ecosystem for rapid development. Natively supported by Mikroe software tools, it covers many aspects of prototyping and development thanks to a considerable number of different Click boards™ (over a thousand boards), the number of which is growing every day.

EasyPIC PRO v8 horizontal image

Microcontroller Overview

MCU Card / MCU

default

Type

8th Generation

Architecture

PIC

MCU Memory (KB)

128

Silicon Vendor

Microchip

Pin count

80

RAM (Bytes)

3904

Used MCU Pins

mikroBUS™ mapper

NC
NC
AN
Reset
PJ4
RST
Chip Enable
PJ0
CS
NC
NC
SCK
NC
NC
MISO
NC
NC
MOSI
Power Supply
3.3V
3.3V
Ground
GND
GND
NC
NC
PWM
NC
NC
INT
UART TX
PG1
TX
UARTRX
PG2
RX
NC
NC
SCL
NC
NC
SDA
NC
NC
5V
Ground
GND
GND
1

Take a closer look

Schematic

WiFi ESP Click Schematic schematic

Step by step

Project assembly

Fusion for PIC v8 front image hardware assembly

Start by selecting your development board and Click board™. Begin with the EasyPIC PRO v8 as your development board.

Fusion for PIC v8 front image hardware assembly
Buck 22 Click front image hardware assembly
SiBRAIN for PIC32MZ1024EFK144 front image hardware assembly
v8 SiBRAIN MB 1 - upright/background hardware assembly
Necto image step 2 hardware assembly
Necto image step 3 hardware assembly
Necto image step 4 hardware assembly
NECTO Compiler Selection Step Image hardware assembly
NECTO Output Selection Step Image hardware assembly
Necto image step 6 hardware assembly
Necto image step 7 hardware assembly
Necto image step 8 hardware assembly
Necto image step 9 hardware assembly
Necto image step 10 hardware assembly
Necto PreFlash Image hardware assembly

Track your results in real time

Application Output

After pressing the "FLASH" button on the left-side panel, it is necessary to open the UART terminal to display the achieved results. By clicking on the Tools icon in the right-hand panel, multiple different functions are displayed, among which is the UART Terminal. Click on the offered "UART Terminal" icon.

UART Application Output Step 1

Once the UART terminal is opened, the window takes on a new form. At the top of the tab are two buttons, one for adjusting the parameters of the UART terminal and the other for connecting the UART terminal. The tab's lower part is reserved for displaying the achieved results. Before connecting, the terminal has a Disconnected status, indicating that the terminal is not yet active. Before connecting, it is necessary to check the set parameters of the UART terminal. Click on the "OPTIONS" button.

UART Application Output Step 2

In the newly opened UART Terminal Options field, we check if the terminal settings are correct, such as the set port and the Baud rate of UART communication. If the data is not displayed properly, it is possible that the Baud rate value is not set correctly and needs to be adjusted to 115200. If all the parameters are set correctly, click on "CONFIGURE".

UART Application Output Step 3

The next step is to click on the "CONNECT" button, after which the terminal status changes from Disconnected to Connected in green, and the data is displayed in the Received data field.

UART Application Output Step 4

Software Support

Library Description

This library contains API for WiFi ESP Click driver.

Key functions:

  • wifiesp_send_cmd - Sends AT command to the module.

  • wifiesp_generic_write - Generic write function.

  • wifiesp_generic_read - Generic read function.

Open Source

Code example

This example can be found in NECTO Studio. Feel free to download the code, or you can copy the code below.

/*!
 * \file 
 * \brief wifiesp Click example
 * 
 * # Description
 * This example connects to the desired WiFi network and then
 * creates web server on the IP address assigned to the click board.
 * The user can connect to the server via web browser.
 *
 * The demo application is composed of two sections :
 * 
 * ## Application Init 
 * Initializes driver and wifi communication, then connects to the desired WiFi network
 * and creates web server on the IP address assigned to the click board.
 * 
 * ## Application Task  
 * Waits for the client request (paste IP address in your web browser and 
 * refresh to send a request).
 * The click board will respond by sending a page content to the client.
 * 
 * \author MikroE Team
 *
 */
// ------------------------------------------------------------------- INCLUDES

#include "board.h"
#include "log.h"
#include "wifiesp.h"
#include "string.h"
#include "conversions.h"

#define APP_SSID                            "MikroE Public"
#define APP_PASSWORD                        "mikroe.guest"

#define PROCESS_BUFFER_SIZE                 610

// ------------------------------------------------------------------ VARIABLES

uint8_t page[ ] = "<a href=\"https://www.mikroe.com/\">MikroElektronika</a>\
<h1 style=\"color:red;\">WiFi ESP click board</h1>";
uint8_t page_len[ 10 ] = { 0 };
uint8_t send_buf[ 10 ] = { 0 };
static uint8_t link_id[ 2 ] = { 0 };

static wifiesp_t wifiesp;
static log_t logger;

static char app_buf[ PROCESS_BUFFER_SIZE ]  = { 0 };
static int32_t app_buf_len                  = 0;

static err_t app_error_flag;

// ------------------------------------------------------- ADDITIONAL FUNCTIONS

static void wifiesp_clear_app_buf ( void )
{
    memset( app_buf, 0, app_buf_len );
    app_buf_len = 0;
}

static void wifiesp_log_app_buf ( void )
{
    for ( int32_t buf_cnt = 0; buf_cnt < app_buf_len; buf_cnt++ )
    {
        log_printf( &logger, "%c", app_buf[ buf_cnt ] );
    }
}

static err_t wifiesp_process ( void )
{
    uint8_t rx_buf[ PROCESS_BUFFER_SIZE ] = { 0 };
    int32_t rx_size = 0;
    rx_size = wifiesp_generic_read( &wifiesp, rx_buf, PROCESS_BUFFER_SIZE );
    if ( rx_size > 0 ) 
    {
        int32_t buf_cnt = app_buf_len;
        if ( ( ( app_buf_len + rx_size ) > PROCESS_BUFFER_SIZE ) && ( app_buf_len > 0 ) ) 
        {
            buf_cnt = PROCESS_BUFFER_SIZE - ( ( app_buf_len + rx_size ) - PROCESS_BUFFER_SIZE );
            memmove ( app_buf, &app_buf[ PROCESS_BUFFER_SIZE - buf_cnt ], buf_cnt );
        }
        for ( int32_t rx_cnt = 0; rx_cnt < rx_size; rx_cnt++ ) 
        {
            if ( rx_buf[ rx_cnt ] ) 
            {
                app_buf[ buf_cnt++ ] = rx_buf[ rx_cnt ];
                if ( app_buf_len < PROCESS_BUFFER_SIZE )
                {
                    app_buf_len++;
                }
            }
        }
        return WIFIESP_OK;
    }
    return WIFIESP_ERROR;
}

static err_t wifiesp_rsp_check ( char * response )
{
    uint32_t timeout_cnt = 0;
    uint32_t timeout = 120000;
    wifiesp_clear_app_buf( );
    wifiesp_process( );
    while ( ( 0 == strstr( app_buf, response ) ) &&
            ( 0 == strstr( app_buf, WIFIESP_RSP_ERROR ) ) )
    {
        wifiesp_process( );
        if ( timeout_cnt++ > timeout )
        {
            wifiesp_clear_app_buf( );
            return WIFIESP_ERROR_TIMEOUT;
        }
        Delay_ms( 1 );
    }
    Delay_ms( 5 );
    wifiesp_process( );
    if ( strstr( app_buf, response ) )
    {
        return WIFIESP_OK;
    }
    else if ( strstr( app_buf, WIFIESP_RSP_ERROR ) )
    {
        return WIFIESP_ERROR_CMD;
    }
    return WIFIESP_ERROR_UNKNOWN;
}

static void wifiesp_error_check( err_t error_flag )
{
    switch ( error_flag )
    {
        case WIFIESP_OK:
        {
            wifiesp_log_app_buf( );
            break;
        }
        case WIFIESP_ERROR:
        {
            log_error( &logger, " Overflow!" );
            break;
        }
        case WIFIESP_ERROR_TIMEOUT:
        {
            log_error( &logger, " Timeout!" );
            break;
        }
        case WIFIESP_ERROR_CMD:
        {
            log_error( &logger, " CMD!" );
            break;
        }
        case WIFIESP_ERROR_UNKNOWN:
        default:
        {
            log_error( &logger, " Unknown!" );
            break;
        }
    }
    log_printf( &logger, "\r\n-----------------------------------\r\n" );
    Delay_ms( 500 );
}

void wifi_communication_init( void )
{
    wifiesp_process( ); // dummy read
    wifiesp_clear_app_buf( );
    
    wifiesp_send_cmd( &wifiesp, WIFIESP_CHECK, NULL );
    app_error_flag = wifiesp_rsp_check( WIFIESP_RSP_OK );
    wifiesp_error_check( app_error_flag );
    
    wifiesp_send_cmd( &wifiesp, WIFIESP_RESTORE, NULL );
    app_error_flag = wifiesp_rsp_check( WIFIESP_RSP_OK );
    wifiesp_error_check( app_error_flag );
    uart_clear ( &wifiesp.uart );
    
    wifiesp_send_cmd( &wifiesp, WIFIESP_CHECK_FIRMWARE, NULL );
    app_error_flag = wifiesp_rsp_check( WIFIESP_RSP_OK );
    wifiesp_error_check( app_error_flag );
    
    wifiesp_send_cmd( &wifiesp, WIFIESP_SET_MODE, "1" );
    app_error_flag = wifiesp_rsp_check( WIFIESP_RSP_OK );
    wifiesp_error_check( app_error_flag );
    
    wifiesp_clear_app_buf( );
    strcpy ( app_buf, "\"" );
    strcat ( app_buf, APP_SSID );
    strcat ( app_buf, "\",\"" );
    strcat ( app_buf, APP_PASSWORD );
    strcat ( app_buf, "\"" );
    app_buf_len = strlen ( app_buf );
    wifiesp_send_cmd( &wifiesp, WIFIESP_CONNECT, app_buf );
    wifiesp_clear_app_buf ( );
    app_error_flag = wifiesp_rsp_check( WIFIESP_RSP_OK );
    wifiesp_error_check( app_error_flag );
    
    wifiesp_send_cmd( &wifiesp, WIFIESP_SET_MULTIPLE_CONNECTION, "1" );
    app_error_flag = wifiesp_rsp_check( WIFIESP_RSP_OK );
    wifiesp_error_check( app_error_flag );
    
    wifiesp_send_cmd( &wifiesp, WIFIESP_SET_AS_SERVER, "1,80" );
    app_error_flag = wifiesp_rsp_check( WIFIESP_RSP_OK );
    wifiesp_error_check( app_error_flag );
    
    wifiesp_send_cmd( &wifiesp, WIFIESP_GET_IP, NULL );
    app_error_flag = wifiesp_rsp_check( WIFIESP_RSP_OK );
    wifiesp_error_check( app_error_flag );
}

static void wifiesp_str_cut_chr ( uint8_t *str, uint8_t chr )
{
    uint16_t cnt_0 = 0;
    uint16_t cnt_1 = 0;
    for ( cnt_0 = 0; cnt_0 < strlen( str ); cnt_0++ )
    {
        if ( str[ cnt_0 ] == chr )
        {
            for ( cnt_1 = cnt_0; cnt_1 < strlen( str ); cnt_1++ )
            {
                str[ cnt_1 ] = str[ cnt_1 + 1 ];
            }
        }
    }
}

// ------------------------------------------------------ APPLICATION FUNCTIONS

void application_init ( void )
{
    log_cfg_t log_cfg;
    wifiesp_cfg_t cfg;
    
    /** 
     * Logger initialization.
     * Default baud rate: 115200
     * Default log level: LOG_LEVEL_DEBUG
     * @note If USB_UART_RX and USB_UART_TX 
     * are defined as HAL_PIN_NC, you will 
     * need to define them manually for log to work. 
     * See @b LOG_MAP_USB_UART macro definition for detailed explanation.
     */
    LOG_MAP_USB_UART( log_cfg );
    log_init( &logger, &log_cfg );
    log_info( &logger, "---- Application Init ----" );

    // Click initialization.
    wifiesp_cfg_setup( &cfg );
    WIFIESP_MAP_MIKROBUS( cfg, MIKROBUS_1 );
    wifiesp_init( &wifiesp, &cfg );
    wifiesp_default_cfg( &wifiesp );
    Delay_ms( 1000 );
    
    // Communication initialization
    wifi_communication_init( );
    
    uint16_to_str ( strlen( page ), page_len );
    wifiesp_str_cut_chr ( page_len, ' ' );
    
    log_info( &logger, "Please connect to the IP address listed above.\r\n" );
}

void application_task ( void )
{
    if ( WIFIESP_OK == wifiesp_rsp_check( WIFIESP_RECEIVE ) ) 
    {
        link_id[ 0 ] = *( strstr( app_buf, WIFIESP_RECEIVE ) + 5 );
        strcpy ( send_buf, link_id );
        strcat ( send_buf, "," );
        strcat ( send_buf, page_len );
        wifiesp_str_cut_chr ( send_buf, ' ' );
        wifiesp_log_app_buf( );
        wifiesp_clear_app_buf( );
        Delay_ms( 100 );
        wifiesp_process( );
        wifiesp_log_app_buf( );
        wifiesp_send_cmd( &wifiesp, WIFIESP_SEND, send_buf );
        app_error_flag = wifiesp_rsp_check( WIFIESP_RSP_READY_FOR_SEND );
        wifiesp_log_app_buf( );
        Delay_ms( 100 );
        wifiesp_generic_write( &wifiesp, page, strlen( page ) );
        app_error_flag = wifiesp_rsp_check( WIFIESP_RSP_SEND_OK );
        wifiesp_error_check( app_error_flag );
        wifiesp_send_cmd( &wifiesp, WIFIESP_CLOSE, link_id );
        app_error_flag = wifiesp_rsp_check( WIFIESP_RSP_OK );
        wifiesp_error_check( app_error_flag );
        wifiesp_clear_app_buf( );
        
        wifiesp_process( );
        wifiesp_log_app_buf( );
        wifiesp_clear_app_buf( );
        uart_clear ( &wifiesp.uart );
        Delay_ms( 100 );
    }
}

void main ( void )
{
    application_init( );
    
    for ( ; ; )
    {
        application_task ( );
    }
}


// ------------------------------------------------------------------------ END

Additional Support

Resources