กลับไปหน้ารวมไฟล์
ultrasonic-sensor-with-alarm-lcd-and-temperature-2415d4.md

ภาพรวมโปรเจค

"Aqua-Sentry" นี่แหละคือ โซลูชันตรวจวัดระยะไกลสำหรับถังน้ำ ที่แม่นยำและเชื่อถือได้ ตัวนี้แก้ปัญหาพื้นฐานของเซนเซอร์วัดระยะแบบอัลตราโซนิกที่มักจะเพี้ยนเพราะสภาพแวดล้อม เพราะความเร็วเสียงมันขึ้นกับอุณหภูมินะน้อง! เซนเซอร์ที่ไม่ได้ชดเชยอุณหภูมิจะวัดผิดเพี้ยนไปเยอะถ้าเอาไปใช้นอกบ้านหรือในโรงงาน Aqua-Sentry เลยเอาตัววัดอุณหภูมิแบบดิจิตอล DS18B20 มารวมด้วย เพื่อทำ การวิเคราะห์สภาพบรรยากาศแบบเรียลไทม์ ปรับสูตรคำนวณระยะให้แม่นยำ ไม่ว่าอากาศจะร้อนจะหนาวแค่ไหน ก็วัดระดับน้ำได้เป๊ะเวอร์

โปรเจคนี้ทำให้เรารู้ข้อมูลระดับน้ำในถังน้ำได้ชัดเจนเลย

  • ระดับน้ำต่ำ -> ไฟ LED สีเขียวติด
  • ระดับน้ำปานกลาง -> ไฟ LED สีเหลืองติด
  • ระดับน้ำสูง -> ไฟ LED สีแดงกระพริบ พร้อมกับเสียงออดดัง ระยะทางจากเซนเซอร์ถึงผิวน้ำจะถูกวัดด้วยเซนเซอร์อัลตราโซนิก และแสดงผลบนจอ LCD พร้อมกับอุณหภูมิในถัง

โปรเจคนี้เป็นแค่ส่วนหนึ่งของโปรเจคใหญ่ที่วางไว้

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

ล้วงลึกเทคนิค

  • การวิเคราะห์การเดินทางของคลื่นเสียง (Time-of-Flight Forensics):
    • วงจร Trigger-Echo: เซนเซอร์ HC-SR04 จะปล่อยพัลส์เสียง 40kHz ออกไปหลังจากได้รับพัลส์ Trigger 10µs ระบบจะวัดเวลา pingTime (เวลาที่เสียงเดินทางไปกระทบผิวน้ำและสะท้อนกลับมา)
    • การคำนวณที่ชดเชยอุณหภูมิ: โค้ดทั่วไปมักจะสมมติความเร็วเสียงคงที่ที่ 340m/s แต่ Aqua-Sentry ใช้สูตรนี้แทน: $v = 331.3 + 0.606 \times T$ โดยที่ $T$ คืออุณหภูมิเซลเซียสจาก DS18B20 วิธีนี้ป้องกันปัญหา "ระดับน้ำลอย" ที่มักเกิดในโปรเจคอัลตราโซนิกแบบง่ายๆ
  • การวิเคราะห์บัส 1-Wire (DS18B20):
    • โครงสร้างดิจิตอล: DS18B20 ใช้โปรโตคอล Dallas 1-Wire ทำให้สามารถอ่านค่าอุณหภูมิความละเอียดสูง (9 ถึง 12-bit) ผ่านพิน GPIO เพียงพินเดียว โปรเจคนี้ใช้ตัวต้านทานดึงขึ้น (Pull-up Resistor) 4.7kΩ ภายนอก เพื่อรักษาความเสถียรของบัส รับประกันข้อมูลอุณหภูมิที่ชัดเจน แม้อยู่ในสภาพแวดล้อมที่มีสัญญาณรบกวนไฟฟ้าเยอะ
  • การแสดงผลสามสถานะและตรรกะกำหนดขีดจำกัด:
    • การแบ่งระดับ: ระบบแบ่งความลึกในถังออกเป็น 3 โซนชัดเจน:
      • ปลอดภัย (สีเขียว): ความลึก > 40ซม. ปกติทุกอย่าง
      • ระวัง (สีเหลือง): 20ซม. < ความลึก < 40ซม. เตือนด้วยภาพ
      • วิกฤต (สีแดง + ออด): ความลึก < 20ซม. เปิดสัญญาณเตือนทั้งภาพ (ไฟกระพริบ) และเสียง
    • การแสดงผลบน LCD: จอ LCD ขนาด 16x2 ทำหน้าที่เป็นศูนย์กลางแสดงข้อมูล แสดงค่าระยะทางและอุณหภูมิแบบเรียลไทม์ด้วยความแม่นยำระดับงานวิทยาศาสตร์เลยทีเดียว

