/esp-iot-solution

Espressif IoT Library. IoT Device Drivers, Documentations And Solutions.

Primary LanguageCApache License 2.0Apache-2.0

ESP32 IoT Solution Overview


Solutions


Evaluation Board Series


ESP32 IoT Example List:


Components

Features

DAC Audio - Driver and example of using DAC Audio.
ULP Monitor - Provides some APIs for running simple ulp program in deep sleep.
TouchPad - Driver and example of using different types of touch pad.
Infrared - Driver and framework of using infrared remote control.

Framework

Lowpower_framework - Development framework for lowpower applications.

General fucntions

Button - Driver and example of using buttons and keys.
Debugs - Provides different commands for debugging via UART.
LED - Driver and example of using LED, which provides such APIs as to blink with different frequency.
Light - Driver and example of using PWM to drive a light, which provides such APIs as to control several channels of LED.
OTA - Driver and example of upgrading firmware from the given URL.
Param - Driver and example of saving and loading data via NVS flash.
Power Meter - Driver and example of a single-phase energy meter such as BL0937 or HLW8012.
Relay - Driver and example of a relay with different driving modes.
Weekly timer - Driver and example of a weekly timer to trigger events at some certain moment in each week.

HMI

LittlevGL - Driver of using LittlevGL embedded GUI library.
uGFX - Driver and example of using uGFX embedded GUI library.

I2C Sensors

APDS9960 - Driver and example of reading APDS9960, which is an ambient light photo Sensor.
BH1750 - Driver and example of reading BH1750 light sensor (GY-30 module).
BME280 - Driver and example of reading BME280, which is an pressure and temperature Sensor.
FT5X06 - Driver and example of reading FT5X06, which is a touch Sensor.
HDC2010 - Driver and example of reading HDC2010, which is a low power temperature and humidity sensor.
HTS221 - Driver and example of reading HTS221 temperature and humidity sensor.
LIS2DH12 - Driver and example of reading LIS2DH12, which is a 3-axis accelerometer.
MVH3004D - Driver and example of reading MVH3004D temperature and humidity sensor.
VEML6040 - Driver and example of reading VEML6040, which is a light UV sensor.

I2C Devices

AT24C02 - Driver and example of driving AT24C02, which is an eeprom storage.
CH450 - Driver and example of driving CH450, which is a 7-segment LED driver.
HT16C21 - Driver and example of driving HT16C21, which is a LED driver.
IS31FL3XXX - Driver and example of driving is31fl3xxx series chips, which are light effect LED driver chips.
MCP23017 - Driver and example of using mcp23017, which is a 16-bit I/O expander.
SSD1306 - Driver and example of using ssd1306, which is a 132 x 64 dot matrix OLED/PLED segment driver chip.

I2S Devices

ILI9806 - Driver and example of driving ILI9806 LCD.
NT35510 - Driver and example of driving NT35510 LCD.

Motor

Servo - Driver and example of driving servo motors.
A4988 - Driver and example of driving A4988, which is a stepper motor driver.

Network Abstract

MQTT - Driver and example of using MQTT client, which is a light-weight IoT protocol.
TCP - API and example of using TCP server and client in C++.
UDP - API and example of using UDP in C++.
Alink - API and example of connecting and communicating with Alink cloud service.

SPI Devices

E-ink display - API and example of driving and controlling SPI E-ink screen.
LCD screen - API and example of driving and controlling SPI LCD.
XPT2046 Touch screen - API and example of driving and controlling SPI Touch Screen.

WiFi Abstract

ESP-TOUCH for smart-config - Abstract APIs and example of configuring devices via esp-touch.
Blufi abstract APIs - Abstract APIs and example of configuring devices via blufi.
WiFi connection abstract APIs - Abstract APIs and example of WiFi station connecting to router.


Preparation(Make)

  • To clone this repository by

    git clone --recursive https://github.com/espressif/esp-iot-solution
    
  • To initialize the submodules

    git submodule update --init --recursive
    
  • Set IOT_SOLUTION_PATH, for example:

    export IOT_SOLUTION_PATH=~/esp/esp-iot-solution
    
  • esp-iot-solution project will over write the IDF_PATH to the submodule in makefile by default

  • You can refer to the Makefile in example if you want to build your own application.

  • To run the example project, please refer to:


