STM32 วัดอุณหภูมิ และความชื้น แสดง ออกทางหน้าจอ LCD

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

ประโยชน์และการนำโปรเจคไปพัฒนาต่อ


เช่น..เครื่องควบคุมอุณหภูมิเป็นอุปกรณ์ที่ใช้ในการควบคุมอุณหภูมิให้ได้ตามค่าอุณหภูมิที่กำหนดไว้ โดยจะนำมาใช้ในการสั่งการให้กับอุปกรณ์สำหรับทำความร้อนหรืออุปกรณ์ทำความเย็น ทำงาน ตามที่ได้ตั้งค่าอุณหภูมิไว้ การนำมาใช้งานและการควบคุมก็ขึ้นอยู่กับจุดประสงค์ของการใช้งาน

เครื่องวัดอุณหภูมิก็จะมีส่วนที่รับอุณหภูมิ (Input) จากหัววัดอุณหภูมิ หรือที่เรียกกันว่าเซ็นเซอร์วัดอุณหภูมิแล้วมาแสดงผลที่หน้าจอ Display พร้อมกับควบคุมอุณหภูมิให้ได้ตามค่าที่ได้กำหนดไว้ หากอุณหภูมิไม่ได้ตามที่กำหนดไว้ก็จะมีในส่วนของการสั่งงาน (Output) สั่งงานให้อุปกรณ์สำหรับทำความร้อนหรืออุปกรณ์ทำความเย็นทำงานให้ได้ตามค่าที่กำหนดไว้

เหมาะสำหรับงานใน ห้องควบคุมอุณหภูมิความชื้น, อุตสาหกรรมอาหาร,ห้องอบ, ห้องแช่เย็น,ห้องแล็ป,ห้องควบคุมระบบคอมพิวเตอร์, Clean Room, Warehouse ที่มี ปัญหาในการควบคุมอุณหภูมิ หรือความชื้น ทำให้เกิดความเสียหายต่ออุปกรณ์ หรือวัสดุที่ต้องการควบคุมอุณหภูมิ ความชื้น เป็นต้น



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

1 : ทดสอบการใช้งาน STM32 รุ่น STM32F103C8T6

ทดสอบการใช้งานเบื้องต้นของบอร์ด STM32 รุ่น STM32F103C8T6 ตามลิงค์ด้านล่าง


2 : ทดสอบการใช้งานจอ LCD 16×2

ทดสอบการใช้งานเบื้องต้นของบอร์ด STM32 รุ่น STM32F103C8T6 กับ จอ LCD 16×2 ตามลิงค์ด้านล่าง



3 : เชื่อมต่อ เซ็นเซอร์ DHT11

เชื่อมต่อสายระหว่าง เซ็นเซอร์ DHT11 กับ STM32 ตามรูปด้านล่าง

เชื่อมต่อ เซ็นเซอร์ DHT11 STM32



4 : ติดตั้งไลบรารี เซ็นเซอร์ DHT11


สำหรับการใช้งานเซ็นเซอร์ DHT11 ต้องติดตั้งไลบรารี DHT sensor library เพิ่มเข้าไปที่ Arduino IDE

ดาวน์โหลดไลบรารีได้ที่ :  DHT11 library.

ไปที่ Code -> Download ZIP

DHT11 ไปที่ Code -> Download ZIP



ไปที่ Sketch -> Include Library -> Add .ZIP Library…


ไปที่ ไลบรารี DHT-sensor-library-master.zip ที่เรา ดาวน์โหลด มา -> Open

ไปที่ ไลบรารี DHT-sensor-library-master.zip ที่เรา ดาวน์โหลด มา -> Open


ตรวจสอบที่ Sketch -> Include Library  จะพบ ไลบรารี DHT sensor library เพิ่มเข้ามาใน Arduino IDE ของเรา


ไปที่ Tools -> Manage Libraries…

ไปที่ Tools -> Manage Libraries...


ไปที่ช่องค้นหา พิมพ์ DHT  (เพื่อค้นหา DHT sensor library)

ไปที่ช่องค้นหา พิมพ์ DHT  (เพื่อค้นหา DHT sensor library)


เลื่อนเมาส์ไปที่ DHT sensor library เลือกเวอร์ชัน แล้ว คลิก Install

เลื่อนเมาส์ไปที่ DHT sensor library เลือกเวอร์ชัน แล้ว คลิก Install

เลื่อนเมาส์ไปที่ DHT sensor library เลือกเวอร์ชัน แล้ว คลิก Install



คลิก Install all

คลิก Install all


INSTALLED แสดงการติดตั้งสำเร็จ

INSTALLED แสดงการติดตั้งสำเร็จ


5 : อธิบายโค้ด

เริ่มแรกเรียกใช้ไลบรารีที่จำเป็น เช่น Wire.h สำหรับการใช้ I2C ใน STM32F103C8, LiquidCrystal_I2C.h สำหรับการใช้จอแสดงผล LCD ประเภท I2C และ DHT.h สำหรับการใช้ฟังก์ชันเซ็นเซอร์ DHT11

