25. Wio Terminal EP.12, วัดระยะทาง ด้วย HC-SR04


Wio Terminal EP.12, วัดระยะทาง ด้วย HC-SR04

ครั้งนี้ผู้เขียนได้ประยุกต์ใช้งาน โดยนำเซนเซอร์วัดระยะทาง แบบอัลตร้าโซนิก HC-SR04 มาใช้ และขอเน้นย้ำว่า ไม่ใช่ Grove Sensor นะครับ เนื่องจาก Grove Sensor มีขั้วต่อใช้งาน 3 ขั้ว แต่ HC-SR04 มีขั้วต่อใช้งาน 4 ขั้ว ตามรูปที่ 1



ภาพจาก https://raw.githubusercontent.com/SeeedDocument/Grove_Ultrasonic_Ranger/master/optimizing/Compare.jpg
รูปที่ 1 Grove Ultrasonic และ HC-SR04

ในการนำ HC-SR04 มาใช้งาน จึงต้อง มีการต่อสาย ตามรูปที่ 2 และ ไม่จำเป็นต้องติดตั้งไลบรารี่ ใด ๆ เพิ่มเติม


HC-SR04 ต่อกับWio Terminal 
VccGPIO4 (+5)
GNDGPIO6 (GND)
TrigGPIO13 (D0)
EchoGPIO15 (D1)


รูปที่ 2 แสดงการต่อสาย


 คำอธิบาย
    การเขียนโค้ดครั้งนี้ มีการแยกเขียนเป็นส่วน ๆ เพื่อให้ง่ายต่อการศึกษาและแก้ไข โดยแบ่งเป็นฟังก์ชั่นต่าง ๆ ดังนี้ 
    1. ฟังก์ชั่น ranger () เป็นฟังก์ชั่นที่ใช้ในการสั่งงานให้ HC-SR04 ทำงานส่งสัญญาณออกไปและรับเวลาที่ใช้ในการส่งออกไป จนสะท้อนกลับมา แล้วคำนวณให้เป็นระยะทาง ในหน่วย เซนติเมตร
    2. ฟังก์ชั่น 
centerText(String tt, int tx, int ty) ใช้สำหรับแสดงค่าที่วัดได้ ให้อยู่ในแนวกึ่งกลาง
    3. ฟังก์ชั่น 
setup() ทำหน้าที่ในการเติมสีบนหน้าจอแสดงผล และกำหนดให้ พอร์ต D0 ทำหน้าที่เป็น เอ๊าท์พุต และ D1 ทำหน้าที่เป็น อินพุต
    4. ฟังก์ชั่น 
loop() อ่านค่า จากเซนเซอร์ HC-SR04 แล้วเปรียบเทียบค่าที่อ่านได้ กับ ค่าก่อนหน้านี้ ซึ่งเก็บไว้ในตัวแปร old ถ้าค่าที่รับมาต่างจากค่าเดิมที่ได้มาก่อนหน้านี้ ให้ลบข้อความเดิม แล้วเขียนข้อความใหม่บนจอแสดงผล ซึ่งมีทั้งหน่วย เซนติเมตร และ นิ้ว
    
    หลักในการใช้งาน HC-SR04 มีอยู่ว่า จะต้องกำหนดให้ขา Trig มีสถานะเป็น HIGH เป็นเวลานาน 10 ไมโครวินาที เพื่อส่งคลื่นออกไป และเมื่อตัวรับสัญญาณ ตรวจจับการสะท้อนของคลื่นได้ ก็จะส่งค่าเวลาในการเดินทางของคลื่นออกมา ผู้ใช้เพียงนำค่าที่ได้รับ หารด้วย 58.2 ก็จะได้ตัวเลขที่เป็นระยะทาง ในหน่วย เซนติเมตร และหากต้องการแสดงระยะทาง ในหน่วย นิ้ว ก็เพียงนำค่าระยะทางในหน่วย เซนติเมตร หารด้วย 2.54 ก็จะได้ระยะทางในหน่วย นิ้ว โดยง่าย

