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 ตามรูปด้านล่าง
4 : ติดตั้งไลบรารี เซ็นเซอร์ DHT11
สำหรับการใช้งานเซ็นเซอร์ DHT11 ต้องติดตั้งไลบรารี DHT sensor library เพิ่มเข้าไปที่ Arduino IDE
ดาวน์โหลดไลบรารีได้ที่ : DHT11 library.
ไปที่ Code -> Download ZIP
ไปที่ Sketch -> Include Library -> Add .ZIP Library…
ไปที่ ไลบรารี DHT-sensor-library-master.zip ที่เรา ดาวน์โหลด มา -> Open
ตรวจสอบที่ Sketch -> Include Library จะพบ ไลบรารี DHT sensor library เพิ่มเข้ามาใน Arduino IDE ของเรา
ไปที่ Tools -> Manage Libraries…
ไปที่ช่องค้นหา พิมพ์ DHT (เพื่อค้นหา DHT sensor library)
เลื่อนเมาส์ไปที่ DHT sensor library เลือกเวอร์ชัน แล้ว คลิก Install
คลิก Install all
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
#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(" %");
}
กดปุ่ม RESET 1 ครั้ง
คลิกที่ Upload รอจนกระทั่งขึ้น Done uploading. ที่แถบด้านล่าง และ บรรทัดสุดท้าย ด้านล่างสุดขึ้นคำว่า done. แสดงว่าเราอัพโหลดโปรแกรมลงบอร์ด STM32 ได้สำเร็จแล้ว
7 : ผลลัพธ์การทำงาน
ย้ายจั้มเปอร์สีเหลืองด้านบน จาก โหมดอัพโหลดโปรแกรม เปลี่ยนเป็น โหมดใช้งาน
กดปุ่ม RESET 1 ครั้ง
ผลลัพธ์การทำงาน บรรทัดบนแสดง Temp : ตามด้วยอุณหภูมิที่วัดได้ และ บรรทัดล่างแสดง Humid : ตามด้วยความชื้นที่วัดได้ แสดงว่าโปรเจคสำเร็จแล้ว
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 ตามรูปด้านล่าง
ทดสอบการทำงาน โดยย้ายจั้มเปอร์สีเหลืองด้านบน จาก โหมดอัพโหลดโปรแกรม เปลี่ยนเป็น โหมดใช้งาน และ เพิ่มอุณหภูมิ เช่น .. ใช้ลมร้อนจากไดร์เป่าผม เพิ่มอุณหภูมิให้กับ DHT11 โดยผลลัพธ์การทำงานถ้าได้ตามคลิปด้านบนสุด แสดงว่าโปรเจคสำเร็จตามความต้องการแล้ว
9 : อุปกรณ์ที่ใช้
- 1. STM32F103C8T6 Development Board Minimum STM32
- 2. CP2102 USB 2.0 to UART TTL 5PIN Connector Module
- 3. Breadboard 830 Point MB-102
- 4. Jumper (M2M) cable wire 20cm Male to Male
- 5. โมดูล I2C LCD พร้อมหน้าจอ LCD 1602
- 6. Jumper (F2M) cable wire 20cm Female to Male
- 7. DHT11 Temperature and Humidity Sensor + PCB
- 8. Buzzer สัญญาณเสียงเตือนภัย/กันขโมย 120dB
credit : https://circuitdigest.com/microcontroller-projects/interfacing-dht11-sensor-with-stm32f103c8