1) ติดตั้งเครื่องมือให้พร้อม
- ติดตั้ง Arduino IDE (เวอร์ชันล่าสุด)
- เปิด IDE ไปที่ File → Preferences แล้วเติมที่ช่อง Additional Boards Manager URLs:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
ถ้าเคยมี URL อื่นอยู่ ให้คั่นด้วยเครื่องหมายจุลภาค
,
- ไปที่ Tools → Board → Boards Manager… ค้นหา esp32 แล้วกด Install
- เสียบบอร์ด ESP32 เข้าคอม
- ไดรเวอร์ USB ที่พบบ่อย: CP210x หรือ CH340 (ถ้าไม่เจอพอร์ต ให้ติดตั้งไดรเวอร์ของชิปรุ่นนั้น)
- เลือกบอร์ดและพอร์ต
- 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) เคล็ดลับ & ปัญหายอดฮิต
- อัปโหลดไม่ผ่าน/พอร์ตไม่ขึ้น
- เช็คสาย USB ที่ “ส่งข้อมูลได้” (ไม่ใช่สายชาร์จอย่างเดียว)
- ติดตั้งไดรเวอร์ CP210x/CH340 ให้ตรงชิปบนบอร์ด
- กดปุ่ม BOOT ค้างไว้ตอนเริ่มอัปโหลด (บางบอร์ดต้องช่วยเข้าโหมดแฟลช)
- เลือกบอร์ด/พอร์ตผิด → Tools ให้ตรงรุ่นและพอร์ต
- ไฟไม่ติด → ขา LED บนบอร์ดต่างกัน: ลอง
2,13, หรือLED_BUILTIN - รีเซ็ต/แฟลชช้า → ปิด Serial Monitor ตอนอัปโหลด, ลดความเร็ว Upload Speed ใน Tools → Upload Speed
- Wi-Fi ต่อไม่ติด → เช็ค SSID/PASS, ระยะสัญญาณ, 2.4GHz เท่านั้น (ESP32 ส่วนใหญ่ไม่รองรับ 5GHz)
10) แบบฝึกหัดสั้น ๆ (ทำตามลำดับ)
- กระพริบ LED ด้วยความเร็วต่างกัน 3 แบบ (ช้า/กลาง/เร็ว)
- กดปุ่มเพื่อสลับสถานะ LED (กดติด-กดดับ) พร้อมพิมพ์สถานะใน Serial
- อ่านค่า ADC จากโพเทนชิฯ แล้ว แปลงเป็นความสว่าง LED ด้วย
ledcWrite - ต่อ Wi-Fi แล้วทำเว็บเพจแสดงค่าจาก ADC (รีเฟรชทุก 1 วินาทีด้วย
<meta http-equiv="refresh" content="1">) - เพิ่มปุ่มบนหน้าเว็บเพื่อสั่งเปิด-ปิด 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 ดิจิทัล | pinMode | pinMode(pin, MODE) | กำหนดโหมดขา: INPUT, INPUT_PULLUP, OUTPUT | pinMode(2, OUTPUT); |
digitalWrite | digitalWrite(pin, val) | เขียนค่า HIGH/LOW | digitalWrite(2, HIGH); | |
digitalRead | digitalRead(pin) | อ่านค่า HIGH/LOW | int s = digitalRead(15); | |
| เวลา | delay | delay(ms) | หน่วงเวลาเป็นมิลลิวินาที | delay(500); |
millis | millis() | เวลาที่ผ่านไปตั้งแต่เริ่ม (ms) | ใช้ทำ non-blocking delay | |
| Serial | Serial.begin | Serial.begin(baud) | เปิดพอร์ตอนุกรม | ESP32 นิยม 115200 |
Serial.print/println | Serial.print(x) | พิมพ์ข้อมูลออก Serial | Debug สะดวกมาก | |
| อนาล็อก (อ่าน) | analogRead | analogRead(pin) | อ่านค่า ADC (0..4095 บน ESP32) | ใช้ขา 32–39 จะอ่านได้ดี |
| คณิต/ยูทิล | map | map(x,inMin,inMax,outMin,outMax) | สเกลค่า x ไปช่วงใหม่ | สเกล ADC → PWM |
constrain | constrain(x, a, b) | ล็อกค่าให้อยู่ในช่วง [a,b] | ป้องกันค่าหลุดช่วง | |
min/max/abs | min(a,b) ฯลฯ | ค่าต่ำสุด/สูงสุด/ค่าสัมบูรณ์ | — | |
| เงื่อนไข/วนลูป | if/else, for, while | มาตรฐาน C/C++ | ควบคุมการไหลของโปรแกรม | — |
| อินเทอร์รัพท์ | attachInterrupt | attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) | เรียก ISR เมื่อขาเปลี่ยนสถานะ | mode: RISING/FALLING/CHANGE |
| สุ่ม | random, randomSeed | random(min,max) | สุ่มตัวเลข | seed จาก analogRead |
ตารางสรุปคำสั่ง PWM/LED บน ESP32 (ledc*)
ESP32 ไม่มี
analogWrite()แบบ Arduino UNO ให้ใช้ตระกูลledc*แทน
| คำสั่ง | ไวยากรณ์ | ความหมาย | ตัวอย่าง |
|---|---|---|---|
ledcSetup | ledcSetup(channel, freq, resolution_bits) | ตั้งค่าช่องสัญญาณ PWM | ledcSetup(0, 5000, 8); |
ledcAttachPin | ledcAttachPin(pin, channel) | ผูกขา GPIO เข้ากับช่อง PWM | ledcAttachPin(2, 0); |
ledcWrite | ledcWrite(channel, duty) | เขียน duty cycle (0..2^res-1) | ledcWrite(0, 128); // 8บิต |
ตาราง Wi-Fi (ESP32)
| คำสั่ง/คลาส | ไวยากรณ์ | ความหมาย/ผลลัพธ์ | ตัวอย่าง |
|---|---|---|---|
WiFi.mode | WiFi.mode(WIFI_STA/AP/WIFI_AP_STA) | เลือกโหมด (ต่อเราเตอร์/ปล่อย AP/ทั้งคู่) | WiFi.mode(WIFI_STA); |
WiFi.begin | WiFi.begin(ssid, pass) | เริ่มเชื่อมต่อ Wi-Fi | WiFi.begin("MyWiFi","12345678"); |
| สถานะ | WiFi.status() | เช็คสถานะ WL_CONNECTED ฯลฯ | วนรอจนต่อได้ |
| IP | WiFi.localIP() | คืนค่า IP ที่ได้รับ | พิมพ์ดูใน Serial |
| เว็บเซิร์ฟเวอร์ | WebServer | HTTP server ง่าย ๆ | เสิร์ฟหน้า HTML เบื้องต้น |
ตาราง I2C/SPI ยอดนิยม
| โปรโตคอล | ไลบรารี | คำสั่งหลัก | หมายเหตุ |
|---|---|---|---|
| I2C | Wire.h | Wire.begin(), beginTransmission(addr), write(), endTransmission(), requestFrom(addr,n) | ESP32 ค่าเริ่มต้น SDA=21, SCL=22 (ส่วนใหญ่) |
| SPI | SPI.h | SPI.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 (อินเทอร์รัพท์)
| คำสั่ง/แนวคิด | ไวยากรณ์ | หมายเหตุ |
|---|---|---|
| ผูก ISR | attachInterrupt(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 |
| ผูก ISR | timerAttachInterrupt(t, ISR, edge); | — |
| ตั้ง period | timerAlarmWrite(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)
| เรื่อง | รายละเอียด |
|---|---|
| ADC | analogRead(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-Fi | WiFi.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)
| ไลบรารี | หมายเหตุ |
|---|---|
PubSubClient | MQTT ยอดนิยม (ต้องมี 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)
| ไลบรารี | ฟังก์ชันหลัก |
|---|---|
ArduinoOTA | ArduinoOTA.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.h | MDNS.begin("esp32"); แล้วเข้า http://esp32.local/ |
#include <ESPmDNS.h>
void setup(){
// ต่อ Wi-Fi...
MDNS.begin("esp32");
}
void loop(){}
