กลับไปหน้ารวมไฟล์
temperature-and-humidity-with-minmax-on-lcd-44f3ea.md

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

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

โปรเจคนี้จะสลับไปมาอยู่ระหว่างการแสดงอุณหภูมิและความชื้นบนจอ LCD 16x2

Temperature and Humidity LCD display

  • แสดงอุณหภูมิปัจจุบันเป็นฟาเรนไฮต์
    • อุณหภูมิต่ำสุดที่บันทึกได้
    • อุณหภูมิสูงสุดที่บันทึกได้
  • แสดงความชื้นปัจจุบัน
    • ความชื้นต่ำสุดที่บันทึกได้
    • ความชื้นสูงสุดที่บันทึกได้

ค่าต่ำสุดและสูงสุดจะนับตั้งแต่บอร์ด Arduino ถูกจ่ายไฟ และอัพเดทในทุกๆ ลูป

เก็บสถิติแบบไม่ลืม: จอ LCD แสดงค่าความชื้นต่ำสุด/สูงสุด

โปรเจค DHT11 ทั่วไปมันเป็นพวกขี้ลืมสุดๆ มันบอกแค่ว่าตอนนี้ 25°C แต่มันไม่รู้หรอกว่าตอนตี 3 ตอนที่น้องหลับอยู่ มันเกิดอะไรขึ้นบ้าง โปรเจคบันทึกค่าอุณหภูมิและความชื้นต่ำสุด/สูงสุด บังคับให้โปรแกรมเมอร์ต้องเข้าใจเรื่องความคงอยู่ของตัวแปร ด้วยการสร้างกับดักตรรกะแบบ 'High-Water-Mark' เปรียบเทียบขึ้นมา ทำให้ Arduino จดจำค่าสูงสุด-ต่ำสุดสุดขั้วของอุณหภูมิได้อย่างแม่นยำ เหมาะสำหรับใช้ในโรงเรือนใหญ่ๆ หรือตู้ฟักไข้

กับดักตรรกะ High-Water Mark

หัวใจของโค้ดอยู่ที่การประกาศตัวแปรอาเรย์แบบ float สองตัวไว้นอกฟังก์ชัน loop()

  1. float maxTemp = -100.0;
  2. float minTemp = 100.0;
  3. เครื่องยนต์เปรียบเทียบที่ไม่เคยหยุดนิ่ง: ทุกๆ สองวินาที เซนเซอร์ DHT จะอ่านค่าห้องปัจจุบัน
    float currentTemp = dht.readTemperature();
    
    if (currentTemp > maxTemp) {
      maxTemp = currentTemp; // ราชาใหม่ขึ้นครองบัลลังก์!
    }
    if (currentTemp < minTemp) {
      minTemp = currentTemp; // ศูนย์สัมบูรณ์ใหม่มาแล้ว!
    }
    
  4. เมื่อวันเวลาผ่านจากกลางคืนที่หนาวยะเยือกสู่กลางวันที่ร้อนระอุ ตัวแปรสองตัวนี้จะถูกเขียนทับด้วยค่าทางคณิตศาสตร์อย่างต่อเนื่อง จับขอบเขตสุดขั้วได้อย่างแม่นยำ

ผลักดันข้อมูลไปยัง UI และ EEPROM

ผู้ใช้สามารถสลับดูข้อมูลบนจอ LCD 16x2 I2C ได้ด้วยปุ่มกดฟิสิคอล

  • กดปุ่ม UI เพื่อสลับจอ LCD จากโหมด "ข้อมูลสด" ไปเป็นโหมด "สถิติตลอดกาล"
  • กับดักความจำหาย: ถ้าดับไฟ SRAM จะลืมค่า maxTemp และ minTemp ไปเลย
  • ขั้นสูงขึ้น: โค้ดสามารถใช้ไลบรารี <EEPROM.h> ที่มีอยู่แล้วได้ ทุกครั้งที่บันทึกค่า maxTemp ใหม่ได้ Arduino สามารถเขียนค่า float ลงไปในฮาร์ดไดรฟ์ ROM จริงๆ ของมันได้เลย! EEPROM.put(0, maxTemp);
  • เมื่อ Arduino บูตขึ้นมาหลังจากไฟดับ มันสามารถดึงสถิติถาวรกลับมาได้ทันที: EEPROM.get(0, maxTemp);, ดึงข้อมูลประวัติกลับมาได้อย่างสมบูรณ์!

