ปรึกษา IoT
Internet of Things • Chapter 05

บทที่ 5 Arduino หน้าจอ LCD และเซ็นเซอร์

บทนี้เรียนรู้การประยุกต์ใช้ Arduino ร่วมกับ จอ LCD 1602 พร้อม I2C Interface, เซ็นเซอร์ Ultrasonic HC-SR04, DHT22 และ โมดูลนาฬิกา DS3231 เพื่อสร้างระบบแสดงผลและควบคุมอุปกรณ์ได้อย่างเป็นรูปธรรม พร้อมตัวอย่างโค้ดและภาพประกอบการอธิบาย

LCD 1602 + I2C HC-SR04 DHT22 DS3231 Arduino Code Wokwi

เนื้อหาสำคัญในบทนี้

  • แนะนำอุปกรณ์ Arduino, LCD, Sensor และ RTC
  • โปรแกรมแสดงข้อความบนจอ LCD 1602
  • โปรแกรมแสดงอุณหภูมิและความชื้นบน LCD
  • โปรแกรมตั้งเวลาเปิด-ปิดหลอด LED ด้วย DS3231
LCD 1602 + I2C
Ultrasonic HC-SR04
DHT22
DS3231 RTC

ภาพรวมบทเรียน

จากสไลด์บทที่ 5 ผู้เรียนจะได้ฝึกการนำ Arduino ไปเชื่อมต่อกับอุปกรณ์ที่ใช้จริงในงาน IoT โดยเฉพาะการใช้ จอ LCD 1602 พร้อม I2C Interface สำหรับแสดงผล, การใช้ เซ็นเซอร์ Ultrasonic HC-SR04 เพื่อวัดระยะทาง, การใช้ DHT22 เพื่อวัดอุณหภูมิและความชื้น และการใช้ DS3231 RTC Module เพื่อจัดการเวลาในระบบอัตโนมัติ

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

Learning Objectives

เมื่อเรียนจบบทนี้ ผู้เรียนควรสามารถเชื่อมต่อ LCD และเซ็นเซอร์กับ Arduino พร้อมเขียนโปรแกรมควบคุมระบบแสดงผลและระบบตั้งเวลาได้

อธิบายหน้าที่ของ LCD 1602, I2C Interface, HC-SR04, DHT22 และ DS3231 ได้
เขียนโปรแกรมให้จอ LCD แสดงข้อความได้อย่างถูกต้อง
แสดงค่าอุณหภูมิและความชื้นจาก DHT22 บนจอ LCD ได้
ประยุกต์ใช้โมดูล RTC ในการตั้งเวลาเปิด-ปิด LED ได้

ภาพรวมการเชื่อมโยงอุปกรณ์ในบทที่ 5

Sensor HC-SR04 / DHT22 Arduino UNO ประมวลผลและควบคุม LCD 1602 LED / RTC อ่านค่าเซ็นเซอร์ → ประมวลผล → แสดงผลบน LCD / ควบคุมอุปกรณ์

5.1 แนะนำอุปกรณ์

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

Arduino UNO R3

บอร์ดไมโครคอนโทรลเลอร์หลัก ใช้ควบคุมการทำงานทั้งหมดของวงจร

หลอด LED

ใช้แสดงสถานะการทำงานและใช้ในตัวอย่างระบบตั้งเวลาเปิด-ปิด

ตัวต้านทาน

ใช้จำกัดกระแสไฟหรือช่วยในวงจร pull-up / pull-down ตามชนิดของวงจร

Breadboard

บอร์ดทดลองสำหรับต่อวงจรโดยไม่ต้องบัดกรี

สาย Jumper

ใช้เชื่อมต่ออุปกรณ์ต่าง ๆ ทั้งแบบผู้-ผู้ และผู้-เมีย

Ultrasonic HC-SR04

เซ็นเซอร์วัดระยะทางด้วยคลื่นอัลตราโซนิก

LCD 1602 + I2C

จอแสดงผล 16 คอลัมน์ 2 แถว ใช้ I2C เพื่อลดจำนวนสายในการเชื่อมต่อ

DHT22 / DHT11

เซ็นเซอร์วัดอุณหภูมิและความชื้น สำหรับนำมาแสดงผลบนจอ LCD

DS3231 Module

โมดูลนาฬิกาแบบ Real-Time Clock ใช้เก็บเวลาและวันที่อย่างแม่นยำ

