1) ติดตั้งเครื่องมือให้พร้อม

  1. ติดตั้ง Arduino IDE (เวอร์ชันล่าสุด)
  2. เปิด IDE ไปที่ File → Preferences แล้วเติมที่ช่อง Additional Boards Manager URLs:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

ถ้าเคยมี URL อื่นอยู่ ให้คั่นด้วยเครื่องหมายจุลภาค ,

  1. ไปที่ Tools → Board → Boards Manager… ค้นหา esp32 แล้วกด Install
  2. เสียบบอร์ด ESP32 เข้าคอม
    • ไดรเวอร์ USB ที่พบบ่อย: CP210x หรือ CH340 (ถ้าไม่เจอพอร์ต ให้ติดตั้งไดรเวอร์ของชิปรุ่นนั้น)
  3. เลือกบอร์ดและพอร์ต
    • Tools → Board → ESP32 Arduino → ESP32 Dev Module (หรือรุ่นที่ตรงกับบอร์ดคุณ)
    • Tools → Port เลือกพอร์ตที่เพิ่มขึ้นมาเมื่อเสียบบอร์ด

ESP32 ใช้แรงดัน 3.3V ห้ามต่อสัญญาณ 5V เข้าขา I/O โดยตรง


2) โปรแกรมแรก: กระพริบ LED (Blink)

บอร์ดบางรุ่นมีไฟ LED ในตัว อยู่ที่ LED_BUILTIN หรือ GPIO2/LEDบนบอร์ด (ต่างกันได้)
ลองโค้ดนี้ก่อน—ถ้าไฟไม่ติด ให้ลองเปลี่ยน LED_PIN เป็น 2 หรือ 13

// ESP32 Blink 101
#define LED_PIN LED_BUILTIN  // ถ้าไม่ติด ลองเปลี่ยนเป็น 2 หรือ 13

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

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

อัปโหลด: กดปุ่มลูกศร “Upload” → รอขึ้น “Done uploading”
ดูผล: มองที่ไฟ LED บนบอร์ด


3) Serial Monitor & พิมพ์ข้อความ

void setup() {
  Serial.begin(115200);          // ความเร็วยอดนิยมสำหรับ ESP32
  delay(1000);                   // รอเสถียรเล็กน้อย
  Serial.println("Hello ESP32!");
}

void loop() {
  Serial.println(millis());      // พิมพ์เวลาที่ผ่านไป (ms)
  delay(1000);
}

เปิด Tools → Serial Monitor (เลือกบอดเรต 115200)


4) อ่านปุ่มกด (ใช้ Pull-up ในตัว) + Debounce ง่าย ๆ

ต่อปุ่มกดระหว่าง GPIO 15 → GND (ตัวอย่างนี้ใช้ 15 แต่คุณเปลี่ยนขาได้)
เราใช้ INPUT_PULLUP → ปล่อยปุ่ม = HIGH, กดปุ่ม = LOW

const int BUTTON_PIN = 15;
unsigned long lastChange = 0;
int lastState = HIGH;

void setup() {
  Serial.begin(115200);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop() {
  int reading = digitalRead(BUTTON_PIN);
  unsigned long now = millis();

  // debounce ~50ms
  if (reading != lastState && (now - lastChange) > 50) {
    lastChange = now;
    lastState = reading;
    if (reading == LOW) Serial.println("Button PRESSED");
    else Serial.println("Button RELEASED");
  }
}

5) อ่าน Analog (ตัวแปลง ADC)

ขา ADC ที่อ่านค่าได้ดี: GPIO 32–39 (เช่น 34, 35 เป็นต้น—บางขาเป็น input-only)
ต่อโพเทนชิโอมิเตอร์/แรงดัน 0–3.3V แล้วอ่านได้เลย

const int ADC_PIN = 34;  // input only
void setup() {
  Serial.begin(115200);
}
void loop() {
  int value = analogRead(ADC_PIN);  // ค่าประมาณ 0..4095
  Serial.println(value);
  delay(200);
}

6) PWM (หรี่ความสว่าง LED) ด้วย ledc*

ESP32 ใช้ ledc แทน analogWrite แบบเดิม

const int LED_PIN = 2;     // เลือกขา PWM ได้หลายขา
const int CH = 0;          // ช่องสัญญาณ 0..15
const int FREQ = 5000;     // Hz
const int RES = 8;         // บิต (0..255)

void setup() {
  ledcSetup(CH, FREQ, RES);
  ledcAttachPin(LED_PIN, CH);
}

