Official Approved Reseller of Raspberry Pi

ESP32 Sleep Modes และการใช้งาน Deep Sleep Mode — คู่มือสมบูรณ์

ESP32 Sleep Modes และการใช้งาน Deep Sleep Mode — คู่มือสมบูรณ์ 💤⚡
ESP32 Deep Sleep Power Consumption Analysis

ESP32 Sleep Modes และการใช้งาน Deep Sleep Mode — คู่มือสมบูรณ์ 💤⚡

เรียนรู้ ESP32 Sleep Modes ทั้งหมด รวมถึง Active Mode, Light Sleep และ Deep Sleep Mode พร้อมโค้ดตัวอย่าง การทดสอบการใช้พลังงาน และเทคนิคการประหยัดแบตเตอรี่สำหรับโปรเจกต์ IoT

4 Sleep Modes
99% Power Saving
10µA Deep Sleep Current
IoT Battery Projects
🔧

Understanding ESP32 Hardware

ESP32 เป็น Microcontroller ที่มีความสามารถในการจัดการพลังงานอย่างมีประสิทธิภาพ ด้วย Sleep Modes หลากหลายรูปแบบที่ช่วยประหยัดแบตเตอรี่สำหรับโปรเจกต์ IoT

ESP32 Hardware Architecture and Components
ESP32 Hardware Architecture แสดงส่วนประกอบหลักและการจัดการพลังงาน

🧠 Dual-Core Processor

Xtensa LX6 32-bit dual-core processor ทำงานที่ความเร็วสูงสุด 240MHz พร้อมความสามารถในการจัดการงานหลายอย่างพร้อมกัน

  • CPU0: Application Core
  • CPU1: Protocol Core (WiFi/Bluetooth)
  • FPU (Floating Point Unit)
  • DSP Instructions

📡 Wireless Connectivity

WiFi 802.11 b/g/n และ Bluetooth 4.2/BLE ในชิปเดียว พร้อมการจัดการพลังงานอัตโนมัติ

  • WiFi: 2.4GHz, WPA/WPA2
  • Bluetooth: Classic + BLE
  • Antenna: PCB/External
  • Range: 100m+ (open area)

💾 Memory Architecture

520KB SRAM และ 448KB ROM พร้อม External Flash สำหรับเก็บโปรแกรมและข้อมูล

  • SRAM: 520KB (Data/Instruction)
  • ROM: 448KB (Boot/Library)
  • Flash: 4MB-16MB (External)
  • RTC Memory: 8KB (Deep Sleep)

⚡ Power Management

Advanced Power Management Unit (PMU) ที่ควบคุม Sleep Modes และการใช้พลังงานของแต่ละส่วน

  • Multiple Power Domains
  • Dynamic Voltage Scaling
  • Clock Gating
  • RTC Timer (Ultra Low Power)

⚡ ESP32 Power Consumption Overview

🔥 Active Mode

160-260mA

WiFi + CPU ทำงานเต็มที่

💡 Light Sleep

0.8mA

CPU หยุด, RTC ทำงาน

❄️ Deep Sleep

10µA

เฉพาะ RTC Timer

🧊 Hibernation

2.5µA

ปิดเกือบทั้งหมด

📊 การประหยัดพลังงาน

Deep Sleep ประหยัดพลังงานได้มากกว่า 99.99% เมื่อเทียบกับ Active Mode!

💡 ข้อดีของ ESP32 Power Management

  • Flexible Power Modes: เลือก Sleep Mode ได้ตามความต้องการ
  • Fast Wake-up: ตื่นจาก Light Sleep ได้เร็วมาก (3ms)
  • RTC Memory: เก็บข้อมูลได้แม้ใน Deep Sleep
  • Multiple Wake Sources: ตื่นได้จากหลายสาเหตุ
  • Automatic Power Scaling: ปรับพลังงานตามการใช้งาน

✅ การใช้งานจริงในโปรเจกต์ IoT

  • Sensor Monitoring: อ่านค่าเซ็นเซอร์ทุก 10 นาที แล้ว Deep Sleep
  • Weather Station: ส่งข้อมูลทุกชั่วโมง ประหยัดแบตเตอรี่
  • Smart Door Bell: ตื่นเมื่อมีคนกดกริ่ง
  • Plant Monitor: ตรวจสอบความชื้นดินและรดน้ำอัตโนมัติ
  • Security System: ตื่นเมื่อเซ็นเซอร์ตรวจจับการเคลื่อนไหว
💤

ESP32 Sleep Modes

ESP32 มี Sleep Modes หลักๆ 4 แบบ แต่ละแบบมีการใช้พลังงานและความสามารถที่แตกต่างกัน

1

Active Mode

Active Mode คือโหมดการทำงานปกติของ ESP32 ที่ CPU และ peripherals ทั้งหมดทำงานเต็มที่

🔥 คุณสมบัติ Active Mode

  • CPU Cores: ทั้ง 2 cores ทำงานที่ 80-240MHz
  • WiFi/Bluetooth: ทำงานเต็มประสิทธิภาพ
  • Peripherals: GPIO, ADC, DAC, I2C, SPI ทำงานทั้งหมด
  • Memory: เข้าถึง SRAM และ Flash ได้เต็มที่
การทำงาน การใช้พลังงาน หมายเหตุ
CPU Only (240MHz) 30-50mA ไม่มี WiFi/Bluetooth
WiFi Connected 160-260mA ขึ้นกับการส่งข้อมูล
WiFi + Bluetooth 200-300mA ใช้พลังงานสูงสุด

⚠️ ข้อควรระวัง Active Mode

  • แบตเตอรี่หมดเร็ว: ใช้พลังงานสูงมาก
  • ความร้อน: ชิปร้อนขึ้นเมื่อทำงานหนัก
  • ไม่เหมาะสำหรับ Battery Projects: แบตเตอรี่จะหมดใน 1-2 วัน
2

Light Sleep Mode

Light Sleep Mode หยุดการทำงานของ CPU แต่ยังคง RTC และ peripherals บางส่วนไว้

💡 คุณสมบัติ Light Sleep Mode

  • CPU: หยุดทำงาน (Clock Gated)
  • RTC: ยังทำงานอยู่
  • WiFi/Bluetooth: สามารถคงการเชื่อมต่อได้
  • RAM: ข้อมูลยังคงอยู่ทั้งหมด
  • Wake-up Time: 3ms (เร็วมาก)
