โปรเจค ESP32 วัดอุณหภูมิและความชื้น + PM2.5

บทความนี้เราจะเรียนรู้วิธีการเชื่อมต่อเซ็นเซอร์อุณหภูมิและความชื้นยอดนิยม DHT11 กับไมโครคอนโทรลเลอร์ ESP32 โดย DHT11 เป็นเซ็นเซอร์วัดอุณหภูมิและความชื้น เพื่อวัดอุณหภูมิและความชื้นของบรรยากาศในสภาพแวดล้อมเฉพาะหรือในพื้นที่ปิดที่ จำกัด และเพิ่ม เซ็นเซอร์วัดฝุ่น PM2.5 Keyestudio GP2Y1014AU ของ Sharp โดยเซ็นเซอร์ฝุ่นนี้มีขนาดเล็กและสามารถตรวจจับฝุ่นละอองและอนุภาคควันในสิ่งแวดล้อมได้ ใช้พลังงานน้อยมากในขณะที่ทำงานจึงเหมาะอย่างยิ่งสำหรับระบบตรวจสอบที่เปิดตลอดเวลา ซึ่งทั้ง 2 เซ็นเซอร์มักใช้ในการตรวจสอบพารามิเตอร์ด้านสิ่งแวดล้อมในหลาย ๆ แอปพลิเคชันเช่นการเกษตรอุตสาหกรรมอาหารโรงพยาบาลรถยนต์สถานีตรวจอากาศเป็นต้น

รายการอุปกรณ์


ขั้นตอนการทํางาน

1 : โปรแกรมแรก กับ Keyestudio ESP32



สวัสดีชาวโลก (Hello World) คือ คำง่าย ๆ สำหรับการเขียนโปรแกรมแรกของโปรแกรมเมอร์ เป็นโปรแกรมคอมพิวเตอร์พื้นฐานที่ทำการแสดงผลคำว่า “Hello world” บนอุปกรณ์แสดงผล ซึ่งเป็นหนึ่งในโปรแกรมที่ง่ายที่สุดเท่าที่จะเป็นไปได้ในการเขียนภาษาโปรแกรมต่างๆ ตามขั้นตอนลิงค์ด้านล่าง


2 : ทดสอบใช้งาน จอ LCD 20×4 กับ Keyestudio ESP32


จอ LCD ขนาด 20×4 หมายถึงใน 1 แถว มีตัวอักษรใส่ได้ 20 ตัว และมีทั้งหมด 4 บรรทัดให้ใช้งาน โดยจอ LCD ปกติจะใช้สายไฟหลายเส้นในการต่อใช้งาน แต่โมดูล LCD2004 I2C ที่เลือกใช้ จะมีวงจรแปลงสัญญาณสำหรับติดต่อจอ LCD แบบอินเตอร์เฟส I2C ต่อแปลงการใช้สายไฟหลาย ๆ เส้น ให้เหลือสายไฟเพียง 2 เส้น ทำให้การเขียนโปรแกรมและการต่อวงจรทำได้ง่ายขึ้น เพียงแค่ใช้โมดูล LCD2004 I2C ไปต่อกับจอ LCD แบบเดิม ก็สามารถใช้งานได้ทันที โมดูล I2C LCD นี้จะมีตัวต้านทานปรับค่าได้สำหรับปรับความสว่างหน้าจอมาด้วย

เชื่อมต่อ I2C LCD เข้ากับ Keyestudio ESP32-IO Shield ตามรูปด้านล่าง

โปรเจค ESP32 เครื่องวัดฝุ่น PM2.5



สำหรับการใช้งานโมดูล I2C LCD ต้องติดตั้งไลบรารี LiquidCrystal_I2C เพิ่มเข้าไปที่ Arduino IDE

ดาวน์โหลดไลบรารีได้ที่ : Arduino-LiquidCrystal-I2C-library-master

ไปที่ Code -> Download ZIP

