1. ติดตั้ง Arduino IDE
- ดาวน์โหลดและติดตั้ง Arduino IDE จากเว็บไซต์ Arduino.cc (แนะนำเวอร์ชันล่าสุด)
2. เพิ่ม Board Manager ของ ESP32
- เปิด Arduino IDE
- ไปที่ File > Preferences
- ในช่อง Additional Board Manager URLs ให้เพิ่มลิงก์ต่อไปนี้:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
หรือ
http://arduino.esp8266.com/stable/package_esp8266com_index.json
https://dl.espressif.com/dl/package_esp32_index.json
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
4. กด OK
3. ติดตั้งบอร์ด ESP32
- ไปที่ Tools > Board > Boards Manager
- ค้นหา ESP32
- เลือก “esp32 by Espressif Systems” และกด Install
- หลังติดตั้งเสร็จ คุณจะสามารถเลือกบอร์ด ESP32 ได้จากเมนู Tools > Board
4. การเขียนโปรแกรมทดสอบ Blink
โค้ดทดสอบ:
#define LED_BUILTIN 2
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // ตั้งค่า LED_BUILTIN เป็น output
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // เปิดไฟ LED
delay(1000); // รอ 1 วินาที
digitalWrite(LED_BUILTIN, LOW); // ปิดไฟ LED
delay(1000); // รอ 1 วินาที
}
5. เลือกบอร์ด ESP32 และพอร์ต COM
- ไปที่ Tools > Board > ESP32 Arduino และเลือกบอร์ดที่คุณใช้งาน (เช่น ESP32 Dev Module)
- ไปที่ Tools > Port และเลือกพอร์ต COM ที่เชื่อมต่อกับบอร์ด ESP32
6. อัปโหลดโปรแกรม
- กดปุ่ม Upload (ลูกศรชี้ขึ้น) เพื่ออัปโหลดโปรแกรมไปยัง ESP32
- รอจนกระทั่งข้อความ “Done uploading” แสดงขึ้น
7. การแก้ไขข้อผิดพลาด (Error)
กรณี: “Failed to connect to ESP32: Timed out waiting for packet header”
สาเหตุ:
ESP32 ไม่เข้าสู่โหมดการดาวน์โหลด (flash mode)
วิธีแก้ไข:
- กดปุ่ม BOOT บนบอร์ด ESP32 ค้างไว้ขณะอัปโหลดโปรแกรม
- ปล่อยปุ่ม BOOT เมื่อเห็นข้อความ
Connecting...
ใน Serial Monitor
กรณี: “WiFi.h: No such file or directory”
สาเหตุ:
ยังไม่ได้ติดตั้ง Board Manager ของ ESP32
วิธีแก้ไข:
- ติดตั้ง Board Manager ของ ESP32 ตามขั้นตอนในหัวข้อที่ 2
กรณี: “Port not detected”
สาเหตุ:
พอร์ต COM ของ ESP32 ไม่ปรากฏใน Arduino IDE
วิธีแก้ไข:
- ตรวจสอบสาย USB ว่าสามารถส่งข้อมูลได้ (บางสายมีแค่ฟังก์ชันชาร์จไฟ)
- ตรวจสอบไดรเวอร์ USB หากยังไม่มี ให้ติดตั้งไดรเวอร์ CP2102 หรือ CH340 ขึ้นอยู่กับชิป USB-to-Serial บนบอร์ด ESP32
- Download driver
– CP2102 USB to Serial Driver
ดาวน์โหลดจากเว็บไซต์ทางการของ Silicon Labs:
ลิงก์ดาวน์โหลด: CP210x Drivers
ขั้นตอนการติดตั้ง:เลือกระบบปฏิบัติการที่คุณใช้งาน (Windows, macOS, หรือ Linux)
ดาวน์โหลดไฟล์ติดตั้ง
ติดตั้งตามคำแนะนำในหน้าต่างติดตั้ง
– CH340 USB to Serial Driver
ดาวน์โหลดจากเว็บไซต์ของผู้พัฒนา:
ลิงก์ดาวน์โหลด: CH340 Drivers
ขั้นตอนการติดตั้ง:คลิกลิงก์เพื่อดาวน์โหลดไฟล์ติดตั้งสำหรับ Windows
เปิดไฟล์CH341SER.EXE
กดปุ่ม Install ในหน้าต่างติดตั้ง
กรณี: “Error compiling for board ESP32”
สาเหตุ:
ไลบรารีหรือบอร์ดไม่สมบูรณ์
วิธีแก้ไข:
- ตรวจสอบว่าได้ติดตั้ง Board Manager และอัปเดตเป็นเวอร์ชันล่าสุด
- ลบโฟลเดอร์ ESP32 ใน Arduino IDE แล้วติดตั้งใหม่
การต่อวงจร ร่วมกับ sensors analog 3 ตัว
- เชื่อมต่อเซ็นเซอร์อนาล็อก 3 ตัวกับพิน ADC ของ ESP32:
- เซ็นเซอร์ 1: ต่อขาสัญญาณที่ GPIO34
- เซ็นเซอร์ 2: ต่อขาสัญญาณที่ GPIO35
- เซ็นเซอร์ 3: ต่อขาสัญญาณที่ GPIO32
- ขา VCC ของเซ็นเซอร์ ต่อเข้ากับ 3.3V บน ESP32
- ขา GND ของเซ็นเซอร์ ต่อเข้ากับ GND บน ESP32
// กำหนดขาพิน ADC สำหรับเซ็นเซอร์
const int sensor1Pin = 34; // ADC1 Channel 6
const int sensor2Pin = 35; // ADC1 Channel 7
const int sensor3Pin = 32; // ADC1 Channel 4
void setup() {
Serial.begin(115200); // เริ่มการสื่อสาร Serial
delay(1000); // รอการเริ่มต้น
}
void loop() {
// อ่านค่าจากเซ็นเซอร์ทั้งสามตัว
int sensor1Value = analogRead(sensor1Pin);
int sensor2Value = analogRead(sensor2Pin);
int sensor3Value = analogRead(sensor3Pin);
// แปลงค่า ADC เป็นแรงดันไฟฟ้า (แรงดันไฟฟ้า = (ค่า ADC / 4095.0) * 3.3V)
float voltage1 = (sensor1Value / 4095.0) * 3.3;
float voltage2 = (sensor2Value / 4095.0) * 3.3;
float voltage3 = (sensor3Value / 4095.0) * 3.3;
// แสดงผลใน Serial Monitor
Serial.println("=== Sensor Readings ===");
Serial.print("Sensor 1 Voltage: ");
Serial.print(voltage1);
Serial.println(" V");
Serial.print("Sensor 2 Voltage: ");
Serial.print(voltage2);
Serial.println(" V");
Serial.print("Sensor 3 Voltage: ");
Serial.print(voltage3);
Serial.println(" V");
Serial.println("=======================");
delay(1000); // รอ 1 วินาที ก่อนอ่านค่าถัดไป
}
คำอธิบายโค้ด
analogRead(pin)
อ่านค่าจากพิน ADC (Analog-to-Digital Converter) ซึ่งคืนค่าในช่วง 0 ถึง 4095 (ความละเอียด 12 บิต)- แปลงค่า ADC เป็นแรงดันไฟฟ้า:
ESP32 ใช้แรงดันอ้างอิง (Vref) ที่ 3.3V ค่าแรงดันไฟฟ้าจึงคำนวณโดย:
voltage = (ADC_value / 4095.0) * 3.3;
3. Serial Monitor
เปิด Serial Monitor ใน Arduino IDE (Ctrl+Shift+M) เพื่อดูค่าที่อ่านจากเซ็นเซอร์
การแก้ปัญหา Error
- “GPIO pin not responding”
- ตรวจสอบว่าขาที่ใช้สามารถทำงานในโหมด ADC ได้ (ESP32 บางขาไม่ได้รองรับ ADC)
- ใช้เฉพาะพินที่ระบุใน ADC Pins Documentation
- “Values are always zero”
- ตรวจสอบการเชื่อมต่อวงจรระหว่างเซ็นเซอร์กับ ESP32
- ตรวจสอบว่าเซ็นเซอร์ใช้งานได้และได้รับไฟเลี้ยง
- “No output in Serial Monitor”
- ตรวจสอบว่าเลือกพอร์ต COM และบอร์ด ESP32 อย่างถูกต้องใน Arduino IDE
- ตรวจสอบว่าความเร็วบอดเรต (Baud Rate) ตรงกับในโค้ด (
Serial.begin(115200)
)
การเชื่อมต่อ ESP32 กับเซ็นเซอร์ DHT11 หรือ DHT22 โดยใช้ไลบรารี DHT sensor library:
การติดตั้งไลบรารีที่จำเป็น
- เปิด Arduino IDE
- ไปที่ Tools > Manage Libraries
- ค้นหาและติดตั้งไลบรารีต่อไปนี้:
- DHT sensor library โดย Adafruit
- Adafruit Unified Sensor
การต่อวงจร
- ขาสัญญาณของ DHT11/DHT22 ต่อกับ GPIO4 ของ ESP32
- ขา VCC ต่อกับ 3.3V บน ESP32
- ขา GND ต่อกับ GND บน ESP32
- ใส่ตัวต้านทาน (Pull-up Resistor) ขนาด 10kΩ ระหว่างขา VCC และ DATA ของ DHT
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
// กำหนดชนิดเซ็นเซอร์ (เลือก DHT11 หรือ DHT22)
#define DHTTYPE DHT22 // เปลี่ยนเป็น DHT11 ถ้าคุณใช้ DHT11
// กำหนดพินที่ใช้เชื่อมต่อกับเซ็นเซอร์
#define DHTPIN 4
// สร้างออบเจ็กต์สำหรับเซ็นเซอร์
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200); // เริ่มการสื่อสาร Serial
dht.begin(); // เริ่มต้นเซ็นเซอร์ DHT
Serial.println("DHT sensor test starting...");
}
void loop() {
// อ่านค่าจากเซ็นเซอร์
float humidity = dht.readHumidity(); // อ่านค่าความชื้น
float temperature = dht.readTemperature(); // อ่านค่าอุณหภูมิ (หน่วย Celsius)
// ตรวจสอบว่าการอ่านสำเร็จหรือไม่
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// แสดงผลข้อมูล
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print("%\t");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println("°C");
delay(2000); // อ่านค่าทุก ๆ 2 วินาที
}
คำอธิบายโค้ด
- การกำหนดชนิดเซ็นเซอร์
- หากใช้ DHT11 ให้เปลี่ยน
#define DHTTYPE DHT22
เป็น#define DHTTYPE DHT11
- หากใช้ DHT11 ให้เปลี่ยน
- การอ่านค่าเซ็นเซอร์
dht.readHumidity()
อ่านค่าความชื้นสัมพัทธ์ (%)dht.readTemperature()
อ่านค่าอุณหภูมิในหน่วย Celsius
- การตรวจสอบข้อผิดพลาด
หากisnan()
คืนค่าเป็นtrue
หมายถึงการอ่านค่าจากเซ็นเซอร์ล้มเหลว
การแก้ไขปัญหา
- “Failed to read from DHT sensor!”
- ตรวจสอบสายไฟและการต่อขาระหว่าง DHT กับ ESP32
- ตรวจสอบค่าความต้านทาน (Pull-up Resistor) ระหว่างขา DATA และ VCC
- เซ็นเซอร์ไม่ตอบสนอง
- ตรวจสอบว่าขาสัญญาณของ DHT เชื่อมต่อกับ GPIO ที่รองรับบน ESP32
- ค่าน้อยผิดปกติหรือไม่แสดงค่า
- ตรวจสอบว่าเซ็นเซอร์ได้รับไฟเลี้ยงเพียงพอ (3.3V)
การใช้ ESP32 เพื่อควบคุมรีเลย์ 5 ตัวตามเงื่อนไขที่ตั้งไว้ โดยข้อมูลเซ็นเซอร์ถูกนำมาประมวลผลเพื่อเปิดหรือปิดรีเลย์
การต่อวงจร
- รีเลย์
- รีเลย์ตัวที่ 1: GPIO32
- รีเลย์ตัวที่ 2: GPIO33
- รีเลย์ตัวที่ 3: GPIO25
- รีเลย์ตัวที่ 4: GPIO26
- รีเลย์ตัวที่ 5: GPIO27
- เซ็นเซอร์
- DHT22: ขาสัญญาณต่อ GPIO4
- เซ็นเซอร์อนาล็อก (Sensor 1, 2, 3): ต่อ GPIO34, GPIO35, GPIO36
ตัวอย่างโค้ด
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
// กำหนดขาพินสำหรับเซ็นเซอร์และรีเลย์
#define DHTPIN 4 // ขาสัญญาณของ DHT
#define DHTTYPE DHT22 // เปลี่ยนเป็น DHT11 หากใช้ DHT11
#define RELAY1 32
#define RELAY2 33
#define RELAY3 25
#define RELAY4 26
#define RELAY5 27
#define SENSOR1_PIN 34
#define SENSOR2_PIN 35
#define SENSOR3_PIN 36
// สร้างออบเจ็กต์สำหรับเซ็นเซอร์ DHT
DHT dht(DHTPIN, DHTTYPE);
// กำหนดเงื่อนไขการควบคุม
float temperatureThreshold = 30.0; // อุณหภูมิสูงกว่า 30°C
float humidityThreshold = 60.0; // ความชื้นสูงกว่า 60%
float sensorChangeThreshold = 0.5; // การเปลี่ยนแปลงของค่ามากกว่า 0.5V
// ตัวแปรสำหรับตรวจจับการเปลี่ยนแปลงค่าเซ็นเซอร์
float lastSensor1Value = 0;
float lastSensor2Value = 0;
float lastSensor3Value = 0;
void setup() {
Serial.begin(115200);
dht.begin();
// ตั้งค่าขารีเลย์เป็น OUTPUT
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(RELAY4, OUTPUT);
pinMode(RELAY5, OUTPUT);
// ปิดรีเลย์ทั้งหมดในตอนเริ่มต้น
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
digitalWrite(RELAY3, LOW);
digitalWrite(RELAY4, LOW);
digitalWrite(RELAY5, LOW);
}
void loop() {
// อ่านค่า DHT เซ็นเซอร์
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// อ่านค่าจากเซ็นเซอร์อนาล็อก
float sensor1Value = analogRead(SENSOR1_PIN) * (3.3 / 4095.0);
float sensor2Value = analogRead(SENSOR2_PIN) * (3.3 / 4095.0);
float sensor3Value = analogRead(SENSOR3_PIN) * (3.3 / 4095.0);
// ตรวจสอบค่าที่อ่านได้
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// แสดงค่าที่อ่านได้ใน Serial Monitor
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Sensor 1: ");
Serial.println(sensor1Value);
Serial.print("Sensor 2: ");
Serial.println(sensor2Value);
Serial.print("Sensor 3: ");
Serial.println(sensor3Value);
// ควบคุมรีเลย์ตามเงื่อนไข
digitalWrite(RELAY1, temperature > temperatureThreshold ? HIGH : LOW);
digitalWrite(RELAY2, humidity > humidityThreshold ? HIGH : LOW);
if (abs(sensor1Value - lastSensor1Value) > sensorChangeThreshold) {
digitalWrite(RELAY3, HIGH);
} else {
digitalWrite(RELAY3, LOW);
}
if (abs(sensor2Value - lastSensor2Value) > sensorChangeThreshold) {
digitalWrite(RELAY4, HIGH);
} else {
digitalWrite(RELAY4, LOW);
}
if (abs(sensor3Value - lastSensor3Value) > sensorChangeThreshold) {
digitalWrite(RELAY5, HIGH);
} else {
digitalWrite(RELAY5, LOW);
}
// บันทึกค่าปัจจุบันสำหรับการเปรียบเทียบครั้งถัดไป
lastSensor1Value = sensor1Value;
lastSensor2Value = sensor2Value;
lastSensor3Value = sensor3Value;
delay(2000); // รอ 2 วินาที
}
คำอธิบายโค้ด
- ควบคุมรีเลย์ตามค่า DHT
- เปิด/ปิดรีเลย์ 1 และ 2 ตามค่าความชื้นและอุณหภูมิ
- ตรวจจับความเปลี่ยนแปลงของเซ็นเซอร์อนาล็อก
- หากค่าความเปลี่ยนแปลงของเซ็นเซอร์เกินกว่า
sensorChangeThreshold
รีเลย์จะเปิด
- หากค่าความเปลี่ยนแปลงของเซ็นเซอร์เกินกว่า
- Serial Monitor
- ใช้สำหรับตรวจสอบค่าอุณหภูมิ ความชื้น และแรงดันไฟฟ้าของเซ็นเซอร์
การแก้ปัญหา
- เซ็นเซอร์ DHT ไม่ตอบสนอง
- ตรวจสอบว่าต่อวงจรถูกต้องและใช้ตัวต้านทาน Pull-up ระหว่าง DATA กับ VCC
- รีเลย์ไม่ทำงาน
- ตรวจสอบแรงดันไฟฟ้าสำหรับรีเลย์ และการต่อวงจรขา IN กับ GPIO
- ค่าเซ็นเซอร์อนาล็อกไม่เปลี่ยนแปลง
- ตรวจสอบแรงดันไฟฟ้าของเซ็นเซอร์ และการต่อขาสัญญาณ
การควบคุมรีเลย์ 5 ตัวโดยใช้ ESP32 ตามเงื่อนไขจากค่าอุณหภูมิ ความชื้น (จากเซ็นเซอร์ DHT22) และค่าความเปลี่ยนแปลงจากเซ็นเซอร์อนาล็อก 3 ตัว (เช่น Photoresistor, Potentiometer หรือเซ็นเซอร์อื่นๆ):
การต่อวงจร
- รีเลย์:
- ต่อ GPIO ของ ESP32 กับขา IN ของรีเลย์ทั้ง 5 ตัว (เช่น GPIO12, GPIO13, GPIO14, GPIO25, GPIO26)
- ต่อขา GND ของรีเลย์กับ GND ของ ESP32
- ต่อขา VCC ของรีเลย์กับ 5V หรือ 3.3V (ขึ้นอยู่กับรีเลย์ที่ใช้)
- DHT22:
- ต่อ DATA ของ DHT22 กับ GPIO4
- ต่อ 3.3V และ GND เข้ากับ DHT22
- เซ็นเซอร์อนาล็อก 3 ตัว:
- ต่อขาสัญญาณของแต่ละเซ็นเซอร์กับ GPIO34, GPIO35 และ GPIO32
- ต่อ 3.3V และ GND สำหรับไฟเลี้ยง
ตัวอย่างโค้ด:
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
// กำหนดพินของรีเลย์
#define RELAY1 12
#define RELAY2 13
#define RELAY3 14
#define RELAY4 25
#define RELAY5 26
// กำหนดพินของเซ็นเซอร์ DHT22
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// กำหนดพินของเซ็นเซอร์อนาล็อก
#define SENSOR1_PIN 34
#define SENSOR2_PIN 35
#define SENSOR3_PIN 32
void setup() {
// เริ่มต้น Serial Monitor
Serial.begin(115200);
// เริ่มต้นเซ็นเซอร์ DHT
dht.begin();
// กำหนดพินรีเลย์เป็น OUTPUT และตั้งค่าเริ่มต้น
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(RELAY4, OUTPUT);
pinMode(RELAY5, OUTPUT);
// ปิดรีเลย์ทั้งหมดเริ่มต้น
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
digitalWrite(RELAY3, LOW);
digitalWrite(RELAY4, LOW);
digitalWrite(RELAY5, LOW);
Serial.println("System started...");
}
void loop() {
// อ่านค่าจากเซ็นเซอร์ DHT
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// อ่านค่าจากเซ็นเซอร์อนาล็อก
int sensor1Value = analogRead(SENSOR1_PIN);
int sensor2Value = analogRead(SENSOR2_PIN);
int sensor3Value = analogRead(SENSOR3_PIN);
// ตรวจสอบว่าอ่านค่าได้สำเร็จหรือไม่
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// แสดงผลใน Serial Monitor
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Sensor1: ");
Serial.println(sensor1Value);
Serial.print("Sensor2: ");
Serial.println(sensor2Value);
Serial.print("Sensor3: ");
Serial.println(sensor3Value);
// เงื่อนไขควบคุมรีเลย์
if (temperature > 30) {
digitalWrite(RELAY1, HIGH); // เปิดรีเลย์ 1
} else {
digitalWrite(RELAY1, LOW); // ปิดรีเลย์ 1
}
if (humidity > 70) {
digitalWrite(RELAY2, HIGH); // เปิดรีเลย์ 2
} else {
digitalWrite(RELAY2, LOW); // ปิดรีเลย์ 2
}
if (sensor1Value > 2000) {
digitalWrite(RELAY3, HIGH); // เปิดรีเลย์ 3
} else {
digitalWrite(RELAY3, LOW); // ปิดรีเลย์ 3
}
if (sensor2Value < 1000) {
digitalWrite(RELAY4, HIGH); // เปิดรีเลย์ 4
} else {
digitalWrite(RELAY4, LOW); // ปิดรีเลย์ 4
}
if ((sensor3Value - sensor2Value) > 500) {
digitalWrite(RELAY5, HIGH); // เปิดรีเลย์ 5
} else {
digitalWrite(RELAY5, LOW); // ปิดรีเลย์ 5
}
// รอ 1 วินาที ก่อนเริ่มรอบถัดไป
delay(1000);
}
คำอธิบายโค้ด
- ควบคุมรีเลย์ตามเงื่อนไข:
- ใช้ค่าจาก DHT22 (อุณหภูมิและความชื้น) และค่าจากเซ็นเซอร์อนาล็อก 3 ตัวเพื่อตัดสินใจเปิด/ปิดรีเลย์
- ค่าควบคุมปรับเปลี่ยนได้:
- ปรับค่าตามความเหมาะสม เช่น
if (temperature > 30)
หรือsensor1Value > 2000
- ปรับค่าตามความเหมาะสม เช่น
- Serial Monitor:
- ใช้ดูค่าที่อ่านจากเซ็นเซอร์เพื่อการตรวจสอบ
ปัญหาที่อาจเกิดขึ้นและการแก้ไข
- รีเลย์ไม่ทำงาน:
- ตรวจสอบการต่อสายระหว่าง GPIO กับขา IN ของรีเลย์
- ตรวจสอบว่ารีเลย์ได้รับไฟเลี้ยงเพียงพอ
- DHT ไม่ตอบสนอง:
- ใช้ตัวต้านทาน Pull-up ขนาด 10kΩ ระหว่างขา VCC และ DATA
- ค่าของเซ็นเซอร์อนาล็อกไม่เปลี่ยนแปลง:
- ตรวจสอบว่าเซ็นเซอร์ได้รับไฟเลี้ยงเพียงพอ
- ตรวจสอบพิน GPIO ว่ารองรับ ADC หรือไม่
การต่อวงจร
- เซ็นเซอร์อนาล็อก
- เซ็นเซอร์ 1: ต่อที่ GPIO34
- เซ็นเซอร์ 2: ต่อที่ GPIO35
- เซ็นเซอร์ 3: ต่อที่ GPIO36
- DHT22/DHT11
- ขาสัญญาณต่อที่ GPIO4
- รีเลย์ 8 ช่อง
- รีเลย์ 1: GPIO25
- รีเลย์ 2: GPIO26
- รีเลย์ 3: GPIO27
- รีเลย์ 4: GPIO14
- รีเลย์ 5: GPIO12
- รีเลย์ 6: GPIO13
- รีเลย์ 7: GPIO33
- รีเลย์ 8: GPIO32
โค้ด Arduino
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
// กำหนดชนิดเซ็นเซอร์ DHT
#define DHTPIN 4
#define DHTTYPE DHT22 // เปลี่ยนเป็น DHT11 หากใช้ DHT11
// สร้างออบเจ็กต์สำหรับเซ็นเซอร์ DHT
DHT dht(DHTPIN, DHTTYPE);
// กำหนดพินเซ็นเซอร์อนาล็อก
#define SENSOR1_PIN 34
#define SENSOR2_PIN 35
#define SENSOR3_PIN 36
// กำหนดพินรีเลย์
#define RELAY1 25
#define RELAY2 26
#define RELAY3 27
#define RELAY4 14
#define RELAY5 12
#define RELAY6 13
#define RELAY7 33
#define RELAY8 32
// กำหนดเงื่อนไขสำหรับการทำงาน
float temperatureThreshold = 30.0; // อุณหภูมิสูงกว่า 30°C
float humidityThreshold = 60.0; // ความชื้นสูงกว่า 60%
float sensorThreshold1 = 1.5; // เซ็นเซอร์ 1 มากกว่า 1.5V
float sensorThreshold2 = 2.0; // เซ็นเซอร์ 2 มากกว่า 2.0V
float sensorThreshold3 = 1.0; // เซ็นเซอร์ 3 มากกว่า 1.0V
void setup() {
Serial.begin(115200);
dht.begin();
// ตั้งค่าขารีเลย์เป็น OUTPUT และปิดรีเลย์ทั้งหมด
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(RELAY4, OUTPUT);
pinMode(RELAY5, OUTPUT);
pinMode(RELAY6, OUTPUT);
pinMode(RELAY7, OUTPUT);
pinMode(RELAY8, OUTPUT);
allRelaysOff();
}
void loop() {
// อ่านค่าจาก DHT เซ็นเซอร์
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// อ่านค่าจากเซ็นเซอร์อนาล็อก
float sensor1Value = analogRead(SENSOR1_PIN) * (3.3 / 4095.0);
float sensor2Value = analogRead(SENSOR2_PIN) * (3.3 / 4095.0);
float sensor3Value = analogRead(SENSOR3_PIN) * (3.3 / 4095.0);
// ตรวจสอบว่าการอ่านค่าเซ็นเซอร์ DHT สำเร็จหรือไม่
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// แสดงผลค่าที่อ่านได้
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Sensor 1: ");
Serial.println(sensor1Value);
Serial.print("Sensor 2: ");
Serial.println(sensor2Value);
Serial.print("Sensor 3: ");
Serial.println(sensor3Value);
// การควบคุมรีเลย์ตามเงื่อนไข
digitalWrite(RELAY1, temperature > temperatureThreshold ? HIGH : LOW);
digitalWrite(RELAY2, humidity > humidityThreshold ? HIGH : LOW);
digitalWrite(RELAY3, sensor1Value > sensorThreshold1 ? HIGH : LOW);
digitalWrite(RELAY4, sensor2Value > sensorThreshold2 ? HIGH : LOW);
digitalWrite(RELAY5, sensor3Value > sensorThreshold3 ? HIGH : LOW);
// ตัวอย่างการตั้งค่ารีเลย์ 6-8 เป็นสถานะอิสระ
digitalWrite(RELAY6, (temperature > 25 && humidity < 50) ? HIGH : LOW);
digitalWrite(RELAY7, (sensor1Value > 2.0 || sensor3Value < 1.0) ? HIGH : LOW);
digitalWrite(RELAY8, (temperature < 20) ? HIGH : LOW);
delay(2000); // รอ 2 วินาที
}
// ฟังก์ชันสำหรับปิดรีเลย์ทั้งหมด
void allRelaysOff() {
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
digitalWrite(RELAY3, LOW);
digitalWrite(RELAY4, LOW);
digitalWrite(RELAY5, LOW);
digitalWrite(RELAY6, LOW);
digitalWrite(RELAY7, LOW);
digitalWrite(RELAY8, LOW);
}
คำอธิบายโค้ด
- เงื่อนไขควบคุมรีเลย์
- รีเลย์ 1: เปิดเมื่ออุณหภูมิเกิน 30°C
- รีเลย์ 2: เปิดเมื่อความชื้นเกิน 60%
- รีเลย์ 3-5: เปิดเมื่อค่าจากเซ็นเซอร์อนาล็อกแต่ละตัวเกินค่าที่กำหนด
- รีเลย์ 6-8: ใช้เงื่อนไขรวมจากค่าเซ็นเซอร์
- การคำนวณแรงดันไฟฟ้าจากเซ็นเซอร์อนาล็อก
- ค่าอนาล็อกจาก ESP32 มีช่วง 0-4095 ซึ่งแปลงเป็นแรงดันไฟฟ้าได้ด้วยสูตร:
- ค่าอนาล็อกจาก ESP32 มีช่วง 0-4095 ซึ่งแปลงเป็นแรงดันไฟฟ้าได้ด้วยสูตร:
- การแสดงผลใน Serial Monitor
- ใช้ตรวจสอบค่าที่อ่านได้จากเซ็นเซอร์ทั้งหมด
การแก้ปัญหา
- “Failed to read from DHT sensor!”
- ตรวจสอบการเชื่อมต่อขาเซ็นเซอร์ DHT และตัวต้านทาน Pull-up ระหว่าง DATA กับ VCC
- รีเลย์ไม่ทำงาน
- ตรวจสอบแรงดันไฟฟ้าและการต่อขาสัญญาณระหว่าง ESP32 และโมดูลรีเลย์
- ค่าของเซ็นเซอร์ไม่ถูกต้อง
- ตรวจสอบแหล่งจ่ายไฟของเซ็นเซอร์ และความถูกต้องของการต่อสาย