💻 Light Sleep Mode Code
// Light Sleep Mode Example
#include "esp_sleep.h"

void setup() {
  Serial.begin(115200);
  
  // กำหนด wake-up source
  esp_sleep_enable_timer_wakeup(10 * 1000000); // 10 วินาที (microseconds)
  
  Serial.println("Going to Light Sleep...");
  Serial.flush();
  
  // เข้า Light Sleep Mode
  esp_light_sleep_start();
  
  // ตื่นขึ้นมาแล้ว
  Serial.println("Woke up from Light Sleep!");
}

void loop() {
  // โค้ดหลังตื่นขึ้น
  Serial.println("Running normal code...");
  delay(5000);
  
  // เข้า Light Sleep อีกครั้ง
  Serial.println("Going back to Light Sleep...");
  esp_light_sleep_start();
  Serial.println("Woke up again!");
}

✅ ข้อดี Light Sleep Mode

  • ประหยัดพลังงาน: ลดการใช้พลังงานลง 99%
  • ตื่นเร็ว: กลับมาทำงานได้ทันที (3ms)
  • คงข้อมูล: ข้อมูลใน RAM ไม่หาย
  • คง WiFi: สามารถคงการเชื่อมต่อ WiFi ได้

💡 การใช้งาน Light Sleep

  • Sensor Reading: หยุดรอระหว่างการอ่านค่า
  • WiFi Projects: ประหยัดพลังงานแต่คง Connection
  • Real-time Applications: ต้องการ Response เร็ว
  • Periodic Tasks: งานที่ทำเป็นช่วงๆ
3

Deep Sleep Mode

Deep Sleep Mode ปิดการทำงานของ CPU และ peripherals เกือบทั้งหมด เหลือเฉพาะ RTC Timer และ RTC Memory

❄️ คุณสมบัติ Deep Sleep Mode

  • CPU: ปิดทำงานสมบูรณ์
  • WiFi/Bluetooth: ปิดทำงาน
  • Main Memory: ข้อมูลหายหมด
  • RTC Memory: เก็บข้อมูลได้ 8KB
  • RTC Timer: ยังทำงานอยู่
  • Wake-up Time: 300ms
💻 Deep Sleep Mode Code
// Deep Sleep Mode Example
#include "esp_sleep.h"

// RTC Memory สำหรับเก็บข้อมูลข้าม Deep Sleep
RTC_DATA_ATTR int bootCount = 0;

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  // เพิ่มจำนวนครั้งที่ Boot
  ++bootCount;
  Serial.println("Boot number: " + String(bootCount));
  
  // แสดงสาเหตุที่ตื่นขึ้น
  print_wakeup_reason();
  
  // กำหนด wake-up source
  esp_sleep_enable_timer_wakeup(20 * 1000000); // 20 วินาที
  
  Serial.println("Going to Deep Sleep for 20 seconds...");
  Serial.flush();
  
  // เข้า Deep Sleep Mode
  esp_deep_sleep_start();
  
  // โค้ดหลังจากนี้จะไม่ทำงาน
  Serial.println("This will never be printed");
}

void loop() {
  // ใน Deep Sleep Mode, loop() จะไม่ทำงาน
}

void print_wakeup_reason() {
  esp_sleep_wakeup_cause_t wakeup_reason;
  wakeup_reason = esp_sleep_get_wakeup_cause();
  
  switch(wakeup_reason) {
    case ESP_SLEEP_WAKEUP_EXT0:
      Serial.println("Wakeup caused by external signal using RTC_IO");
      break;
    case ESP_SLEEP_WAKEUP_EXT1:
      Serial.println("Wakeup caused by external signal using RTC_CNTL");
      break;
    case ESP_SLEEP_WAKEUP_TIMER:
      Serial.println("Wakeup caused by timer");
      break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD:
      Serial.println("Wakeup caused by touchpad");
      break;
    case ESP_SLEEP_WAKEUP_ULP:
      Serial.println("Wakeup caused by ULP program");
      break;
    default:
      Serial.printf("Wakeup was not caused by deep sleep: %d\n", wakeup_reason);
      break;
  }
}

🔋 Deep Sleep Power Calculation

ตัวอย่างการคำนวณอายุแบตเตอรี่:

  • แบตเตอรี่: 2000mAh Li-ion
  • Deep Sleep: 10µA (0.01mA)
  • Active Time: 1 นาที/ชั่วโมง @ 200mA
  • อายุแบตเตอรี่: มากกว่า 1 ปี!

✅ ข้อดี Deep Sleep Mode

  • ประหยัดพลังงานสุดๆ: ใช้เพียง 10µA
  • อายุแบตเตอรี่ยาวนาน: เดือน-ปี
  • RTC Memory: เก็บข้อมูลสำคัญได้
  • Multiple Wake Sources: ตื่นได้หลายวิธี

⚠️ ข้อจำกัด Deep Sleep Mode

  • ข้อมูลหาย: ข้อมูลใน RAM หายหมด
  • WiFi ขาด: ต้องเชื่อมต่อใหม่ทุกครั้ง
  • Boot ใหม่: รันโปรแกรมใหม่ตั้งแต่ setup()
  • ช้ากว่า: ใช้เวลาตื่น 300ms
4

Hibernation Mode

Hibernation Mode เป็น Deep Sleep แบบสุดขั้ว ปิดเกือบทุกอย่างรวมถึง RTC Peripherals

🧊 คุณสมบัติ Hibernation Mode

  • การใช้พลังงาน: 2.5µA (ต่ำสุด)
  • RTC Timer: ปิดทำงาน
  • RTC Memory: ข้อมูลหายหมด
  • Wake-up: เฉพาะ External Reset หรือ Power Cycle
  • การใช้งาน: เก็บอุปกรณ์ระยะยาว
💻 Hibernation Mode Code
// Hibernation Mode Example
#include "esp_sleep.h"

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  Serial.println("ESP32 will enter Hibernation Mode");
  Serial.println("Wake up only by pressing RESET button");
  Serial.flush();
  
  // ปิด RTC Peripherals ทั้งหมด
  esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
  esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF);
  esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);
  
  // เข้า Deep Sleep โดยไม่มี wake-up source (Hibernation)
  esp_deep_sleep_start();
}