#include <Wire.h>      
#include <LiquidCrystal_I2C.h>  
#include <DHT.h>   


ตอนนี้ชื่อขาของ DHT11 (ขาออก) ที่เชื่อมต่อกับ PA1 ของ STM32F103C8 ถูกกำหนดแล้ว

#define DHTPIN PA1


และยังกำหนด DHTTYPE เป็น DHT11

#define DHTTYPE DHT11


ถัดไปออบเจ็กต์ lcd สำหรับคลาส LiquidCrystal_I2C ที่มีที่อยู่ I2C ส่วนมากจะมี address เป็น 0x27 หรือบางรุ่นจะเป็น 0x3F ของจอแสดงผล รุ่น LCD 16×2 (หมายถึงใน 1 แถว มีตัวอักษรใส่ได้ 16 ตัว และมีทั้งหมด 2 บรรทัดให้ใช้งาน) จะเริ่มต้น

LiquidCrystal_I2C lcd(0x27, 16, 2); 


เตรียมใช้งาน DHT11 ด้วย object dht สำหรับคลาส DHT ที่มีชื่อขาของ DHT เชื่อมต่อกับ STM32 และประเภทของ DHT

DHT dht(DHTPIN, DHTTYPE);


ถัดไปใน void setup ():

ขั้นแรกให้เริ่มต้น LCD โดยโค้ดนี้

lcd.begin();


จากนั้นใช้โค้ดด้านล่างเพื่อเริ่มรับค่าอุณหภูมิและความชื้นจากเซ็นเซอร์ DHT11

dht.begin(); 


เปิดไฟแบล็กไลต์และพิมพ์ข้อความต้อนรับและลบออกหลังจาก 3 วินาที

lcd.backlight();     
lcd.setCursor(0,0);
lcd.print("LUNGMAKER.COM");
lcd.setCursor(0,1);
lcd.print("DHT11 with STM32");
delay(3000);
lcd.clear();


ถัดไปใน void loop ():

ค่าจะได้รับจากเซ็นเซอร์ DHT11 อย่างต่อเนื่อง เพื่อให้ได้ค่าอุณหภูมิและความชื้นที่แยกจากกันและเก็บไว้ในตัวแปรต่อไปนี้จะใช้คำสั่ง

เพื่อให้ได้ค่าความชื้นเท่านั้น

float h = dht.readHumidity();  


เพื่อให้ได้ค่าอุณหภูมิเท่านั้น

float t = dht.readTemperature(); 


และสุดท้ายพิมพ์ออกที่จอ LCD 16X2

  lcd.setCursor(0,0);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print("Humid: ");
  lcd.print(h);
  lcd.print(" %");


6 : อัพโหลดโค้ด วัดอุณหภูมิ และความชื้น ให้กับ STM32

ย้ายจั้มเปอร์สีเหลืองด้านบนให้มาอยู่อีกฝั่ง จาก โหมดใช้งาน เปลี่ยนเป็น โหมดอัพโหลดโปรแกรม

โหมดอัพโหลดโปรแกรม STM32


เขียนโปรแกรมและอัพโหลดโค้ดด้านล่างนี้ ไปที่ STM32


#include <Wire.h>  
#include <LiquidCrystal_I2C.h>
#include <DHT.h>

#define DHTPIN PA1 

#define DHTTYPE DHT11

LiquidCrystal_I2C lcd(0x27, 16, 2);

DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  lcd.begin();
  dht.begin(); 
  lcd.backlight(); 
  lcd.setCursor(0,0);
  lcd.print("LUNGMAKER.COM");
  lcd.setCursor(0,1);
  lcd.print("DHT11 with STM32");
  delay(3000);
  lcd.clear();
}

void loop()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  lcd.setCursor(0,0);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print("Humid: ");
  lcd.print(h);
  lcd.print(" %");
}

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>

#define DHTPIN PA1

#define DHTTYPE DHT11

LiquidCrystal_I2C lcd(0x27, 16, 2);

DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  lcd.begin();
  dht.begin();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("LUNGMAKER.COM");
  lcd.setCursor(0, 1);
  lcd.print("DHT11 with STM32");
  delay(3000);
  lcd.clear();
}

void loop()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" C");
  lcd.setCursor(0, 1);
  lcd.print("Humid: ");
  lcd.print(h);
  lcd.print(" %");
}
#include <Wire.h>  
#include <LiquidCrystal_I2C.h>
#include <DHT.h>

#define DHTPIN PA1 

#define DHTTYPE DHT11

LiquidCrystal_I2C lcd(0x27, 16, 2);

DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  lcd.begin();
  dht.begin(); 
  lcd.backlight(); 
  lcd.setCursor(0,0);
  lcd.print("LUNGMAKER.COM");
  lcd.setCursor(0,1);
  lcd.print("DHT11 with STM32");
  delay(3000);
  lcd.clear();
}

