- ส่วนประกอบที่จำเป็น
- ใช้ 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 นอกจากนี้หากคุณมีข้อสงสัยโปรดแสดงความคิดเห็นด้านล่างหรือถามคำถามในฟอรัม
กรอกรหัสพร้อมวิดีโอที่ใช้งานได้ด้านล่าง
/>