void loop() {
  // จะไม่ทำงาน
}

// ตัวอย่างการใช้ External Wake-up สำหรับ Hibernation
void setupExternalWakeup() {
  // ใช้ GPIO 33 เป็น wake-up source
  esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 0); // Wake เมื่อ GPIO 33 เป็น LOW
  
  Serial.println("Going to Hibernation...");
  Serial.println("Press button on GPIO 33 to wake up");
  
  esp_deep_sleep_start();
}

💡 การใช้งาน Hibernation Mode

  • Long-term Storage: เก็บอุปกรณ์นานๆ
  • Emergency Shutdown: ปิดเครื่องฉุกเฉิน
  • Shipping Mode: ส่งสินค้าโดยไม่ใช้แบตเตอรี่
  • Ultra Low Power: ต้องการประหยัดพลังงานสุดๆ

📊 เปรียบเทียบ Sleep Modes

Mode Current Wake Time Memory WiFi
Active 160-260mA - ✓ Full ✓ Active
Light Sleep 0.8mA 3ms ✓ Keep ✓ Keep
Deep Sleep 10µA 300ms ⚠ RTC Only ✗ Lost
Hibernation 2.5µA Reset Only ✗ Lost ✗ Lost
⚙️

ESP32 Deep Sleep Mode Hardware Implementation

การต่อวงจรและเตรียมฮาร์ดแวร์สำหรับทดสอบ ESP32 Deep Sleep Mode

ESP32 Deep Sleep Mode Circuit Implementation
วงจรการต่อ ESP32 สำหรับทดสอบ Deep Sleep Mode พร้อม Wake-up Sources
1

อุปกรณ์ที่ต้องใช้

🔧 อุปกรณ์หลัก

  • ESP32 Development Board
  • Breadboard
  • Jumper Wires
  • USB Cable

🔘 Push Buttons

  • Push Button x2
  • Pull-up Resistor 10kΩ x2
  • สำหรับ External Wake-up

💡 LED Indicators

  • LED x3 (Red, Green, Blue)
  • Resistor 220Ω x3
  • แสดงสถานะการทำงาน

📊 Multimeter

  • Digital Multimeter
  • วัดกระแสไฟฟ้า
  • ตรวจสอบ Power Consumption
2

การต่อวงจร

ESP32 Deep Sleep Hardware Setup
การต่อวงจร ESP32 พร้อมอุปกรณ์ทดสอบ Deep Sleep Mode

🔌 การต่อ Wake-up Sources

📋 Pin Connections
// Pin Connections for Deep Sleep Testing

// Wake-up Buttons
#define BUTTON_PIN_BITMASK 0x200000000 // 2^33 in hex (GPIO 33)
#define EXT_WAKEUP_PIN_1 33  // External wake-up pin 1
#define EXT_WAKEUP_PIN_2 32  // External wake-up pin 2

// LED Indicators
#define LED_RED    25   // Red LED - Active Mode
#define LED_GREEN  26   // Green LED - Light Sleep
#define LED_BLUE   27   // Blue LED - Deep Sleep

// Touch Pins (if using touch wake-up)
#define TOUCH_PIN_1 T0  // GPIO 4
#define TOUCH_PIN_2 T3  // GPIO 15

// Connection Details:
// GPIO 33 -> Button 1 -> GND (with 10kΩ pull-up to 3.3V)
// GPIO 32 -> Button 2 -> GND (with 10kΩ pull-up to 3.3V)
// GPIO 25 -> 220Ω -> Red LED -> GND
// GPIO 26 -> 220Ω -> Green LED -> GND
// GPIO 27 -> 220Ω -> Blue LED -> GND

⚠️ ข้อควรระวังการต่อวงจร

  • RTC GPIO Only: Wake-up pins ต้องเป็น RTC GPIO เท่านั้น
  • Pull-up Resistors: ใช้ pull-up 10kΩ สำหรับ buttons
  • Voltage Levels: ใช้ 3.3V เท่านั้น อย่าใช้ 5V
  • Current Measurement: ต่อ multimeter แบบ series กับ VCC
3

RTC GPIO Pins

ESP32 มี GPIO pins พิเศษที่เรียกว่า RTC GPIO ที่สามารถทำงานได้แม้ใน Deep Sleep Mode

📍 RTC GPIO Pins ที่ใช้ได้

GPIO 0
RTC_GPIO11
GPIO 2
RTC_GPIO12
GPIO 4
RTC_GPIO10
GPIO 12
RTC_GPIO15
GPIO 13
RTC_GPIO14
GPIO 14
RTC_GPIO16
GPIO 15
RTC_GPIO13
GPIO 25
RTC_GPIO6
GPIO 26
RTC_GPIO7
GPIO 27
RTC_GPIO17
GPIO 32
RTC_GPIO9
GPIO 33
RTC_GPIO8

💡 การใช้งาน RTC GPIO

  • External Wake-up: ใช้เป็น wake-up source ใน Deep Sleep
  • Touch Wake-up: GPIO 0, 2, 4, 12, 13, 14, 15, 27, 32, 33
  • ULP Access: ULP Coprocessor เข้าถึงได้
  • RTC Domain: ทำงานด้วย RTC Power Domain
💻

Programming for waking up ESP32 from Deep Sleep

โปรแกรมสำหรับควบคุม ESP32 Deep Sleep และ Wake-up Sources ต่างๆ

1

Timer Wake-up

การตื่นจาก Deep Sleep ด้วย Timer - วิธีที่ง่ายและใช้บ่อยที่สุด

⏰ Timer Wake-up Complete Code
/*
  ESP32 Deep Sleep Timer Wake-up Example
  ตื่นจาก Deep Sleep ทุก 20 วินาที
*/

#include "esp_sleep.h"

// RTC Memory สำหรับนับจำนวนครั้งที่ตื่น
RTC_DATA_ATTR int bootCount = 0;

