หน้าเว็บ

วันจันทร์ที่ 17 มิถุนายน พ.ศ. 2562

โปรเจค ESP32 DevKit V1 เปิดปิดไฟ ผ่านบลูทูธ BLE ด้วย App มือถือ


โมดูลบลูทูธ เช่น HC-05 และ HC-06 นั้นติดตั้งง่ายและใช้งานง่ายกับ Arduino IDE แต่มีข้อ จำกัด ของตัวเองเช่นการใช้พลังงานสูงและทำงานบน Bluetooth V2.0 รุ่นเก่า แต่ ESP32 โมดูลเหล่านี้มีคุณสมบัติมากมายเช่น Wi-Fi และบลูทูธ ในตัว มีขา ADC และ DAC ที่เพียงพอการสนับสนุนด้านเสียงรองรับการ์ด SD โหมด Deep Sleep ฯลฯ ซึ่งจะมีเกือบทุกอย่างเพื่อที่จะสร้างโครงการ IoT

BLE

BLE ย่อมาจาก Bluetooth Low Energy หรืออาจแปลเป็นไทยได้ว่า บลูทูธพลังงานต่ำ ตามหลักแล้วอุปกรณ์ BLE จะใช้พลังงานน้อยมาก ๆ บางอุปกรณ์เครมว่าสามารถอยู่ได้ต่อเนื่องนาน 1 ปี โดยใช้พลังงานจากถ่านกระดุมเพียงก้อนเดียว ซึ่ง BLE จะทำงานร่วมกับ Bluetooth V4.0 และสามารถทำงานโดยใช้พลังงานต่ำโดยเป็นเซิร์ฟเวอร์หรือเป็นไคลเอนต์ ซึ่งทำให้ BLE เป็นตัวเลือกที่เหมาะอย่างยิ่ง

บลูทูธ แบบเดิมนั้นเป็นเพียงบลูทูธ ธรรมดาธรรมดาที่เราใช้ในการถ่ายโอนไฟล์และข้อมูลอื่นๆ แต่อุปกรณ์ BLE เกือบทั้งหมดจะมีฟังก์ชั่น Classic Bluetooth ที่ใช้ในโมดูลเช่น HC-05 หรือที่เรียกว่าบลูทูธ SSP (Serial Port Protocol) หมายถึงบลูทูธ ตามโปรโตคอลอนุกรมมาตรฐาน ซึ่งทำให้การส่งและรับข้อมูลทำได้ง่ายขึ้น


ESP32 เปิดปิดไฟ ผ่านบลูทูธ BLE ด้วย App มือถือ

ในบทความนี้เราจะใช้ฟังก์ชั่น Serial Bluetooth ใน ESP32 เพื่อจับคู่กับสมาร์ทโฟนและใช้แอพ Bluetooth Terminal ที่มีอยู่ใน Play store เพื่อส่งคำสั่งไปยัง ESP32  เพื่อควบคุมเปิดปิด LED โดยใช้สมาร์ทโฟน

โดยให้ 
แอพ Bluetooth Terminal ส่งข้อมูลผ่านบลูทูธออกมา เมื่อ ESP32 ได้รับจะถูกเก็บไว้ในตัวแปร  สามารถเปรียบเทียบตัวแปรนี้ และดำเนินการตามที่ต้องการ  โดย ESP32 จะอ่านค่าที่ส่งมาจากสมาร์ทโฟน ในรูปแบบ char คือเป็นตัวอักษรขนาด 1 ตัว แล้วแปลงค่าเป็นตัวเลข (Dec)  ฉะนั้น ในกรณีที่ต้องการใช้ตัวอักษร  ‘0’ ในการควบคุมจึงเขียนโค้ดเป็น 48 และเมื่อต้องการใช้ตัวอักษร  ‘1’  ในการควบคุม จึงเขียนโค้ดเป็น 49 โดยสามารถอ้างอิงแผนภูมิ ASCII เพื่อทำความเข้าใจว่าค่าทศนิยมสำหรับอักขระทุกตัวคืออะไร ASCII chart 






### อุปกรณ์ที่ใช้ ###


1. DOIT ESP32 DevKit V1 Development Board

2. Micro USB Cable Wire 1m for NodeMCU

3. Breadboard 8.5CM x 5.5CM 400 holes