ขั้นตอนการทำงาน
    1. วาดหน้าจอของมิเตอร์
    2. อ่านค่าจากเซ็นเซอร์ HC-SR04
    3. เปรียบเทียบค่าที่อ่านได้ กับค่าก่อนหน้า
    4. ถ้าค่าต่างไปจากเดิม ให้ลบข้อความเดิม
    5. เขียนข้อความใหม่บนจอแสดงผล
    


เขียนโค้ด ใช้ทดสอบ


/*
   plakemphet.blogspot.com
   30/9/2021
   Wio Ranger with HC-SR04 not GROVE
*/

#include <TFT_eSPI.h>

TFT_eSPI tft = TFT_eSPI();

const int Trig = D0;  //D0-13  ขา Trig ของ HC-SR04
const int Echo = D1;  //D1-15  ขา Echo ของ HC-SR04

long echoTime;
int old;
uint16_t screenColor = TFT_DARKGREEN;  // สีพื้น หน้าจอ
uint16_t textColor = TFT_BLACK;    // สีตัวอักขระ

long ranger ()
{
  digitalWrite(Trig, LOW);        // ส่งสัญญาณเสียง 
  delayMicroseconds(2);
  digitalWrite(Trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);
  echoTime = pulseIn(Echo, HIGH);     // จับเวลาในการสะท้อนเสียง
  echoTime = echoTime / 58.2;   // แปลงเวลา เป็นระยะห่าง หน่วย เซนติเมตร
  return echoTime;
}

void centerText(String tt, int tx, int ty)
{
  int tlen = tt.length();
  tx = long((320 - (tlen  * 28)) / 2);
  tft.drawString(tt, tx, ty, 4);   // ใช้ตัวอักษรแบบที่ 4
}

void setup(void)
{
  tft.init();
  tft.setRotation(3);
  tft.fillScreen(TFT_BLACK);    // ระบายสีพื้นจอ
  tft.fillRect(0, 0, 319, 120, screenColor);    // วาดกรอบสี่เหลี่ยมด้วยสีตามที่กำหนดในตัวแปร screenColor
  tft.setTextColor(textColor);    // กำหนดสีตัวอักขระ ตามที่กำหนดในตัวแปร textColor
  tft.setTextSize(1);
  tft.drawString("MEASURE TAPE", 70, 10, 4);
  tft.drawString("cm.", 140, 95, 4);
  tft.setTextColor(TFT_DARKGREY);
  tft.drawString("inch(es)", 120, 200, 4);
  tft.setTextSize(1);
  pinMode(D0, OUTPUT);
  pinMode(D1, INPUT);
}

void loop()
{
  long cm = ranger() - 4;   // เพื่อให้ระยะ 0 cm อยู่ห่างจากหน้าเซ็นเซอร์ เป็นระยะ 4 เซนติเมตร
  if (cm != old)
  {
    //  ลบข้อความเดิมบนจอแสดงผล
    tft.setTextSize(2);
    tft.setTextColor(screenColor);
    centerText(String(old), 0, 40);
    tft.setTextColor(TFT_BLACK);
    centerText(String(old / 2.54), 0, 140);
  }
  // เขียนข้อความใหม่ บนจอแสดงผล 
  tft.setTextSize(2);
  tft.setTextColor(textColor);
  centerText(String(cm), 0, 40);
  tft.setTextColor(TFT_DARKGREY);
  centerText(String(cm / 2.54), 0, 140);
  delay(100);
  old = cm;
}

  



 ผลที่ได้จากการทำงาน

  
รูปที่ 3 ผลจากการทำงานของคำสั่ง

## ภาพที่อยู่ในบล็อกนี้ อาจมีบางภาพหายไป เนื่องจากปัญหาของ blogspot.com ซึ่งเป็นการอย่างแพร่หลาย ##


โพสต์ยอดนิยมจากบล็อกนี้

14. Wio Terminal EP.01 , เริ่มตันกับ Wio Terminal ด้วย circuitPython

28. Wio Terminal GPS

24. Wio Terminal EP.11, อนาล็อกมิเตอร์ วัดความสว่างของแสง