BME280: Temperature, Humidity, Pressure Sensor

ถ้าเป็นการหัดเขียนโปรแกรมทั่วไปหรือในคลาสสอนเขียนโปรแกรม โปรแกรมแรกที่เขียนก็คงหนีไม่พ้น Hello World แต่สำหรับคนที่หัดเล่น microcontroller แล้วก็คงหนีไม่พ้นโปรแกรมไฟกระพริบ จะกระพริบ On board / Internal LED หรือต่อ LED ภายนอกก็แล้วแต่ เพื่อที่อย่างน้อยก็จะทดสอบว่าบอร์ดที่เราใช้งานนั้นสามารถ Upload Code ได้และในส่วนของ i/o นั้นทำงานได้อย่างถูกต้อง

ถัดมาก็คือการต่อเซนเซอร์ภายนอกเพื่ออ่านค่าหรือควบคุมสวิทช์ไฟหรือ Relay อาจจะเรียกว่าเป็นสูตรสำเร็จถัดจากไฟกระพริบเลยก็ว่า ซึ่งถ้าต่อยอดจาก Hello World แล้วมาทางการอ่านค่า Input จากเซนเซอร์ก็คงหนีไม่พ้น การวัดอุณหูมิและความชื้นในอากาศ และเจ้าเซนเซอร์ยอดฮิตที่นิยมใช้กันก็คือ DHT22 ซึ่งก็ใช้สายเพียงแค่เส้นเดียวในการอ่านค่า

ถามว่า DHT22 ดีมั้ย ก็ถือว่าดีในระดับหนึ่งแหละ แต่บางคนอาจจะเจอปัญหาใช้งานไปนานๆเริ่มจะอ่านค่าได้บ้างไม่ได้บ้าง หรือว่าได้ค่าความชื้นมากกว่า 80% และที่สำคัญยังกินกระแสค่อนข้างสูง (2.5mA max current use during conversion while requesting data)

ถ้าไม่เอา DHT22 แล้ว จะใช้ตัวไหนดี ในตลาดมีให้เลือกหลายตัวเลยครับ SHT71, ds18b20 ที่มักมาพร้อมกับปลอกหุ้มกันน้ำไว้วัดอุณหภูมิของเหลว และพระเอกของเราในวันนี้ BME280 ที่วัดได้ทั้งอุณหภูมิ ความชื้น และความกดอากาศด้วย ที่สำคัญกินกระแสต่ำแค่ 3.6 μA

ฉะนั้นวันนี้เราจะมาทดลองใช้งาน BME280 กับ Nodemcu กัน การใช้งาน BME280 รุ่นที่เห็นอยู่ด้านบนนี้ (Chinese Version) จะใช้การเชื่อมต่อแบบ i2c ในการอ่านข้อมูลจากเซนเซอร์ ซึ่งถ้าใครที่ใช้ DHT22 อยู่แล้วต้องการจะเปลี่ยนมาใช้ BME280 ก็ต้องใช้สายเพิ่มอีก 1 เส้นและทำการ wiring กับ Nodemcu ใหม่ตามขาด้านล่างเลยครับ

จากนั้นที่โปรแกรม Arduino IDE ให้เข้าไปที่ Library Manager แล้ว Search คำว่า BME280 จะเจอกับ Adafruit BME280 ก็กด Install กันได้เลย

 

เมื่อทำการติดตั้งเรียบร้อยแล้วก็โหลดตัวอย่าง BME280test มาดูกัน

 

โค้ดหลักๆที่จำเป็นก็จะเป็นการเรียกใช้งาน Library การประกาศตัวแปร ซึ่งจากตัวอย่างที่ให้มานั้นก็มีส่วนที่ใช้สำหรับ BME280 บางรุ่นที่รองรับการเชื่อมต่อแบบ SPI มาด้วย แต่งานนี้ของเราคุยผ่าน i2c ก็สามารถตัดทิ้งได้เลยดังนั้นโค้ดที่ใช้งานจริงๆจะเหลือแค่นี้เองครับ

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>


#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C

unsigned long delayTime;

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

    bool status;
    
    // default settings
    // (you can also pass in a Wire library object like &Wire2)
    status = bme.begin();  
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
    
    Serial.println("-- Default Test --");
    delayTime = 1000;

    Serial.println();
}