ไลบรารี LiquidCrystal_I2C



เปิดโปรแกรม Arduino IDE ไปที่ Sketch -> Include Library -> Add .ZIP Library…

ไปที่ Sketch -> Include Library -> Add .ZIP Library…



ไปที่ ไลบรารี Arduino-LiquidCrystal-I2C-library-master.zip ที่เรา ดาวน์โหลด มา -> Open

ไลบรารี Arduino-LiquidCrystal-I2C-library-master.zip ที่เรา ดาวน์โหลด มา -> Open



ตรวจสอบที่ Sketch -> Include Library  จะพบ ไลบรารี Arduino-LiquidCrystal-I2C-library-master เพิ่มเข้ามาใน Arduino IDE ของเรา

ไลบรารี Arduino-LiquidCrystal-I2C-library-master เพิ่มเข้ามาใน Arduino IDE ของเรา


อัพโหลดโค้ดไปที่ Keyestudio ESP32 ตามโค้ดด้านล่างนี้

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {

  // initialize the LCD,
  lcd.begin();
  // Turn on the blacklight and print a message.
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0, 0); //
  lcd.print("LungMaker LCD2004 Test");
  lcd.setCursor (0, 1); //

  lcd.print("Please Wait - 3");
  lcd.setCursor (0, 1); //
  delay(1000);
  lcd.print("Please Wait - 2");
  delay(1000);
  lcd.setCursor (0, 1); //
  lcd.print("Please Wait - 1");
  delay(1000);
}

void loop() {

  // LungMaker.com LCD2004 with I2C custom code
  lcd.clear();// clearn previous values from screen
  lcd.setCursor (0, 0); //character zero, line 1
  lcd.print("LCD2004 I2C Example"); // print text

  lcd.setCursor (4, 1); //character 4, line 2
  lcd.print("LungMaker.com"); // print text

  lcd.setCursor (0, 2); //character 0, line 3
  lcd.print("Voltage: "); // print text
  float v = 8.254;// define or get voltage
  char VoltageStr[5];
  dtostrf(v, 5, 3, VoltageStr );
  lcd.setCursor (9, 2); //character 9, line 3
  lcd.print(VoltageStr); // print voltage
  lcd.setCursor (14, 2); //character 14, line 3
  lcd.print("V"); // print V at the end of voltage

  lcd.setCursor (0, 3); //character 0, line 4
  lcd.print("X: "); // print x
  float xdeg = -123.87;// define or get x degree (just example)
  lcd.setCursor (3, 3); //character 8, line 3
  lcd.print(xdeg); // print xdeg value


  lcd.setCursor (12, 3); //character 12, line 4
  lcd.print("Y: "); // print Y
  float ydeg = 32.8;// define or get y degree (just example)
  lcd.setCursor (15, 3); //character 15, line 4
  lcd.print(ydeg); // print ydeg value


  delay(1000);

}



ถ้ายังไม่เห็นตัวอักษร ให้ปรับความสว่างหน้าจอ LCD โดยใช้ไขควงหมุนปรับ Contrast ที่ R ปรับค่าได้สีฟ้า (ค่อยๆปรับจนกว่าจะเห็นตัวอักษร)

ปรับความสว่างหน้าจอ LCD


ผลลัพธ์การทำงาน แสดงตามรูปด้านล่าง แสดงว่าจอ LCD 20×4 พร้อมใช้งานกับ Keyestudio ESP32 แล้ว

การใช้งานจอ LCD2004 I2C 20x4  กับ Keyestudio ESP32
โปรเจค ESP32 เครื่องวัดฝุ่น PM2.5


3 : ทดสอบใช้งาน เซ็นเซอร์ DHT11


เชื่อมต่อ เซ็นเซอร์ DHT11 เข้ากับ Keyestudio ESP32-IO Shield ตามรูปด้านล่าง

ทดสอบใช้งาน เซ็นเซอร์ DHT11