4. Traffic Light LED Display Module

5. Jumper (M2M) 10cm Male to Male

6. 10UF 25V Electrolytic Capacitor

7. รางถ่าน AA 6 ก้อน 9 โวลต์


โดยการทำโปรเจคมีขั้นตอนดังนี้


1.ติดตั้ง Arduino core for ESP32

ลิงค์การติดตั้ง Arduino core for ESP32

https://robotsiam.blogspot.com/2017/09/arduino-core-for-esp32.html


2.เชื่อมต่ออุปกรณ์



2.1 เชื่อมต่อ  ESP32  กับ Traffic Light LED Display Module





2.2 เชื่อมต่อ  ESP32  กับ คาปาซิเตอร์ 10UF 





การต่อ คาปาซิเตอร์ 10UF นั้นเป็นการแก้ปัญหา A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header ในขั้นตอนอัพโหลดโปรแกรม






ถ้าไม่ได้ต่อ คาปาซิเตอร์ 10UF ให้แก้ปัญหาดังนี้ : ให้กดปุ่ม BOOT ค้างไว้แล้วกดปุ่ม EN (กดแล้วปล่อย) หลังจากนั้นให้คลิกอัพโหลด (ยังกดปุ่ม BOOT ค้างไว้อยู่) รอจนกว่าข้อความในหน้าต่างแสดงผลเปลี่ยนจากสีขาวเป็นสีส้มแล้วค่อยปล่อยมือ


ภาพรวมการต่อวงจร 1





2.3 เชื่อมต่อ  ESP32  กับ รางถ่าน AA 6 ก้อน







ภาพรวมการต่อวงจร 2





การเชื่อมต่อรางถ่าน AA 6 ก้อน นั้นเป็นการ ป้อนแหล่งจ่ายไฟให้กับ ESP32  ขณะที่ไม่ใช้สาย USB และเป็นการแก้ปัญหา ในกรณีที่คอมพิวเตอร์มองไม่เห็นพอร์ต ของ ESP32 อีกด้วย




3. อัพโหลดโปรแกรม


3.1 เชื่อมต่อสาย USB ระหว่าง คอมพิวเตอร์ กับ ESP32




3.2 เขียนโค้ดดังนี้





#include "BluetoothSerial.h"

BluetoothSerial ESP_BT;

int incoming;

void setup() {

  Serial.begin(9600);

  ESP_BT.begin("ESP32_LED_Control");

  Serial.println("Bluetooth Device is Ready to Pair");

  pinMode (12, OUTPUT);

  pinMode (13, OUTPUT);

  pinMode (27, OUTPUT);


}

void loop() {

  if (ESP_BT.available())
  {
    incoming = ESP_BT.read();

    Serial.print("Received:"); Serial.println(incoming);

    if (incoming == 49)
    {
      digitalWrite(13, HIGH);

      ESP_BT.println("GREEN LED ON");
    }

    if (incoming == 48)
    {
      digitalWrite(13, LOW);

      ESP_BT.println("GREEN LED OFF");
    }

    if (incoming == 51)
    {
      digitalWrite(12, HIGH);

      ESP_BT.println("YELLOW LED ON");
    }

    if (incoming == 50)
    {
      digitalWrite(12, LOW);

      ESP_BT.println("YELLOW LED OFF");
    }

    if (incoming == 53)
    {
      digitalWrite(27, HIGH);

      ESP_BT.println("RED LED ON");
    }

    if (incoming == 52)
    {
      digitalWrite(27, LOW);

      ESP_BT.println("RED LED OFF");
    }

    if (incoming == 55)
    {
      digitalWrite(13, HIGH);

      digitalWrite(12, HIGH);

      digitalWrite(27, HIGH);

      ESP_BT.println("ALL LED ON");
    }

    if (incoming == 54)
    {
      digitalWrite(13, LOW);

      digitalWrite(12, LOW);

      digitalWrite(27, LOW);

      ESP_BT.println("ALL LED OFF");
    }
  }
  delay(20);

}


3.3 ไปที่ Tools -> Board เลือก ESP32 Dev Module



3.4 ไปที่ Tools -> Port แล้วเลือกพอร์ตที่ปรากฏ (กรณีใช้เครื่องคอมพิวเตอร์ที่มี COM Port ให้เลือกตัวอื่นที่ไม่ใช่ COM1)

