สวัสดีครับเพื่อนสมาชิก

EP.3 ของกระทู้ ESP32 จะขอเสนอเนื้อหาการใช้งาน ESP32 กับ sensor ชนิดต่าง ๆ ครับ
🛑 EP.1 แนะนำเบื้องต้นให้รู้จัก ESP32
https://pantip.com/topic/44159372
🛑 EP.2 ใช้งาน ESP32 กับ web dashboard
https://pantip.com/topic/44161526
.... ตั้งแต่ยุคของ Arduino ก็มีพวก sensor ชนิดต่าง ๆ เกือบ 100 ชนิดก็ว่าได้ มีทั้ง sensor แบบ analog , digital ซึ่ง sensor เหล่านั้นก็นำมาใช้กับ ESP32 ได้อย่างสมบูรณ์ สิ่งเดียวที่ต้องดูก็คือ sensor เหล่านั้นใช้ไฟเลี้ยงเท่าใด 5 โวลต์หรือ 3.3 โวลต์ หากเป็น sensor ในยุคของ Arduino ก็จะเป็นไฟเลี้ยง 5 โวลต์ เมื่อเชื่อมต่อกับ ESP32 (ซึ่งรับ input เข้า GPIO 3.3V) ก็จะต้องมีอุปกรณ์ลดแรงดันลงจากเกือบ 5V เป็น 3.3V (ใช้ voltage divider ง่ายสุด)
ภาพตัวอย่าง sensors ที่ใช้กับ ESP32 , Arduino

sensor ทั้งหลายเหล่านี้ถูกผลิตออกมาครอบคลุมการใช้งาน IoT ทั้งหมด ที่ใช้กันมากก็เช่น sensor อุณหภูมิ ความชื้น ความสว่าง ระดับเสียง วัดระยะทาง นอกจากนี้ยังมี sensor พื้นฐานที่ใช้ในอิเล็กทรอนิกส์ยุคเก่ามาประยุกต์เชื่อมต่อกับ ESP32 ก็ได้อย่างเช่น LDR , Thermistor , ตัวรับสัญญาณ infrared , IR LED
🛑 ตัวแรกก็คือ
DHT22 มันเป็น sensor อุณหภูมิกับความชื้นแบบ digital ก็คือมีขา output เพียงขาเดียวเท่านั้นและต่อกับ GPIO ของ ESP32 โดยตรงได้เลยครับเพราะใช้ไฟเลี้ยง 3.3V ข้างใน sensor ตัวนี้จะมี sensor รับความชื้นและ Thermister เพื่อรับอุณหภูมิและมีไมโครคอนโทรลเลอร์ 8 bit ขนาดจิ๋วด้านในเพื่อแปลงสัญญาณ analog จาก sensor ความชื้นและ thermister แปลงไปเป็นสัญญาณ serial และเนื่องจาก DHT22 เป็นแบบ digital output ดังนั้นจึงต้องทำงานกับ library ของมันเอง
🛑 ตัวต่อไปคือ HY-SRF05 Ultrasonic Module เป็น sensor ที่ใช้คลื่นเสียงความถี่สูงระดับ ultrasonic 40 KHz โดยส่งคลื่นออกไปและคำนวณเวลาที่คลื่นสะท้อนกลับมา สามารถวัดระยะวัตถุได้แม่นยำตั้งแต่ 2 ซม. - 4 เมตร ตัวนี้เป็น sensor ที่สมบูรณ์ในตัวเอง ก็คือมี IC ทำหน้าที่กำเนิด ultrasonic และเป็นภาครับ echo ของคลื่น ultrasonic กลับมาแปลงมาเป็นค่า timing ได้เลย
Timing diagram ของ HY-SRF05 Ultrasonic Module ตามภาพนี้ครับ