Preparation(CMake)

  • Add to PATH the path to the tools directory inside the IDF_PATH directory.Add IDF_PATH & idf.py PATH to User Profile(CMake)

  • To clone this repository by

    git clone --recursive https://github.com/espressif/esp-iot-solution
    
  • To initialize the submodules

    git submodule update --init --recursive
    
  • Set IOT_SOLUTION_PATH, for example:

    export IOT_SOLUTION_PATH=~/esp/esp-iot-solution
    
  • esp-iot-solution project will over write the IDF_PATH to the submodule in makefile by default

  • You can refer to the Makefile in example if you want to build your own application.

  • To run the example project, please refer to:


Build system and dependency (Make)

  • We can regard IoT solution project as a platform that contains different device drivers and features

  • Add-on project: If you want to use those drivers and build your project base on the framework, you need to include the IoT components into your project.

    PROJECT_NAME := empty_project
    #If IOT_SOLUTION_PATH is not defined, use relative path as default value
    IOT_SOLUTION_PATH ?= $(abspath $(shell pwd)/../../)
    include $(IOT_SOLUTION_PATH)/Makefile
    include $(IDF_PATH)/make/project.mk
    

    As we can see, in the Makefile of your project, you need to include the Makefile under $(IOT_SOLUTION_PATH) directory so that the build system can involve all the components and drivers you need.

    Note: In this way, the build system will replace the IDF_PATH with the directory of idf repository in submodule during the build process.

    If you don't want the replacement to happen(which means to use the ESP_IDF value from your system environment), you can modify as the following Makefile does:

    PROJECT_NAME := empty_project
    #If IOT_SOLUTION_PATH is not defined, use relative path as default value
    IOT_SOLUTION_PATH ?= $(abspath $(shell pwd)/../../)
    include $(IOT_SOLUTION_PATH)/components/component_conf.mk
    include $(IDF_PATH)/make/project.mk
    
  • Stand-alone component: if you just want to pick one of the component and put it into your existing project, you just need to copy the single component to your project components directory. But you can also append the component list in your project Makefile like this:

    EXTRA_COMPONENT_DIRS += $(IOT_SOLUTION_PATH)/components/the_one_you_want_to_use
    
  • Components control: Usually we don't need all the device drivers to be compiled into our project, we can choose the necessary ones in menuconfig:

    make menuconfig --> IoT Solution settings --> IoT Components Management
    

    Those components that are not enabled, will not be compiled into the project, which alos means, you need to enable the components you would like to use.


Build system and dependency (CMake)

  • We can regard IoT solution project as a platform that contains different device drivers and features

  • Add-on project: If you want to use those drivers and build your project base on the framework, you need to include the IoT components into your project.

    # The following lines of boilerplate have to be in your project's
    # CMakeLists in this exact order for cmake to work correctly
    cmake_minimum_required(VERSION 3.5)
    
    #If IOT_SOLUTION_PATH is not defined, use relative path as default value
    set(IOT_SOLUTION_PATH "$ENV{IOT_SOLUTION_PATH}")
    if(NOT IOT_SOLUTION_PATH)
        # Documentation says you should set IOT_SOLUTION_PATH in your environment, but we
        # can infer it relative to PROJECT_PATH directory if it's not set.
        get_filename_component(IOT_SOLUTION_PATH "${PROJECT_PATH}/../.." ABSOLUTE)
    endif()
    file(TO_CMAKE_PATH "${IOT_SOLUTION_PATH}" IOT_SOLUTION_PATH)
    set(ENV{IOT_SOLUTION_PATH} ${IOT_SOLUTION_PATH})
    
    include($ENV{IOT_SOLUTION_PATH}/CMakeLists.txt)
    include($ENV{IDF_PATH}/tools/cmake/project.cmake)
    
    project(empty-project)
    

    As we can see, in the Makefile of your project, you need to include the Makefile under $(IOT_SOLUTION_PATH) directory so that the build system can involve all the components and drivers you need.

    Note: In this way, the build system will replace the IDF_PATH with the directory of idf repository in submodule during the build process.

    If you don't want the replacement to happen(which means to use the ESP_IDF value from your system environment), you can modify as the following Makefile does:

    # The following lines of boilerplate have to be in your project's
    # CMakeLists in this exact order for cmake to work correctly
    cmake_minimum_required(VERSION 3.5)
    
    #If IOT_SOLUTION_PATH is not defined, use relative path as default value
    set(IOT_SOLUTION_PATH "$ENV{IOT_SOLUTION_PATH}")
    if(NOT IOT_SOLUTION_PATH)
        # Documentation says you should set IOT_SOLUTION_PATH in your environment, but we
        # can infer it relative to PROJECT_PATH directory if it's not set.
        get_filename_component(IOT_SOLUTION_PATH "${PROJECT_PATH}/../.." ABSOLUTE)
    endif()
    file(TO_CMAKE_PATH "${IOT_SOLUTION_PATH}" IOT_SOLUTION_PATH)
    set(ENV{IOT_SOLUTION_PATH} ${IOT_SOLUTION_PATH})
    
    include($ENV{IOT_SOLUTION_PATH}/CMakeLists.txt)
    include($ENV{IDF_PATH}/tools/cmake/project.cmake)
    
    project(empty-project)
    
  • Stand-alone component: if you just want to pick one of the component and put it into your existing project, you just need to copy the single component to your project components directory. But you can also append the component list in your project Makefile like this:

    set(EXTRA_COMPONENT_DIRS "${EXTRA_COMPONENT_DIRS} ${IOT_SOLUTION_PATH}/components/the_one_you_want_to_use")
    
  • Components control: Usually we don't need all the device drivers to be compiled into our project, we can choose the necessary ones in menuconfig:

    idf.py menuconfig --> IoT Solution settings --> IoT Components Management
    

    Those components that are not enabled, will not be compiled into the project, which alos means, you need to enable the components you would like to use.