ฮาร์ดแวร์ที่ต้องใช้

  • Arduino Uno R3 หรือบอร์ดที่เข้ากันได้ (มีหน่วยความจำ EEPROM ในตัว 1KB ที่เยี่ยมมาก)
  • โมดูลเซนเซอร์วัดความชื้น/อุณหภูมิ DHT11
  • จอ LCD 16x2 พร้อม I2C
  • สายจัมเปอร์ผู้-เมีย 5 เส้น
  • สายจัมเปอร์เมีย-เมีย 2 เส้น
  • ตัวเลือก: ปุ่มกดแบบ Tactile เพื่อใช้เป็นระบบสลับเมนูแบบฟิสิคอล (ใช้ INPUT_PULLUP)

ไลบรารีที่ต้องใช้

dht.h LiquidCrystal_I2C.h

เคล็ดลับก่อนเริ่มงาน

เพราะโปรเจคนี้ตั้งใจไว้สำหรับมือใหม่ หรือคนที่ยังไม่เคยใช้อุปกรณ์ชุดนี้มาก่อน ผมเลยเพิ่มสองหัวข้อสั้นๆ นี้ที่มีข้อมูลเกี่ยวกับโมดูลวัดอุณหภูมิ/ความชื้น และ I2C ที่ใช้เชื่อมต่อ LCD กับบอร์ด Arduino

โมดูลวัดอุณหภูมิ/ความชื้น

ผมชอบแยกคำว่า "เซนเซอร์" กับ "โมดูล" ด้วยเหตุผลง่ายๆ ว่ามันต่างกันชัดเจนและมีขาต่อที่ต่างกัน ซึ่งอาจทำให้น้องๆ งงได้ง่ายๆ

อย่างเช่น เซ็นเซอร์วัดอุณหภูมิ/ความชื้น (Sensor) มี 4 ขา แต่โมดูลวัดอุณหภูมิ/ความชื้น (Module) มีแค่ 3 ขา เรื่องนี้อาจดูไม่สำคัญ แต่สำหรับมือใหม่หัดเล่นที่ยังไม่เคยใช้ทั้งสองแบบมาก่อน มันอาจทำให้งงได้ว่าเอ๊ะ... แล้วขาที่ต้องใช้คือขาไหนกันแน่

อีกอย่างหนึ่ง ข้อดีของการใช้ "โมดูล" แทน "เซ็นเซอร์" เลยก็คือ โมดูลจะมีตัวเก็บประจุกรองสัญญาณ (filtering capacitor) และตัวต้านทานดึงขึ้น (pull-up resistor) ในตัวอยู่แล้ว แต่ถ้าน้องใช้แค่เซ็นเซอร์เปล่าๆ น้องต้องหาอุปกรณ์พวกนี้มาต่อเพิ่มเองแน่นอน

DTH11 pinout

จอแสดงผล LCD 16x2

จอ LCD 16x2 ทั่วไปมีขายเพียบ แบบไหนก็ใช้ได้เหมือนกัน ข้อแตกต่างที่เห็นชัดสุดก็คือสีตัวอักษรกับสีพื้นจอ แบบฮิตๆ ก็มีตัวหนังสือสีดำบนพื้นเขียว กับตัวหนังสือสีขาวบนพื้นน้ำเงิน พี่ใช้แบบขาวบนน้ำเงินนะ เพราะอ่านง่ายกว่าเยอะ

