การเริ่มต้นใช้งาน ESP32 ใน Arduino IDE

1. ติดตั้ง Arduino IDE

  • ดาวน์โหลดและติดตั้ง Arduino IDE จากเว็บไซต์ Arduino.cc (แนะนำเวอร์ชันล่าสุด)

2. เพิ่ม Board Manager ของ ESP32

  1. เปิด Arduino IDE
  2. ไปที่ File > Preferences
  3. ในช่อง 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

  1. ไปที่ Tools > Board > Boards Manager
  2. ค้นหา ESP32
  3. เลือก “esp32 by Espressif Systems” และกด Install
  4. หลังติดตั้งเสร็จ คุณจะสามารถเลือกบอร์ด 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

  1. ไปที่ Tools > Board > ESP32 Arduino และเลือกบอร์ดที่คุณใช้งาน (เช่น ESP32 Dev Module)
  2. ไปที่ 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)

วิธีแก้ไข:

  1. กดปุ่ม BOOT บนบอร์ด ESP32 ค้างไว้ขณะอัปโหลดโปรแกรม
  2. ปล่อยปุ่ม 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

วิธีแก้ไข:

  1. ตรวจสอบสาย USB ว่าสามารถส่งข้อมูลได้ (บางสายมีแค่ฟังก์ชันชาร์จไฟ)
  2. ตรวจสอบไดรเวอร์ USB หากยังไม่มี ให้ติดตั้งไดรเวอร์ CP2102 หรือ CH340 ขึ้นอยู่กับชิป USB-to-Serial บนบอร์ด ESP32
  3. 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 ตัว

  1. เชื่อมต่อเซ็นเซอร์อนาล็อก 3 ตัวกับพิน ADC ของ ESP32:
    • เซ็นเซอร์ 1: ต่อขาสัญญาณที่ GPIO34
    • เซ็นเซอร์ 2: ต่อขาสัญญาณที่ GPIO35
    • เซ็นเซอร์ 3: ต่อขาสัญญาณที่ GPIO32
  2. ขา VCC ของเซ็นเซอร์ ต่อเข้ากับ 3.3V บน ESP32
  3. ขา 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 วินาที ก่อนอ่านค่าถัดไป
}

คำอธิบายโค้ด

  1. analogRead(pin)
    อ่านค่าจากพิน ADC (Analog-to-Digital Converter) ซึ่งคืนค่าในช่วง 0 ถึง 4095 (ความละเอียด 12 บิต)
  2. แปลงค่า ADC เป็นแรงดันไฟฟ้า:
    ESP32 ใช้แรงดันอ้างอิง (Vref) ที่ 3.3V ค่าแรงดันไฟฟ้าจึงคำนวณโดย:
voltage = (ADC_value / 4095.0) * 3.3;

3. Serial Monitor
เปิด Serial Monitor ใน Arduino IDE (Ctrl+Shift+M) เพื่อดูค่าที่อ่านจากเซ็นเซอร์

การแก้ปัญหา Error

  1. “GPIO pin not responding”
    • ตรวจสอบว่าขาที่ใช้สามารถทำงานในโหมด ADC ได้ (ESP32 บางขาไม่ได้รองรับ ADC)
    • ใช้เฉพาะพินที่ระบุใน ADC Pins Documentation
  2. “Values are always zero”
    • ตรวจสอบการเชื่อมต่อวงจรระหว่างเซ็นเซอร์กับ ESP32
    • ตรวจสอบว่าเซ็นเซอร์ใช้งานได้และได้รับไฟเลี้ยง
  3. “No output in Serial Monitor”
    • ตรวจสอบว่าเลือกพอร์ต COM และบอร์ด ESP32 อย่างถูกต้องใน Arduino IDE
    • ตรวจสอบว่าความเร็วบอดเรต (Baud Rate) ตรงกับในโค้ด (Serial.begin(115200))

การเชื่อมต่อ ESP32 กับเซ็นเซอร์ DHT11 หรือ DHT22 โดยใช้ไลบรารี DHT sensor library:

การติดตั้งไลบรารีที่จำเป็น

  1. เปิด Arduino IDE
  2. ไปที่ Tools > Manage Libraries
  3. ค้นหาและติดตั้งไลบรารีต่อไปนี้:
    • DHT sensor library โดย Adafruit
    • Adafruit Unified Sensor