void loop() {
  // ไต่จากมืด → สว่าง
  for (int d=0; d<=255; d++) { ledcWrite(CH, d); delay(5); }
  // ไต่จากสว่าง → มืด
  for (int d=255; d>=0; d--) { ledcWrite(CH, d); delay(5); }
}

7) ต่อ Wi-Fi (STA mode) + พิมพ์ IP

ใส่ชื่อ Wi-Fi/รหัสผ่านของคุณก่อนอัปโหลด

#include <WiFi.h>

const char* SSID = "YOUR_WIFI_SSID";
const char* PASS = "YOUR_WIFI_PASSWORD";

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASS);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected! IP: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  // ทำงานอื่น ๆ ได้
}

8) เว็บเซิร์ฟเวอร์แบบง่าย (Hello from ESP32)

เข้าเว็บเบราว์เซอร์ไปที่ IP ที่ Serial พิมพ์ออกมา

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

const char* SSID = "YOUR_WIFI_SSID";
const char* PASS = "YOUR_WIFI_PASSWORD";

WebServer server(80);

void handleRoot() {
  server.send(200, "text/html", "<h1>Hello from ESP32</h1>");
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASS);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
  Serial.println();
  Serial.print("IP: "); Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}

9) เคล็ดลับ & ปัญหายอดฮิต

  • อัปโหลดไม่ผ่าน/พอร์ตไม่ขึ้น
    1. เช็คสาย USB ที่ “ส่งข้อมูลได้” (ไม่ใช่สายชาร์จอย่างเดียว)
    2. ติดตั้งไดรเวอร์ CP210x/CH340 ให้ตรงชิปบนบอร์ด
    3. กดปุ่ม BOOT ค้างไว้ตอนเริ่มอัปโหลด (บางบอร์ดต้องช่วยเข้าโหมดแฟลช)
  • เลือกบอร์ด/พอร์ตผิด → Tools ให้ตรงรุ่นและพอร์ต
  • ไฟไม่ติด → ขา LED บนบอร์ดต่างกัน: ลอง 2, 13, หรือ LED_BUILTIN
  • รีเซ็ต/แฟลชช้า → ปิด Serial Monitor ตอนอัปโหลด, ลดความเร็ว Upload Speed ใน Tools → Upload Speed
  • Wi-Fi ต่อไม่ติด → เช็ค SSID/PASS, ระยะสัญญาณ, 2.4GHz เท่านั้น (ESP32 ส่วนใหญ่ไม่รองรับ 5GHz)

10) แบบฝึกหัดสั้น ๆ (ทำตามลำดับ)

  1. กระพริบ LED ด้วยความเร็วต่างกัน 3 แบบ (ช้า/กลาง/เร็ว)
  2. กดปุ่มเพื่อสลับสถานะ LED (กดติด-กดดับ) พร้อมพิมพ์สถานะใน Serial
  3. อ่านค่า ADC จากโพเทนชิฯ แล้ว แปลงเป็นความสว่าง LED ด้วย ledcWrite
  4. ต่อ Wi-Fi แล้วทำเว็บเพจแสดงค่าจาก ADC (รีเฟรชทุก 1 วินาทีด้วย <meta http-equiv="refresh" content="1">)
  5. เพิ่มปุ่มบนหน้าเว็บเพื่อสั่งเปิด-ปิด LED จากเบราว์เซอร์ (ทำ route /on และ /off)

11) โฟลเดอร์โปรเจกต์ & ชื่อไฟล์

  • ใน Arduino IDE ให้ ตั้งชื่อสเก็ตช์ เป็นตัวอักษร/ตัวเลขอังกฤษ ไม่มีช่องว่าง (เช่น esp32_blink)
  • หากเริ่มมีหลายไฟล์ แยก .h/.cpp ได้ แต่สำหรับ 101 ใช้ไฟล์เดียว .ino ไปก่อน

ตารางสรุปคำสั่งพื้นฐาน (Core)