// Pin definitions
#define LED_PIN 2
#define SLEEP_TIME_SECONDS 20

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  // เพิ่มจำนวนครั้งที่ Boot
  ++bootCount;
  
  // ตั้งค่า LED
  pinMode(LED_PIN, OUTPUT);
  
  // แสดงข้อมูลการตื่น
  Serial.println("=================================");
  Serial.println("ESP32 Deep Sleep Timer Wake-up");
  Serial.println("=================================");
  Serial.println("Boot count: " + String(bootCount));
  
  // แสดงสาเหตุที่ตื่น
  print_wakeup_reason();
  
  // กระพริบ LED เพื่อแสดงว่าตื่นแล้ว
  for(int i = 0; i < 5; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(200);
    digitalWrite(LED_PIN, LOW);
    delay(200);
  }
  
  // ทำงานปกติ 5 วินาที
  Serial.println("Running for 5 seconds...");
  for(int i = 5; i > 0; i--) {
    Serial.println("Countdown: " + String(i));
    delay(1000);
  }
  
  // เตรียมเข้า Deep Sleep
  Serial.println("Going to Deep Sleep for " + String(SLEEP_TIME_SECONDS) + " seconds");
  
  // กำหนด Timer Wake-up
  esp_sleep_enable_timer_wakeup(SLEEP_TIME_SECONDS * 1000000ULL);
  
  Serial.println("Deep Sleep starting...");
  Serial.flush();
  
  // เข้า Deep Sleep
  esp_deep_sleep_start();
  
  // โค้ดหลังจากนี้จะไม่ทำงาน
}

void loop() {
  // ใน Deep Sleep Mode, loop() จะไม่ทำงาน
}

void print_wakeup_reason() {
  esp_sleep_wakeup_cause_t wakeup_reason;
  wakeup_reason = esp_sleep_get_wakeup_cause();
  
  switch(wakeup_reason) {
    case ESP_SLEEP_WAKEUP_EXT0:
      Serial.println("Wakeup: External signal (RTC_IO)");
      break;
    case ESP_SLEEP_WAKEUP_EXT1:
      Serial.println("Wakeup: External signal (RTC_CNTL)");
      break;
    case ESP_SLEEP_WAKEUP_TIMER:
      Serial.println("Wakeup: Timer");
      break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD:
      Serial.println("Wakeup: Touchpad");
      break;
    case ESP_SLEEP_WAKEUP_ULP:
      Serial.println("Wakeup: ULP program");
      break;
    default:
      Serial.println("Wakeup: Power on or reset");
      break;
  }
}
2

External Wake-up (EXT0)

การตื่นจาก Deep Sleep ด้วยสัญญาณจาก GPIO pin เดียว

🔘 External Wake-up (EXT0) Code
/*
  ESP32 Deep Sleep External Wake-up (EXT0) Example
  ตื่นเมื่อกดปุ่มที่ GPIO 33
*/

#include "esp_sleep.h"

// Pin definitions
#define BUTTON_PIN 33  // RTC GPIO สำหรับ wake-up
#define LED_PIN 2

RTC_DATA_ATTR int bootCount = 0;

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  ++bootCount;
  
  // ตั้งค่า pins
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);
  
  Serial.println("=================================");
  Serial.println("ESP32 External Wake-up (EXT0)");
  Serial.println("=================================");
  Serial.println("Boot count: " + String(bootCount));
  
  // แสดงสาเหตุที่ตื่น
  print_wakeup_reason();
  
  // กระพริบ LED
  blinkLED(3);
  
  // แสดงสถานะปุ่ม
  Serial.println("Button state: " + String(digitalRead(BUTTON_PIN)));
  
  // รอ 5 วินาที
  Serial.println("Running for 5 seconds...");
  delay(5000);
  
  // เตรียมเข้า Deep Sleep
  Serial.println("Going to Deep Sleep...");
  Serial.println("Press button on GPIO 33 to wake up");
  
  // กำหนด External Wake-up (EXT0)
  // ตื่นเมื่อ GPIO 33 เป็น LOW (กดปุ่ม)
  esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 0);
  
  Serial.flush();
  esp_deep_sleep_start();
}

void loop() {
  // ไม่ทำงาน
}

void blinkLED(int times) {
  for(int i = 0; i < times; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(300);
    digitalWrite(LED_PIN, LOW);
    delay(300);
  }
}

void print_wakeup_reason() {
  esp_sleep_wakeup_cause_t wakeup_reason;
  wakeup_reason = esp_sleep_get_wakeup_cause();
  
  switch(wakeup_reason) {
    case ESP_SLEEP_WAKEUP_EXT0:
      Serial.println("Wakeup: Button pressed (EXT0)");
      break;
    case ESP_SLEEP_WAKEUP_EXT1:
      Serial.println("Wakeup: External signal (EXT1)");
      break;
    case ESP_SLEEP_WAKEUP_TIMER:
      Serial.println("Wakeup: Timer");
      break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD:
      Serial.println("Wakeup: Touchpad");
      break;
    case ESP_SLEEP_WAKEUP_ULP:
      Serial.println("Wakeup: ULP program");
      break;
    default:
      Serial.println("Wakeup: Power on or reset");
      break;
  }
}
3

External Wake-up (EXT1)

การตื่นจาก Deep Sleep ด้วยสัญญาณจาก GPIO pins หลายตัว

🔘 External Wake-up (EXT1) Code
/*
  ESP32 Deep Sleep External Wake-up (EXT1) Example
  ตื่นเมื่อกดปุ่มใดปุ่มหนึ่งใน GPIO 32 หรือ 33
*/

#include "esp_sleep.h"

// Pin definitions
#define BUTTON_PIN_1 32  // ปุ่มที่ 1
#define BUTTON_PIN_2 33  // ปุ่มที่ 2
#define LED_RED 25
#define LED_GREEN 26

// Bitmask สำหรับ EXT1 wake-up
#define BUTTON_PIN_BITMASK 0x300000000 // 2^32 + 2^33 in hex