การต่อวงจร

  1. ขาสัญญาณของ DHT11/DHT22 ต่อกับ GPIO4 ของ ESP32
  2. ขา VCC ต่อกับ 3.3V บน ESP32
  3. ขา GND ต่อกับ GND บน ESP32
  4. ใส่ตัวต้านทาน (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 วินาที
}

คำอธิบายโค้ด

  1. การกำหนดชนิดเซ็นเซอร์
    • หากใช้ DHT11 ให้เปลี่ยน #define DHTTYPE DHT22 เป็น #define DHTTYPE DHT11
  2. การอ่านค่าเซ็นเซอร์
    • dht.readHumidity() อ่านค่าความชื้นสัมพัทธ์ (%)
    • dht.readTemperature() อ่านค่าอุณหภูมิในหน่วย Celsius
  3. การตรวจสอบข้อผิดพลาด
    หาก isnan() คืนค่าเป็น true หมายถึงการอ่านค่าจากเซ็นเซอร์ล้มเหลว

การแก้ไขปัญหา

  1. “Failed to read from DHT sensor!”
    • ตรวจสอบสายไฟและการต่อขาระหว่าง DHT กับ ESP32
    • ตรวจสอบค่าความต้านทาน (Pull-up Resistor) ระหว่างขา DATA และ VCC
  2. เซ็นเซอร์ไม่ตอบสนอง
    • ตรวจสอบว่าขาสัญญาณของ DHT เชื่อมต่อกับ GPIO ที่รองรับบน ESP32
  3. ค่าน้อยผิดปกติหรือไม่แสดงค่า
    • ตรวจสอบว่าเซ็นเซอร์ได้รับไฟเลี้ยงเพียงพอ (3.3V)

การใช้ ESP32 เพื่อควบคุมรีเลย์ 5 ตัวตามเงื่อนไขที่ตั้งไว้ โดยข้อมูลเซ็นเซอร์ถูกนำมาประมวลผลเพื่อเปิดหรือปิดรีเลย์

การต่อวงจร

  1. รีเลย์
    • รีเลย์ตัวที่ 1: GPIO32
    • รีเลย์ตัวที่ 2: GPIO33
    • รีเลย์ตัวที่ 3: GPIO25
    • รีเลย์ตัวที่ 4: GPIO26
    • รีเลย์ตัวที่ 5: GPIO27
  2. เซ็นเซอร์
    • 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 วินาที
}

คำอธิบายโค้ด

  1. ควบคุมรีเลย์ตามค่า DHT
    • เปิด/ปิดรีเลย์ 1 และ 2 ตามค่าความชื้นและอุณหภูมิ
  2. ตรวจจับความเปลี่ยนแปลงของเซ็นเซอร์อนาล็อก
    • หากค่าความเปลี่ยนแปลงของเซ็นเซอร์เกินกว่า sensorChangeThreshold รีเลย์จะเปิด
  3. Serial Monitor
    • ใช้สำหรับตรวจสอบค่าอุณหภูมิ ความชื้น และแรงดันไฟฟ้าของเซ็นเซอร์

การแก้ปัญหา

  1. เซ็นเซอร์ DHT ไม่ตอบสนอง
    • ตรวจสอบว่าต่อวงจรถูกต้องและใช้ตัวต้านทาน Pull-up ระหว่าง DATA กับ VCC
  2. รีเลย์ไม่ทำงาน
    • ตรวจสอบแรงดันไฟฟ้าสำหรับรีเลย์ และการต่อวงจรขา IN กับ GPIO
  3. ค่าเซ็นเซอร์อนาล็อกไม่เปลี่ยนแปลง
    • ตรวจสอบแรงดันไฟฟ้าของเซ็นเซอร์ และการต่อขาสัญญาณ

การควบคุมรีเลย์ 5 ตัวโดยใช้ ESP32 ตามเงื่อนไขจากค่าอุณหภูมิ ความชื้น (จากเซ็นเซอร์ DHT22) และค่าความเปลี่ยนแปลงจากเซ็นเซอร์อนาล็อก 3 ตัว (เช่น Photoresistor, Potentiometer หรือเซ็นเซอร์อื่นๆ):