หมวดคำสั่ง/ฟังก์ชันไวยากรณ์ความหมายตัวอย่างใช้งาน/หมายเหตุ
โครงสร้างsetup()void setup(){…}รันครั้งเดียวตอนเริ่มต้นตั้งค่า pinMode, Serial.begin
loop()void loop(){…}รันวนซ้ำตลอดเวลาใส่ลอจิกหลักของโปรแกรม
I/O ดิจิทัลpinModepinMode(pin, MODE)กำหนดโหมดขา: INPUT, INPUT_PULLUP, OUTPUTpinMode(2, OUTPUT);
digitalWritedigitalWrite(pin, val)เขียนค่า HIGH/LOWdigitalWrite(2, HIGH);
digitalReaddigitalRead(pin)อ่านค่า HIGH/LOWint s = digitalRead(15);
เวลาdelaydelay(ms)หน่วงเวลาเป็นมิลลิวินาทีdelay(500);
millismillis()เวลาที่ผ่านไปตั้งแต่เริ่ม (ms)ใช้ทำ non-blocking delay
SerialSerial.beginSerial.begin(baud)เปิดพอร์ตอนุกรมESP32 นิยม 115200
Serial.print/printlnSerial.print(x)พิมพ์ข้อมูลออก SerialDebug สะดวกมาก
อนาล็อก (อ่าน)analogReadanalogRead(pin)อ่านค่า ADC (0..4095 บน ESP32)ใช้ขา 32–39 จะอ่านได้ดี
คณิต/ยูทิลmapmap(x,inMin,inMax,outMin,outMax)สเกลค่า x ไปช่วงใหม่สเกล ADC → PWM
constrainconstrain(x, a, b)ล็อกค่าให้อยู่ในช่วง [a,b]ป้องกันค่าหลุดช่วง
min/max/absmin(a,b) ฯลฯค่าต่ำสุด/สูงสุด/ค่าสัมบูรณ์
เงื่อนไข/วนลูปif/else, for, whileมาตรฐาน C/C++ควบคุมการไหลของโปรแกรม
อินเทอร์รัพท์attachInterruptattachInterrupt(digitalPinToInterrupt(pin), ISR, mode)เรียก ISR เมื่อขาเปลี่ยนสถานะmode: RISING/FALLING/CHANGE
สุ่มrandom, randomSeedrandom(min,max)สุ่มตัวเลขseed จาก analogRead

ตารางสรุปคำสั่ง PWM/LED บน ESP32 (ledc*)

ESP32 ไม่มี analogWrite() แบบ Arduino UNO ให้ใช้ตระกูล ledc* แทน

คำสั่งไวยากรณ์ความหมายตัวอย่าง
ledcSetupledcSetup(channel, freq, resolution_bits)ตั้งค่าช่องสัญญาณ PWMledcSetup(0, 5000, 8);
ledcAttachPinledcAttachPin(pin, channel)ผูกขา GPIO เข้ากับช่อง PWMledcAttachPin(2, 0);
ledcWriteledcWrite(channel, duty)เขียน duty cycle (0..2^res-1)ledcWrite(0, 128); // 8บิต

ตาราง Wi-Fi (ESP32)

คำสั่ง/คลาสไวยากรณ์ความหมาย/ผลลัพธ์ตัวอย่าง
WiFi.modeWiFi.mode(WIFI_STA/AP/WIFI_AP_STA)เลือกโหมด (ต่อเราเตอร์/ปล่อย AP/ทั้งคู่)WiFi.mode(WIFI_STA);
WiFi.beginWiFi.begin(ssid, pass)เริ่มเชื่อมต่อ Wi-FiWiFi.begin("MyWiFi","12345678");
สถานะWiFi.status()เช็คสถานะ WL_CONNECTED ฯลฯวนรอจนต่อได้
IPWiFi.localIP()คืนค่า IP ที่ได้รับพิมพ์ดูใน Serial
เว็บเซิร์ฟเวอร์WebServerHTTP server ง่าย ๆเสิร์ฟหน้า HTML เบื้องต้น

ตาราง I2C/SPI ยอดนิยม

โปรโตคอลไลบรารีคำสั่งหลักหมายเหตุ
I2CWire.hWire.begin(), beginTransmission(addr), write(), endTransmission(), requestFrom(addr,n)ESP32 ค่าเริ่มต้น SDA=21, SCL=22 (ส่วนใหญ่)
SPISPI.hSPI.begin(), SPI.beginTransaction(), transfer(), endTransaction()ใช้อุปกรณ์จอ เซ็นเซอร์บางตัว

โค้ดตัวอย่างสั้น ๆ (พร้อมคอมเมนต์)

1) Blink + Serial (พื้นฐานสุด)

#define LED_PIN 2 // ถ้าไม่ติด ลอง LED_BUILTIN หรือ 13

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(115200);
  Serial.println("Start!");
}

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

