วันอาทิตย์ที่ 19 สิงหาคม พ.ศ. 2561

KC-TH-280 Integrated Environment Sensor vs DHT22

ผมได้รับ  KC-TH-280  Temperature & Humidity & Air Pressure sensor จาก Knowledge Centric Co.,Ltd. มาเมื่อสองวันก่อน องค์กรนี้เป็นองค์ของคนไทย 100 %  ครับ ในยุค Thailand 4.0 แบบนี้คงต้องถือโอกาสนี้คุยเกี่ยวกับผลงานคนไทยด้วยกันสักหน่อย

KC-TH-280 เป็น Integrated Environment sensor ใช้ BME280 จากค่าย Bosh  ที่มีคุณสมบัติที่ดีข้อหนึ่งที่ผมสนใจเป็นพิเศษคือ การมี noise ในข้อมูลต่ำ  noise จะถูกตีความว่าเป็นข้อมูลที่ไม่ให้ความหมาย (meaningless data) เปรียบได้กับเวลาเราสนทนากับคู่สนทนาในที่ค่อนข้างเงียบเราจะได้ความหมายมากกว่าการคุยในที่จอแจ ดังนั้นในการประมวลผลข้อมูลที่ได้จากการบันทึกข้อมูลจาก sensor ก็มักจะมีการทำให้ noise ลดลงเสียก่อน แต่หากเราได้ข้อมูลที่มีความเรียบมากมาแล้ว งานก็ง่ายขึ้น (noise data เป็นเรื่องที่เลี่ยงไม่ได้ แต่ทำให้ลดลงได้)





เนื่องจากผมสนใจในเรื่องความเรียบของข้อมูล ดังนั้นผมก็จะดูว่าข้อมูลที่ได้จาก KC-TH-280 มีความเรียบเป็นอย่างไรเมื่อเทียบกับ sensor ที่ใช้กันบ่อยในโครงงานทั่วไปคือ DHT22  โดยที่ทั้ง KC-TH-280 และ DHT22 จะต่อกับ Raspberry Pi ตัวเดียวกัน วัดค่าอุณหภูมิในสถานที่เดียวกัน (บนโต๊ะทำงานของผม)และวัดไปพร้อมๆกัน

เนื่องจาก  KC-TH-280 ใช้ interface แบบ I2C ดังนั้นก่อนใช้งานกับ Raspbian ต้องทำการ enable interface I2C เสียก่อน (ดูขั้นตอนจาก https://learn.sparkfun.com/tutorials/raspberry-pi-spi-and-i2c-tutorial#i2c-on-pi)

การเชื่อม DHT22 กับ Raspberry Pi ดูได้จากหลายแหล่งเช่น http://electronicshobbyists.com/temperature-and-humidity-sensor-dht22-raspberry-pi-interfacing/

สำหรับ GPIO control library ผมเลือกใช้ pigpio เพราะถนัดมือดี ลงตัวเดียวคุยกับ Sensor ได้หลายประเภท

เตรียมการเรื่องรอบข้างเสร็จแล้ว ก็มาเรื่อง code กัน ผมใช้ Python3.5 ที่มากับ Raspbian ครับ


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@author: Somchai Somphadung
"""

import pigpio
import time
import BME280
import DHT22
import asyncio

pi = pigpio.pi()

dht22 = DHT22.sensor(pi,23) # connect DHT22 to GPIO23
bme280 = BME280.sensor(pi)

start = time.time()
max_count = 600
interval = 30


def tic():
    return "at {}".format(time.time()-start)

async def get_bme280():
    with open('bme280.txt','wb') as f :
        for _ in range(max_count) :
            t_b, _, h_b = bme280.read_data()
            l = "{},{:.2f},{:.2f}\n".format(time.time(),h_b,  t_b)
            f.write(l.encode('utf-8'))
            await asyncio.sleep(interval)

async def get_dht22():
    with open('dht22.txt','wb') as f :
        for _ in range(max_count) :
            dht22.trigger()
            await asyncio.sleep(0.2)
            l = "{},{:.2f},{:.2f}\n".format(time.time(), dht22.humidity(), dht22.temperature())
            f.write(l.encode('utf-8'))
            await asyncio.sleep(interval)
   

loop = asyncio.get_event_loop()
tasks = [
         asyncio.ensure_future(get_bme280()),
         asyncio.ensure_future(get_dht22())
]

loop.run_until_complete(asyncio.wait(tasks))
loop.close()    
dht22.cancel()
bme280.cancel()
pi.stop()
    



ผลที่ได้


หลังจากทำการเก็บข้อมูลเป็นเวลา 5 ชั่วโมง โดยใช้ time interval ที่ 30 วินาที จะเห็นได้ว่าข้อมูลที่ได้จาก KC-TH-280  ให้ข้อมูลที่ต่างจาก DHT22 โดยประมาณ 0.5 C





ในการทดสอบอีกครั้งเพื่อจะเทียบกับค่าที่อ่านได้จาก Thermometer ชนิดที่ใช้ Alcohol แล้วจะเห็นว่า KC-TH-280 ต่างออกไปประมาณ 2 C  และ DHT22 ต่างออกไปประมาณ 1.5 C (อุญหภูมิส่วนที่เพิ่มจาก Thermometer alcohol น่าจะเป็นผลมาจาก self-heating ของตัว sensor )

มาดูค่า Relative Humidity (ปริมาณของไอน้ำที่อยู่ในอากาศขณะนั้นเทียบกับปริมาณไอน้ำสูงสุดที่อากาศสามารถเก็บไว้) กันบ้าง จากรูปจะเห็นได้ว่าในภาพรวมแล้วนอกจากเรื่องการให้ค่าที่ต่างกันค่อนข้างมากราว 10 %  ก็น่าจะใช้งานได้เหมือนกัน (ผมไม่มีไฮโกรมิเตอร์ให้เทียบค่า)


ปล. ที่นำมาเทียบกับ DHT 22 ไม่ได้มีวัตถุประสงค์ที่จะบอกว่าอะไรดีกว่าอะไรเพียงแต่ทำให้เห็นความต่างของข้อมูลที่จัดเก็บมาจาก sensor ที่ต่างกันเท่านั้น การจะเลือกใช้ sensor ไหนขึ้นกับดุลพินิจของผู้ใช้เอง สุดท้ายของต้องขอขอบคุณ Knowledge Centric Co.,Ltd. อีกครั้งที่ได้จัดส่งอะไรมาให้ได้ลองใช้งาน นะครับ











ไม่มีความคิดเห็น:

แสดงความคิดเห็น