Framework

  • components

    • small drivers of different divices like button and LED
    • drivers of sensors
    • drivers of different I2C devices
    • friendly APIs of WiFi and OTA
  • Documents:

    • Documentations of some important features
    • Instruction of some different solutions
  • Examples:

    • Example project using this framework
  • Submodule:

    • esp-idf works as submodule here
  • tools:

    • different tools and scripts
    • unit-test project
    ├── Makefile
    ├── README.md
    ├── components
    ├── documents
    ├── examples
    │   └── aws_iot_demo
    │   └── check_pedestrian_flow
    │   └── empty_project
    │   └── esp32_azure_iot_kit 
    │   └── eth2wifi
    │   └── hmi
    │   └── lowpower_evb
    │   └── oled_screen_module
    │   └── smart_device
    │   └── touch_pad_evb
    │   └── ulp_examples
    ├── submodule
    │   └── esp-idf
    └── tools
        └── unit-test-app
    

Usage (Make)

  • This code is based on esp-idf project.

  • This repository contains esp-idf code as submodule.

  • To clone this repository by git clone --recurisve https://github.com/espressif/esp-iot-solution.git

  • Change to the directory of examples (such as examples/smart_device) in esp-iot-solution, run make menuconfig to configure the project.

  • Compiling the Project by make all

    ... will compile app, bootloader and generate a partition table based on the config.

  • Flashing the Project

  • Flash the binaries by make flash

    This will flash the entire project (app, bootloader and partition table) to a new chip. The settings for serial port flashing can be configured with make menuconfig.
    You don't need to run make all before running make flash, make flash will automatically rebuild anything which needs it.

  • Viewing Serial Output by make monitor target will use the already-installed miniterm (a part of pyserial) to display serial output from the ESP32 on the terminal console. Exit miniterm by typing Ctrl-].

  • To flash and monitor output in one pass, you can run: make flash monitor

  • You can use unit-test in esp-iot-solution to test all the components.


Usage (CMake)

  • This code is based on esp-idf project.

  • This repository contains esp-idf code as submodule.

  • To clone this repository by git clone --recurisve https://github.com/espressif/esp-iot-solution.git

  • Change to the directory of examples (such as examples/smart_device) in esp-iot-solution, run idf.py menuconfig to configure the project.

  • Compiling the Project by idf.py build

    ... will compile app, bootloader and generate a partition table based on the config.

  • Flashing the Project

  • Flash the binaries by idf.py flash

    This will flash the entire project (app, bootloader and partition table) to a new chip. The settings for serial port flashing can be configured with idf.py menuconfig.
    You don't need to run idf.py all before running idf.py flash, idf.py flash will automatically rebuild anything which needs it.

  • Viewing Serial Output by idf.py monitor target will use the already-installed miniterm (a part of pyserial) to display serial output from the ESP32 on the terminal console. Exit miniterm by typing Ctrl-].

  • To flash and monitor output in one pass, you can run: idf.py flash monitor

  • You can use unit-test in esp-iot-solution to test all the components.


Unit-test (Make)

back to top