2) อ่านปุ่ม (ใช้ Pull-up ในตัว) + debounce ง่าย ๆ

const int BUTTON_PIN = 15;
int last = HIGH;
unsigned long tLast = 0;

void setup(){
  Serial.begin(115200);
  pinMode(BUTTON_PIN, INPUT_PULLUP); // ปล่อย=HIGH, กด=LOW
}

void loop(){
  int r = digitalRead(BUTTON_PIN);
  unsigned long now = millis();
  if (r != last && (now - tLast) > 50) {
    tLast = now;
    last = r;
    Serial.println(r == LOW ? "PRESSED" : "RELEASED");
  }
}

3) ADC → PWM (อ่านโพเทนชิฯ แล้วหรี่ไฟด้วย ledc)

const int ADC_PIN = 34;          // input-only
const int LED_PIN = 2;
const int CH = 0;

void setup(){
  Serial.begin(115200);
  ledcSetup(CH, 5000, 8);        // 8 บิต: 0..255
  ledcAttachPin(LED_PIN, CH);
}

void loop(){
  int adc = analogRead(ADC_PIN); // 0..4095
  int duty = map(adc, 0, 4095, 0, 255);
  ledcWrite(CH, duty);
  delay(10);
}

4) Wi-Fi + พิมพ์ IP

#include <WiFi.h>
const char* SSID = "YOUR_WIFI";
const char* PASS = "YOUR_PASS";

void setup(){
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASS);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED){
    delay(500); Serial.print(".");
  }
  Serial.println();
  Serial.print("IP: "); Serial.println(WiFi.localIP());
}

void loop(){}

5) เว็บเซิร์ฟเวอร์ Hello + ปุ่มควบคุม LED

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

const char* SSID = "YOUR_WIFI";
const char* PASS = "YOUR_PASS";
const int LED_PIN = 2;
WebServer server(80);

void handleRoot(){
  String html =
    "<h1>ESP32 LED</h1>"
    "<p><a href='/on'>ON</a> | <a href='/off'>OFF</a></p>";
  server.send(200, "text/html", html);
}
void handleOn(){ digitalWrite(LED_PIN, HIGH); server.sendHeader("Location","/"); server.send(303); }
void handleOff(){ digitalWrite(LED_PIN, LOW); server.sendHeader("Location","/"); server.send(303); }

void setup(){
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASS);
  while (WiFi.status()!=WL_CONNECTED){ delay(500); Serial.print("."); }
  Serial.println("\nIP: " + WiFi.localIP().toString());

  server.on("/", handleRoot);
  server.on("/on", handleOn);
  server.on("/off", handleOff);
  server.begin();
}
void loop(){ server.handleClient(); }

ทริค/ข้อควรระวัง (สั้น ๆ)

  • ESP32 ใช้ไฟ 3.3V กับ I/O และ ADC; หลีกเลี่ยงสัญญาณ 5V เข้าขา
  • ขา ADC ที่นิยมน่าใช้: 32–39 (บางขา input-only)
  • ถ้าอัปโหลดไม่เข้า: เช็คไดรเวอร์ USB (CP210x/CH340), สายข้อมูล, เลือกพอร์ตให้ถูก, กด BOOT ค้างตอนเริ่มแฟลชในบางบอร์ด
  • ใช้ millis() ทำดีเลย์แบบไม่บล็อก เวลาต้องทำงานหลายอย่างพร้อมกัน

A) Interrupts (อินเทอร์รัพท์)

คำสั่ง/แนวคิดไวยากรณ์หมายเหตุ
ผูก ISRattachInterrupt(digitalPinToInterrupt(pin), ISR, mode)mode: RISING, FALLING, CHANGE
ยกเลิกdetachInterrupt(digitalPinToInterrupt(pin))

ตัวอย่าง: ปุ่มปลุก ISR

const int BTN = 15;
volatile bool flag = false;
void IRAM_ATTR onPress(){ flag = true; }

void setup(){
  Serial.begin(115200);
  pinMode(BTN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(BTN), onPress, FALLING);
}
void loop(){
  if(flag){ flag = false; Serial.println("Pressed!"); }
}

B) Timers (ฮาร์ดแวร์ไทเมอร์ ESP32)

ฟังก์ชันไวยากรณ์อธิบาย
สร้างhw_timer_t* t = timerBegin(num, prescale, countUp);num 0–3
ผูก ISRtimerAttachInterrupt(t, ISR, edge);
ตั้ง periodtimerAlarmWrite(t, ticks, autoReload);ticks = us เมื่อ prescale=80
เริ่ม/หยุดtimerAlarmEnable/Disable(t)