RTC_DATA_ATTR int bootCount = 0;

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  ++bootCount;
  
  // ตั้งค่า pins
  pinMode(BUTTON_PIN_1, INPUT_PULLUP);
  pinMode(BUTTON_PIN_2, INPUT_PULLUP);
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  
  Serial.println("=================================");
  Serial.println("ESP32 External Wake-up (EXT1)");
  Serial.println("=================================");
  Serial.println("Boot count: " + String(bootCount));
  
  // แสดงสาเหตุที่ตื่น
  print_wakeup_reason();
  
  // ตรวจสอบปุ่มไหนที่ถูกกด
  checkWakeupButton();
  
  // รอ 5 วินาที
  Serial.println("Running for 5 seconds...");
  delay(5000);
  
  // เตรียมเข้า Deep Sleep
  Serial.println("Going to Deep Sleep...");
  Serial.println("Press any button (GPIO 32 or 33) to wake up");
  
  // กำหนด External Wake-up (EXT1)
  // ตื่นเมื่อ GPIO ใดใน bitmask เป็น HIGH
  esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK, ESP_EXT1_WAKEUP_ANY_HIGH);
  
  Serial.flush();
  esp_deep_sleep_start();
}

void loop() {
  // ไม่ทำงาน
}

void checkWakeupButton() {
  if (esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_EXT1) {
    uint64_t wakeup_pin_mask = esp_sleep_get_ext1_wakeup_status();
    
    if (wakeup_pin_mask != 0) {
      int pin = __builtin_ffsll(wakeup_pin_mask) - 1;
      Serial.printf("Wake up from GPIO %d\n", pin);
      
      if (pin == BUTTON_PIN_1) {
        Serial.println("Button 1 pressed!");
        blinkLED(LED_RED, 3);
      } else if (pin == BUTTON_PIN_2) {
        Serial.println("Button 2 pressed!");
        blinkLED(LED_GREEN, 3);
      }
    }
  } else {
    // First boot หรือ wake-up จากสาเหตุอื่น
    blinkLED(LED_RED, 1);
    blinkLED(LED_GREEN, 1);
  }
}

void blinkLED(int ledPin, int times) {
  for(int i = 0; i < times; i++) {
    digitalWrite(ledPin, HIGH);
    delay(300);
    digitalWrite(ledPin, LOW);
    delay(300);
  }
}

void print_wakeup_reason() {
  esp_sleep_wakeup_cause_t wakeup_reason;
  wakeup_reason = esp_sleep_get_wakeup_cause();
  
  switch(wakeup_reason) {
    case ESP_SLEEP_WAKEUP_EXT0:
      Serial.println("Wakeup: External signal (EXT0)");
      break;
    case ESP_SLEEP_WAKEUP_EXT1:
      Serial.println("Wakeup: External signal (EXT1)");
      break;
    case ESP_SLEEP_WAKEUP_TIMER:
      Serial.println("Wakeup: Timer");
      break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD:
      Serial.println("Wakeup: Touchpad");
      break;
    case ESP_SLEEP_WAKEUP_ULP:
      Serial.println("Wakeup: ULP program");
      break;
    default:
      Serial.println("Wakeup: Power on or reset");
      break;
  }
}
4

Touch Wake-up

การตื่นจาก Deep Sleep ด้วยการสัมผัส Touch Sensor

👆 Touch Wake-up Code
/*
  ESP32 Deep Sleep Touch Wake-up Example
  ตื่นเมื่อสัมผัส Touch Sensor
*/

#include "esp_sleep.h"

// Touch pins
#define TOUCH_PIN T0  // GPIO 4
#define LED_PIN 2

RTC_DATA_ATTR int bootCount = 0;

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  ++bootCount;
  
  pinMode(LED_PIN, OUTPUT);
  
  Serial.println("=================================");
  Serial.println("ESP32 Touch Wake-up Example");
  Serial.println("=================================");
  Serial.println("Boot count: " + String(bootCount));
  
  // แสดงสาเหตุที่ตื่น
  print_wakeup_reason();
  
  // กระพริบ LED
  blinkLED(3);
  
  // อ่านค่า Touch Sensor
  int touchValue = touchRead(TOUCH_PIN);
  Serial.println("Touch value: " + String(touchValue));
  
  // รอ 5 วินาที
  Serial.println("Running for 5 seconds...");
  delay(5000);
  
  // เตรียมเข้า Deep Sleep
  Serial.println("Going to Deep Sleep...");
  Serial.println("Touch GPIO 4 to wake up");
  
  // กำหนด Touch Wake-up
  // ตื่นเมื่อค่า touch น้อยกว่า threshold (สัมผัส)
  touchSleepWakeUpEnable(TOUCH_PIN, 40);
  
  Serial.flush();
  esp_deep_sleep_start();
}

void loop() {
  // ไม่ทำงาน
}

void blinkLED(int times) {
  for(int i = 0; i < times; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(300);
    digitalWrite(LED_PIN, LOW);
    delay(300);
  }
}

void print_wakeup_reason() {
  esp_sleep_wakeup_cause_t wakeup_reason;
  wakeup_reason = esp_sleep_get_wakeup_cause();
  
  switch(wakeup_reason) {
    case ESP_SLEEP_WAKEUP_EXT0:
      Serial.println("Wakeup: External signal (EXT0)");
      break;
    case ESP_SLEEP_WAKEUP_EXT1:
      Serial.println("Wakeup: External signal (EXT1)");
      break;
    case ESP_SLEEP_WAKEUP_TIMER:
      Serial.println("Wakeup: Timer");
      break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD:
      Serial.println("Wakeup: Touch sensor");
      // แสดงว่า touch pad ไหนที่ตื่น
      touch_pad_t touchPin = esp_sleep_get_touchpad_wakeup_status();
      Serial.println("Touch detected on pad: " + String(touchPin));
      break;
    case ESP_SLEEP_WAKEUP_ULP:
      Serial.println("Wakeup: ULP program");
      break;
    default:
      Serial.println("Wakeup: Power on or reset");
      break;
  }
}
5

Complete Deep Sleep Example

โปรแกรมสมบูรณ์ที่รวม Wake-up Sources ทั้งหมด

🚀 Complete Deep Sleep Code
/*
  ESP32 Complete Deep Sleep Example
  รวม Wake-up Sources ทั้งหมด: Timer, External, Touch
*/

#include "esp_sleep.h"

// Pin definitions
#define BUTTON_PIN 33
#define TOUCH_PIN T0  // GPIO 4
#define LED_RED 25
#define LED_GREEN 26
#define LED_BLUE 27