To use uint-test, follow these steps:

  • Change to the directory of unit-test-app

    cd YOUR_IOT_SOLUTION_PATH/tools/unit-test-app
    
  • Use the default sdkconfig and compile unit-test-app by make IOT_TEST_ALL=1 -j8

    make defconfig
    make IOT_TEST_ALL=1
    
  • Flash the images by make flash

    make IOT_TEST_ALL=1 flash
    
  • Reset the chip and see the uart log using an uart tool such as minicom

  • All kinds of components will be shown by uart

    Here's the test menu, pick your combo:
    (1)     "Sensor BH1750 test" [bh1750][iot][sensor]
    (2)     "Button test" [button][iot]
    (3)     "Button cpp test" [button_cpp][iot]
    (4)     "Dac audio test" [dac_audio][iot][audio]
    (5)     "Debug cmd test" [debug][iot]
    (6)     "Deep sleep gpio test" [deep_sleep][rtc_gpio][current][iot]
    (7)     "Deep sleep touch test" [deep_sleep][touch][current][iot]
     ......
    
  • You need to send the index of the unit you want to test by uart. Test code of the unit you select will be run


Unit-test (CMake)

back to top

To use uint-test, follow these steps:

  • Change to the directory of unit-test-app

    cd YOUR_IOT_SOLUTION_PATH/tools/unit-test-app
    
  • Use the default sdkconfig and compile unit-test-app by make IOT_TEST_ALL=1 -j8

    make defconfig
    make IOT_TEST_ALL=1
    
  • Flash the images by make flash

    make IOT_TEST_ALL=1 flash
    
  • Reset the chip and see the uart log using an uart tool such as minicom

  • All kinds of components will be shown by uart

    Here's the test menu, pick your combo:
    (1)     "Sensor BH1750 test" [bh1750][iot][sensor]
    (2)     "Button test" [button][iot]
    (3)     "Button cpp test" [button_cpp][iot]
    (4)     "Dac audio test" [dac_audio][iot][audio]
    (5)     "Debug cmd test" [debug][iot]
    (6)     "Deep sleep gpio test" [deep_sleep][rtc_gpio][current][iot]
    (7)     "Deep sleep touch test" [deep_sleep][touch][current][iot]
     ......
    
  • You need to send the index of the unit you want to test by uart. Test code of the unit you select will be run


Example (Make)

back to top

To run the Examples projects, follow the steps below:

  • Change the directory to example

  • choose one example project you want to run, we take smart_device here.

  • Change the directory to the example project under example directory, take smart_device example as example here:

    cd YOUR_IOT_SOLUTION_PATH/example/smart_device
    
  • Run make menuconfig to set the project parameters in

    make menuconfig --> IoT Example - smart_device
    
  • Run make to compile the project, or make flash to compile and flash the module.


Example (CMake)

back to top

To run the Examples projects, follow the steps below:

  • Change the directory to example

  • choose one example project you want to run, we take smart_device here.

  • Change the directory to the example project under example directory, take smart_device example as example here:

    cd YOUR_IOT_SOLUTION_PATH/example/smart_device/alink_smart_device_demo
    
  • Run idf.py menuconfig to set the project parameters in

    idf.py menuconfig --> IoT Example - smart_device
    
  • Run idf.py to compile the project, or idf.py flash to compile and flash the module.


Empty project (Make)

back to top

  • You can start your own appliction code base on the empty_project.

  • By default, you just need to run make under the example/empty_project directory. The makefile will set all the path by default.

  • Meanwhile, you can copy the example project to anywhere you want, in this case, you will have to set the IOT_SOLUTION_PATH so that the build system shall know where to find the code and link the files.

  • Set iot path:(replace 'YOUR_PATH' below), you can also add IOT_SOLUTION_PATH to your environment PATH

        export IOT_SOLUTION_PATH = "YOUR_PATH/esp-iot-solution"
    

Empty project (CMake)

back to top

  • You can start your own appliction code base on the empty_project.

  • By default, you just need to run idf.py build under the example/empty_project directory. The makefile will set all the path by default.

  • Meanwhile, you can copy the example project to anywhere you want, in this case, you will have to set the IOT_SOLUTION_PATH so that the build system shall know where to find the code and link the files.

  • Set iot path:(replace 'YOUR_PATH' below), you can also add IOT_SOLUTION_PATH to your environment PATH

        export IOT_SOLUTION_PATH = "YOUR_PATH/esp-iot-solution"