ในตัวอย่างเลือกเป็น "COM12"


3.5 ไปที่ Tools -> Upload Speed : เลือกเป็น "115200"




3.6 กดปุ่ม   เพื่ออัพโหลด

ตั้งชื่อไฟล์ -> Save โปรแกรม จะทำการ อัพโหลด




3.7 หากสามารถอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จ จะแสดงคำว่า Done uploading. ที่แถบด้านล่าง



4. ติดตั้งแอพ Bluetooth Terminal 

4.1 ใช้ สมาร์ทโฟน ระบบปฏิการ แอนดรอย ไปที่ Play Store ค้นหา bluetooth terminal เลือก Bluetooth Terminal (Qwerty)





4.2 ติดตั้ง


5. ทดสอบการทํางาน


5.1 เปิดการเชื่อมต่อ บลูทูธ





5.2 เปิดแอพ Bluetooth Terminal




5.3 เลือก Connect a device - Secure




5.4 เลือก Scan for devices




5.5 เลือก ESP32_LED_Control




5.6 เลือก จับคู่




5.7 ทดสอบการทำงาน




โดย

พิมพ์ 1 -> Send -> ผลลัพธ์ คือ LED สีเขียว ติด
พิมพ์ 0 -> Send -> ผลลัพธ์ คือ LED สีเขียว ดับ
พิมพ์ 3 -> Send -> ผลลัพธ์ คือ LED สีเหลือง ติด
พิมพ์ 2 -> Send -> ผลลัพธ์ คือ LED สีเหลือง ดับ
พิมพ์ 5 -> Send -> ผลลัพธ์ คือ LED สีเแดง ติด
พิมพ์ 4 -> Send -> ผลลัพธ์ คือ LED สีแดง ดับ
พิมพ์ 7 -> Send -> ผลลัพธ์ คือ LED ทุกดวง ติด
พิมพ์ 6 -> Send -> ผลลัพธ์ คือ LED ทุกดวง ดับ



6. วีดีโอ ผลลัพล์การทำงาน






7. อธิบายโค้ด 



#include "BluetoothSerial.h" // ให้คอมไพเลอร์นำเฮดเดอร์ไฟล์ (Library Function) ชื่อ BluetoothSerial.h เข้ามาร่วมในการประมวลผลด้วย

BluetoothSerial ESP_BT;  //  ให้ BluetoothSerial ใช้ชื่อว่า ESP_BT

int incoming; // ประกาศตัวแปรชื่อ incoming มีชนิดของข้อมูลคือ int คือ เลขจำนวนเต็ม 


void setup() {  // ฟังก์ชันส่วนนี้จะทำงานครั้งแรก เพียงครั้งเดียวเท่านั้น

  Serial.begin(9600);  //  ตั้งค่าความเร็วในการรับ-ส่งข้อมูล ค่ามาตรฐาน คือ 9600

  ESP_BT.begin("ESP32_LED_Control");  // ชื่อบลูทูธ

  Serial.println("Bluetooth Device is Ready to Pair");  //  ส่งข้อความ Bluetooth Device is Ready to Pair ออกไปที่ App

  pinMode (12, OUTPUT);  // ให้พิน 12 ทำงานเป็นแบบเอาท์พุท

  pinMode (13, OUTPUT);  // ให้พิน 13 ทำงานเป็นแบบเอาท์พุท

  pinMode (27, OUTPUT);  // ให้พิน 27 ทำงานเป็นแบบเอาท์พุท

}  //  สิ้นสุดการทำงานของฟังก์ชัน setup