// Sleep settings
#define SLEEP_TIME_SECONDS 30
#define TOUCH_THRESHOLD 40

// RTC Memory
RTC_DATA_ATTR int bootCount = 0;
RTC_DATA_ATTR int timerWakeups = 0;
RTC_DATA_ATTR int buttonWakeups = 0;
RTC_DATA_ATTR int touchWakeups = 0;

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  ++bootCount;
  
  // ตั้งค่า pins
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_BLUE, OUTPUT);
  
  Serial.println("=========================================");
  Serial.println("ESP32 Complete Deep Sleep Example");
  Serial.println("=========================================");
  Serial.println("Boot count: " + String(bootCount));
  
  // แสดงสถิติการตื่น
  Serial.println("Wake-up Statistics:");
  Serial.println("- Timer wakeups: " + String(timerWakeups));
  Serial.println("- Button wakeups: " + String(buttonWakeups));
  Serial.println("- Touch wakeups: " + String(touchWakeups));
  
  // แสดงสาเหตุที่ตื่นและนับสถิติ
  handleWakeupReason();
  
  // ทำงานปกติ 10 วินาที
  Serial.println("Running active mode for 10 seconds...");
  for(int i = 10; i > 0; i--) {
    Serial.println("Countdown: " + String(i));
    
    // กระพริบ LED ตามสาเหตุที่ตื่น
    blinkStatusLED();
    
    delay(1000);
  }
  
  // เตรียมเข้า Deep Sleep
  setupDeepSleep();
  
  Serial.println("Entering Deep Sleep...");
  Serial.flush();
  
  esp_deep_sleep_start();
}

void loop() {
  // ไม่ทำงาน
}

void handleWakeupReason() {
  esp_sleep_wakeup_cause_t wakeup_reason;
  wakeup_reason = esp_sleep_get_wakeup_cause();
  
  switch(wakeup_reason) {
    case ESP_SLEEP_WAKEUP_EXT0:
      Serial.println("Wakeup: Button pressed!");
      buttonWakeups++;
      blinkLED(LED_GREEN, 3);
      break;
      
    case ESP_SLEEP_WAKEUP_TIMER:
      Serial.println("Wakeup: Timer expired");
      timerWakeups++;
      blinkLED(LED_RED, 2);
      break;
      
    case ESP_SLEEP_WAKEUP_TOUCHPAD:
      Serial.println("Wakeup: Touch detected!");
      touchWakeups++;
      touch_pad_t touchPin = esp_sleep_get_touchpad_wakeup_status();
      Serial.println("Touch pad: " + String(touchPin));
      blinkLED(LED_BLUE, 4);
      break;
      
    default:
      Serial.println("Wakeup: Power on or reset");
      // กระพริบทุก LED
      blinkLED(LED_RED, 1);
      blinkLED(LED_GREEN, 1);
      blinkLED(LED_BLUE, 1);
      break;
  }
}

void setupDeepSleep() {
  Serial.println("Setting up Deep Sleep wake-up sources:");
  
  // 1. Timer Wake-up (30 วินาที)
  esp_sleep_enable_timer_wakeup(SLEEP_TIME_SECONDS * 1000000ULL);
  Serial.println("- Timer: " + String(SLEEP_TIME_SECONDS) + " seconds");
  
  // 2. External Wake-up (Button)
  esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 0);
  Serial.println("- Button: GPIO 33 (press to wake)");
  
  // 3. Touch Wake-up
  touchSleepWakeUpEnable(TOUCH_PIN, TOUCH_THRESHOLD);
  Serial.println("- Touch: GPIO 4 (touch to wake)");
  
  Serial.println("Wake up using any of the above methods!");
}

void blinkLED(int ledPin, int times) {
  for(int i = 0; i < times; i++) {
    digitalWrite(ledPin, HIGH);
    delay(200);
    digitalWrite(ledPin, LOW);
    delay(200);
  }
}

void blinkStatusLED() {
  // กระพริบ LED ตามสาเหตุที่ตื่นล่าสุด
  esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause();
  
  switch(wakeup_reason) {
    case ESP_SLEEP_WAKEUP_EXT0:
      digitalWrite(LED_GREEN, HIGH);
      delay(100);
      digitalWrite(LED_GREEN, LOW);
      break;
    case ESP_SLEEP_WAKEUP_TIMER:
      digitalWrite(LED_RED, HIGH);
      delay(100);
      digitalWrite(LED_RED, LOW);
      break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD:
      digitalWrite(LED_BLUE, HIGH);
      delay(100);
      digitalWrite(LED_BLUE, LOW);
      break;
    default:
      // กระพริบทุก LED
      digitalWrite(LED_RED, HIGH);
      digitalWrite(LED_GREEN, HIGH);
      digitalWrite(LED_BLUE, HIGH);
      delay(100);
      digitalWrite(LED_RED, LOW);
      digitalWrite(LED_GREEN, LOW);
      digitalWrite(LED_BLUE, LOW);
      break;
  }
}

✅ คุณสมบัติของโปรแกรมสมบูรณ์

  • Multiple Wake Sources: Timer, Button, Touch
  • Wake-up Statistics: นับจำนวนครั้งแต่ละประเภท
  • LED Indicators: แสดงสาเหตุที่ตื่นด้วยสี
  • RTC Memory: เก็บข้อมูลข้าม Deep Sleep
  • Serial Monitoring: แสดงข้อมูลครบถ้วน
📊

ESP32 Sleep Modes Testing

การทดสอบและวัดการใช้พลังงานของ ESP32 ในแต่ละ Sleep Mode

ESP32 Sleep Modes Testing Setup
การทดสอบ ESP32 Sleep Modes พร้อมการวัดกระแสไฟฟ้า
1

Active Mode Testing

การทดสอบการใช้พลังงานใน Active Mode

🔥 Active Mode Test Code
/*
  ESP32 Active Mode Power Consumption Test
  วัดการใช้พลังงานใน Active Mode
*/

#include "WiFi.h"
#include "BluetoothSerial.h"