การต่อวงจร

  1. รีเลย์:
    • ต่อ GPIO ของ ESP32 กับขา IN ของรีเลย์ทั้ง 5 ตัว (เช่น GPIO12, GPIO13, GPIO14, GPIO25, GPIO26)
    • ต่อขา GND ของรีเลย์กับ GND ของ ESP32
    • ต่อขา VCC ของรีเลย์กับ 5V หรือ 3.3V (ขึ้นอยู่กับรีเลย์ที่ใช้)
  2. DHT22:
    • ต่อ DATA ของ DHT22 กับ GPIO4
    • ต่อ 3.3V และ GND เข้ากับ DHT22
  3. เซ็นเซอร์อนาล็อก 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);
}

คำอธิบายโค้ด

  1. ควบคุมรีเลย์ตามเงื่อนไข:
    • ใช้ค่าจาก DHT22 (อุณหภูมิและความชื้น) และค่าจากเซ็นเซอร์อนาล็อก 3 ตัวเพื่อตัดสินใจเปิด/ปิดรีเลย์
  2. ค่าควบคุมปรับเปลี่ยนได้:
    • ปรับค่าตามความเหมาะสม เช่น if (temperature > 30) หรือ sensor1Value > 2000
  3. Serial Monitor:
    • ใช้ดูค่าที่อ่านจากเซ็นเซอร์เพื่อการตรวจสอบ

ปัญหาที่อาจเกิดขึ้นและการแก้ไข

  1. รีเลย์ไม่ทำงาน:
    • ตรวจสอบการต่อสายระหว่าง GPIO กับขา IN ของรีเลย์
    • ตรวจสอบว่ารีเลย์ได้รับไฟเลี้ยงเพียงพอ
  2. DHT ไม่ตอบสนอง:
    • ใช้ตัวต้านทาน Pull-up ขนาด 10kΩ ระหว่างขา VCC และ DATA
  3. ค่าของเซ็นเซอร์อนาล็อกไม่เปลี่ยนแปลง:
    • ตรวจสอบว่าเซ็นเซอร์ได้รับไฟเลี้ยงเพียงพอ
    • ตรวจสอบพิน GPIO ว่ารองรับ ADC หรือไม่

การต่อวงจร

  1. เซ็นเซอร์อนาล็อก
    • เซ็นเซอร์ 1: ต่อที่ GPIO34
    • เซ็นเซอร์ 2: ต่อที่ GPIO35
    • เซ็นเซอร์ 3: ต่อที่ GPIO36
  2. DHT22/DHT11
    • ขาสัญญาณต่อที่ GPIO4
  3. รีเลย์ 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. เงื่อนไขควบคุมรีเลย์
    • รีเลย์ 1: เปิดเมื่ออุณหภูมิเกิน 30°C
    • รีเลย์ 2: เปิดเมื่อความชื้นเกิน 60%
    • รีเลย์ 3-5: เปิดเมื่อค่าจากเซ็นเซอร์อนาล็อกแต่ละตัวเกินค่าที่กำหนด
    • รีเลย์ 6-8: ใช้เงื่อนไขรวมจากค่าเซ็นเซอร์
  2. การคำนวณแรงดันไฟฟ้าจากเซ็นเซอร์อนาล็อก
    • ค่าอนาล็อกจาก ESP32 มีช่วง 0-4095 ซึ่งแปลงเป็นแรงดันไฟฟ้าได้ด้วยสูตร:
  3. การแสดงผลใน Serial Monitor
    • ใช้ตรวจสอบค่าที่อ่านได้จากเซ็นเซอร์ทั้งหมด

การแก้ปัญหา

  1. “Failed to read from DHT sensor!”
    • ตรวจสอบการเชื่อมต่อขาเซ็นเซอร์ DHT และตัวต้านทาน Pull-up ระหว่าง DATA กับ VCC
  2. รีเลย์ไม่ทำงาน
    • ตรวจสอบแรงดันไฟฟ้าและการต่อขาสัญญาณระหว่าง ESP32 และโมดูลรีเลย์
  3. ค่าของเซ็นเซอร์ไม่ถูกต้อง
    • ตรวจสอบแหล่งจ่ายไฟของเซ็นเซอร์ และความถูกต้องของการต่อสาย