Lab 3

การติดต่อ Digital Input


VDO Link : https://www.youtube.com/watch?v=FHP8kCh1SBw


ระดับความยากง่าย

● ปานกลาง


ประมาณเวลาที่ใช้เรียนรู้ + ลงมือปฏิบัติตาม

● 30 นาที - 1 ชั่วโมง


Prerequisite ต้องผ่านหัวข้อหรือใบงานกิจกรรมใดมาก่อน

● Module NETPIE on NodeMCU/ESP8266 Lab 1 ติดตั้ง Arduino IDE และทดสอบการทำงานเบื้องต้นของ NodeMCUESP8266 (https://netpie.gitbooks.io/nodemcu-esp8266-on-netpie/content/chapter1.html)


วัตถุประสงค์

  1. เพื่อให้เข้าใจการใช้งานและสามารถประยุกต์ใช้งาน Digital Input ได้
  2. เพื่อให้เข้าใจการใช้งานและสามารถประยุกต์ใช้งานเซนเซอร์ความชื้นและอุณหภูมิ DHT11 ได้

อุปกรณ์ที่ใช้ในการทดลอง

1.บอร์ด NodeMCU ESP8266 (ESP-12E)

2.สวิตช์กดติดปล่อยดับ (Tact switch)

3.เซนเซอร์วัดความชื้นและอุณหภูมิ DHT11

4.Breadboard

5.สายไฟเชื่อมต่อ (Male to Female)

เนื้อหาเชิงทฤษฎี

ในการทดลองนี้เราจะทดลองใช้งานอินพุตแบบดิจิทัล (Digital Input) ของบอร์ด NodeMCU/ESP8266 ผู้ศึกษาจะได้เรียนรู้วิธีการใช้งานสวิตช์กดติดปล่อยดับ (Tact switch) ซึ่งสามารถหาซื้อได้ง่ายตามร้านค้าอุปกรณ์อิเล็กทรอนิกส์ทั่วไป ว่ามีการต่อวงจรอย่างไร จากนั้นเขียนโปรแกรมเพื่อให้บอร์ด NodeMCU/ESP8266 อ่านค่าสถานะการกดปุ่มของสวิตช์

การต่อวงจรอินพุตแบบดิจิทัล (Digital Input) มีสองแบบ แบบแรกคือการต่อแบบ Pull Up กล่าวคือ ในขณะที่ไม่ได้กดสวิตช์ บอร์ด Arduino Mega 2560 จะอ่านแรงดันไฟฟ้าได้ +3.3 V หรือที่เรียกว่า ลอจิก HIGH (‘1’) แต่เมื่อมีการกดสวิตช์ แรงดันไฟฟ้าจะลงมาที่ 0 V ซึ่งเรียกว่าลอจิก LOW (‘0’) ดังนั้นการทำงานภายใต้การต่อแบบ Pull up จึงถูกเรียกว่า Active Low นั่นคือลอจิก LOW ในขณะทำงาน แบบที่สองคือการต่อแบบ Pull Down ซึ่งจะได้ผลลัพธ์กลับกัน คือหากไม่ได้กดสวิตช์ จะได้ลอจิก LOW ‘0’ แต่เมื่อกดสวิตซ์จะได้ลอจิก HIGH ‘1’ ทำให้การต่อแบบ Pull Down ถูกเรียกว่า Active High นั่นคือเกิดการสั่งการในขณะลอจิก HIGH นั่นเอง

เนื่องจากขา GPIO ของ ESP8266 เกือบทั้งหมดมีตัวต้านทาน Pull Up (R1 ในรูป) ภายในอยู่แล้ว ดังนั้นการต่อสวิตช์เข้ากับบอร์ดจึงไม่จำเป็นต้องต่อความต้านทานภายนอกเพิ่มเติมอีก ต่อเพียงสวิตช์อย่างเดียวเท่านั้นดังภาพด้านล่าง

การทดลองส่วนที่สอง จะเป็นการอ่านค่าจากเซ็นเซอร์ความชื้นและอุณหภูมิ DHT11 โดยในกรณีนี้ค่าที่อ่านจะเป็นสัญญาณแอนะล็อก ซึ่งเซ็นเซอร์จะแปลงเป็นสัญญาณดิจิทัลให้ ผู้ใช้งานจึงสามารถเขียนโปรแกรมรับค่าที่เป็นดิจิทัลได้เลยโดยไม่ต้องแปลงสัญญาณใดๆ ในการทดลองนี้ เราจะบอกวิธีที่ใช้ Library ของ Arduino ในการติดต่อกับเซ็นเซอร์ตัวนี้ โดยสิ่งที่ผู้ศึกษาต้องปฏิบัติคือต่อวงจรให้ถูกต้องเท่านั้นก็จะสามารถติดต่อกับเซ็นเซอร์ DHT11 ได้ในทันที เซ็นเซอร์ DHT11 มีคุณสมบัติมีดังนี้

● ใช้แรงดันไฟเลี้ยง +3 V ถึง +5.5 V และกระแสไฟฟ้า 2.5 mA

● วัดความชื้นสัมพัทธ์ได้ 20 ถึง 80% RH ความผิดพลาด ±5% RH และมีความละเอียดในการวัด 1% ขนาดของข้อมูล 8 บิต

● วัดอุณหภูมิได้ 0 ถึง 50 องศาเซลเซียส ความผิดพลาด ±2 องศาเซลเซียส ความละเอียดในการวัด 1 องศาเซลเซียส ขนาดของข้อมูล 8 บิต

● อัตราการสุ่มวัด 1 ครั้งต่อวินาที ความเร็วในการตอบสนองต่อการเปลี่ยนแปลงในการวัด 6 ถึง 30 วินาที

ฟังก์ชั่นของโปรแกรมที่ควรทราบ

pinMode

ฟังก์ชั่น pinMode เป็นฟังก์ชั่นในการตั้งค่าโหมดการทำงานให้กับขาต่างๆ ของ Arduino Mega 2560 เช่น Input, Output หรือ Input_Pullup

Syntax:

pinMode(pin, mode)

Parameter:

pin: หมายเลขขาที่ต้องการตั้งค่าใช้งาน

mode: INPUT : ตั้งขาเป็นอินพุต โดยต่อแบบ Pull Down

INPUT_PULLUP : ตั้งขาเป็นอินพุตที่ต่อแบบ Pull Up และใช้ตัวต้านทาน Pull Up ภายในของบอร์ด

OUTPUT : ตั้งขาเป็นเอาท์พุต

digitalRead

ฟังก์ชั่น digitalRead เป็นฟังก์ชั่นที่ใช้ในการอ่านค่าลอจิกของขาที่ต้องการ ซึ่งจะต้องถูกตั้งโหมดให้เป็น INPUT หรือ INPUT_PULLUP

Syntax:

digitalRead(pin)

Parameter:

pin: หมายเลขขาที่ต้องการใช้งานอ่านค่าสถานะ

Return:

HIGH: เมื่ออ่านค่าลอจิกได้เป็น ‘1’ หรือ HIGH

LOW: เมื่ออ่านค่าลอจิกได้เป็น ‘0’ หรือ LOW

isnan

ฟังก์ชั่น isnan เป็นฟังก์ชั่นตรวจสอบว่าค่าของตัวแปรเป็นตัวเลขตัวเลขหรือไม่ โดยจะให้ผลลัพธ์เป็นค่า Integer “1” เมื่อตัวแปรไม่เป็นตัวเลข (Not-a-Number: NaN) และ “0” เมื่อเป็นตัวเลข

Syntax:

isnan(var)

serial.begin

serial.begin เป็นฟังก์ชั่นที่ใช้ในการตั้งค่าความเร็วในการส่งข้อมูลของพอร์ต serial ที่เชื่อมต่อระหว่างบอร์ดกับคอมพิวเตอร์

Syntax:

serial.begin(speed)

Parameter:

speed: ความเร็วในการรับส่งข้อมูล หน่วยเป็นบิตต่อวินาที (baud)

serial.print

serial.print เป็นฟังก์ชั่นเพื่อให้บอร์ดส่งค่าข้อมูลออกไปพิมพ์ทางพอร์ต serial

Syntax:

serial.print(val)

serial.print(val, format)

Parameter:

val: ค่าข้อมูลที่ต้องการพิมพ์ จะเป็นชนิดใดก็ได้

format: ใช้ในกรณีตัวเลข และต้องการระบุฐานของตัวเลข หรือจำนวนทศนิยม เช่น BIN, DEC, HEX, 1 (ทศนิยม 1 หลัก)

serial.println

serial.println เป็นฟังก์ชั่นที่ทำงานเหมือนกับ serial.print ต่างกันตรงที่เมื่อใช้คำสั่ง serial.println จะขึ้นต้นบรรทัดใหม่เมื่อพิมพ์ค่าข้อมูลเสร็จ

Syntax:

serial.println(val)

serial.println(val, format)

Parameter:

val: ค่าข้อมูลที่ต้องการพิมพ์ จะเป็นชนิดใดก็ได้

format: ใช้ในกรณีตัวเลข และต้องการระบุฐานของตัวเลข หรือจำนวนทศนิยม เช่น BIN, DEC, HEX, 1 (ทศนิยม 1 หลัก)

การทดลองที่ 1

การทดลองการใช้งาน Digital Input

1.1 ต่อสวิตช์ดังภาพ

1.2 เปิดโปรแกรม Arduino IDE แล้วคลิกที่เมนู File -> New File

1.3 เขียนโค้ดลงไปในโปรแกรมดังนี้

#define D1 5 
#define button D1     // switch input Active Low
#define pressed LOW
void setup() 
{
  Serial.begin(9600);
  pinMode(button,INPUT_PULLUP);
}
void loop() 
{
  bool ReadSwitch = digitalRead(button);
  if(ReadSwitch == pressed)
  {
    Serial.println("Pressed Switch.");
    delay(500);
  }
}

คำอธิบายโปรแกรม

การกำหนด #define กำหนดให้ ขา 5 ของ ESP8266 เป็นขา D1 บน NodeMCU และกำหนดให้ขา D1 ของ NodeMCU นั้นต่อกับสวิตช์ปุ่มกด (button) และกำหนดให้คำว่า pressed แทนลอจิก LOW เนื่องจากในการทดลองนี้ เราต่อสวิตช์แบบ Input Pullup ซึ่งทำงานแบบ Active Low นั่นคือสถานะลอจิกเป็น LOW ขณะกดปุ่ม

ส่วนที่อยู่ในฟังก์ชั่นหลัก setup() คือการเริ่มต้นตั้งค่าต่างๆ ได้แก่ความเร็วในการเชื่อมต่อผ่านสาย Serial ที่ความเร็ว 9,600 บิตต่อวินาที และการกำหนดให้ขา button หรือขาหมายเลข 2 ตามที่กำหนดใน #define ให้เป็นแบบ Input Pullup ในส่วนภายใน setup() นี้ จะทำงานจากบรรทัดบนไปสู่บรรทัดล่างโดยไม่มีการวนลูป

ส่วนที่อยู่ภายในฟังก์ชั่นหลัก loop() จะทำงานวนลูปไปเรื่อยๆ ตามลำดับไม่สิ้นสุด โดยในการทดลองนี้ เราจะวนลูปเพื่ออ่านค่าลอจิกจากขา button ด้วยคำสั่ง digitalRead มาเก็บไว้ในตัวแปลแบบ Boolean ชื่อ ReadSwitch แล้วทำการตรวจสอบเงื่อนไขของค่าลอจิกที่อ่านได้ด้วยคำสั่งควบคุม if หากมีการกดปุ่ม (pressed = LOW) จะทำงานในคำสั่ง Serial.print เพื่อส่งข้อความ "Pressed Switch." ไปแสดงผลที่หน้าจอ จากนั้นจะหน่วงเวลาไว้ 500 ms ก่อนจะวนลูปซ้ำ

1.4 คลิกที่ปุ่ม เพื่อคอมไพล์โค้ด แล้วทำการบันทึกไฟล์เป็น “DigitalInput” ไว้ที่ Desktop ดังภาพตัวอย่างด้านล่าง เมื่อคอมไพล์เสร็จสิ้นและไม่มีข้อผิดพลาด ทำการอัพโหลดโดยคลิกปุ่ม

1.5 จากนั้นให้คลิกที่ ปุ่ม Serial monitor (รูปแว่นขยาย) และทำการกดสวิตช์ เพื่อทำการอ่านค่าผลลัพธ์ดังภาพ

การทดลองที่ 2

การทดลองการใช้งานเซนเซอร์ DHT11

2.1 ทำการต่อเซนเซอร์ DHT11 เข้ากับบอร์ด NodeMCU/ESP8266 วงจรดังภาพ

2.2 เปิดโปรแกรม Arduino IDE เพื่อติดตั้ง Library ของ DHT11 โดยไปที่เมนู Sketch -> Include Library -> Manage Libraries

2.3 พิมพ์ DHT11 ในช่องค้นหา แล้วคลิกที่ผลลัพธ์ DHT sensor library by Adafruit จากนั้นคลิก Install

2.4 เขียนโปรแกรมใหม่โดยไปที่เมนู File -> New File

2.5 เขียนโค้ดลงไปในสเก็ตช์ดังต่อไปนี้

#include "DHT.h"
#define D4 2   // TXD1
#define DHTPIN D4     // what digital pin we're connected to
#define DHTTYPE DHT11   // DHT 11

DHT dht(DHTPIN, DHTTYPE);

void setup() 
{
  Serial.begin(115200);
  dht.begin();  // เริ่มต้นเรียกใช้งาน Library DHT11 
}

void loop()
{
  // Wait a few seconds between measurements.
  delay(2000);
  float Humidity = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float Temp = dht.readTemperature();

  // Check if any reads failed and exit early (to try again).
  if (isnan(Humidity) || isnan(Temp)) 
  {
    Serial.println("Failed to read from DHT sensor!");  // บอกสถานะหากเกิดการผิดพลาดในการอ่านข้อมูล สาเหตุอาจเกิดได้จากสัญญาณรบกวน หรือการเชื่อมต่อที่ไม่สมบรูณ์
    return;
  }
  else
  {
    Serial.print("Humidity: ");
    Serial.print(Humidity);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(Temp);
    Serial.println(" *C ");
  }

}

คำอธิบายโปรแกรม

การกำหนด #include ประกาศเรียกใช้ Library ของ DTH (DHT.h)

การกำหนด #define กำหนดให้ ขา 2 ของ ESP8266 เป็นขา D4 บน NodeMCU และกำหนดให้เรียกขา D4 ว่า DHTPIN จากนั้นให้ DHTTYPE เรียกแทนคำว่า DHT11 แล้วประกาศ Object ของ DHT ด้วย dht(DHTPIN, DHTTYPE)

ส่วนภายในฟังก์ชั่นหลัก setup() เป็นการเริ่มต้นตั้งค่าความเร็วในการเชื่อมต่อผ่าน Serial ที่ 115200 บิตต่อวินาที และเริ่มต้นเรียกใช้งานไลบรารี่ DHT11 ด้วยคำสั่ง dht.begin()

ส่วนภายในฟังก์ชั่นหลัก loop() เริ่มจากคำสั่งหน่วงเวลา 2000 ms เพื่อเว้นระยะระหว่างการอ่านค่าแต่ละครั้ง จากนั้นสั่งอ่านค่าความชื้นจากเซ็นเซอร์ด้วยคำสั่ง dht.readHumidity() เก็บไว้ในตัวแปร Humidity และอ่านค่าอุณหภูมิด้วยคำสั่ง dht.readTemperature() เก็บค่าไว้ในตัวแปร Temp จากนั้นจะเข้าสู่คำสั่งควบคุม if, else เพื่อตรวจสอบเงื่อนไขว่าค่าความชื้นหรืออุณหภูมิที่ได้เป็นตัวเลขที่สามารถอ่านค่าได้หรือไม่ หากไม่เป็น ให้พิมพ์ข้อความ Failed to read from DHT sensor! ไปยังหน้าจอ หากเป็นให้พิมพ์ค่าของความชื้นและอุณหภูมิออกมา และทำกระบวนการที่กล่าวมาวนซ้ำตามลำดับไปเรื่อยๆ

2.6 คอมไพล์โค้ด และบันทึกไฟล์ไว้บน Desktop โดยในตัวอย่างที่แสดงตั้งชื่อไฟล์เป็น “DHT11” หากไม่มีข้อผิดพลาด อัพโหลดไฟล์โปรแกรมลงบนบอร์ด

2.7 คลิกปุ่ม (Serial monitor) จะได้ผลลัพธ์บนหน้าจอดังภาพ

สรุปผล ในการทดลองนี้ เราทดลองใช้งาน Digital Input ของบอร์ด Arduino Mega 2560 โดยในส่วนแรกอ่านค่าสถานะของสวิตช์ และในส่วนที่สอง อ่านค่าอุณหภูมิกับความชื้นจากเซ็นเซอร์ DHT11 โดยนอกจากผู้ศึกษาจะได้เรียนรู้วิธีการต่อวงจรแล้ว ยังได้ทดลองเรียกใช้ Library ของ DHT11 มาใช้งานเพื่อให้เขียนโปรแกรมได้สั้นและง่ายยิ่งขึ้น

แบบฝึกหัดทดสอบความเข้าใจ

  1. คำสั่งอะไรใช้อ่านค่าจากสวิตช์
  2. หากแก้ไขโค้ดจาก #define pressed LOW ให้เป็น #define pressed HIGH จะเกิดอะไรขึ้น
  3. คำสั่งอะไรในการทดลองที่ใช้ในการอ่านค่าอุณหภูมิกับ ความชื้นของ DHT11
  4. แก้ไขโค้ดที่แสดงด้านล่าง เพื่อทำให้เมื่อกดปุ่มแล้วจะมีการแสดงผลค่าอุณหภูมิและความชื้น
#include "DHT.h"
#define D1 5 
#define D4 2   // TXD1

#define button D1     // switch input Active Low
#define DHTPIN D4     // what digital pin we're connected to
#define DHTTYPE DHT11   // DHT 11

#define pressed LOW

DHT dht(DHTPIN, DHTTYPE);

void setup() 
{
  Serial.begin(115200);
  dht.begin(); 
  pinMode(button,INPUT_PULLUP);
}

void loop()
{
  bool ReadSwitch = digitalRead(button);
  if(ReadSwitch == pressed)
  {
    Serial.println("Pressed Switch.");
    delay(50);
  }

  // Wait a few seconds between measurements.
  delay(2000);
  float Humidity = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float Temp = dht.readTemperature();

  // Check if any reads failed and exit early (to try again).
  if (isnan(Humidity) || isnan(Temp)) 
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  else
  {
    Serial.print("Humidity: ");
    Serial.print(Humidity);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(Temp);
    Serial.println(" *C ");
  }

}

เฉลย-แบบฝึกหัดทดสอบความเข้าใจ

  1. digitalRead(button);
  2. เมื่อไม่ได้กดปุ่มสวิตช์ หน้าจอจะแสดงข้อความ Pressed Switch แต่เมื่อกดปุ่มแล้วจะไม่มีข้อความใดปรากฎ
  3. float Humidity = dht.readHumidity(); อ่านค่าความชื้นและ float Temp = dht.readTemperature(); อ่านค่าอุณหภูมิ
#include "DHT.h"
#define D1 5 
#define D4 2   // TXD1

#define button D1     // switch input Active Low
#define DHTPIN D4     // what digital pin we're connected to
#define DHTTYPE DHT11   // DHT 11

#define pressed LOW

DHT dht(DHTPIN, DHTTYPE);

void setup() 
{
  Serial.begin(115200);
  dht.begin(); 
  pinMode(button,INPUT_PULLUP);
}

void loop()
{
  bool ReadSwitch = digitalRead(button);
  if(ReadSwitch == pressed)
  {
    Serial.println("Pressed Switch.");
    // Wait a few seconds between measurements.
    delay(2000);
    float Humidity = dht.readHumidity();
    // Read temperature as Celsius (the default)
    float Temp = dht.readTemperature();

    // Check if any reads failed and exit early (to try again).
    if (isnan(Humidity) || isnan(Temp)) 
    {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }
    else
    {
      Serial.print("Humidity: ");
      Serial.print(Humidity);
      Serial.print(" %\t");
      Serial.print("Temperature: ");
      Serial.print(Temp);
      Serial.println(" *C ");
    }
  }
}

VDO Link : https://www.youtube.com/watch?v=FHP8kCh1SBw


results matching ""

    No results matching ""