Thursday, 1 July 2021

ESP32

Standard
 


ESP32

What is ESP32:

ESP32 is a system on a chip(SoC) that integrates the following features:

  • Wi-Fi (2.4 GHz band):
  • Bluetooth
  • Dual high performance cores
  • Ultra Low Power co-processor
  • Multiple peripherals

Powered by 40 nm technology, ESP32 provides a robust, highly integrated platform, which helps meet the continuous demands for efficient power usage, compact design, security, high performance, and reliability.

Espressif provides basic hardware and software resources to help application developers realize their ideas using the ESP32 series hardware. The software development framework by Espressif is intended for development of Internet-of-Things (IoT) applications with Wi-Fi, Bluetooth, power management and several other system features.

Features:

Following block diagram explains all inbuilt features of  ESP32
Ultra­Low­Power Solution ESP32 is designed for mobile, wearable electronics, and Internet-of-Things (IoT) applications. It features all the state-of-the-art characteristics of low-power chips, including fine-grained clock gating, multiple power modes, and dynamic power scaling. For instance, in a low-power IoT sensor hub application scenario, ESP32 is woken up periodically and only when a specified condition is detected. Low-duty cycle is used to minimize the amount of energy that the chip expends. The output of the power amplifier is also adjustable, thus contributing to an optimal trade-off between communication range, data rate and power consumption.

Wi­Fi Key Features :
  • 802.11 b/g/n
  • 802.11 n (2.4 GHz), up to 150 Mbps
  • WMM 
  • TX/RX A-MPDU, RX A-MSDU 
  • Defragmentation 
  • Automatic Beacon monitoring (hardware TSF) 
  • 4 × virtual Wi-Fi interfaces 
  • Simultaneous support for Infrastructure Station, SoftAP, and Promiscuous modes 
  • Antenna diversity

BT Key Features :
  • Compliant with Bluetooth v4.2 BR/EDR and BLE specifications 
  • Class-1, class-2 and class-3 transmitter without external power amplifier 
  • Enhanced Power Control 
  • +12 dBm transmitting power 
  • NZIF receiver with –94 dBm BLE sensitivity 
  • Adaptive Frequency Hopping (AFH) 
  • Standard HCI based on SDIO/SPI/UART 
  • High-speed UART HCI, up to 4 Mbps 
  • Bluetooth 4.2 BR/EDR BLE dual mode controller 
  • Synchronous Connection-Oriented/Extended (SCO/eSCO) 
  • CVSD and SBC for audio codec 
  • Bluetooth Piconet and Scatternet 
  • Multi-connections in Classic BT and BLE 
  • Simultaneous advertising and scanning
CPU and Memory :
  • Xtensa® single-/dual-core 32-bit LX6 microprocessor(s), up to 600 MIPS (200 MIPS for ESP32-S0WD/ESP32-U4WDH, 400 MIPS for ESP32-D2WD) 
  • 448 KB ROM 
  • 520 KB SRAM 
  • 16 KB SRAM in RTC 
  • QSPI supports multiple flash/SRAM chips
Clocks and Timers :

  • Internal 8 MHz oscillator with calibration 
  • Internal RC oscillator with calibration 
  • External 2 MHz ~ 60 MHz crystal oscillator (40 MHz only for Wi-Fi/BT functionality)
  • External 32 kHz crystal oscillator for RTC with calibration 
  • Two timer groups, including 2 × 64-bit timers and 1 × main watchdog in each group 
  • One RTC timer
  • RTC watchdog

Advanced Peripheral Interfaces :
  • 34 × programmable GPIOs 
  • 12-bit SAR ADC up to 18 channels 
  • 2 × 8-bit DAC 
  • 10 × touch sensors 
  • 4 × SPI 
  • 2 × I²S 
  • 2 × I²C 
  • 3 × UART 
  • 1 host (SD/eMMC/SDIO) 
  • 1 slave (SDIO/SPI) 
  • Ethernet MAC interface with dedicated DMA and IEEE 1588 support 
  • Two-Wire Automotive Interface (TWAI®, compatible with ISO11898-1) 
  • IR (TX/RX) 
  • Motor PWM 
  • LED PWM up to 16 channels 
  • Hall sensor

Secure boot :
  • Flash encryption 
  • 1024-bit OTP, up to 768-bit for customers 
  • Cryptographic hardware acceleration: – AES – Hash (SHA-2) 
  • RSA – ECC – Random Number Generator (RNG)


