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


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

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


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

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 : ทดสอบใช้งาน เซ็นเซอร์วัดฝุ่น 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 พร้อมใช้งานแล้ว



4. อัพโหลดโค้ด โปรเจคเครื่องวัดฝุ่น PM2.5



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


#include  <Wire.h>
#include  <LiquidCrystal_I2C.h>
LiquidCrystal_I2C  lcd(0x27, 20, 4); 
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(0, 0);
  lcd.print("The  dust ");
  lcd.setCursor(0, 1);
  lcd.print("concentration  is:");
  lcd.setCursor(7, 2);
  lcd.print("ug/m3");
  pinMode(ledPower, OUTPUT);


}

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;
  lcd.setCursor(0, 2);
  lcd.print(dustDensity);

  delay(1000);

}
#include  <Wire.h>
#include  <LiquidCrystal_I2C.h>
LiquidCrystal_I2C  lcd(0x27, 20, 4); 
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(0, 0);
  lcd.print("The dust ");
  lcd.setCursor(0, 1);
  lcd.print("concentration is:");
  lcd.setCursor(7, 2);
  lcd.print("ug/m3");
  pinMode(ledPower, OUTPUT);


}

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;
  lcd.setCursor(0, 2);
  lcd.print(dustDensity);

  delay(1000);

}
#include  <Wire.h>
#include  <LiquidCrystal_I2C.h>
LiquidCrystal_I2C  lcd(0x27, 20, 4); 
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(0, 0);
  lcd.print("The  dust ");
  lcd.setCursor(0, 1);
  lcd.print("concentration  is:");
  lcd.setCursor(7, 2);
  lcd.print("ug/m3");
  pinMode(ledPower, OUTPUT);


}

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;
  lcd.setCursor(0, 2);
  lcd.print(dustDensity);

  delay(1000);

}



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

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


ข้อมูลเปรียบเทียบกับคุณภาพอากาศ:

3000 + = Very Bad
1050-3000 = Bad
300-1050 = Ordinary
150-300 = Good
75-150 = Very Good
0-75 = Tiptop

นี่คือแผนภูมิเปรียบเทียบความเข้มข้นของฝุ่น
ตรวจสอบได้ไหมว่าค่าความเข้มข้นของฝุ่นอยู่ในระดับใด?

ในการทดสอบของเราตอนนี้ค่าที่วัดได้แสดงให้เห็นว่าคุณภาพอากาศดีมาก (Very Good)