วิศวกรรมและการลงมือทำ

  • ความสมบูรณ์ของสัญญาณและการกรอง (Signal Integrity & Filtering):
    • คลื่นอัลตราโซนิกเนี่ยมันชอบมีปัญหา "สัญญาณรบกวนจากเสียงสะท้อน (Ping-Echo Interference)" อยู่นะตัวนี้ ฟิร์มแวร์เลยต้องจัดให้มีดีเลย์รอให้สัญญาณนิ่ง 2000µs และเว้นช่วงระหว่างการวัด 10ms เพื่อป้องกันไม่ให้พัลส์เสียงซ้อนกันจนคำนวณระยะเพี้ยนไปหมด
  • การจัดการเซ็นเซอร์กันน้ำ (Waterproof Sensor Logistics):
    • ถ้าจะเอาไปใช้ในสนามจริง แนะนำให้อัพเกรดเป็นทรานสดิวเซอร์กันน้ำ JSN-SR04T ไปเลยจ้า อันนี้เป็นโมดูลอัพเกรดที่ยังใช้อินเตอร์เฟสแบบลอจิกเลเวลเหมือน HC-SR04 แต่เพิ่มความสามารถกันน้ำระดับ IP67 มาให้ ใช้ในตู้หรือสภาพแวดล้อมชื้นๆ ได้สบายๆ
  • การแปลงหน่วยแบบเจาะลึก (Unit Conversion Forensics):
    • การลงมือทำครั้งนี้โชว์ให้เห็นเส้นทางการแปลงหน่วยแบบครบวงจรเลยนะ เปลี่ยนข้อมูลดิบจากไมโครวินาทีให้เป็นชั่วโมง/ไมล์/เซนติเมตรได้หมด เป็นพื้นฐานคณิตศาสตร์ที่แข็งแรงมากๆ สำหรับการปรับสเกลไปใช้ในแท็งก์หรืออ่างเก็บน้ำขนาดใหญ่ในภาคเกษตรหรืออุตสาหกรรม

สรุป

Aqua-Sentry คือสะพานเชื่อมระหว่างเซ็นเซอร์ของเล่นพื้นฐาน กับ เครื่องมือวัดที่เชื่อถือได้ในสนามจริง (Reliable Field Instrumentation) ด้วยการเข้าใจเรื่อง การชดเชยอุณหภูมิอากาศ (Atmospheric Temperature Compensation) และ การเชื่อมต่อกับบัสหลายโปรโตคอล (Multi-Protocol Bus Interfacing) อย่างถ่องแท้ นักพัฒนาก็สามารถสร้างอาร์เรย์สำหรับการตรวจสอบสภาพแวดล้อมที่ทั้งแข็งแรงและรู้จักสภาพแวดล้อมได้ ใช้ได้ตั้งแต่ระบบอัตโนมัติในบ้าน ไปจนถึงการจัดการของไหลในระดับอุตสาหกรรม


ความแม่นยำจากชั้นบรรยากาศ: การควบคุมความเร็วเสียงผ่านการวิเคราะห์อุณหภูมิ