Applications (A Non­exhaustive List) :

  • Generic Low-power IoT Sensor Hub 
  • Generic Low-power IoT Data Loggers 
  • Cameras for Video Streaming
  • Over-the-top (OTT) Devices 
  • Speech Recognition
  • Image Recognition 
  • Mesh Network 
  • Home Automation – Light control – Smart plugs – Smart door locks 
  • Smart Building – Smart lighting – Energy monitoring 
  • Industrial Automation – Industrial wireless control – Industrial robotics 
  • Smart Agriculture – Smart greenhouses – Smart irrigation – Agriculture robotics 
  • Audio Applications – Internet music players – Live streaming devices – Internet radio players – Audio headsets 
  • Health Care Applications – Health monitoring – Baby monitors 
  • Wi-Fi-enabled Toys – Remote control toys – Proximity sensing toys – Educational toys 
  • Wearable Electronics – Smart watches – Smart bracelets 
  • Retail & Catering Applications – POS machines – Service robots

Types & Specifications:

The ESP32 series of chips includes follwing variants...

  • ESP32-D0WD-V3 
  • ESP32-D0WDQ6-V3 
  • ESP32-D0WD
  • ESP32-D0WDQ6 
  • ESP32-D2WD E
  • SP32-S0WD 
  • ESP32-U4WDH
ESP32 WROOM PINOUT:






For More Updates...Please Follow: 

For ESp32 based Development Board Variants and market price:

Firmware and Types:

ESP32 Supports many firmwares and Programming languages. It does matter for a developpper to choose right firmware before developming any product. Right firmware and supported libraries are the main building blocks for developing  a good product.

Following table represents the Firmware Types Programming Language support with Links..

Programming Language Supports:

  1. Embeddded C,C++
  2. Python
    For More Reference:

IDEs:

1. VS Code


 

2. Arduino IDE


RTOS:



Power Consumption and Modes:

 ESP32 offers 5 configurable power modes. As per the power requirement, the chip can switch between different power modes. The modes are:

  • Active Mode
  • Modem Sleep Mode
  • Light Sleep Mode

  • Deep Sleep Mode
  • Hibernation Mode




Sample Codes, Experiments and Example:

LED Blinking Code:

/*
 * ON Board LED GPIO 2
 */

#define LED 2

void setup() {
  // Set pin mode
  pinMode(LED,OUTPUT);
}

void loop() {
  delay(500);
  digitalWrite(LED,HIGH);
  delay(500);
  digitalWrite(LED,LOW);
}

O/P:



Wifi Station Code:


#include <WiFi.h>
#include <WebServer.h>

/* Put your SSID & Password */
const char* ssid = "ESP32";  // Enter SSID here
const char* password = "12345678";  //Enter Password here

/* Put IP Address details */
IPAddress local_ip(192,168,1,1);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

WebServer server(80);

uint8_t LED1pin = 4;
bool LED1status = LOW;

uint8_t LED2pin = 5;
bool LED2status = LOW;

void setup() {
  Serial.begin(115200);
  pinMode(LED1pin, OUTPUT);
  pinMode(LED2pin, OUTPUT);

  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  delay(100);
  
  server.on("/", handle_OnConnect);
  server.on("/led1on", handle_led1on);
  server.on("/led1off", handle_led1off);
  server.on("/led2on", handle_led2on);
  server.on("/led2off", handle_led2off);
  server.onNotFound(handle_NotFound);
  
  server.begin();
  Serial.println("HTTP server started");
}
void loop() {
  server.handleClient();
  if(LED1status)
  {digitalWrite(LED1pin, HIGH);}
  else
  {digitalWrite(LED1pin, LOW);}
  
  if(LED2status)
  {digitalWrite(LED2pin, HIGH);}
  else
  {digitalWrite(LED2pin, LOW);}
}

void handle_OnConnect() {
  LED1status = LOW;
  LED2status = LOW;
  Serial.println("GPIO4 Status: OFF | GPIO5 Status: OFF");
  server.send(200, "text/html", SendHTML(LED1status,LED2status)); 
}

void handle_led1on() {
  LED1status = HIGH;
  Serial.println("GPIO4 Status: ON");
  server.send(200, "text/html", SendHTML(true,LED2status)); 
}

void handle_led1off() {
  LED1status = LOW;
  Serial.println("GPIO4 Status: OFF");
  server.send(200, "text/html", SendHTML(false,LED2status)); 
}

void handle_led2on() {
  LED2status = HIGH;
  Serial.println("GPIO5 Status: ON");
  server.send(200, "text/html", SendHTML(LED1status,true)); 
}