void loop() {  //  ฟังก์ชันส่วนนี้จะทำงานซ้ำ วนลูป ไปเรื่อยๆ

  if (ESP_BT.available())  //  ถ้า ESP_BT มีข้อมูลเข้ามา
  {
    
     incoming = ESP_BT.read();  //  อ่านค่าข้อมูลจาก ESP_BT แล้วเก็บไว้ในตัวแปร incoming

    Serial.print("Received:"); Serial.println(incoming);  //  ส่งข้อความ ที่อ่านได้ ออกไปที่ App

    if (incoming == 49)  //  ถ้าข้อมูลเท่ากับ 49 หรือ ตัวอักษร  ‘1’
    {
      digitalWrite(13, HIGH);  // ให้พิน 13 ส่งไฟออกไป ทำให้ LED สีเขียว ติด

      ESP_BT.println("GREEN LED ON");  //  ส่งข้อความ GREEN LED ON ไปที่ App
    }

    if (incoming == 48)  //  ถ้าข้อมูลเท่ากับ 48 หรือ ตัวอักษร  ‘0’
    {
      digitalWrite(13, LOW);  // ให้พิน 13 หยุดส่งไฟออกไป ทำให้ LED สีเขียว ดับ

      ESP_BT.println("GREEN LED OFF");  //  ส่งข้อความ GREEN LED OFF ไปที่ App
    }

    if (incoming == 51)  //  ถ้าข้อมูลเท่ากับ 51 หรือ ตัวอักษร  ‘3’
    {
      digitalWrite(12, HIGH); // ให้พิน 12 ส่งไฟออกไป ทำให้ LED สีเหลือง ติด

      ESP_BT.println("YELLOW LED ON");  //  ส่งข้อความ YELLOW LED ON ไปที่ App
    }

    if (incoming == 50)  //  ถ้าข้อมูลเท่ากับ 50 หรือ ตัวอักษร  ‘2’
    {
      digitalWrite(12, LOW);  // ให้พิน 12 หยุดส่งไฟออกไป ทำให้ LED สีเหลือง ดับ

      ESP_BT.println("YELLOW LED OFF");  //  ส่งข้อความ YELLOW LED OFF ไปที่ App
    }

    if (incoming == 53)  //  ถ้าข้อมูลเท่ากับ 53 หรือ ตัวอักษร  ‘5’
    {
      digitalWrite(27, HIGH);  // ให้พิน 27 ส่งไฟออกไป ทำให้ LED สีแดง ติด

      ESP_BT.println("RED LED ON");   //  ส่งข้อความ RED LED ON ไปที่ App
    }

    if (incoming == 52)  //  ถ้าข้อมูลเท่ากับ 52 หรือ ตัวอักษร  ‘4’
    {
      digitalWrite(27, LOW);  // ให้พิน 27 หยุดส่งไฟออกไป ทำให้ LED สีแดง ดับ

      ESP_BT.println("RED LED OFF");  //  ส่งข้อความ RED LED OFF ไปที่ App
    }

    if (incoming == 55)  //  ถ้าข้อมูลเท่ากับ 55 หรือ ตัวอักษร  ‘7’
    {
      digitalWrite(13, HIGH);   // ให้พิน 13 ส่งไฟออกไป ทำให้ LED สีเขียว ติด

      digitalWrite(12, HIGH);  // ให้พิน 12 ส่งไฟออกไป ทำให้ LED สีเหลือง ติด

      digitalWrite(27, HIGH);  // ให้พิน 27 ส่งไฟออกไป ทำให้ LED สีแดง ติด

      ESP_BT.println("ALL LED ON");  //  ส่งข้อความ ALL LED ON ไปที่ App
    }

    if (incoming == 54)  //  ถ้าข้อมูลเท่ากับ 54  หรือ ตัวอักษร  ‘6’
    {
      digitalWrite(13, LOW);  // ให้พิน 13 หยุดส่งไฟออกไป ทำให้ LED สีเขียว ดับ

      digitalWrite(12, LOW);  // ให้พิน 12 หยุดส่งไฟออกไป ทำให้ LED สีเหลือง ดับ

      digitalWrite(27, LOW);  // ให้พิน 27 หยุดส่งไฟออกไป ทำให้ LED สีแดง ดับ

      ESP_BT.println("ALL LED OFF");  //  ส่งข้อความ ALL LED OFF ไปที่ App
    }
  }
  delay(20);  //  หน่วงเวลา 20  มิลลิวินาที

 //  สิ้นสุดการทำงานของฟังก์ชัน loop แล้วเริ่มทำงานฟังก์ชัน loop ใหม่ซ้ำไปเรื่อยๆ



...

credit : https://circuitdigest.com/microcontroller-projects/using-classic-bluetooth-in-esp32-and-toogle-an-led

ไม่มีความคิดเห็น:

แสดงความคิดเห็น