ตัวอย่าง: ไฟกระพริบด้วย Timer (ไม่ใช้ delay)

const int LED=2;
hw_timer_t* T=nullptr;
volatile bool on=false;
void IRAM_ATTR isr(){ on=!on; digitalWrite(LED,on); }

void setup(){
  pinMode(LED,OUTPUT);
  T=timerBegin(0,80,true);              // 1 tick = 1us (80MHz/80)
  timerAttachInterrupt(T,isr,true);
  timerAlarmWrite(T,500000,true);       // 500,000us = 0.5s
  timerAlarmEnable(T);
}
void loop(){}

C) Analog/DAC (ESP32)

เรื่องรายละเอียด
ADCanalogRead(pin) ช่วง 0..4095 (ปรับได้ด้วย analogSetWidth/atten)
DACขา GPIO25, GPIO26 เขียนได้ด้วย dacWrite(pin, 0..255)

ตัวอย่าง: DAC

void setup(){}
void loop(){
  for(int v=0; v<256; v++){ dacWrite(25, v); delay(5); }
}

D) I²C (Wire) + ตัวอย่างจอ SSD1306

คำสั่งหลักไวยากรณ์
เริ่มบัสWire.begin(SDA,SCL); (ส่วนมาก 21,22)
ส่งข้อมูลbeginTransmission(addr)→write(...)→endTransmission()
รับข้อมูลrequestFrom(addr, n)

SSD1306 (ต้องติดตั้งไลบรารี Adafruit):

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 oled(128,64,&Wire,-1);
void setup(){
  Wire.begin(21,22);
  oled.begin(SSD1306_SWITCHCAPVCC,0x3C);
  oled.clearDisplay();
  oled.setTextSize(2); oled.setTextColor(WHITE);
  oled.setCursor(0,0); oled.print("ESP32");
  oled.display();
}
void loop(){}

E) SPI พื้นฐาน

คำสั่งหมายเหตุ
SPI.begin(SCK, MISO, MOSI, SS)ตั้งขามาตรฐานหรือระบุเอง
SPI.beginTransaction(SPISettings(freq, MSBFIRST, SPI_MODE0))เริ่มทรานแซกชัน
SPI.transfer(byte)ส่ง/รับ 1 ไบต์

F) Serial1/Serial2 (UART เพิ่ม)

พอร์ตใช้งานตัวอย่าง
Serial1ระบุขาเองSerial1.begin(115200, SERIAL_8N1, RXpin, TXpin);
Serial2ระบุขาเองเหมือนกัน

ตัวอย่าง: สะพาน Serial

void setup(){
  Serial.begin(115200);
  Serial1.begin(9600, SERIAL_8N1, 16, 17); // RX=16, TX=17
}
void loop(){
  if(Serial.available()) Serial1.write(Serial.read());
  if(Serial1.available()) Serial.write(Serial1.read());
}

G) Filesystem (LittleFS/SPIFFS)

คำสั่งไวยากรณ์
เริ่มLittleFS.begin()
เปิดไฟล์File f = LittleFS.open("/data.txt","r/w/a");
อ่าน/เขียนf.readString(), f.print(), f.close()

ตัวอย่าง: บันทึกค่า

#include <LittleFS.h>
void setup(){
  Serial.begin(115200);
  LittleFS.begin();
  File f = LittleFS.open("/log.txt","a");
  f.println("booted"); f.close();
}
void loop(){}

H) Wi-Fi + HTTP Client

คำสั่งไวยากรณ์
ต่อ Wi-FiWiFi.mode(WIFI_STA); WiFi.begin(ssid,pass);
HTTP GETใช้ HTTPClient

ตัวอย่าง: GET JSON

#include <WiFi.h>
#include <HTTPClient.h>
const char* SSID="SSID"; const char* PASS="PASS";
void setup(){
  Serial.begin(115200);
  WiFi.begin(SSID,PASS); while(WiFi.status()!=WL_CONNECTED){delay(300);}
  HTTPClient http; http.begin("https://httpbin.org/get");
  int code=http.GET(); if(code==200){ Serial.println(http.getString()); }
  http.end();
}
void loop(){}

I) WebServer หลายเส้นทาง (Route)