// WiFi credentials
const char* ssid = "YourWiFiName";
const char* password = "YourWiFiPassword";

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  Serial.println("=================================");
  Serial.println("ESP32 Active Mode Power Test");
  Serial.println("=================================");
  
  // Test 1: CPU Only
  Serial.println("Test 1: CPU Only (No WiFi/Bluetooth)");
  testCPUOnly();
  
  // Test 2: WiFi Active
  Serial.println("Test 2: WiFi Active");
  testWiFiActive();
  
  // Test 3: Bluetooth Active
  Serial.println("Test 3: Bluetooth Active");
  testBluetoothActive();
  
  // Test 4: WiFi + Bluetooth
  Serial.println("Test 4: WiFi + Bluetooth");
  testWiFiAndBluetooth();
}

void loop() {
  // ทำงานต่อเนื่องเพื่อวัดกระแส
  Serial.println("Active Mode - Measure current now!");
  
  // ทำงานหนักๆ เพื่อให้ CPU ใช้พลังงานเต็มที่
  for(int i = 0; i < 1000000; i++) {
    float result = sin(i) * cos(i) * sqrt(i);
  }
  
  delay(5000);
}

void testCPUOnly() {
  Serial.println("CPU running at full speed...");
  Serial.println("Measure current consumption now!");
  
  unsigned long startTime = millis();
  while(millis() - startTime < 10000) { // 10 วินาที
    // ทำงานหนัก
    for(int i = 0; i < 100000; i++) {
      volatile float calc = i * 3.14159;
    }
  }
  
  Serial.println("Expected: 30-50mA");
  Serial.println("------------------------");
}

void testWiFiActive() {
  WiFi.begin(ssid, password);
  
  Serial.println("Connecting to WiFi...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("");
  Serial.println("WiFi connected!");
  Serial.println("IP address: " + WiFi.localIP().toString());
  Serial.println("Measure current consumption now!");
  
  // ส่งข้อมูลผ่าน WiFi
  for(int i = 0; i < 20; i++) {
    Serial.println("WiFi active - sending data...");
    delay(1000);
  }
  
  Serial.println("Expected: 160-260mA");
  Serial.println("------------------------");
}

void testBluetoothActive() {
  SerialBT.begin("ESP32test");
  Serial.println("Bluetooth started!");
  Serial.println("Measure current consumption now!");
  
  for(int i = 0; i < 20; i++) {
    SerialBT.println("Bluetooth test message " + String(i));
    Serial.println("Bluetooth active...");
    delay(1000);
  }
  
  Serial.println("Expected: 100-150mA");
  Serial.println("------------------------");
}

void testWiFiAndBluetooth() {
  Serial.println("WiFi + Bluetooth both active!");
  Serial.println("Measure current consumption now!");
  
  for(int i = 0; i < 20; i++) {
    SerialBT.println("BT: " + String(i));
    Serial.println("WiFi + BT active...");
    delay(1000);
  }
  
  Serial.println("Expected: 200-300mA");
  Serial.println("------------------------");
}

🔥 Active Mode Results

CPU Only
30-50mA
WiFi Active
160-260mA
Bluetooth
100-150mA
WiFi + BT
200-300mA
2

ESP32 Deep Sleep Mode Testing

การทดสอบการใช้พลังงานใน Deep Sleep Mode

ESP32 Deep Sleep Mode Testing
การทดสอบ ESP32 Deep Sleep Mode พร้อมการวัดกระแสไฟฟ้าที่ต่ำมาก
❄️ Deep Sleep Test Code
/*
  ESP32 Deep Sleep Mode Power Consumption Test
  วัดการใช้พลังงานใน Deep Sleep Mode
*/

#include "esp_sleep.h"

#define LED_PIN 2
#define SLEEP_TIME_SECONDS 60  // Sleep 1 นาที

RTC_DATA_ATTR int bootCount = 0;
RTC_DATA_ATTR unsigned long totalSleepTime = 0;

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  ++bootCount;
  pinMode(LED_PIN, OUTPUT);
  
  Serial.println("=================================");
  Serial.println("ESP32 Deep Sleep Power Test");
  Serial.println("=================================");
  Serial.println("Boot count: " + String(bootCount));
  Serial.println("Total sleep time: " + String(totalSleepTime) + " seconds");
  
  // แสดงสาเหตุที่ตื่น
  print_wakeup_reason();
  
  // กระพริบ LED เพื่อแสดงว่าตื่นแล้ว
  blinkLED(3);
  
  // ทำงาน Active Mode สั้นๆ (5 วินาที)
  Serial.println("Active mode for 5 seconds...");
  Serial.println("Measure ACTIVE current now!");
  
  for(int i = 5; i > 0; i--) {
    Serial.println("Active countdown: " + String(i));
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
    delay(500);
  }
  
  // เตรียมเข้า Deep Sleep
  Serial.println("Preparing for Deep Sleep...");
  Serial.println("MEASURE DEEP SLEEP CURRENT IN 3 SECONDS!");
  
  delay(3000);
  
  // บันทึกเวลา Sleep
  totalSleepTime += SLEEP_TIME_SECONDS;
  
  // กำหนด Timer Wake-up
  esp_sleep_enable_timer_wakeup(SLEEP_TIME_SECONDS * 1000000ULL);
  
  Serial.println("Entering Deep Sleep for " + String(SLEEP_TIME_SECONDS) + " seconds...");
  Serial.println("Expected current: ~10µA");
  Serial.flush();
  
  // เข้า Deep Sleep
  esp_deep_sleep_start();
}

void loop() {
  // ไม่ทำงาน
}

void blinkLED(int times) {
  for(int i = 0; i < times; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(200);
    digitalWrite(LED_PIN, LOW);
    delay(200);
  }
}

void print_wakeup_reason() {
  esp_sleep_wakeup_cause_t wakeup_reason;
  wakeup_reason = esp_sleep_get_wakeup_cause();
  
  switch(wakeup_reason) {
    case ESP_SLEEP_WAKEUP_EXT0:
      Serial.println("Wakeup: External signal (RTC_IO)");
      break;
    case ESP_SLEEP_WAKEUP_EXT1:
      Serial.println("Wakeup: External signal (RTC_CNTL)");
      break;
    case ESP_SLEEP_WAKEUP_TIMER:
      Serial.println("Wakeup: Timer");
      break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD:
      Serial.println("Wakeup: Touchpad");
      break;
    case ESP_SLEEP_WAKEUP_ULP:
      Serial.println("Wakeup: ULP program");
      break;
    default:
      Serial.println("Wakeup: Power on or reset");
      break;
  }
}