void loop() { 
    printValues();
    delay(delayTime);
}


void printValues() {
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");

    Serial.print("Pressure = ");

    Serial.print(bme.readPressure() / 100.0F);
    Serial.println(" hPa");

    Serial.print("Approx. Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");

    Serial.print("Humidity = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");

    Serial.println();
}

หลังจากนั้นก็ Compile แล้ว Upload ไปที่ Nodemcu ของเรากันเลย ถ้าการทำงานเป็นไปอย่างถูกต้อง เมื่อเปิด Serial Monitor ขึ้นมาเราจะเจอกับประโยคที่ว่า “Could not find a valid BME280 sensor, check wiring!” อ้าววว เห้ยยยย

นี่เราโดนพี่จีนหลอกขายเซนเซอร์เจ๊งหรือเนี่ย หรือว่าต่อสายผิด หรือว่า Library มีปัญหา คำตอบของคำถามนี้ก็คือ i2c address ของ Library และ เซนเซอร์ของเรานั้นไม่ตรงกันครับ ซึ่งการเชื่อมต่อแบบ i2c นั้นจะมี address ในการอ้างอิงว่าเราต้องการคุยกับอุปกรณ์ไหน แล้วเราจะรู้ได้ไงว่า address ของเซนเซอร์เรานั้นคืออะไร ซึ่งสามารถทำได้ 2 วิธีคือ

  • เปิดคู่มือ หรือ Datasheet หรือถามจากคนขาย
  • i2c scanner

และไหนๆเขียนแล้ว คงไม่ไล่ให้คนอ่านไปถามจากคนขายแน่นอน เราก็จะใช้โปรแกรมในการสแกนหา address ของเจ้า BME280 (Chinese Version) แล้วมาดูผลลัพท์กันครับ ซึ่งโปรแกรมนี้ก็สามารถใช้ในการหา i2c address ของอุปกรณ์อื่นๆได้เช่นกัน

โปรแกรม i2c Scanner

#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             //wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(3000);           // wait 5 seconds for next scan
}

 

เมื่อ Compile และ Upload Code ของ i2c scanner ไปยัง Nodemcu ของเรากันแล้ว ให้เปิดหน้า Serial Monitor ขึ้นมาก็จะได้ผลลัพท์แบบด้านล่างนี้ครับ

ในที่สุดเราก็รู้แล้ว่า address ของเซนเซอร์ BME280 นั้นคือ 0x76

 

คราวนี้เราก็มาดูที่ Library ของเรากันบ้างว่า address ที่กำหนดไว้เป็นอะไร ให้เข้าไปที่ Library Folder ของ Adafruit BME280 เพื่อแก้ไขไฟล์ Adafruit_BME280.h โดยจะเปิดจาก Notepad, TextEdit, Editplus หรือโปรแกรมอะไรก็แล้วแต่ถนัดเลยครับ

 

ทำการแก้ไข Address ของ BME280 จาก 0x77 ให้เป็น 0x76 แล้วทำการ save แค่นี้ก็เรียบร้อย

 

จากนั้นก็เปิดตัวอย่าง BME280test ขึ้นมาใหม่ Compile และ Upload กันอีกรอบ รับรองว่าอันนี้ไม่โดนหลอกละ ต้องได้ผลแบบด้านล่างนี้แน่นอนครับ

ถ้าใครเคยใช้งาน DHT22 ในการอ่านค่าอุณหภูมิและความชื้นมาก่อน จะสังเกตุได้อย่างนึงก็คือ ความเร็วในการอ่าน DHT22 นั้นจะอ่านค่าแบบถี่ๆไม่ได้ หรือบางครั้งการอ่านค่าก็ไม่สามารถอ่านได้เช่นกัน ฉะนั้นตอนนี้เราก็มีทางเลือกเพิ่มขึ้นมาอีกตัวกับ BME280 ที่นอกจากจะอ่านค่าอุณหภูมิ ความชื้นได้แล้ว ยังสามารถอ่านค่าความกดอากาศได้อีกด้วย ซึ่งความกดอากาศนี้ก็สามารถนำมาแปลงเป็นความสูงได้ด้วย ใครสนใจก็ลองหามาทดลองใช้กันดูได้ครับ

 

Author: Joe D.S.
Just a man on earth

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.