5.2 โปรแกรมวัดระยะทางด้วย Ultrasonic Module HC-SR04

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

หุ่นยนต์หลบสิ่งกีดขวาง Smart Parking ระบบรักษาความปลอดภัย Water Level Indicator

ภาพประกอบ: หลักการวัดระยะของ HC-SR04

HC-SR04 วัตถุ ส่งคลื่นเสียง → สะท้อนกลับ → คำนวณระยะทางจากเวลาเดินทาง

5.3 โปรแกรมแสดงข้อความบนหน้าจอ LCD 1602 พร้อม I2C Interface

สไลด์ส่วนนี้มุ่งเน้นการใช้ LCD 1602 เพื่อแสดงข้อความ โดยอาศัย I2C Interface ซึ่งช่วยลดการใช้ขา GPIO ของ Arduino เมื่อเทียบกับการต่อ LCD แบบปกติ

จอ LCD 1602 มีขนาด 16 คอลัมน์ 2 แถว (16x2) และเมื่อใช้โมดูล I2C จะเชื่อมต่อกับ Arduino เพียง 4 จุดหลัก ได้แก่ GND, VCC, SDA และ SCL

5.3.1 อุปกรณ์ที่ต้องใช้

  • Arduino UNO R3 พร้อมสาย USB
  • LCD 1602 (Blue Screen) 16x2
  • โมดูลจอ LCD พร้อม I2C Interface
  • สาย Jumper และ Breadboard (ถ้าจำเป็น)

5.3.3 วิธีการต่ออุปกรณ์

ตามสไลด์ การต่อ LCD 1602 แบบ I2C กับ Arduino UNO R3 มีรายละเอียดดังนี้

ขาของ LCD I2C ต่อกับ Arduino UNO R3
GNDGND
VCC5V
SDAA4
SCLA5

ภาพประกอบการต่อ LCD 1602 แบบ I2C

Arduino UNO 5V GND A4 / SDA A5 / SCL LCD 1602 I2C Interface

5.3.5 Code โปรแกรมแสดงข้อความบน LCD

ตัวอย่างโค้ดต่อไปนี้สรุปจากสไลด์เรื่องการแสดงข้อความบนหน้าจอ LCD 1602 พร้อม I2C Interface

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

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  lcd.begin();
  lcd.backlight();

  lcd.setCursor(2, 0);
  lcd.print("IoT");

  lcd.setCursor(0, 1);
  lcd.print("www.siam2dev.com");
}

void loop() {
}
ผลลัพธ์: บรรทัดแรกแสดงข้อความ “IoT” และบรรทัดที่สองแสดง “www.siam2dev.com” บนจอ LCD 1602

5.4 โปรแกรมแสดงอุณหภูมิ และความชื้นออกทางหน้าจอ LCD 1602

หัวข้อนี้นำเซ็นเซอร์ DHT22 มาเชื่อมต่อกับ Arduino และแสดงค่าที่อ่านได้ออกทางจอ LCD 1602 โดยใช้ I2C Interface ซึ่งช่วยให้มองเห็นผลลัพธ์ได้ชัดเจนกว่าการดูผ่าน Serial Monitor เพียงอย่างเดียว

5.4.1 อุปกรณ์ที่ต้องใช้

  • Arduino UNO R3 พร้อมสาย USB
  • เซ็นเซอร์วัดอุณหภูมิและความชื้น DHT22
  • LCD 1602 (Blue Screen) 16x2
  • โมดูลจอ LCD พร้อม I2C Interface
  • บอร์ดทดลอง Breadboard
  • Resistor ตัวต้านทาน 1 ตัว
  • สายไฟ Jumper ผู้-ผู้ และผู้-เมีย

5.4.2 ติดตั้ง Libraries

ก่อนใช้งานโค้ด ต้องติดตั้งไลบรารีสำหรับหน้าจอ LCD และ DHT ให้เรียบร้อย โดยในทางปฏิบัติแนะนำให้ใช้ Library Manager ของ Arduino IDE เพื่อความสะดวก

  • LiquidCrystal_I2C สำหรับจอ LCD 1602 แบบ I2C
  • DHT sensor library และ Adafruit Unified Sensor สำหรับ DHT22