void handle_led2off() {
  LED2status = LOW;
  Serial.println("GPIO5 Status: OFF");
  server.send(200, "text/html", SendHTML(LED1status,false)); 
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

String SendHTML(uint8_t led1stat,uint8_t led2stat){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>LED Control</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
  ptr +=".button {display: block;width: 80px;background-color: #3498db;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px auto 35px;cursor: pointer;border-radius: 4px;}\n";
  ptr +=".button-on {background-color: #3498db;}\n";
  ptr +=".button-on:active {background-color: #2980b9;}\n";
  ptr +=".button-off {background-color: #34495e;}\n";
  ptr +=".button-off:active {background-color: #2c3e50;}\n";
  ptr +="p {font-size: 14px;color: #888;margin-bottom: 10px;}\n";
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<h1>ESP32 Web Server</h1>\n";
  ptr +="<h3>Using Access Point(AP) Mode</h3>\n";
  
   if(led1stat)
  {ptr +="<p>LED1 Status: ON</p><a class=\"button button-off\" href=\"/led1off\">OFF</a>\n";}
  else
  {ptr +="<p>LED1 Status: OFF</p><a class=\"button button-on\" href=\"/led1on\">ON</a>\n";}

  if(led2stat)
  {ptr +="<p>LED2 Status: ON</p><a class=\"button button-off\" href=\"/led2off\">OFF</a>\n";}
  else
  {ptr +="<p>LED2 Status: OFF</p><a class=\"button button-on\" href=\"/led2on\">ON</a>\n";}

  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

O/P:



WiFi Client Code:


WiFi OLED DIsplay(0.96inch I2C):

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(-1);

void setup()   
{                
	// initialize with the I2C addr 0x3C
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  

	// Clear the buffer.
	display.clearDisplay();

	// Display Text
	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0,28);
	display.println("Hello world!");
	display.display();
	delay(2000);
	display.clearDisplay();

	// Display Inverted Text
	display.setTextColor(BLACK, WHITE); // 'inverted' text
	display.setCursor(0,28);
	display.println("Hello world!");
	display.display();
	delay(2000);
	display.clearDisplay();

	// Changing Font Size
	display.setTextColor(WHITE);
	display.setCursor(0,24);
	display.setTextSize(2);
	display.println("Hello!");
	display.display();
	delay(2000);
	display.clearDisplay();

	// Display Numbers
	display.setTextSize(1);
	display.setCursor(0,28);
	display.println(123456789);
	display.display();
	delay(2000);
	display.clearDisplay();

	// Specifying Base For Numbers
	display.setCursor(0,28);
	display.print("0x"); display.print(0xFF, HEX); 
	display.print("(HEX) = ");
	display.print(0xFF, DEC);
	display.println("(DEC)"); 
	display.display();
	delay(2000);
	display.clearDisplay();

	// Display ASCII Characters
	display.setCursor(0,24);
	display.setTextSize(2);
	display.write(3);
	display.display();
	delay(2000);
	display.clearDisplay();

	// Scroll full screen
	display.setCursor(0,0);
	display.setTextSize(1);
	display.println("Full");
	display.println("screen");
	display.println("scrolling!");
	display.display();
	display.startscrollright(0x00, 0x07);
	delay(2000);
	display.stopscroll();
	delay(1000);
	display.startscrollleft(0x00, 0x07);
	delay(2000);
	display.stopscroll();
	delay(1000);    
	display.startscrolldiagright(0x00, 0x07);
	delay(2000);
	display.startscrolldiagleft(0x00, 0x07);
	delay(2000);
	display.stopscroll();
	display.clearDisplay();

	// Scroll part of the screen
	display.setCursor(0,0);
	display.setTextSize(1);
	display.println("Scroll");
	display.println("some part");
	display.println("of the screen.");
	display.display();
	display.startscrollright(0x00, 0x00);
}

void loop() {}


O/P:

.....Many More



BLE Code:


#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>


#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");

  BLEDevice::init("Long name works now");
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setValue("Hello World says Neil");
  pService->start();
  // BLEAdvertising *pAdvertising = pServer->getAdvertising();  // this still is working for backward compatibility
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);  // functions that help with iPhone connections issue
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
  Serial.println("Characteristic defined! Now you can read it in your phone!");
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(2000);
}

OTA Update Code and Support:

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "..........";
const char* password = "..........";

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  // Port defaults to 3232
  // ArduinoOTA.setPort(3232);

  // Hostname defaults to esp3232-[MAC]
  // ArduinoOTA.setHostname("myesp32");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

  ArduinoOTA
    .onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH)
        type = "sketch";
      else // U_SPIFFS
        type = "filesystem";

      // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
      Serial.println("Start updating " + type);
    })
    .onEnd([]() {
      Serial.println("\nEnd");
    })
    .onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    })
    .onError([](ota_error_t error) {
      Serial.printf("Error[%u]: ", error);
      if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
      else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
      else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
      else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
      else if (error == OTA_END_ERROR) Serial.println("End Failed");
    });

  ArduinoOTA.begin();

  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();
}

For More in Details: htpts://lastminuteengineers.com/esp32-ota-updates-arduino-ide/...


Bibliography:

https://circuits4you.com/2018/02/02/esp32-led-blink-example/

https://lastminuteengineers.com/creating-esp32-web-server-arduino-ide/

https://randomnerdtutorials.com/esp32-bluetooth-low-energy-ble-arduino-ide/

https://www.espressif.com/en/products/modules

https://www.youtube.com/

https://www.google.com/

https://www.instructables.com/

https://stackoverflow.com/

http://esp32.net/

https://en.wikipedia.org/wiki/ESP32

https://aws.amazon.com/

1 comment: