โปรเจกต์ Air Quality Analyzer
วิเคราะห์ Air Quality ภายในบ้านและบันทึกค่าลงใน SD card
วิเคราะห์ Air Quality ภายในบ้านและบันทึกค่าลงใน SD card
คุณภาพของอากาศที่เราหายใจเข้าไปมีความสำคัญต่อสุขภาพของเรามาก อุปกรณ์นี้จะวิเคราะห์คุณภาพอากาศภายในบ้านและบันทึกค่าลงใน SD card การวิเคราะห์ค่าที่บันทึกไว้จะทำให้เราทราบถึงการเปลี่ยนแปลงของค่าต่างๆ ตามช่วงเวลาได้
ผมจะใช้ Sensor วัดอุณหภูมิ ความชื้น และคุณภาพอากาศที่มีราคาถูกพอสำหรับโปรเจกต์ประเภทนี้ โดยที่ยังให้ความแม่นยำในระดับที่ยอมรับได้ แนวคิดหลักของโปรเจกต์นี้คือการตรวจสอบว่าอากาศนั้นปลอดภัยต่อการหายใจหรือไม่
Sensor ที่เลือกใช้คือ:
ก่อนหน้านี้ผมเคยใช้ Arduino Uno และพบข้อจำกัดเรื่องหน่วยความจำ ครั้งนี้ผมจึงตัดสินใจใช้ Board อื่นแทน เนื่องจากผมต้องการ SD card เพื่อบันทึกค่าต่างๆ Adafruit Feather M0 Adalogger จึงเป็นตัวเลือกที่สมบูรณ์แบบในราคาที่เหมาะสม ($19.95):
ผมเริ่มจากการดาวน์โหลด Arduino IDE เวอร์ชันล่าสุดจาก https://www.arduino.cc/en/Main/Software โดยเลือก Windows installer หลังจากติดตั้งเสร็จแล้ว อย่าลืมอ่านคู่มือการใช้งานของ Adafruit Feather M0 Adalogger อย่างละเอียด
เพื่อให้สามารถใช้ Arduino IDE กับ Board นี้ได้ เราต้องตั้งค่า IDE ตามที่ระบุไว้ในคู่มือการใช้งาน Adafruit Feather M0 Adalogger โดยจำเป็นต้องเพิ่ม URL ในช่อง Additional Boards Manager URLs รวมถึงขั้นตอนง่ายๆ อื่นๆ ซึ่งทั้งหมดมีคำอธิบายอยู่ในคู่มือที่สามารถดูได้จาก:
เมื่อตั้งค่าทุกอย่างเรียบร้อยแล้ว (อย่าลืมเลือก Board และ Port ที่ถูกต้องใน IDE) ให้ลองทำการทดสอบง่ายๆ เพื่อเช็คว่าทุกอย่างทำงานปกติ ผมใช้ Code นี้:
void setup() {
pinMode(13, OUTPUT);// initialize digital pin 13 as an output.
}
void loop() {
digitalWrite(13, !digitalRead(13)); // flash the LED with inverse value
delay(500); // wait for a half a second
}
หลังจากส่ง Code นี้ไปยัง FEATHER M0 ADALOGGER แล้ว ไม่พบข้อผิดพลาดใดๆ และ LED สีแดงบน Board (ซึ่งต่อกับ Port 13) ก็เริ่มกะพริบ ทุกอย่างทำงานได้ปกติ
สิ่งแรกที่ผมเชื่อมต่อกับ Board คือหน้าจอ OLED ผมขอแนะนำอย่างยิ่งให้คุณอ่านเอกสารประกอบของหน้าจอได้ที่ https://cdn-learn.adafruit.com/downloads/pdf/monochrome-oled-breakouts.pdf
ผมเชื่อมต่อ Pins ของหน้าจอเข้ากับ Board ประมวลผลดังนี้:
จากนั้นให้ทำตามเอกสารของหน้าจอ OLED เพื่อติดตั้ง Library Adafruit SSD1306 และ Adafruit GFX แล้วจึงทำการ Restart Arduino IDE
สุดท้ายคุณสามารถรันตัวอย่างได้ที่ File→Sketchbook →Libraries→ Adafruit_SSD1306→ SSD1306_128x64_spi
ผมพบข้อผิดพลาดในการ Compile เกี่ยวกับความสูงของหน้าจอที่ไม่ถูกต้อง เนื่องจากไฟล์ Library SSD1306.h เป็นแบบค่าเริ่มต้น ผมจึงต้องแก้ไขไฟล์เพื่อเลือกความสูงที่ถูกต้องของหน้าจอ (64) โดยค้นหาบรรทัดที่เกี่ยวข้องและเลือกค่าที่ถูกต้องด้วยการใส่ Comment ในบรรทัดที่ไม่ต้องการ
// #define SSD1306_128_64
#define SSD1306_128_32
// #define SSD1306_96_16
ผมได้เปลี่ยน Pins เริ่มต้นเนื่องจากเกิดการชนกันของสัญญาณบางอย่าง ดังนั้นผมจึงต้องเปลี่ยนการกำหนดค่า Pins ใน Code ตัวอย่างเพื่อให้ตรงกับ Pins ที่ผมใช้งานจริง:
#define OLED_MOSI 6
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 5
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
หมายเหตุ: อย่าใช้ Pin digital 9 หากคุณวางแผนที่จะใช้การตรวจวัดแรงดันแบตเตอรี่ใน A7 เนื่องจาก Digital 9 และ A7 ใช้ Pin ร่วมกัน ผมพบปัญหานี้ด้วยวิธีที่ยากลำบาก หลังจากเสียเวลาหลายชั่วโมงกับค่า Vbat ที่ผิดเพี้ยนและพฤติกรรมที่ผิดปกติของหน้าจอ

เมื่อหน้าจอทำงานถูกต้องแล้ว คุณสามารถดำเนินการในส่วนถัดไปได้:
เชื่อมต่อ DHT 11 ตามแผนผัง (ห้ามใช้ Pin D13 บน Board เพื่ออ่านข้อมูลจาก DHT11 เนื่องจาก Pin D13 มี LED ต่ออยู่อย่างถาวร ทำให้มีความต้านทาน (Impedance) ต่ำ และไม่เหมาะกับการใช้งานประเภทนี้)

เราต้องใช้ Digital Pins ที่ยังว่างอยู่ โดยเราตัด D9 ออกเพราะชนกับ A7 ที่ใช้สำหรับอ่านค่า Vbat และตัด D13 เพราะมีวงจร LED ผมจะใช้ D19 เพื่อต่อกับ Pin 2 ของ DHT11 และอ่านค่าอุณหภูมิและความชื้นผ่านโปรโตคอล one wire โดย D19 นั้นระบุเป็น A5 บน Board แต่สามารถใช้เป็น Digital 19 ได้เช่นกัน อย่าลืมกำหนดค่า DHTpin ใน Software:
#define DHTPIN 19

การเชื่อมต่อ CCS811:
ผมใช้ Library Adafruit_CCS811 version 1.0.0 และทุกอย่างทำงานได้ดี
เพื่อให้สามารถบันทึกค่าต่างๆ ตามช่วงเวลาได้ ผมจึงใช้ uSD card ขนาด 512MB รุ่นเก่า Board Adalogger นี้ยอดเยี่ยมมากเพราะมีช่องเสียบ uSD Card มาให้ในตัว ผมใช้ Arduino library version 1.2.2 และใช้ Pin D4 เป็น CS pin สำหรับ SD ในรูปถัดไปผมจะแสดงรูปแบบของข้อมูลใน SD Card ซึ่งจะคั่นด้วยเครื่องหมายจุลภาค (Comma) เพื่อให้สามารถเปิดด้วยโปรแกรม Spreadsheet สำหรับการวิเคราะห์ได้

ในตัวอย่างนี้ ข้อมูลจะถูกบันทึกทุกๆ 5 นาที (300 วินาที) ค่าเวลานี้สามารถเปลี่ยนได้ง่ายใน Software โดยการแก้ไขบรรทัด:
#define SD_write_interval 300 //seconds between SD writes
เปลี่ยน 300 เป็นจำนวนวินาทีที่คุณต้องการให้บันทึกลง SD ง่ายๆ เพียงเท่านี้

ไฟล์จะอยู่ในรูปแบบ csv (comma separated values) หมายความว่าค่าทั้งหมดจะถูกแยกด้วยเครื่องหมายจุลภาค ทำให้สามารถนำเข้าสู่ Spreadsheet เพื่อการวิเคราะห์เพิ่มเติมได้โดยง่าย
การประทับเวลา (Time stamp) เป็นสิ่งจำเป็นสำหรับ Data-logger ในตอนนี้ผมกำลังใช้งานและประเมินผล RTC ภายในด้วย Library RTCZero
#include <RTCZero.h> //author=Arduino version=1.5.2
#include <RTClib.h> //author=Adafruit version=1.2.1
อย่างไรก็ตาม ผมใช้ RTClib เป็นส่วนเสริม สำหรับการเริ่มต้นใช้งาน RTC ผมใช้ Code ต่อไปนี้:
//RTC initialization
DateTime now;
now = (DateTime(F(__DATE__), F(__TIME__))); //compile time
now=now+20; //20s compensation for Compile + Reset time
rtc.begin(); // initialize RTCZero
rtc.setTime(now.hour(), now.minute(), now.second());
rtc.setDate(now.day(), now.month(), now.year()-2000);
สิ่งต่อไปที่ต้องทำคือหาวิธีปรับตั้งเวลา โปรดติดตามตอนต่อไป!
หากผู้ใช้ไม่ทราบเกณฑ์จำกัดของพารามิเตอร์คุณภาพอากาศ และไม่สนใจตัวเลข คงจะดีกว่าถ้าบอกแค่ว่าระดับนั้นปลอดภัยหรือไม่ การใช้ LED 3 ดวงเป็น Interface ที่เรียบง่ายกว่าและมีประโยชน์มากกว่า หากผู้ใช้เพียงแค่ต้องการทราบว่าเขาสามารถหายใจในอากาศนั้นได้หรือไม่ นั่นคือเหตุผลที่ผมตัดสินใจใช้ LED 3 ดวงนี้เพื่อแสดงระดับการเตือนที่แตกต่างกัน: เขียว, เหลือง หรือ แดง ระดับที่ใช้กระตุ้นการเตือนแต่ละขั้นสามารถตั้งโปรแกรมได้ตามข้อกำหนดในท้องถิ่น หากต้องการเปลี่ยนระดับ ให้แก้ไขบรรทัด Code ต่อไปนี้:
//Levels
//temp levels
#define low_temp_level_1 18
#define low_temp_level_2 12
#define low_temp_level_3 8
#define high_temp_level_1 29
#define high_temp_level_2 35
#define high_temp_level_3 40
//rh levels
#define low_rh_level_1 40
#define low_rh_level_2 30
#define low_rh_level_3 20
#define high_rh_level_1 70
#define high_rh_level_2 80
#define high_rh_level_3 90
//co2 levels
#define co2_level_1 1000
#define co2_level_2 1500
#define co2_level_3 3000
//TVOC levels
#define tvoc_level_1 100
#define tvoc_level_2 500
#define tvoc_level_3 1000
ค่าที่แสดงเป็นเพียงค่าเบื้องต้นและผมใช้เพื่อวัตถุประสงค์ในการทดสอบเท่านั้น
ตอนนี้ผมยังอยู่ในขั้นตอนการประเมินผล และหวังว่าจะมีใครบางคนอยากสร้างวงจรที่คล้ายกันเพื่อช่วยผมพัฒนา Data logger ที่มีประโยชน์นี้ให้ดียิ่งขึ้น
ลองดาวน์โหลด Code ไปเล่นกันดู และสนุกไปกับการอ่านค่า CO2 เหล่านั้น ผมต้องเปิดหน้าต่างตั้งหลายบานเพื่อให้อากาศดีขึ้นเลยล่ะ :)
อย่าลืมรอ 20 นาทีหลังจากเปิดเครื่อง เพื่อให้ได้ค่าที่ถูกต้องจาก CCS811 (นอกจากนี้ CCS811 ยังต้องการระยะเวลา burn-in 48 ชั่วโมงก่อนการใช้งานครั้งแรกด้วย)
ขอให้สนุกครับ
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้
ประเมิน Project
เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า
รีวิวจากคนใช้งานจริง
ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย
ยังไม่มีรีวิวบนหน้านี้ ถ้าเคยใช้งานหรือมีข้อเสนอแนะ เขียนเป็นคนแรกได้เลย