หมายเหตุ: ใน Wokwi หรือบนอุปกรณ์จริง ขา NC ของ DHT22 หมายถึง No Connection ไม่ต้องเชื่อมต่อกับอุปกรณ์ใด

5.4.3 วิธีการต่ออุปกรณ์

จากสไลด์มีการต่อวงจรดังนี้

อุปกรณ์ ขาอุปกรณ์ ต่อกับ Arduino UNO R3
LCD 1602 I2CGNDGND
LCD 1602 I2CVCC5V
LCD 1602 I2CSDAA4
LCD 1602 I2CSCLA5
DHT22GNDGND
DHT22VCC5V
DHT22OUT / DATAขา 2

ภาพประกอบการต่อ DHT22 + LCD 1602

Arduino UNO 5V GND A4 A5 D2 LCD 1602 I2C Interface DHT22

5.4.5 Code โปรแกรมแสดงอุณหภูมิและความชื้นบน LCD

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

LiquidCrystal_I2C lcd(0x27, 16, 2);
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
  lcd.begin();
  lcd.backlight();
}

void loop() {
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Hum: ");
  lcd.print(humidity);
  lcd.print("%");

  lcd.setCursor(0, 1);
  lcd.print("Tem: ");
  lcd.print(temperature);
  lcd.print("C");

  delay(500);
}

สิ่งที่ควรเข้าใจจากโค้ด

  • LiquidCrystal_I2C lcd(0x27, 16, 2) กำหนดที่อยู่ I2C และขนาดจอ 16x2
  • dht.readHumidity() และ dht.readTemperature() ใช้อ่านค่าจาก DHT22
  • ใช้ lcd.setCursor() เพื่อกำหนดตำแหน่งก่อนพิมพ์ค่าลงจอ
  • หากจอไม่แสดงผล อาจเกิดจาก I2C address ไม่ตรง เช่น บางรุ่นอาจใช้ 0x3F แทน 0x27

5.5 โปรแกรมตั้งเวลา เปิด-ปิด หลอด LED

สไลด์ส่วนนี้ประยุกต์ใช้ DS3231 RTC Module เพื่อให้ Arduino รู้วันและเวลาจริง แล้วนำเวลาไปใช้ควบคุมการเปิด-ปิดอุปกรณ์ เช่น หลอด LED ซึ่งต่อยอดไปใช้ได้กับระบบรดน้ำอัตโนมัติ ระบบเปิดไฟหน้าบ้าน หรือระบบบันทึกข้อมูลตามเวลา

5.5.1 อุปกรณ์ที่ต้องใช้

  • Arduino UNO R3 พร้อมสาย USB
  • DS3231 Module
  • LED 1 ดวง
  • Resistor 1 ตัว
  • สาย Jumper และ Breadboard

5.5.3 ตัวอย่างการใช้งาน DS3231

  • นาฬิกาตั้งโต๊ะและระบบแสดงเวลา
  • Data Logger สำหรับบันทึกเวลาร่วมกับข้อมูลเซ็นเซอร์
  • ระบบเตือนความจำหรือแจ้งเตือน
  • ระบบควบคุมอัตโนมัติ เช่น เปิด-ปิดไฟตามเวลา
  • ระบบบันทึกเวลาเข้าเรียนหรือเวลาการทำงาน

5.5.4 วิธีการต่ออุปกรณ์

อุปกรณ์ ขาอุปกรณ์ ต่อกับ Arduino UNO R3
LEDขาบวกขา 2 (ผ่านตัวต้านทาน)
LEDขาลบGND
DS3231SDAA4
DS3231SCLA5
DS3231VCC5V
DS3231GNDGND

ภาพประกอบการต่อ DS3231 + LED

Arduino UNO 5V GND A4 A5 D2 DS3231 RTC SDA / SCL / VCC / GND LED

5.5.6 Code โปรแกรม RTC

โค้ดต่อไปนี้ประยุกต์แนวคิดจากสไลด์ โดยใช้ RTC ตรวจสอบเวลา แล้วสั่งเปิด-ปิด LED ตามเวลาที่กำหนด ตัวอย่างด้านล่างกำหนดให้เปิดเวลา 08:00 และปิดเวลา 18:00

#include <Wire.h>
#include <RTClib.h>