#include <LiquidCrystal.h>//Load Liquid Crystal Library
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 6 // Data wire is plugged into pin 6 on the Arduino 
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire);   // Pass our oneWire reference to Dallas Temperature.
LiquidCrystal LCD(12, 11, 5, 4, 3, 2);  //Create Liquid Crystal Object called LCD
int trigPin = 9; //Sensor Trip pin connected to Arduino pin 9
int echoPin = 7; //Sensor Echo pin connected to Arduino pin 7
int myCounter = 0; //declare your variable myCounter and set to 0
float pingTime;  //time for ping to travel from the sensor to the target and return
float targetDistance; //Distance to Target in Centimeters
float speedOfSound = 776.5; //Speed of sound in miles per hour
void setup() {
 Serial.begin(9600);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 LCD.begin(16, 2); //Tell Arduino to start your 16x2 LCD
 LCD.setCursor(0, 0); //Set LCD cursor to upper left corner, column 0, row 0
 LCD.print("Distance:");  //Print Message on First Row
 sensors.begin();   // Start up the library
 pinMode(8, OUTPUT);  //pin  8, 10, 13 output pins
 pinMode(10, OUTPUT);
 pinMode(13, OUTPUT);
}
void loop() {
 digitalWrite(trigPin, LOW); //Set trigger pin low
 delayMicroseconds(2000); //Let signal settle
 digitalWrite(trigPin, HIGH); //Set trigPin high
 delayMicroseconds(15); //Delay in high state
 digitalWrite(trigPin, LOW); //ping has now been sent
 delayMicroseconds(10); //Delay in high state
 pingTime = pulseIn(echoPin, HIGH);  //pingTime in microceconds
 pingTime = pingTime / 1000000; //convert pingTime to seconds by dividing by 1000000 (microseconds in a second)
 pingTime = pingTime / 3600; //convert pingtime to hours by dividing by 3600 (seconds in an hour)
 targetDistance = speedOfSound * pingTime; //This will be in miles, since we declared the speed of sound as kilometers per hour; although we're going to convert it back to centimeters
 targetDistance = targetDistance / 2; //Remember ping travels to the target and back from the target, so you must divide by 2 for actual target distance.
 targetDistance = targetDistance * 160934.4; //Convert miles to centimeters by multipling by 160934,4
 sensors.requestTemperatures(); // Send the command to get temperature readings
 LCD.setCursor(10, 0); //Set the cursor to the tenth column of the first row
 LCD.print("                "); //Print blanks to clear the row
 LCD.setCursor(10, 0);  //Set Cursor again to the tenth column of the first row
 LCD.print((int) (targetDistance + 0.5)); //Print measured distance
 LCD.print("cm ");  //Print your units
LCD.setCursor(0, 1); //เซ็ตเคอร์เซอร์ไปที่คอลัมน์แรกของแถวที่สอง
 LCD.print("                "); //พิมพ์ช่องว่างเพื่อเคลียร์แถว
 LCD.setCursor(0, 1);  //เซ็ตเคอร์เซอร์อีกครั้งที่คอลัมน์แรกของแถวที่สอง
 if (targetDistance > 40) {
   LCD.print("LEV LOW  ");
   LCD.print(sensors.getTempCByIndex(0));
   LCD.print((char)223);
   LCD.print ("C");
 }
 else if (targetDistance < 40 && targetDistance > 20) {
   LCD.print("LEV MED  ");
   LCD.print(sensors.getTempCByIndex(0));
   LCD.print((char)223);
   LCD.print ("C");
 }
 else (targetDistance < 20); {
   LCD.print ("LEV HIGH ");
   LCD.print(sensors.getTempCByIndex(0));
   LCD.print((char)223);
   LCD.print ("C");
 }
 delay(2000);
 if (targetDistance > 40) {
   digitalWrite (13, HIGH);  //Green LED ON
 }
 else {
   digitalWrite(13, LOW);   //Green LED OFF
 }
 if (targetDistance < 40 && targetDistance > 20) {
   digitalWrite (8, HIGH);   //Yellow LED ON
 }
 else {
   digitalWrite(8, LOW);    //Yellow LED OFF
 }
 if (targetDistance < 20) {
   digitalWrite(10, HIGH);   //Red LED ON
   delay(2000);
   digitalWrite(10, LOW);   //Red LED OFF
 }
 else {
   digitalWrite(10, LOW);   //Red LED OFF
 }
}

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

apps:
  - "1x Arduino IDE"
author: "MichDragstar"
category: "Sensors & Environment"
components:
  - "1x Standard LCD - 16x2 White on Blue"
  - "1x Resistor 4.75k ohm"
  - "1x Ultrasonic Sensor - HC-SR04 (Generic)"
  - "1x Jumper wires (generic)"
  - "1x Buzzer"
  - "1x Single Turn Potentiometer- 10k ohms"
  - "1x DS18B20 Programmable Resolution 1-Wire Digital Thermometer"
  - "1x Pushbutton switch 12mm"
  - "1x Breadboard (generic)"
  - "1x Arduino UNO"
  - "3x Resistor 221 ohm"
  - "3x LEDs"
description: "ใช้เซนเซอร์อัลตราโซนิกจับระดับน้ำ งานง่ายแต่หล่อ! มีไฟ LED กับออดเตือนเป็นขั้นๆ และแสดงผลระยะทางกับอุณหภูมิแบบเรียลไทม์บน LCD ไว้ดูเท่ๆ"
difficulty: "Easy"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX18r79ugQ5ajWKVfqzUcDPwOHm2NRn4Dpzrx4MaW/kuH3enZ8MtaVP/Kl5ZqdMIXyb4VgfVs+ByDDPEFwWt2Vbo6pBj7MJcToUA="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/ultrasonic-sensor-with-alarm-lcd-and-temperature-2415d4_cover.jpg"
lang: "en"
likes: 21
passwordHash: "853e002a8a9cdce34b6be36faa02b8573e0237d2c22ccfd7a3861258de5de972"
price: 699
seoDescription: "Arduino Ultrasonic Sensor project for water level with LED alarms, buzzer, and temp display on LCD."
tags:
  - "home automation"
title: "โปรเจควัดระดับน้ำสุดตึง! เตือนภัยด้วยออด+LED พร้อมโชว์ระยะกับอุณหภูมิบนจอ LCD"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/S1Oxl-OjN-o"
views: 52072