ติดตั้งไลบรารี DHT sensor library


สำหรับการใช้งานเซ็นเซอร์ DHT11 ต้องติดตั้งไลบรารี DHT sensor library เพิ่มเข้าไปที่ Arduino IDE

ดาวน์โหลดไลบรารีได้ที่ :  DHT11 library.

ไปที่ Code -> Download ZIP

DHT11 ไปที่ Code -> Download ZIP



ไปที่ Sketch -> Include Library -> Add .ZIP Library…


ไปที่ ไลบรารี DHT-sensor-library-master.zip ที่เรา ดาวน์โหลด มา -> Open

ไปที่ ไลบรารี DHT-sensor-library-master.zip ที่เรา ดาวน์โหลด มา -> Open


ตรวจสอบที่ Sketch -> Include Library  จะพบ ไลบรารี DHT sensor library เพิ่มเข้ามาใน Arduino IDE ของเรา


ไปที่ Tools -> Manage Libraries…

ไปที่ Tools -> Manage Libraries...


ไปที่ช่องค้นหา พิมพ์ DHT  (เพื่อค้นหา DHT sensor library)

ไปที่ช่องค้นหา พิมพ์ DHT  (เพื่อค้นหา DHT sensor library)


เลื่อนเมาส์ไปที่ DHT sensor library เลือกเวอร์ชัน แล้ว คลิก Install

เลื่อนเมาส์ไปที่ DHT sensor library เลือกเวอร์ชัน แล้ว คลิก Install

เลื่อนเมาส์ไปที่ DHT sensor library เลือกเวอร์ชัน แล้ว คลิก Install



คลิก Install all

คลิก Install all


INSTALLED แสดงการติดตั้งสำเร็จ

INSTALLED แสดงการติดตั้งสำเร็จ



อัพโหลดโค้ดไปที่ Keyestudio ESP32 ตามโค้ดด้านล่างนี้


#include "DHT.h"
#define DHTPIN 27     // Digital pin connected to the DHT sensor


// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
// #define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}



เปิดหน้าต่าง Serial Monitor  โดยไปที่ Tools -> Serial Monitor


เปิดหน้าต่าง Serial Monitor

ที่มุมขวาล่าง ของ Serial Monitor เลือกเป็น 9600 baud ที่ Serial Monitor แสดงค่าอุณหภูมิและความชื้น ประมาณรูปด้านล่าง แสดงว่า เซ็นเซอร์ DHT11 พร้อมใช้งานแล้ว

เซ็นเซอร์ DHT11 พร้อมใช้งานแล้ว


4 : ทดสอบใช้งาน เซ็นเซอร์วัดฝุ่น PM2.5 GP2Y1014AU


เชื่อมต่อ เซ็นเซอร์วัดฝุ่น PM2.5 เข้ากับ Keyestudio ESP32-IO Shield ตามรูปด้านล่าง

เชื่อมต่อ เซ็นเซอร์วัดฝุ่น PM2.5 เข้ากับ ESP32


โปรเจค ESP32 เครื่องวัดฝุ่น PM2.5



อัพโหลดโค้ดไปที่ Keyestudio ESP32 ตามโค้ดด้านล่างนี้

int  measurePin  =  4;  
int  ledPower  =  16;   
int  samplingTime  =  280;
int  deltaTime  =  40;
int  sleepTime  =  9680;
float  voMeasured  =  0;
float  calcVoltage  =  0;
float  dustDensity  =  0;

void setup() {

  Serial.begin(115200);
  pinMode(ledPower, OUTPUT);
  Serial.print("******************  keyestudio  ******************\n");

}