RTC_DS3231 rtc;
int ledPin1 = 2;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  rtc.begin();
  pinMode(ledPin1, OUTPUT);

  // ใช้เฉพาะครั้งแรกเมื่อต้องการตั้งเวลาให้ RTC
  // rtc.adjust(DateTime(__DATE__, __TIME__));
}

void loop() {
  DateTime now = rtc.now();

  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print("  ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.println(now.minute(), DEC);

  if (now.hour() == 8 && now.minute() == 0) {
    digitalWrite(ledPin1, HIGH);
    Serial.println("LED ON");
  } else if (now.hour() == 18 && now.minute() == 0) {
    digitalWrite(ledPin1, LOW);
    Serial.println("LED OFF");
  }

  delay(1000);
}

ต้องการพัฒนาระบบ IoT ที่มีหน้าจอและเซ็นเซอร์ใช้งานจริง?

Siam2Dev ช่วยออกแบบระบบเซ็นเซอร์, หน้าจอแสดงผล, Data Logger, Dashboard และระบบอัตโนมัติสำหรับโครงงาน การเรียนการสอน และงานวิจัย

สรุปบทเรียน

บทที่ 5 แสดงให้เห็นว่าการประยุกต์ใช้ Arduino ในงาน IoT ไม่ได้มีแค่การอ่านค่าจากเซ็นเซอร์ แต่ยังสามารถนำข้อมูลไปแสดงผลบน LCD และใช้โมดูลเวลาในการควบคุมอุปกรณ์แบบอัตโนมัติได้ ซึ่งเป็นพื้นฐานสำคัญของระบบ Smart Home, Smart Farm และระบบบันทึกข้อมูลจริง

แบบฝึกหัดท้ายบท

  1. อธิบายข้อดีของการใช้ LCD 1602 ร่วมกับ I2C Interface เมื่อเทียบกับการต่อแบบปกติ
  2. เขียนตารางการต่อขาของ LCD 1602 I2C กับ Arduino UNO R3 ให้ครบถ้วน
  3. เขียนโปรแกรมให้จอ LCD แสดงชื่อผู้เรียนในบรรทัดแรก และแสดงรหัสนักศึกษาในบรรทัดที่สอง
  4. ออกแบบวงจรแสดงอุณหภูมิและความชื้นจาก DHT22 บน LCD พร้อมวาดภาพการเชื่อมต่อ
  5. อธิบายหน้าที่ของไลบรารี LiquidCrystal_I2C และ DHT.h
  6. ให้เขียนโปรแกรมเปิด LED เมื่ออุณหภูมิสูงกว่า 30°C และแสดงสถานะบนจอ LCD
  7. อธิบายบทบาทของ DS3231 ในระบบ IoT และยกตัวอย่างการใช้งาน 3 กรณี
  8. ให้ปรับโค้ด RTC เพื่อเปิดไฟเวลา 18:30 และปิดไฟเวลา 22:00
  9. ลองออกแบบโครงงาน “วัดอุณหภูมิและความชื้นทุก ๆ 1 นาที แล้วแสดงบน LCD” พร้อมเขียนแนวทางการทำงาน

คำถามที่พบบ่อยเกี่ยวกับบทที่ 5

ให้ตรวจสอบการต่อสาย GND, VCC, SDA และ SCL ว่าถูกต้องหรือไม่ รวมถึงตรวจสอบ I2C address ของจอ เช่น 0x27 หรือ 0x3F และดูว่าติดตั้งไลบรารี LiquidCrystal_I2C แล้วหรือยัง

การใช้ I2C ช่วยลดจำนวนสายและขาที่ต้องใช้จาก Arduino เหลือเพียง SDA และ SCL พร้อมไฟเลี้ยง จึงทำให้ต่อวงจรง่ายและประหยัดขา GPIO

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

Wokwi ช่วยจำลองการทำงานของ Arduino, LCD, DHT22 และ RTC ได้ ทำให้สามารถทดลองโค้ด แก้ปัญหา และทำความเข้าใจการเชื่อมต่อวงจรได้ก่อนนำไปใช้งานกับอุปกรณ์จริง
อ่านต่อ

ต่อยอดจากบทที่ 5

หลังจากเชื่อมต่อจอ LCD และเซ็นเซอร์ได้แล้ว สามารถต่อยอดไปสู่ระบบแสดงผลแบบ Dashboard และระบบควบคุมอัตโนมัติที่ซับซ้อนขึ้นได้