❄️ Deep Sleep Results

Deep Sleep
~10µA
0.01mA
Power Saving
99.99%
vs Active Mode
Battery Life
1+ Year
2000mAh Battery
Wake Time
300ms
Boot + Setup
3

การวัดกระแสไฟฟ้า

วิธีการวัดกระแสไฟฟ้าของ ESP32 อย่างถูกต้อง

🔌 การต่อ Multimeter

  • ตัด VCC line ของ ESP32
  • ต่อ Multimeter แบบ Series
  • ตั้ง Multimeter เป็น DC Current
  • เริ่มจาก range สูง (mA) แล้วลดลง

📊 การอ่านค่า

  • Active Mode: ใช้ range mA
  • Light Sleep: ใช้ range mA
  • Deep Sleep: ใช้ range µA
  • รอให้ค่าเสถียรก่อนอ่าน

⚠️ ข้อควรระวัง

  • USB Cable มี current leakage
  • ใช้แบตเตอรี่สำหรับวัดที่แม่นยำ
  • LED บน board ใช้กระแสเพิ่ม
  • Temperature มีผลต่อการใช้พลังงาน

🎯 เป้าหมายการวัด

  • Active: 160-260mA
  • Light Sleep: 0.8mA
  • Deep Sleep: 10µA
  • Hibernation: 2.5µA

⚠️ ปัจจัยที่มีผลต่อการวัด

  • USB Connection: มี current leakage ผ่าน USB
  • Development Board: มี LED และ voltage regulator
  • Temperature: อุณหภูมิสูงใช้พลังงานมากขึ้น
  • Voltage Level: แรงดันต่ำใช้พลังงานน้อยลง
  • Peripheral Devices: อุปกรณ์ภายนอกที่เชื่อมต่อ

💡 เคล็ดลับการวัดที่แม่นยำ

  • ใช้แบตเตอรี่: ถอด USB cable ออกเมื่อวัด
  • รอให้เสถียร: รอ 10-30 วินาทีก่อนอ่านค่า
  • วัดหลายครั้ง: เอาค่าเฉลี่ยจากการวัดหลายครั้ง
  • ปิด LED: ปิด LED บน development board
  • ใช้ Oscilloscope: สำหรับดูรูปแบบการใช้พลังงาน

📊 สรุปผลการทดสอบ Sleep Modes

Sleep Mode Current Battery Life* Wake Time Use Case
Active Mode 200mA 10 hours - Real-time
Light Sleep 0.8mA 104 days 3ms Quick response
Deep Sleep 10µA 23 years 300ms IoT sensors
Hibernation 2.5µA 91 years Reset only Long storage

* คำนวณจากแบตเตอรี่ 2000mAh Li-ion

🎥

Video Tutorial

วิดีโอสาธิตการใช้งาน ESP32 Sleep Modes และการวัดการใช้พลังงาน

🎥 เนื้อหาในวิดีโอ

  • ESP32 Hardware Overview: ส่วนประกอบและการจัดการพลังงาน
  • Sleep Modes Explanation: อธิบาย Sleep Modes ทั้ง 4 แบบ
  • Hardware Setup: การต่อวงจรและเตรียมอุปกรณ์
  • Code Examples: ตัวอย่างโค้ดสำหรับแต่ละ Sleep Mode
  • Power Measurement: การวัดกระแสไฟฟ้าจริง
  • Practical Applications: การใช้งานจริงในโปรเจกต์ IoT

✅ สิ่งที่จะได้เรียนรู้จากวิดีโอ

  • Visual Demonstration: เห็นการทำงานจริงของแต่ละ Sleep Mode
  • Current Measurement: ดูการวัดกระแสไฟฟ้าด้วย Multimeter
  • Code Walkthrough: อธิบายโค้ดทีละบรรทัด
  • Troubleshooting: แก้ปัญหาที่พบบ่อย
  • Best Practices: เทคนิคการใช้งานที่ดีที่สุด

🎯 เนื้อหาเพิ่มเติม

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ ESP32 และ IoT Projects

📚 ESP32 Tutorials

WiFi, Bluetooth, Sensors

🔋 Power Management

Battery Projects, Solar

🌐 IoT Projects

Smart Home, Monitoring

📊 Data Logging

Cloud, Database, Analytics

🛒 สนใจอุปกรณ์ ESP32 และ IoT?

เรามีอุปกรณ์ครบครัน ESP32, Sensors, Development Boards และอุปกรณ์ IoT ทั้งหมด!

🎁 สินค้าที่มีจำหน่าย

แท็ก


ฝากความคิดเห็น

ฝากความคิดเห็น

Blog posts

  • Raspberry Pi 1 Countdown & Debian ยุติการซัพพอร์ต ARMEL/MIPS64EL

    , โดย Global Byte Shope Raspberry Pi 1 Countdown & Debian ยุติการซัพพอร์ต ARMEL/MIPS64EL

  • ESP32 Sleep Modes และการใช้งาน Deep Sleep Mode — คู่มือสมบูรณ์

    , โดย Global Byte Shope ESP32 Sleep Modes และการใช้งาน Deep Sleep Mode — คู่มือสมบูรณ์

  • Bitcoin Mining ด้วย Raspberry Pi — คู่มือสมบูรณ์ตั้งแต่เริ่มต้น

    , โดย Global Byte Shope Bitcoin Mining ด้วย Raspberry Pi — คู่มือสมบูรณ์ตั้งแต่เริ่มต้น

  • Raspberry Pi GPIO — เริ่มเขียนโค้ดควบคุม LED และปุ่มกดด้วย Python

    , โดย Global Byte Shope Raspberry Pi GPIO — เริ่มเขียนโค้ดควบคุม LED และปุ่มกดด้วย Python

© 2025 บริษัท โกลบอลโทรนิค อินเตอร์เทรด จํากัด, ขับเคลื่อนโดย Shopify

    • PayPal

    เข้าสู่ระบบ

    ลืมรหัสผ่านใช่ไหม?

    ยังไม่มีบัญชีใช่ไหม?
    สร้างบัญชี