ด้านล่างเป็นรูปด้านหน้าและด้านหลังของจอ 16x2 จะเห็นขาทั้ง 16 ขาที่ใช้ต่อกับ I2C

16x2 LCD front

16x2 LCD back

I2C ในฐานะ "กระเป๋าเป้" ของ LCD

เหตุผลหลักที่เราใช้ I2C ต่อจอ LCD เข้ากับบอร์ด Arduino ก็คือ "ความสะดวก" ในการเดินสายไงล่ะ

แค่ดูรายการอุปกรณ์ข้างล่างก็รู้แล้วว่าวิธีไหนสะดวกกว่ากัน จัดไปวัยรุ่น!

ถ้าไม่ใช้ I2C

  • บอร์ดทดลอง (Breadboard)
  • สายจัมเปอร์เฉลี่ยประมาณ 16 เส้น
  • โพเทนชิออมิเตอร์ (Potentiometer) ภายนอก
  • ตัวต้านทาน (Resistor) ภายนอก

ถ้าใช้ I2C

  • สายจัมเปอร์แค่ 4 เส้น!

น้องสามารถซื้อโมดูล I2C แยกมาต่อเองได้ ถ้ามีจอ LCD เก่าๆ ตกค้างอยู่และน้องมีฝีมือบัดกรีพอที่จะติดมันเข้ากับแผงวงจรด้านหลังของจอได้ หรือจะทำแบบพี่ก็ได้ คือซื้อจอ LCD ที่มี I2C ติดมาด้วยเลย

ลองดูที่โมดูล I2C ดีๆ น้องจะเห็นจุดสำคัญหลายจุด เช่น ขาต่อ, โพเทนชิออมิเตอร์สีฟ้า และจัมเปอร์

I2C features

มีเรื่องหนึ่งที่พี่ได้ยินเข้าใจผิดบ่อยมากเกี่ยวกับหน้าที่ของโพเทนชิออมิเตอร์บนโมดูล I2C นะ! ปุ่มหมุนอันนี้ใช้สำหรับปรับความคมชัดของตัวอักษร (contrast) ไม่ใช่ใช้ปรับความสว่างของไฟแบ็คไลท์จอนะจ๊ะ ห้ามช็อตนะตัวนี้

ที่อยู่ (Address) ของ I2C

ถ้าในโปรเจคของน้องใช้จอแสดงผลมากกว่าหนึ่งตัว หรือใช้ I2C อื่นๆ ร่วมด้วย น้องจะต้องตั้ง "ที่อยู่" (Address) ให้กับ I2C แต่ละตัว เพื่อให้มันสื่อสารกับบอร์ด Arduino ได้ไม่ชนกัน ทำได้โดยการ "ลัดวงจร" (short) ขาเล็กๆ ที่มีป้ายว่า A0, A1 และ A2 เพื่อกำหนดที่ให้แต่ละตัว โดยปกติแล้ว I2C สำหรับ LCD ส่วนใหญ่จะมาพร้อมที่อยู่เริ่มต้นเป็น 0x27

I2C address

ต่อฮาร์ดแวร์

ส่วนนี้น่าจะเป็นขั้นตอนที่ง่ายที่สุดของโปรเจคแล้ว เริ่มจากต่อโมดูล DHT11 ก่อน แล้วตามด้วย I2C ที่ต่ออยู่กับจอ LCD

โมดูล DHT11

ขั้นตอนที่ 1 - ใช้สายจัมเปอร์แบบผู้/เมีย ด้านเมียต่อเข้ากับขาที่ 1 (ขาข้อมูล) ของโมดูลวัดอุณหภูมิ/ความชื้น ส่วนด้านผู้ต่อเข้ากับขา A0 ของ Arduino

ขั้นตอนที่ 2 - ใช้สายจัมเปอร์แบบผู้/เมียอีกเส้น ด้านเมียต่อเข้ากับขาที่ 2 (ขา Vcc) ของโมดูล ส่วนด้านผู้ต่อเข้ากับขา 5V ของ Arduino

