โปรเจค ESP32 วัดอุณหภูมิและความชื้น + PM2.5
บทความนี้เราจะเรียนรู้วิธีการเชื่อมต่อเซ็นเซอร์อุณหภูมิและความชื้นยอดนิยม DHT11 กับไมโครคอนโทรลเลอร์ ESP32 โดย DHT11 เป็นเซ็นเซอร์วัดอุณหภูมิและความชื้น เพื่อวัดอุณหภูมิและความชื้นของบรรยากาศในสภาพแวดล้อมเฉพาะหรือในพื้นที่ปิดที่ จำกัด และเพิ่ม เซ็นเซอร์วัดฝุ่น PM2.5 Keyestudio GP2Y1014AU ของ Sharp โดยเซ็นเซอร์ฝุ่นนี้มีขนาดเล็กและสามารถตรวจจับฝุ่นละอองและอนุภาคควันในสิ่งแวดล้อมได้ ใช้พลังงานน้อยมากในขณะที่ทำงานจึงเหมาะอย่างยิ่งสำหรับระบบตรวจสอบที่เปิดตลอดเวลา ซึ่งทั้ง 2 เซ็นเซอร์มักใช้ในการตรวจสอบพารามิเตอร์ด้านสิ่งแวดล้อมในหลาย ๆ แอปพลิเคชันเช่นการเกษตรอุตสาหกรรมอาหารโรงพยาบาลรถยนต์สถานีตรวจอากาศเป็นต้น
รายการอุปกรณ์
- 1. Keyestudio ESP32 Development Board ESP32-WROOM-32
- 2. Keyestudio ESP32-IO Shield
- 3. Micro USB Cable Wire 1m for NodeMCU
- 4. LCD2004 I2C 20×4 Character LCD Display Module
- 5. Jumper (F2F) cable wire 30cm Female to Female
- 6. DHT11 Temperature and Humidity Sensor + PCB
- 7. เซ็นเซอร์วัดฝุ่น PM2.5 Keyestudio GP2Y1014AU
ขั้นตอนการทํางาน
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 ตามรูปด้านล่าง
สำหรับการใช้งานโมดูล I2C LCD ต้องติดตั้งไลบรารี LiquidCrystal_I2C เพิ่มเข้าไปที่ Arduino IDE
ดาวน์โหลดไลบรารีได้ที่ : Arduino-LiquidCrystal-I2C-library-master
ไปที่ Code -> Download ZIP
เปิดโปรแกรม Arduino IDE ไปที่ Sketch -> Include Library -> Add .ZIP Library…
ไปที่ ไลบรารี Arduino-LiquidCrystal-I2C-library-master.zip ที่เรา ดาวน์โหลด มา -> Open
ตรวจสอบที่ Sketch -> Include Library จะพบ ไลบรารี 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 20×4 พร้อมใช้งานกับ Keyestudio ESP32 แล้ว
3 : ทดสอบใช้งาน เซ็นเซอร์ DHT11
เชื่อมต่อ เซ็นเซอร์ DHT11 เข้ากับ Keyestudio ESP32-IO Shield ตามรูปด้านล่าง
ติดตั้งไลบรารี DHT sensor library
สำหรับการใช้งานเซ็นเซอร์ DHT11 ต้องติดตั้งไลบรารี DHT sensor library เพิ่มเข้าไปที่ Arduino IDE
ดาวน์โหลดไลบรารีได้ที่ : DHT11 library.
ไปที่ Code -> Download ZIP
ไปที่ Sketch -> Include Library -> Add .ZIP Library…
ไปที่ ไลบรารี DHT-sensor-library-master.zip ที่เรา ดาวน์โหลด มา -> Open
ตรวจสอบที่ Sketch -> Include Library จะพบ ไลบรารี DHT sensor library เพิ่มเข้ามาใน Arduino IDE ของเรา
ไปที่ Tools -> Manage Libraries…
ไปที่ช่องค้นหา พิมพ์ DHT (เพื่อค้นหา DHT sensor library)
เลื่อนเมาส์ไปที่ DHT sensor library เลือกเวอร์ชัน แล้ว คลิก Install
คลิก Install all
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 เลือกเป็น 9600 baud ที่ Serial Monitor แสดงค่าอุณหภูมิและความชื้น ประมาณรูปด้านล่าง แสดงว่า เซ็นเซอร์ DHT11 พร้อมใช้งานแล้ว
4 : ทดสอบใช้งาน เซ็นเซอร์วัดฝุ่น PM2.5 GP2Y1014AU
เชื่อมต่อ เซ็นเซอร์วัดฝุ่น PM2.5 เข้ากับ Keyestudio ESP32-IO Shield ตามรูปด้านล่าง
อัพโหลดโค้ดไปที่ 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
ที่มุมขวาล่าง ของ Serial Monitor เลือกเป็น 115200 baud ที่ Serial Monitor แสดงค่าฝุ่น 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 แสดงว่าโปรเจคสำเร็จตามความต้องการแล้ว