void loop() {

  digitalWrite(ledPower, LOW); //  power  on  the  LED
  delayMicroseconds(samplingTime);
  voMeasured  =  analogRead(measurePin);  //  read  the  dust  value
  delayMicroseconds(deltaTime);
  digitalWrite(ledPower, HIGH); //  turn  the  LED  off
  delayMicroseconds(sleepTime);
  //  0  -  5V  mapped  to  0  -  1023  integer  values
  //  recover  voltage
  calcVoltage  =  voMeasured  *  (2.5  /  1024.0);
  dustDensity  =  170 * calcVoltage  -  0.1;
  Serial.print("The  dust  concentration  is:  ");
  Serial.print(dustDensity);
  Serial.print("  ug/m3\n");
  delay(1000);

}



เปิดหน้าต่าง Serial Monitor  โดยไปที่ Tools -> Serial Monitor

ไปที่ Tools -> Serial Monitor


ที่มุมขวาล่าง ของ Serial Monitor เลือกเป็น 115200 baud ที่ Serial Monitor แสดงค่าฝุ่น PM2.5 แสดงว่า เซ็นเซอร์วัดฝุ่น PM2.5 พร้อมใช้งานแล้ว

เซ็นเซอร์วัดฝุ่น PM2.5 พร้อมใช้งานแล้ว



5. อัพโหลดโค้ด โปรเจค ESP32 วัดอุณหภูมิและความชื้น + PM2.5



อัพโหลดโค้ดไปที่ Keyestudio ESP32 ตามโค้ดด้านล่างนี้



#include  <Wire.h>
#include  <LiquidCrystal_I2C.h>
LiquidCrystal_I2C  lcd(0x27, 20, 4);
#include "DHT.h"
#define DHTPIN 27     // Digital pin connected to the DHT sensor

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
// #define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

DHT dht(DHTPIN, DHTTYPE);

int  measurePin  =  4;
int  ledPower  =  16;
int  samplingTime  =  280;
int  deltaTime  =  40;
int  sleepTime  =  9680;
float  voMeasured  =  0;
float calcVoltage = 0;
float  dustDensity  =  0;


void setup() {

  // initialize the LCD,
  lcd.begin();
  // Turn on the blacklight and print a message.
  lcd.backlight();
  lcd.clear();

  //  Print  a  message  to  the  LCD.

  lcd.backlight();
  lcd.setCursor(2, 0);
  lcd.print("WEATHER  STATION");
  lcd.setCursor(4, 1);
  lcd.print("TEMP:");
  lcd.setCursor(15, 1);
  lcd.print("C ");
  lcd.setCursor(5, 2);
  lcd.print("HUM:");
  lcd.setCursor(15, 2);
  lcd.print("%");
  lcd.setCursor(1, 3);
  lcd.print("PM2.5:");
  lcd.setCursor(14, 3);
  lcd.print("ug/m3");

  pinMode(ledPower, OUTPUT);
  dht.begin();

}

void loop() {

  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  digitalWrite(ledPower, LOW); //  power  on  the  LED
  delayMicroseconds(samplingTime);
  voMeasured  =  analogRead(measurePin);  //  read  the  dust  value
  delayMicroseconds(deltaTime);
  digitalWrite(ledPower, HIGH); //  turn  the  LED  off
  delayMicroseconds(sleepTime);

  //  0  -  5V  mapped  to  0  -  1023  integer  values
  //  recover  voltage

  calcVoltage  =  voMeasured  *  (2.5  /  1024.0);
  dustDensity  =  170  *  calcVoltage  -  0.1;

  lcd.setCursor(9, 1);
  lcd.print(t);

  lcd.setCursor(9, 2);
  lcd.print(h);

  lcd.setCursor(7, 3);
  lcd.print(dustDensity);


  delay(1000);

}



6 : ผลลัพธ์การทำงาน

ที่จอ LCD แสดงค่า อุณหภูมิ , ความชื้น และ ค่าฝุ่น PM2.5 แสดงว่าโปรเจคสำเร็จตามความต้องการแล้ว

โปรเจค ESP32 วัดอุณหภูมิและความชื้น
โปรเจค ESP32 วัดอุณหภูมิและความชื้น