ขั้นตอนที่ 3 - ใช้สายจัมเปอร์แบบผู้/เมียเส้นสุดท้าย ด้านเมียต่อเข้ากับขาที่ 3 (ขา GND) ของโมดูล ส่วนด้านผู้ต่อเข้ากับขา GND ของ Arduino

ต่อเสร็จแล้วควรเป็นแบบนี้ สู้งานนะน้อง

Connected DTH11 Module

16x2 LCD กับ I2C

ขั้นตอนที่ 1 - ใช้สายจัมเปอร์แบบเมีย/เมีย ต่อปลายเมียด้านหนึ่งเข้ากับขา GND ของโมดูล I2C แล้วต่อปลายเมียอีกด้านของสายจัมเปอร์เข้ากับขา GND ของ Arduino บนหัว ICSP

ขั้นตอนที่ 2 - ใช้สายจัมเปอร์แบบเมีย/เมีย ต่อปลายเมียด้านหนึ่งเข้ากับขา Vcc ของโมดูล I2C แล้วต่อปลายเมียอีกด้านของสายจัมเปอร์เข้ากับขา 5V ของ Arduino บนหัว ICSP

ขั้นตอนที่ 3 - ใช้สายจัมเปอร์แบบเมีย/ผู้ ต่อปลายเมียเข้ากับขา SDA ของโมดูล I2C แล้วต่อปลายผู้ของสายจัมเปอร์เข้ากับขา SDA ของ Arduino

ขั้นตอนที่ 4 - ใช้สายจัมเปอร์แบบเมีย/ผู้ ต่อปลายเมียเข้ากับขา SCL ของโมดูล I2C แล้วต่อปลายผู้ของสายจัมเปอร์เข้ากับขา SCL ของ Arduino

ถ้าจะเอาไปต่อยอดในโปรเจคตัวเอง อย่าลืมนะว่าบอร์ด Arduino บางรุ่นมีสายเชื่อมภายในระหว่างขา SDA กับขาแอนะล็อก A4 และขา SCL กับขาแอนะล็อก A5

ต่อเสร็จแล้วต้องหน้าตาประมาณนี้เลย

LCD and DTH11 Connected

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "essejcds"
category: "Sensors & Environment"
components:
  - "5x Jumper Wire Female to Male"
  - "2x Jumper Wire Female to Female"
  - "1x 16 X 2 LCD with I2C Adapter"
  - "1x Arduino UNO"
  - "1x DHT11 Digital Temperature and Humidity Sensor DHT11 module"
description: "โปรเจคเทพๆ ที่ใช้เซนเซอร์วัดค่าอุณหภูมิและความชื้น แล้วดันผลลัพธ์พร้อมค่าต่ำสุด-สูงสุดแบบเรียลไทม์ขึ้นจอ LCD 16x2 ผ่าน I2C งานง่ายแต่หล่อ วัยรุ่นต้องลองจัดไป!"
difficulty: "Easy"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX18YCRDGLE2dMxyHLu/K39lRFClfXqQbkt7eqOyg1SoHLDlXONwDxUseHLRUq/BQmsc5qGZQZjltz6GaWo1Bezc3dAZWhMtOHfA="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/temperature-and-humidity-with-minmax-on-lcd-44f3ea_cover.jpg"
lang: "en"
likes: 0
passwordHash: "7a2894ac216e02b3ad35f2bc49fdb6850ad4d80518ce77095c1b42fae3919b5f"
price: 699
seoDescription: "Monitor Temperature and Humidity with Min/Max records on a 16x2 LCD using I2C and Arduino."
tags:
  - "Environmental Sensing"
title: "วัดอุณหภูมิ-ความชื้นแบบตึงๆ พร้อมโชว์สถิติ Min/Max บน LCD"
tools: []
videoLinks: []
views: 2690