ถึงแม้ Timing diagram จะดูซับซ้อนยุ่งยาก แต่เวลาให้ AI เขียน code เราไม่ต้องบอกรายละเอียดพวกนี้เลยครับ เพราะ AI ถูก train ข้อมูลพวกนี้มาหมดแล้ว มันสามารถออก code ที่สอดคล้องกับ timing diagram นี้แบบเป๊ะเลย ใน prompt เราแค่ระบุให้ชัดว่าขา TRIG , Echo ต่อกับ GPIO ใดของ ESP32
ตัวอย่าง project วัดระยะทาง + LDR วัดความสว่างแสดงค่าแสงเป็น 0 - 100%

อุปกรณ์มีเพียงเท่านี้

ESP32 code ของ project นี้
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include <DHT.h>
// OLED Configuration
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDRESS 0x3C // Common I2C address for these displays
#define I2C_SDA 40
#define I2C_SCL 42
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// DHT22 Configuration
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// LDR Configuration
#define LDR_PIN 1
// HY-SRF05 Configuration
#define TRIG_PIN 7
#define ECHO_PIN 8
// Timing Variables (Non-blocking using millis)
unsigned long lastDHTRead = 0;
unsigned long lastLDRRead = 0;
unsigned long lastSonicRead = 0;
const long dhtInterval = 5000; // 5 seconds
const long ldrInterval = 300; // 300 ms
const long sonicInterval = 1000; // 1 second
// Global variables to hold last read values
float currentTemp = 0.0;
float lightPercent = 0.0;
float currentRange = 0.0;
void setup() {
Serial.begin(115200);
// Initialize Custom I2C pins for ESP32-S3
Wire.begin(I2C_SDA, I2C_SCL);
// Initialize OLED
if (!display.begin(OLED_ADDRESS, true)) {
Serial.println(F("SH1106 OLED initialization failed!"));
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.display();
// Initialize DHT
dht.begin();
// Initialize Ultrasonic Pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Configure ADC attenuation if needed for 0-3V range
// By default, ESP32 Arduino Core 3.x configures ADC to 11dB (~0V - 3.3V)
analogSetPinAttenuation(LDR_PIN, ADC_11db);
}
void loop() {
unsigned long currentMillis = millis();
bool needUpdateDisplay = false;
// 1. Read DHT22 every 5 seconds
if (currentMillis - lastDHTRead >= dhtInterval) {
lastDHTRead = currentMillis;
float t = dht.readTemperature();
if (!isnan(t)) {
currentTemp = t;
needUpdateDisplay = true;
}
}
// 2 & 3. Read LDR every 300 ms and map voltage
if (currentMillis - lastLDRRead >= ldrInterval) {
lastLDRRead = currentMillis;
// Read raw ADC (ESP32-S3 has 12-bit ADC: 0 - 4095)
int rawADC = analogRead(LDR_PIN);
// Convert to Voltage (assuming 3.3V VREF)
float voltage = (rawADC / 4095.0) * 3.3;
// Map 1.0V - 3.0V to 0% - 100%
if (voltage < 1.0) {
lightPercent = 0.0;
} else if (voltage > 3.0) {
lightPercent = 100.0;
} else {
// Linear interpolation formula: (value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
lightPercent = (voltage - 1.0) * (100.0 - 0.0) / (3.0 - 1.0) + 0.0;
}
needUpdateDisplay = true;
}
// 4. Read HY-SRF05 Ultrasonic every 1 second
if (currentMillis - lastSonicRead >= sonicInterval) {
lastSonicRead = currentMillis;
// Trigger the sensor
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Read echo duration (travel time in microseconds)
long duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30ms timeout (~5 meters max)
// Calculate distance in cm (Speed of sound is ~343 m/s or 0.0343 cm/us)
if (duration > 0) {
currentRange = (duration * 0.0343) / 2.0;
} else {
currentRange = -1.0; // Out of range / timeout indicator
}
needUpdateDisplay = true;
}
// Update OLED if any data has changed
if (needUpdateDisplay) {
updateOLED();
}
}
void updateOLED() {
display.clearDisplay();
// Line 1: Temperature
display.setCursor(0, 4);
display.print("Temp: ");
display.print(currentTemp, 1); // 1 decimal place
display.print(" C");
// Line 2: Light Level
display.setCursor(0, 24);
display.print("Light level = ");
display.print(lightPercent, 1); // 1 decimal place
display.print(" %");
// Line 3: Range
display.setCursor(0, 44);
if (currentRange >= 0) {
display.print("Range = ");
display.print(currentRange, 1); // 1 decimal place
display.print(" cm");
} else {
display.print("Range = Out of Bound");
}
display.display();
}
กระทู้ไมโครคอนโทรลเลอร์ ESP32 (EP.3) ESP32 กับ sensor ต่าง ๆ
EP.3 ของกระทู้ ESP32 จะขอเสนอเนื้อหาการใช้งาน ESP32 กับ sensor ชนิดต่าง ๆ ครับ
🛑 EP.1 แนะนำเบื้องต้นให้รู้จัก ESP32
https://pantip.com/topic/44159372
🛑 EP.2 ใช้งาน ESP32 กับ web dashboard
https://pantip.com/topic/44161526
.... ตั้งแต่ยุคของ Arduino ก็มีพวก sensor ชนิดต่าง ๆ เกือบ 100 ชนิดก็ว่าได้ มีทั้ง sensor แบบ analog , digital ซึ่ง sensor เหล่านั้นก็นำมาใช้กับ ESP32 ได้อย่างสมบูรณ์ สิ่งเดียวที่ต้องดูก็คือ sensor เหล่านั้นใช้ไฟเลี้ยงเท่าใด 5 โวลต์หรือ 3.3 โวลต์ หากเป็น sensor ในยุคของ Arduino ก็จะเป็นไฟเลี้ยง 5 โวลต์ เมื่อเชื่อมต่อกับ ESP32 (ซึ่งรับ input เข้า GPIO 3.3V) ก็จะต้องมีอุปกรณ์ลดแรงดันลงจากเกือบ 5V เป็น 3.3V (ใช้ voltage divider ง่ายสุด)
ภาพตัวอย่าง sensors ที่ใช้กับ ESP32 , Arduino
sensor ทั้งหลายเหล่านี้ถูกผลิตออกมาครอบคลุมการใช้งาน IoT ทั้งหมด ที่ใช้กันมากก็เช่น sensor อุณหภูมิ ความชื้น ความสว่าง ระดับเสียง วัดระยะทาง นอกจากนี้ยังมี sensor พื้นฐานที่ใช้ในอิเล็กทรอนิกส์ยุคเก่ามาประยุกต์เชื่อมต่อกับ ESP32 ก็ได้อย่างเช่น LDR , Thermistor , ตัวรับสัญญาณ infrared , IR LED
🛑 ตัวแรกก็คือ DHT22 มันเป็น sensor อุณหภูมิกับความชื้นแบบ digital ก็คือมีขา output เพียงขาเดียวเท่านั้นและต่อกับ GPIO ของ ESP32 โดยตรงได้เลยครับเพราะใช้ไฟเลี้ยง 3.3V ข้างใน sensor ตัวนี้จะมี sensor รับความชื้นและ Thermister เพื่อรับอุณหภูมิและมีไมโครคอนโทรลเลอร์ 8 bit ขนาดจิ๋วด้านในเพื่อแปลงสัญญาณ analog จาก sensor ความชื้นและ thermister แปลงไปเป็นสัญญาณ serial และเนื่องจาก DHT22 เป็นแบบ digital output ดังนั้นจึงต้องทำงานกับ library ของมันเอง
ถึงแม้ Timing diagram จะดูซับซ้อนยุ่งยาก แต่เวลาให้ AI เขียน code เราไม่ต้องบอกรายละเอียดพวกนี้เลยครับ เพราะ AI ถูก train ข้อมูลพวกนี้มาหมดแล้ว มันสามารถออก code ที่สอดคล้องกับ timing diagram นี้แบบเป๊ะเลย ใน prompt เราแค่ระบุให้ชัดว่าขา TRIG , Echo ต่อกับ GPIO ใดของ ESP32
ตัวอย่าง project วัดระยะทาง + LDR วัดความสว่างแสดงค่าแสงเป็น 0 - 100%
อุปกรณ์มีเพียงเท่านี้
ESP32 code ของ project นี้
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้