void loop()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  lcd.setCursor(0,0);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print("Humid: ");
  lcd.print(h);
  lcd.print(" %");
}

อัพโหลดโปรแกรมลงบอร์ด STM32


กดปุ่ม RESET 1 ครั้ง

กดปุ่ม RESET  STM32 1 ครั้ง


คลิกที่ Upload รอจนกระทั่งขึ้น Done uploading. ที่แถบด้านล่าง และ บรรทัดสุดท้าย ด้านล่างสุดขึ้นคำว่า done. แสดงว่าเราอัพโหลดโปรแกรมลงบอร์ด STM32 ได้สำเร็จแล้ว

อัพโหลดโปรแกรมลงบอร์ด STM32


STM32 วัดอุณหภูมิ และความชื้น



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

ย้ายจั้มเปอร์สีเหลืองด้านบน จาก โหมดอัพโหลดโปรแกรม เปลี่ยนเป็น โหมดใช้งาน

โหมดอัพโหลดโปรแกรม STM32


กดปุ่ม RESET 1 ครั้ง

กดปุ่ม RESET STM32 1 ครั้ง

ผลลัพธ์การทำงาน บรรทัดบนแสดง Temp : ตามด้วยอุณหภูมิที่วัดได้ และ บรรทัดล่างแสดง Humid : ตามด้วยความชื้นที่วัดได้ แสดงว่าโปรเจคสำเร็จแล้ว

STM32 วัดอุณหภูมิ และความชื้น


STM32 วัดอุณหภูมิ และความชื้น



8 : เพิ่มการแจ้งเตือน ด้วยออด Buzzer


ให้เซ็นเซอร์วัดอุณหภูมิ DHT11 เป็นส่วนที่รับอุณหภูมิ (Input) ส่งให้ บอร์ด STM32 สั่งให้แสดงค่าอุณหภูมิที่วัดได้ ที่บรรทัดที่ 1 ของหน้าจอ LCD Display และ ต้องการควบคุมอุณหภูมิให้ได้ตามค่าที่ได้กำหนด โดยการเขียนโค้ดกำหนดไว้ โดยให้แสดงที่บรรทัดที่ 2 ของหน้าจอ LCD Display

โดยเมื่ออุณหภูมิวัดค่าได้เท่ากับหรือมากกว่าค่าที่กำหนดในตัวอย่างคือ 40 องศาเซลเซียส STM32 จะไปสั่งงาน (Output) คือ ให้ออด Buzzer แสดงการแจ้งเตือน และเมื่ออุณหภูมิวัดค่าได้น้อยกว่า 40 องศาเซลเซียส ให้ ออด Buzzer หยุดการแจ้งเตือน


ย้ายจั้มเปอร์สีเหลืองด้านบนให้มาอยู่อีกฝั่ง จาก โหมดใช้งาน เปลี่ยนเป็น โหมดอัพโหลดโปรแกรม จากนั้นเขียนโปรแกรมและอัพโหลดโค้ดด้านล่างนี้ ไปที่ STM32

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>

#define DHTPIN PA1

#define DHTTYPE DHT11

LiquidCrystal_I2C lcd(0x27, 16, 2);

DHT dht(DHTPIN, DHTTYPE);

int relay_1 = PC13;

void setup()
{
  lcd.begin();
  dht.begin();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("LUNGMAKER.COM");
  lcd.setCursor(0, 1);
  lcd.print("DHT11 with STM32");
  delay(3000);
  lcd.clear();
  pinMode(relay_1, OUTPUT);
  digitalWrite(relay_1, HIGH);

}

void loop()
{
  float t_set = 40;
  float t = dht.readTemperature();
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" C");
  lcd.setCursor(0, 1);
  lcd.print("Set : ");
  lcd.print(t_set);
  lcd.print(" C");

  if (t >= t_set) {
    digitalWrite(relay_1, HIGH);
  }
  else {
    digitalWrite(relay_1, LOW);
  }
}


เชื่อมต่อสายระหว่าง เซ็นเซอร์ Buzzer กับ STM32 ตามรูปด้านล่าง

เชื่อมต่อสายระหว่าง เซ็นเซอร์ Buzzer กับ STM32

ทดสอบการทำงาน โดยย้ายจั้มเปอร์สีเหลืองด้านบน จาก โหมดอัพโหลดโปรแกรม เปลี่ยนเป็น โหมดใช้งาน และ เพิ่มอุณหภูมิ เช่น .. ใช้ลมร้อนจากไดร์เป่าผม เพิ่มอุณหภูมิให้กับ DHT11 โดยผลลัพธ์การทำงานถ้าได้ตามคลิปด้านบนสุด แสดงว่าโปรเจคสำเร็จตามความต้องการแล้ว

เพิ่มการแจ้งเตือน ด้วยออด Buzzer



9 : อุปกรณ์ที่ใช้


credit : https://circuitdigest.com/microcontroller-projects/interfacing-dht11-sensor-with-stm32f103c8