ฟังก์ชันใช้ทำอะไร
server.on(path, handler)กำหนดเส้นทาง
server.send(code, type, body)ส่งตอบ

ตัวอย่าง: JSON API

#include <WiFi.h>
#include <WebServer.h>
WebServer server(80);
void api(){
  server.send(200,"application/json","{\"ok\":true}");
}
void setup(){
  // ต่อ Wi-Fi แล้ว...
  server.on("/api/status", api);
  server.begin();
}
void loop(){ server.handleClient(); }

J) MQTT (Pub/Sub)

ไลบรารีหมายเหตุ
PubSubClientMQTT ยอดนิยม (ต้องมี broker เช่น Mosquitto)

ตัวอย่างสั้น:

#include <WiFi.h>
#include <PubSubClient.h>
WiFiClient esp; PubSubClient mqtt(esp);
void cb(char* topic, byte* payload, unsigned int len){ /*handle*/ }
void setup(){
  // Wi-Fi ...
  mqtt.setServer("broker.hivemq.com",1883);
  mqtt.setCallback(cb);
  while(!mqtt.connected()){ mqtt.connect("esp32-demo"); }
  mqtt.subscribe("lic/test");
  mqtt.publish("lic/test","hello");
}
void loop(){ mqtt.loop(); }

K) OTA (อัปเดตผ่าน Wi-Fi)

ไลบรารีฟังก์ชันหลัก
ArduinoOTAArduinoOTA.begin(), handle()

สเก็ตช์ย่อ:

#include <WiFi.h>
#include <ArduinoOTA.h>
void setup(){
  // ต่อ Wi-Fi...
  ArduinoOTA.begin();
}
void loop(){ ArduinoOTA.handle(); }

L) Deep Sleep & Wake

ฟังก์ชันอธิบาย
เวลาปลุกesp_sleep_enable_timer_wakeup(us);
ปุ่มปลุกesp_sleep_enable_ext0_wakeup(GPIO_NUM_15, 0);
เข้าหลับesp_deep_sleep_start();

ตัวอย่าง: หลับ 5 วินาที

void setup(){
  esp_sleep_enable_timer_wakeup(5ULL*1000000ULL);
  esp_deep_sleep_start();
}
void loop(){}

M) FreeRTOS Tasks (รันคู่ขนาน) + Multi-core

คำสั่งไวยากรณ์
สร้างงานxTaskCreatePinnedToCore(fn,"name",stack,NULL,prio,&handle, core);
หน่วงงานvTaskDelay(pdMS_TO_TICKS(ms));

ตัวอย่าง: งานสองตัวคนละคอร์

void t1(void*){
  for(;;){ Serial.println("Task1"); vTaskDelay(pdMS_TO_TICKS(500)); }
}
void t2(void*){
  for(;;){ Serial.println("Task2"); vTaskDelay(pdMS_TO_TICKS(700)); }
}
void setup(){
  Serial.begin(115200);
  xTaskCreatePinnedToCore(t1,"t1",4096,NULL,1,NULL,0);
  xTaskCreatePinnedToCore(t2,"t2",4096,NULL,1,NULL,1);
}
void loop(){}

N) Preferences/EEPROM (บันทึกค่าถาวร)

วิธีหมายเหตุ
Preferencesเก็บคู่คีย์-ค่าใน NVS
EEPROMมีอีมูเลชัน แต่ Preferences สะดวกกว่า

Preferences ตัวอย่าง:

#include <Preferences.h>
Preferences pref;
void setup(){
  Serial.begin(115200);
  pref.begin("app", false);     // เนมสเปซ
  int counter = pref.getInt("cnt", 0);
  pref.putInt("cnt", counter+1);
  Serial.printf("Boot #%d\n", counter+1);
  pref.end();
}
void loop(){}

O) Touch Sensor ในตัว (Capacitive Touch)

ฟังก์ชันตัวอย่าง
touchRead(pin)ขายอดนิยม T0=4, T2=2, T3=15, T4=13, T5=12, T6=14, T7=27, T8=33, T9=32
void setup(){ Serial.begin(115200); }
void loop(){
  Serial.println(touchRead(T0)); // ขา 4
  delay(200);
}

P) mDNS (ชื่อ .local)

ไลบรารีคำสั่ง
ESPmDNS.hMDNS.begin("esp32"); แล้วเข้า http://esp32.local/
#include <ESPmDNS.h>
void setup(){
  // ต่อ Wi-Fi...
  MDNS.begin("esp32");
}
void loop(){}