- ส่วนประกอบที่จำเป็น
- ใช้ nRF Connect Android App สำหรับ ESP32 iBeacon
- การเขียนโปรแกรม ESP32 ให้ทำงานเป็น BLE iBeacon
ESP32 เป็นอุปกรณ์ IoT ที่ทรงพลังที่รองรับ Bluetooth และ WiFi ในตัว ESP32 เป็นรุ่นขั้นสูงของ ESP8266 รุ่นก่อนที่มีคุณสมบัติพิเศษเช่น RAM, ROM, GPIO Pins เป็นต้นโมดูล ESP32 รองรับทั้งบลูทู ธ แบบคลาสสิกและบลูทู ธ พลังงานต่ำ (BLE) บลูทู ธ แบบคลาสสิกสามารถใช้ในการถ่ายโอนเพลงหรือไฟล์และ BLE สามารถใช้ตัวเลือกสำหรับแอพพลิเคชั่นที่ปรับให้เหมาะสมกับแบตเตอรี่เช่นบลูทู ธ บีคอนแถบออกกำลังกายพร็อกซิมิตี ฯลฯ นอกจากนี้ยังสามารถใช้ ESP32 เป็นบลูทู ธ แบบอนุกรมเช่นโมดูล HC-05 หรือ HC-06 สำหรับโครงการไมโครคอนโทรลเลอร์อย่างง่าย
ดังที่เราทราบกันดีว่า BLE สามารถทำงานได้ในสองโหมดที่แตกต่างกัน - โหมดเซิร์ฟเวอร์และโหมดไคลเอนต์ ทั้งสองโหมดได้รับการกล่าวถึงในบทช่วยสอน ESP32ก่อนหน้านี้ของเรา:
- ESP32 BLE Server - บริการ GATT สำหรับการระบุระดับแบตเตอรี่
- ไคลเอนต์ ESP32 BLE - การเชื่อมต่อกับ Fitness Band เพื่อทริกเกอร์ Bulb
ในบทช่วยสอนนี้เราจะสร้างBLE iBeacon โดยใช้ ESP32 โดยที่ ESP32 จะทำหน้าที่เป็นเซิร์ฟเวอร์และสมาร์ทโฟนจะทำหน้าที่เป็นไคลเอนต์ ฉันคิดว่าคุณคุ้นเคยกับวิธีใช้บอร์ด ESP32 กับ Arduino IDE แล้วหากไม่ถอยกลับไปที่การเริ่มต้นใช้งานแบบฝึกหัด ESP32
นอกจากนี้คุณยังสามารถทราบข้อมูลเพิ่มเติมเกี่ยวกับเทคโนโลยี Beacon / iBeacon ได้โดยการอ่านโครงการ Bluetooth iBeacon ก่อนหน้านี้โดยใช้ Raspberry Pi และ HM-10 BLE iBeacon
ส่วนประกอบที่จำเป็น
ฮาร์ดแวร์:
- คณะกรรมการพัฒนา ESP32
- สายไมโคร USB
ซอฟต์แวร์:
- Arduino IDE
- แอพ Android: nRF Connect สำหรับมือถือ (โดย Nordic Semiconductor)
มีแอพสแกนเนอร์ BLE จำนวนมากหนึ่งในนั้นที่เราเคยใช้ในโครงการ How to Use HM-10 BLE Module กับ Arduino ก่อนหน้านี้ นี้ app สแกนเนอร์ BLE ให้ดีกราฟิก Interface (GUI) แต่ขาดข้อมูลเพิ่มเติมดังนั้นในโครงการนี้เราจะใช้NRF เชื่อมต่อสำหรับแอปมือถือ
ใช้ nRF Connect Android App สำหรับ ESP32 iBeacon
1. ดาวน์โหลดแอป nRF Connect จาก Google Play Store แล้วเปิดขึ้นมา
![]()
2. หน้าจอมีลักษณะดังนี้ ตัวเลือกที่มีประโยชน์สำหรับโปรเจ็กต์นี้คือ 'Scan', 'Scanner' และ 'Info' เมื่อพบอุปกรณ์
'สแกน'ตัวเลือกที่จะใช้ในการดูทั้งหมด iBeacons ใช้ได้ ในการเริ่มค้นหา iBeacon ให้ดึงหน้าจอลงหรือไปที่ตัวเลือก 'Scan' ที่มุมขวาบนของหน้าจอ สิ่งนี้จะเริ่มค้นหา iBeacons ที่มี
![]()
3. หลังจากค้นหา iBeacon คุณจะสามารถเห็น RSSI, UUID, Major และ Minor ของ iBeacon RSSI จะเปลี่ยนไปหากคุณนำมือถือหรือ iBeacon ออกจากกัน ในหน้าจอนี้ RSSI คือ (-37) นอกเหนือจากนี้ยังมีรายละเอียดบางอย่างเช่น Dummy Company Name, Device Type, Length of the Bytes, The Local Name of ESP32 นี่คือ“ ESP32 as iBeacon ” คุณสามารถเปลี่ยนชื่อท้องถิ่นในภาพร่าง
![]()
4. หลังจากนำสมาร์ทโฟนออกจาก iBeacon ค่า RSSI จะเปลี่ยนจาก -37 เป็น -58 ค่าเหล่านี้จะเปลี่ยนแปลงไปเรื่อย ๆ หากคุณย้ายอุปกรณ์เครื่องใดเครื่องหนึ่ง
![]()
ค่าที่ยอมรับสัญญาณ RSSI มีดังต่อไปนี้:
| ความแรงของสัญญาณ | TL; ดร | จำเป็นสำหรับ | |
|---|---|---|---|
| -30 เดซิเบล | น่าอัศจรรย์ | ความแรงของสัญญาณสูงสุดที่ทำได้ ไคลเอนต์สามารถอยู่ห่างจาก AP เพียงไม่กี่ฟุตเพื่อบรรลุเป้าหมายนี้ ไม่ปกติหรือเป็นที่ต้องการในโลกแห่งความเป็นจริง | ไม่มี |
| -67 dBm | ดีมาก | ความแรงของสัญญาณขั้นต่ำสำหรับแอปพลิเคชันที่ต้องการการจัดส่งแพ็กเก็ตข้อมูลที่เชื่อถือได้และทันเวลา | VoIP / VoWiFi สตรีมมิ่งวิดีโอ |
| -70 เดซิเบล | ตกลง | ความแรงของสัญญาณขั้นต่ำสำหรับการจัดส่งแพ็คเก็ตที่เชื่อถือได้ | อีเมลเว็บ |
| -80 เดซิเบล | ไม่ดี | ความแรงของสัญญาณขั้นต่ำสำหรับการเชื่อมต่อพื้นฐาน การจัดส่งแพ็คเก็ตอาจไม่น่าเชื่อถือ | ไม่มี |
| -90 dBm | ไม่สามารถใช้งานได้ | ใกล้หรือจมน้ำในพื้นเสียง ฟังก์ชันใด ๆ ไม่น่าเป็นไปได้สูง | ไม่มี |
การเขียนโปรแกรม ESP32 ให้ทำงานเป็น BLE iBeacon
มีโปรแกรมตัวอย่างของ ESP32 BLE iBeacon เมื่อคุณติดตั้งบอร์ด ESP32 ใน Arduino IDE แต่เราได้แก้ไขแบบร่างนี้เล็กน้อยในบทช่วยสอนนี้โปรแกรมตัวอย่างเวอร์ชันแก้ไขทั้งหมดจะได้รับในตอนท้ายของบทช่วยสอนนี้
หากต้องการเปิดโปรแกรมตัวอย่างของ ESP32 BLE_iBeaconเพียงทำตามขั้นตอนด้านล่าง
- เปิด Arduino IDE แล้วเลือก“ ESP32 Dev Module” (หากคุณไม่พบบอร์ดนี้โปรดตรวจสอบว่าคุณได้ติดตั้งแพ็คเกจบอร์ด ESP32 หรือไม่)
- ไปที่ไฟล์ > ตัวอย่าง > ESP32 BLE Arduino > BLE_iBeacon
- เปิด“ BLE_iBeacon” Sketch
ตอนนี้มีการปรับเปลี่ยนโค้ดเล็กน้อยซึ่งทำได้ในบทช่วยสอนนี้ ชื่อ ESP32 จะได้รับการอัปเดตในภาพร่างนี้ด้วย ดังนั้นเริ่มต้นด้วยการรวม Libraries ที่จำเป็นซึ่งจะใช้ในการสร้าง BLE Server และ iBeacon
# รวม "sys / time.h"
นี่คือไลบรารีเวลาเพื่อรับเวลาของระบบปัจจุบัน ซึ่งประกอบด้วยฟังก์ชันต่างๆเช่นtv_sec, gettimeofday () เป็นต้นสำหรับข้อมูลเพิ่มเติมคุณสามารถเยี่ยมชม' sys / time.h' ของUNIX อย่างเป็นทางการ
จากนั้นไลบรารี ESP32 BLE จะรวมอยู่ด้วยซึ่งมีฟังก์ชันมากมายที่ใช้ในการสร้าง ESP32 ในการกำหนดค่าต่างๆเช่นไคลเอนต์ BLE หรือเซิร์ฟเวอร์ BLE
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
ห้องสมุด iBeacon จะรวมซึ่งกำหนด ESP32 เป็น iBeacon นอกจากนี้ไลบรารีการนอนหลับลึกยังรวมอยู่ใน ESP32 ไลบรารีจะถูกใช้เพื่อส่ง ESP32 ในโหมดหลับลึกตามช่วงเวลาที่กำหนด
# รวม "BLEBeacon.h" # รวม "esp_sleep.h"
กำหนดระยะเวลาการนอนหลับสำหรับ ESP32 ที่นี่ ESP32 จะเข้าสู่โหมดสลีปเป็นเวลา 10 วินาทีและจะโฆษณาจากนั้นเข้าสู่การหลับลึกอีกครั้งเป็นเวลา 10 วินาที
# กำหนด GPIO_DEEP_SLEEP_DURATION 10
ที่นี่มีการกำหนดRTC_DATA_ATTR โปรดทราบว่าหากคุณกำหนดตัวแปรส่วนกลางด้วยแอตทริบิวต์ RTC_DATA_ATTR ตัวแปรจะถูกวางไว้ในหน่วยความจำ RTC_SLOW_MEM ดังนั้นโครงสร้างจึงประกาศเป็น RTC_DATA_ATTR และการคัดลอกหน่วยความจำแบบไดนามิกไปยังโครงสร้างนี้ก่อนการนอนหลับสนิทจะช่วยกู้คืนสิ่งนี้ลงในหน่วยความจำแบบไดนามิกหลังจากตื่นนอน พูดง่ายๆคือเราประหยัดเวลาในหน่วยความจำแบบคงที่จากหน่วยความจำแบบไดนามิกเพื่อกู้คืนอีกครั้งหลังจากหลับลึก ที่นี่มีการกำหนดตัวแปรทั้งสอง ' last ' ใช้เพื่อรับครั้งสุดท้ายเมื่อ ESP32 เข้าสู่โหมดหลับลึกและ bootcount จะใช้จำนวนการรีเซ็ต
RTC_DATA_ATTR static time_t ล่าสุด; RTC_DATA_ATTR คง uint32_t bootcount;
จากนั้นกำหนด BLE ประเภทโฆษณา คำจำกัดความทำได้ดังนี้
BLEAdvertising * pAdvertising;
timeval ถูกกำหนดให้เป็นโครงสร้างในการเข้าถึงเวลาปัจจุบัน
โครงสร้างเวลาตอนนี้;
นอกจากนี้ยังกำหนด UUID สามารถสร้าง UUID ได้จากลิงค์นี้
# กำหนด BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
ตอนนี้สร้างฟังก์ชั่นที่จะมีแอตทริบิวต์ iBeacon เช่น UUID, Major, Minor และอื่น ๆ ในฟังก์ชั่นนี้สร้างอินสแตนซ์สำหรับ BLE เป็น iBeacon และตั้งรหัสผู้ผลิตปลอม UUID major และ minor สำหรับ ESP32 เป็น iBeacon
เป็นโมฆะ setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
ตั้งค่าสถานะเป็น 0x04 เพื่อให้ส่งออก BrEdrNotSupported ในเครื่องสแกน
oData.setFlags (0x04);
กำหนดข้อมูลโฆษณาสำหรับการเผยแพร่
std:: สตริง strServiceData = "";
เพิ่มสตริงทีละรายการเพื่อโฆษณา
strServiceData + = (ถ่าน) 26; // เลน strServiceData + = (ถ่าน) 0xFF; // พิมพ์ strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
เริ่มโฆษณาโดยการเผยแพร่ข้อมูล
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
เริ่มต้นมอนิเตอร์แบบอนุกรมที่อัตรารับส่งข้อมูล 115200 และรับเวลา เพิ่มจำนวน บูต เพื่อเก็บจำนวนการรีเซ็ต
Serial.begin (115200); gettimeofday (& ตอนนี้เป็นโมฆะ); Serial.printf ("เริ่ม ESP32% d \ n", bootcount ++);
เก็บเวลาปัจจุบันไว้ในหน่วยความจำแบบคงที่
สุดท้าย = now.tv_sec;
สร้างอุปกรณ์ BLE และตั้งชื่อตามที่คุณต้องการ ที่นี่ ESP32 มีชื่อว่า“ ESP2 เป็น iBeacon ” โปรดทราบว่าชื่ออาจยาวได้ แต่โค้ดเวอร์ชันนี้ได้เริ่มรองรับชื่อแบบยาวแล้ว
BLEDevice:: init ("ESP32 เป็น iBeacon");
สร้างเซิร์ฟเวอร์ BLE เพื่อโฆษณาและเริ่มต้น
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
จากนั้นตั้งค่า ESP32 ในโหมด iBeacon
setBeacon ();
เริ่มโฆษณาจากนั้นหยุดโฆษณาและเข้าสู่โหมดสลีป 10 วินาที
pAdvertising-> start (); pAdvertising-> หยุด (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
ในที่สุดก็เสียบ ESP32 Development Board กับแล็ปท็อปของคุณโดยใช้สาย Micro USB และอัปโหลดรหัสไปยัง ESP32 โดยใช้ Arduino IDE จากนั้นเปิด แอพ nRF Connect Android ในสมาร์ทโฟนของคุณและเริ่มการสแกน คุณจะพบ ESP32 เป็น iBeacon ออกอากาศดังที่แสดงในภาพด้านล่าง:
![]()
นี่คือวิธีที่ESP32 สามารถใช้เป็น BLE Beaconเพื่อโฆษณา UUID, Major และ Minor หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ iBeacon ให้ทำตามบทช่วยสอนก่อนหน้านี้เกี่ยวกับ HM10 เป็น iBeacon นอกจากนี้หากคุณมีข้อสงสัยโปรดแสดงความคิดเห็นด้านล่างหรือถามคำถามในฟอรัม
กรอกรหัสพร้อมวิดีโอที่ใช้งานได้ด้านล่าง
/>