- nRF52 ชุดพัฒนา:
- Segger Embedded Studio
- DHT11 พร้อม nRF52DK
- วิธีการทำงานกับ Bluetooth Low Energy (BLE)
- แผนภาพบริการ / คุณลักษณะ BLE
- คำอธิบายโปรแกรม nRF52 BLE
- ทดสอบโปรแกรมของเราโดยใช้ nRF Connect
ด้วยแถบฟิตเนสสมาร์ทวอทช์และอุปกรณ์สวมใส่อื่น ๆ ได้รับความนิยมมากขึ้นในการใช้Bluetooth 5 / Bluetooth Low Energyมีการนำมาตรฐานการสื่อสารมาใช้อย่างกว้างขวาง BLE ช่วยให้เราแลกเปลี่ยนข้อมูลในระยะทางสั้น ๆ โดยใช้พลังงานเพียงเล็กน้อยซึ่งสำคัญมากสำหรับอุปกรณ์ที่ใช้แบตเตอรี่เช่นอุปกรณ์ที่สวมใส่ได้ นอกจากนี้ยังช่วยให้เราสามารถตั้งค่าเครือข่ายตาข่าย BLE แบบไร้สายคุณสมบัตินี้มีประโยชน์สำหรับอุปกรณ์ระบบอัตโนมัติภายในบ้านที่อุปกรณ์หลายเครื่องต้องสื่อสารกันในสภาพแวดล้อมปิด เราได้ใช้ BLE กับ Raspberry Pi และ BLE กับ ESP32 เพื่อใช้งานฟังก์ชัน BLE พื้นฐานแล้ว วิศวกรกำลังทดลองใช้ BLE เพื่อออกแบบอุปกรณ์ไร้สายแบบพกพาที่สามารถทำงานได้เป็นเวลานานโดยใช้แบตเตอรี่ขนาดเล็กและมีชุดพัฒนาหลายแบบที่สามารถทำงานร่วมกับ BLE ได้ ในการตรวจสอบล่าสุดของเราเกี่ยวกับ Arduino Nano 33 เราสังเกตเห็นว่าบอร์ดมี nRF52840 พร้อมความสามารถ BLE
ในบทช่วยสอนนี้เราจะสำรวจบอร์ดพัฒนาที่น่าตื่นเต้นและเป็นที่นิยมอีกตัวหนึ่งชื่อว่าnRF52 DKเพื่อวัดอุณหภูมิและความชื้นโดยใช้ BLE โดยค่าเริ่มต้น BLE Environment Sensing Profiles รองรับพารามิเตอร์ด้านสิ่งแวดล้อมที่หลากหลาย แต่บทแนะนำนี้ จำกัด เฉพาะค่าอุณหภูมิและความชื้นเท่านั้น โซลูชันนี้เชื่อมต่อกับสมาร์ทโฟนผ่านบลูทู ธ พลังงานต่ำและมีการอัปเดตบ่อยครั้งเกี่ยวกับพารามิเตอร์ด้านสิ่งแวดล้อมเช่นอุณหภูมิความชื้น เราจะใช้เซ็นเซอร์ DHT1 และการวัดอุณหภูมิจะทำด้วยความละเอียด 0.01 องศาเซลเซียสและการวัดความชื้นจะทำได้ด้วยความละเอียด 0.01 เปอร์เซ็นต์
nRF52 ชุดพัฒนา:
nRF52DK เป็นแพลตฟอร์มการสร้างต้นแบบที่สมบูรณ์แบบสำหรับแอปพลิเคชั่น Bluetooth Low Energy และ 2.4 GHz Wireless Internet of Things ชุดพัฒนารองรับ Nordic Toolchains มาตรฐานต่างๆเช่นโอเพนซอร์ส GCC และสภาพแวดล้อมการพัฒนาเชิงพาณิชย์แบบบูรณาการเช่น Keil, IAR และ Segger Embedded Studio เป็นต้น Nordic ยังมีชุดพัฒนาซอฟต์แวร์ที่สมบูรณ์สำหรับ nRF52 ซึ่งรวมถึงการสนับสนุน nRF52DK อย่างสมบูรณ์
nRF52DK ใช้พลังงานจาก ไมโครคอนโทรลเลอร์ nRF52832 ARM Cortex-M4Fซึ่งรวม Flash Memor 512Kbytes และ SRAM 64 Kbytes nRF52DK มีตัว ดีบักเกอร์ Segger J-Link On Boardในตัวซึ่งให้การดีบักที่ง่ายและเร็วขึ้นโดยไม่ต้องมีอุปกรณ์ดีบัก jtag ภายนอก / เพิ่มเติม นอกจากนี้ยังมีขั้วต่อที่เข้ากันได้กับ Arduino Uno Rev3ซึ่งรองรับการเชื่อมต่ออินพุตอะนาล็อกและดิจิตอลกับไมโครโปรเซสเซอร์และยังมีโปรโตคอลการสื่อสารมาตรฐานเช่น I2C (Inter-Integrated Circuit) SPI (Serial Peripheral Interface) และ UART (Universal Asynchronous Receiver and Transmitter) ชุดพัฒนานี้ได้รับการออกแบบด้วยเสาอากาศ PCB ในตัวที่ให้การสื่อสารไร้สายระยะสั้นโดยใช้ Bluetooth Low Energy สำหรับเชื่อมต่อกับสมาร์ทโฟนแล็ปท็อปและแท็บเล็ต
Segger Embedded Studio
ในการเขียนโปรแกรมสำนักงานคณะกรรมการพัฒนาการที่เราจะใช้ Segger ฝังตัวสตูดิโอพร้อม nRF52 Segger Embedded Studio เป็นสภาพแวดล้อมการพัฒนาแบบบูรณาการ C / C ++ (IDE) ที่มีประสิทธิภาพซึ่งมีเป้าหมายเฉพาะสำหรับการพัฒนาระบบฝังตัว นี่เป็นโซลูชันแบบ all-in-one ที่สมบูรณ์ซึ่งประกอบด้วยทุกสิ่งที่จำเป็นสำหรับการเขียนโปรแกรม C แบบฝังการพัฒนาและการดีบัก ซึ่งรวมถึงเวิร์กโฟลว์ที่สมบูรณ์สำหรับการเขียนโปรแกรมและการพัฒนาระบบฝังตัวซึ่งมาพร้อมกับการจัดการโครงการตัวแก้ไขตัวแก้ไขข้อบกพร่องที่สนับสนุนอุปกรณ์ ARM Cortex IDE ที่มีประสิทธิภาพและใช้งานง่ายนี้ฟรีสำหรับลูกค้าชาวนอร์ดิกที่มีใบอนุญาตเต็มรูปแบบโดยไม่มีข้อ จำกัด ด้านขนาดรหัส สามารถดาวน์โหลด IDE ได้จากลิงค์ด้านล่าง
ดาวน์โหลด Segger Embedded Studio
DHT11 พร้อม nRF52DK
DHT11 เป็นเซนเซอร์วัดอุณหภูมิและความชื้นที่มีคุณสมบัติครบถ้วนพร้อมส่วนประกอบการวัดความชื้นแบบ Resistive และส่วนประกอบการวัดอุณหภูมิประเภท NTC ให้คุณภาพที่ยอดเยี่ยมตอบสนองเร็วขึ้นและประหยัดต้นทุน โดยค่าเริ่มต้นเซ็นเซอร์ DHT11 ทั้งหมดจะได้รับการปรับเทียบในห้องปฏิบัติการซึ่งนำไปสู่ความแม่นยำและความน่าเชื่อถือสูงสุด มันสื่อสารโดยใช้ระบบ Single-Wire Serial Interface และข้อกำหนดอื่น ๆ จะได้รับด้านล่าง
ข้อมูลจำเพาะของ DHT11:
- ช่วงความชื้น: 20 - 90% RH
- ช่วงอุณหภูมิ: 0 - 50 องศาเซลเซียส
- ความแม่นยำของความชื้น: ± 5% RH
- ความแม่นยำของอุณหภูมิ: ± 2 ℃
แผนภาพเวลาของ DHT11:
การอ่านข้อมูลจากเซ็นเซอร์ DHT11 นั้นค่อนข้างง่ายโดยใช้แผนภาพเวลาที่แสดงด้านบน ขั้นตอนนี้คล้ายกับคอนโทรลเลอร์ใด ๆ และเราได้ใช้เซ็นเซอร์นี้กับแพลตฟอร์มการพัฒนาอื่น ๆ แล้วเช่น
- DHT11 Sensor พร้อม Raspberry Pi
- DHT11 เซนเซอร์พร้อม PIC16F877A
- DHT11 เซนเซอร์พร้อม STM32F103C8
- เซ็นเซอร์ DHT11 พร้อม NodeMCU
ในการเชื่อมต่อเซ็นเซอร์อุณหภูมิและความชื้น DHT11 กับชุดพัฒนา nRF52 ให้ทำตามแผนภาพการเชื่อมต่อที่ระบุด้านล่าง
ฉันใช้โมดูลขั้วต่อเพื่อเชื่อมต่อเซ็นเซอร์เข้ากับบอร์ดของฉันดังนั้นการตั้งค่าขั้นสุดท้ายจึงเป็นเช่นนี้
ผังงานสำหรับการสื่อสารกับ DHT11:
ผังงานด้านล่างอธิบายผังตรรกะของโปรแกรมที่เราจะใช้เพื่อสื่อสารระหว่าง nRF52DK และ DHT11
รูปแบบข้อมูล:
วิธีการทำงานกับ Bluetooth Low Energy (BLE)
เพื่อให้เข้าใจถึงวิธีการใช้คุณสมบัติ BLE เราต้องเข้าใจคำศัพท์พื้นฐานบางประการที่อธิบายไว้ด้านล่างนี้คุณยังสามารถอ่านบทความ ESP32 BLE เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ BLE
โปรไฟล์การเข้าถึงทั่วไป (GAP)
รายละเอียดการเข้าถึงทั่วไปถือความรับผิดชอบที่สมบูรณ์ของการสร้างการเชื่อมต่อการสื่อสารระหว่าง BLE อุปกรณ์ต่อพ่วง และ กลาง อุปกรณ์GAP ยังมีขั้นตอนต่างๆรวมถึงการสแกน / การค้นพบอุปกรณ์การสร้างการเชื่อมต่อเลเยอร์ลิงค์การยุติการเชื่อมโยงการจับมือคุณสมบัติด้านความปลอดภัยและการกำหนดค่าอุปกรณ์ที่ครบถ้วน GAP ทำงานในสถานะอุปกรณ์ต่อไปนี้
สถานะ GAP |
คำอธิบาย |
รอ |
สถานะเริ่มต้นของอุปกรณ์เมื่อรีเซ็ต |
ผู้ลงโฆษณา |
การโฆษณาอุปกรณ์ด้วยข้อมูลที่ช่วยในการสแกนผู้เริ่มต้น |
สแกนเนอร์ |
รับและส่งคำขอสแกนไปยังผู้ลงโฆษณา |
ผู้ริเริ่ม |
ส่งการร้องขอการเชื่อมต่อเพื่อสร้างลิงค์ |
ทาส / อาจารย์ |
ในการเชื่อมต่ออุปกรณ์เป็นทาสหากผู้โฆษณาเชี่ยวชาญหากเป็นผู้ริเริ่ม |
เลเยอร์โปรไฟล์แอตทริบิวต์ทั่วไป (GATT)
GATT ย่อมาจาก Generic Attribute Profile Layer ซึ่งมีหน้าที่ในการสื่อสารข้อมูลระหว่างอุปกรณ์ BLE สองเครื่อง (อุปกรณ์ต่อพ่วงและส่วนกลาง) การสื่อสารข้อมูลมีลักษณะเฉพาะในรูปแบบซึ่งสื่อสารและจัดเก็บข้อมูล อุปกรณ์ BLE มีสองบทบาทที่แตกต่างกันสำหรับการสื่อสารของอุปกรณ์ที่ระบุด้านล่าง
- GATT Server มีข้อมูลคุณลักษณะที่จะใช้ในการอ่านและเขียน ในบทช่วยสอนของเราเซ็นเซอร์ DHT11 และนักพัฒนาซอฟต์แวร์ ชุดนี้คือเซิร์ฟเวอร์ GATT ของเรา
- GATT Client อ่านและเขียนข้อมูลจาก / ไปยัง GATT Server สมาร์ทโฟนเป็นไคลเอนต์ GATT ที่อ่านและเขียนข้อมูลลงในบอร์ดเซ็นเซอร์ของเรา
Bluetooth SIG
Bluetooth Special Interest Group (SIG) เป็นองค์กรมาตรฐานที่ตรวจสอบการพัฒนามาตรฐานบลูทู ธ และการออกใบอนุญาตเทคโนโลยีบลูทู ธ กลุ่ม SIG ไม่ได้ผลิตหรือขายผลิตภัณฑ์ Bluetooth ใด ๆ เป็นการกำหนดข้อกำหนดและมาตรฐานของ Bluetooth พวกเขากำหนดตัวระบุเฉพาะสำหรับโปรไฟล์พลังงานต่ำของบลูทู ธและคุณสมบัติตามลำดับ สามารถดูข้อกำหนด GATT Profile ได้ที่ลิงค์ด้านล่าง
ข้อกำหนด GATT Profile
ตามข้อกำหนด GATT ที่ระบุในลิงก์ด้านบนเราได้รวบรวมตัวระบุเฉพาะที่จำเป็นสำหรับโครงการของเราซึ่งมีการจัดทำตารางไว้ด้านล่าง
โปรไฟล์ / ลักษณะ |
UUID |
GAP (การเข้าถึงทั่วไป) |
0x1800 |
GATT (แอตทริบิวต์ทั่วไป) |
0x1801 |
ESS (การตรวจจับสภาพแวดล้อม) |
0x181A |
อุณหภูมิ |
0x2A6E |
ความชื้น |
0x2A6F |
แผนภาพบริการ / คุณลักษณะ BLE
BLE UUID
UUID |
ค่า 16 บิต |
UUID 128 บิต |
บริการ ESS |
0x181A |
0000181A-0000-0000-0000-00000000000 |
ถ่านชั่วคราว |
0x2A6E |
00002A6E-0000-0000-0000-00000000000 |
ถ่านความชื้น |
0x2A6F |
00002A6F-0000-0000-0000-00000000000 |
ลักษณะอุณหภูมิ
ทรัพย์สิน |
คำอธิบาย |
หน่วย |
องศาเซลเซียสความละเอียด 0.01 องศา |
รูปแบบ |
ซินท์ 16 |
UUID |
0x2A6E |
เลขชี้กำลังเป็นทศนิยม |
2 |
อ่าน |
บังคับ |
ลักษณะความชื้น
ทรัพย์สิน |
คำอธิบาย |
หน่วย |
เปอร์เซ็นต์ที่มีความละเอียด 0.01 เปอร์เซ็นต์ |
รูปแบบ |
uint16 |
UUID |
0x2A6F |
เลขชี้กำลังเป็นทศนิยม |
2 |
อ่าน |
บังคับ |
คำอธิบายโปรแกรม nRF52 BLE
เราจะใช้ nRF5 SDK เพื่อตั้งโปรแกรมชุดพัฒนา nRF52 ของเรา nRF5 SDK เป็นชุดพัฒนาซอฟต์แวร์ที่สมบูรณ์ซึ่งรวมเข้ากับโปรไฟล์ Bluetooth Low Energy จำนวนมาก GATT Serializer และการสนับสนุนไดรเวอร์สำหรับอุปกรณ์ต่อพ่วงทั้งหมดบน SoCs ของ nRF5 SDK นี้ช่วยให้นักพัฒนาสร้างแอปพลิเคชั่นบลูทู ธ พลังงานต่ำที่มีคุณสมบัติครบถ้วนเชื่อถือได้และปลอดภัยด้วยไมโครคอนโทรลเลอร์ nRF52 และ nRF51 สามารถดาวน์โหลดโปรแกรมที่สมบูรณ์ได้จากที่นี่คำอธิบายรหัสมีดังนี้
กำหนดค่าพินข้อมูล DHT11 เป็นอินพุตที่ nrf52 โดยเปิดใช้งานแบบดึงขึ้น สถานะพินควรสูงเพื่อยืนยันว่า nRF52 ให้ PULLUP ที่เหมาะสมสำหรับพินข้อมูล DHT11
/ * ตั้งค่าเป็นอินพุตและตรวจสอบว่าสัญญาณถูกดึงขึ้นหรือไม่ * / Data_SetInput (); DelayUSec (50); ถ้า (Data_GetVal () == 0) {ส่งคืน DHT11_NO_PULLUP; }
สร้างสัญญาณ START จากไมโครคอนโทรลเลอร์ nRF52 และตรวจสอบสัญญาณรับทราบ
/ * ส่งสัญญาณเริ่มต้น * / Data_SetOutput (); Data_ClrVal (); DelayMSec (20); / * ให้สัญญาณต่ำอย่างน้อย 18 ms * / Data_SetInput (); DelayUSec (50); / * ตรวจสอบสัญญาณรับทราบ * / if (Data_GetVal ()! = 0) {/ * สัญญาณต้องดึงให้ต่ำโดยเซ็นเซอร์ * / ส่งคืน DHT11_NO_ACK_0; } / * รอสูงสุด 100 us สำหรับสัญญาณ ack จากเซ็นเซอร์ * / cntr = 18; ในขณะที่ (Data_GetVal () == 0) {/ * รอจนกว่าสัญญาณจะขึ้น * / DelayUSec (5); ถ้า (--cntr == 0) {ส่งคืน DHT11_NO_ACK_1; / * สัญญาณควรจะขึ้นสำหรับ ACK ที่นี่ * /}} / * รอจนกว่าจะลงอีกครั้งสิ้นสุดลำดับ ack * / cntr = 18; ในขณะที่ (Data_GetVal ()! = 0) {/ * รอจนกว่าสัญญาณจะลดลง * / DelayUSec (5); ถ้า (--cntr == 0) {ส่งคืน DHT11_NO_ACK_0; / * สัญญาณควรลดลงเหลือศูนย์อีกครั้งที่นี่ * /}}
ตอนนี้อ่านข้อมูล 40 บิตที่มีอุณหภูมิ 2 ไบต์ความชื้น 2 ไบต์และการตรวจสอบ 1 ไบต์
/ * ตอนนี้อ่านข้อมูล 40 บิต * / i = 0; ข้อมูล = 0; loopBits = 40; ทำ {cntr = 11; / * รอสูงสุด 55 us * / while (Data_GetVal () == 0) {DelayUSec (5); ถ้า (--cntr == 0) {ส่งคืน DHT11_NO_DATA_0; }} cntr = 15; / * รอสูงสุด 75 us * / while (Data_GetVal ()! = 0) {DelayUSec (5); ถ้า (--cntr == 0) {ส่งคืน DHT11_NO_DATA_1; }} ข้อมูล << = 1; / * บิตข้อมูลถัดไป * / if (cntr <10) {/ * สัญญาณข้อมูลสูง> 30 us ==> บิตข้อมูล 1 * / data - = 1; } if ((loopBits & 0x7) == 1) {/ * ไบต์ถัดไป * / บัฟเฟอร์ = ข้อมูล; ผม ++; ข้อมูล = 0; }} ในขณะที่ (- loopBits! = 0);
ตรวจสอบข้อมูลด้วยความช่วยเหลือของ Checksum
/ * ทดสอบ CRC * / if ((uint8_t) (บัฟเฟอร์ + บัฟเฟอร์ + บัฟเฟอร์ + บัฟเฟอร์)! = บัฟเฟอร์) {return DHT11_BAD_CRC; }
จัดการและจัดเก็บอุณหภูมิและความชื้น
/ * เก็บค่าข้อมูลสำหรับผู้โทร * / ความชื้น = ((int) บัฟเฟอร์) * 100 + บัฟเฟอร์; อุณหภูมิ = ((int) บัฟเฟอร์) * 100 + บัฟเฟอร์;
เริ่มต้นบริการ nRF5 SDK Logger nRF52 SDK มาพร้อมกับอินเทอร์เฟซการควบคุมการบันทึกที่เรียกว่า nrf_log และใช้แบ็กเอนด์เริ่มต้นสำหรับการบันทึกข้อมูล แบ็กเอนด์เริ่มต้นจะเป็นพอร์ตอนุกรม ที่นี่เราเริ่มต้นทั้ง nrf_log อินเตอร์เฟซการควบคุมและการ nrf_log แบ็กเอนด์เริ่มต้นได้เป็นอย่างดี
ret_code_t err_code = NRF_LOG_INIT (NULL); APP_ERROR_CHECK (err_code); NRF_LOG_DEFAULT_BACKENDS_INIT ();
nRF52 SDK มีฟังก์ชั่นจับเวลาการประยุกต์ใช้ โมดูลตัวจับเวลาแอปพลิเคชันช่วยให้สามารถสร้างอินสแตนซ์ตัวจับเวลาหลายตัวโดยใช้อุปกรณ์ต่อพ่วง RTC1 ที่นี่เราเริ่มต้นโมดูลตัวจับเวลาแอปพลิเคชัน nRF5 ในโซลูชันนี้จะใช้ตัวจับเวลาแอปพลิเคชันสองตัวและช่วงเวลาการอัปเดตข้อมูล
ret_code_t err_code = app_timer_init (); APP_ERROR_CHECK (err_code);
nRF52 SDK มีโมดูลการจัดการพลังงานที่มีคุณสมบัติครบถ้วน เนื่องจากอุปกรณ์ BLE ต้องทำงานเป็นเวลาหลายเดือนกับแบตเตอรี่เซลล์แบบเหรียญ การจัดการพลังงานมีบทบาทสำคัญในแอปพลิเคชัน BLE โมดูลการจัดการพลังงาน nRF52 จัดการเหมือนกันทั้งหมด ที่นี่เราเริ่มต้นโมดูลการจัดการพลังงานของ nRF5 SDK
ret_code_t err_code; err_code = nrf_pwr_mgmt_init (); APP_ERROR_CHECK (err_code);
nRF52 SDK มี ไฟล์ hex เฟิร์มแวร์ Nordic Soft Deviceในตัวซึ่งมีบลูทู ธ พลังงานต่ำส่วนกลางและสแต็กอุปกรณ์ต่อพ่วง สแต็กโปรโตคอลที่มีคุณสมบัติสูงนี้ประกอบด้วย GATT, GAP, ATT, SM, L2CAP และ Link Layer ที่นี่เราทำตามลำดับการเริ่มต้นซึ่งเริ่มต้น nRF5 BLE Radio Stack (Nordic Soft Device)
ret_code_t err_code; err_code = nrf_sdh_enable_request (); APP_ERROR_CHECK (err_code); // กำหนดค่า BLE stack โดยใช้การตั้งค่าเริ่มต้น // ดึงที่อยู่เริ่มต้นของ RAM แอปพลิเคชัน uint32_t ram_start = 0; err_code = nrf_sdh_ble_default_cfg_set (APP_BLE_CONN_CFG_TAG, & ram_start); APP_ERROR_CHECK (err_code); // เปิดใช้งาน BLE stack err_code = nrf_sdh_ble_enable (& ram_start); APP_ERROR_CHECK (err_code); // ลงทะเบียนตัวจัดการสำหรับเหตุการณ์ BLE NRF_SDH_BLE_OBSERVER (m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
GAP มีหน้าที่รับผิดชอบในการสแกน / ค้นหาอุปกรณ์การสร้างลิงก์การยุติลิงก์การเริ่มต้นคุณลักษณะด้านความปลอดภัยและการกำหนดค่า GAP ได้นำเสนอด้วยพารามิเตอร์การเชื่อมต่อที่สำคัญเช่นช่วงเวลาการเชื่อมต่อเวลาแฝงของทาสการหมดเวลาการควบคุมดูแล ฯลฯ ในที่นี้ด้วยการเริ่มต้นพารามิเตอร์การเชื่อมต่อโปรไฟล์การเข้าถึงทั่วไป
ret_code_terr_code; ble_gap_conn_params_tgap_conn_params; ble_gap_conn_sec_mode_t sec_mode; BLE_GAP_CONN_SEC_MODE_SET_OPEN (& sec_mode); err_code = sd_ble_gap_device_name_set (& sec_mode, (const uint8_t *) DEVICE_NAME, strlen (DEVICE_NAME)); APP_ERROR_CHECK (err_code); memset (& gap_conn_params, 0, sizeof (gap_conn_params)); gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; gap_conn_params.slave_latency = SLAVE_LATENCY; gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; err_code = sd_ble_gap_ppcp_set (& gap_conn_params); APP_ERROR_CHECK (err_code);
GATT รับผิดชอบการสื่อสารข้อมูลระหว่างอุปกรณ์ต่อพ่วง BLE และอุปกรณ์ส่วนกลาง โมดูล nRF52 GATT มีประโยชน์ในการเจรจาและติดตามขนาด ATT_MTU สูงสุด ที่นี่เราเริ่มต้นโมดูลแอตทริบิวต์ทั่วไปของ nRF52 SDK
ret_code_t err_code = nrf_ble_gatt_init (& m_gatt, NULL); APP_ERROR_CHECK (err_code);
GATT ทำการสื่อสารข้อมูลในรูปแบบของบริการและลักษณะเฉพาะ ที่นี่เราเริ่มต้นบริการตรวจจับสภาพแวดล้อม GATT ซึ่งรวมถึงการเริ่มต้นคุณลักษณะต่างๆเช่นอุณหภูมิและความชื้น
ret_code_terr_code; nrf_ble_qwr_init_t qwr_init = {0}; // เริ่มต้นโมดูลการเขียนคิว qwr_init.error_handler = nrf_qwr_error_handler; err_code = nrf_ble_qwr_init (& m_qwr, & qwr_init); APP_ERROR_CHECK (err_code); m_ess.notif_write_handler = ble_ess_notif_write_handler; err_code = ble_ess_init (& m_ess); APP_ERROR_CHECK (err_code);
การโฆษณามีบทบาทสำคัญในสภาพแวดล้อมแอปพลิเคชัน BLE แพ็กเก็ตประกอบด้วยข้อมูลประเภทที่อยู่ประเภทโฆษณาข้อมูลโฆษณาข้อมูลเฉพาะผู้ผลิตอุปกรณ์และข้อมูลการตอบสนองการสแกน nRF52 SDK มาพร้อมกับโมดูลโฆษณา ที่นี่เราทำการเริ่มต้นโมดูลการโฆษณาด้วยพารามิเตอร์
ret_code_terr_code; ble_advdata_t advdata; ble_advdata_t srdata; ble_uuid_t adv_uuids = {{ESS_UUID_SERVICE, BLE_UUID_TYPE_BLE}}; // สร้างและตั้งค่าข้อมูลโฆษณา memset (& advdata, 0, sizeof (advdata)); advdata.name_type = BLE_ADVDATA_FULL_NAME; advdata.include_appearance = จริง; advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; memset (& srdata, 0, sizeof (srdata)); srdata.uuids_complete.uuid_cnt = sizeof (adv_uuids) / sizeof (adv_uuids); srdata.uuids_complete.p_uuids = adv_uuids; err_code = ble_advdata_encode (& advdata, m_adv_data.adv_data.p_data, & m_adv_data.adv_data.len); APP_ERROR_CHECK (err_code); err_code = ble_advdata_encode (& srdata, m_adv_data.scan_rsp_data.p_data, & m_adv_data.scan_rsp_data.len); APP_ERROR_CHECK (err_code); ble_gap_adv_params_t adv_params; // ตั้งค่าพารามิเตอร์การโฆษณา memset (& adv_params, 0, sizeof (adv_params)); adv_params.primary_phy = BLE_GAP_PHY_1MBPS; adv_params.duration = APP_ADV_DURATION; adv_params.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED; adv_params.p_peer_addr = NULL; adv_params.filter_policy = BLE_GAP_ADV_FP_ANY; adv_params.interval = APP_ADV_INTERVAL; err_code = sd_ble_gap_adv_set_configure (& m_adv_handle, & m_adv_data, & adv_params); APP_ERROR_CHECK (err_code);
การเชื่อมต่อ BLE จะได้รับการจัดการและตรวจสอบด้วยพารามิเตอร์การเชื่อมต่อต่างๆเช่นความล่าช้าในการอัปเดตพารามิเตอร์การเชื่อมต่อครั้งแรกความล่าช้าติดต่อกันครั้งต่อไปจำนวนการอัปเดตฟังก์ชันการโทรกลับของตัวจัดการเหตุการณ์การเชื่อมต่อและตัวจัดการเหตุการณ์การเรียกกลับข้อผิดพลาดในการเชื่อมต่อ ที่นี่เราทำการเริ่มต้นพารามิเตอร์การสร้างการเชื่อมต่อ BLE และตัวจัดการเหตุการณ์การเรียกกลับสำหรับเหตุการณ์การเชื่อมต่อและเหตุการณ์ข้อผิดพลาด
ret_code_terr_code; ble_conn_params_init_t cp_init; memset (& cp_init, 0, sizeof (cp_init)); cp_init.p_conn_params = NULL; cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY; cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY; cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT; t_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID; cp_init.disconnect_on_fail = false; cp_init.evt_handler = on_conn_params_evt; cp_init.error_handler = conn_params_error_handler; err_code = ble_conn_params_init (& cp_init); APP_ERROR_CHECK (err_code);
หลังจากเสร็จสิ้นการเริ่มต้นระบบที่นี่เราเริ่มต้นด้วยการโฆษณาชื่ออุปกรณ์ BLE และข้อมูลความสามารถ จากที่นี่คุณสามารถดูอุปกรณ์ต่อพ่วงนี้ได้ในรายการ Ble scan ของสมาร์ทโฟน
ret_code_terr_code; err_code = sd_ble_gap_adv_start (m_adv_handle, APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK (err_code);
ลูปหลักทำงานในช่วง 2 วินาทีอ่านอุณหภูมิและความชื้นและอัปเดตไปยังอุปกรณ์อัจฉริยะที่เชื่อมต่อโดยใช้การอ่านหรือการแจ้งเตือน
สำหรับ (;;) { uint16_t อุณหภูมิความชื้น; DHTxx_ErrorCode dhtErrCode; idle_state_handle (); ถ้า (updtmrexp) { dhtErrCode = DHTxx_Read (& อุณหภูมิ & ความชื้น); ถ้า (dhtErrCode == DHT11_OK) { NRF_LOG_INFO ("อุณหภูมิ:% d ความชื้น:% d \ n", อุณหภูมิ, ความชื้น); ถ้า (temp_notif_enabled) { ble_ess_notify_temp (m_conn_handle, & m_ess, อุณหภูมิ); } else { ble_ess_update_temp (& m_ess อุณหภูมิ); } if (humid_notif_enabled) { ble_ess_notify_humid (m_conn_handle, & m_ess, ความชื้น); } else { ble_ess_update_humid (& m_ess ความชื้น); } } updtmrexp = เท็จ; } }
ทดสอบโปรแกรมของเราโดยใช้ nRF Connect
nRF Connect เป็นเครื่องมือบลูทู ธ พลังงานต่ำที่มีประสิทธิภาพซึ่งช่วยให้สามารถสแกนและสำรวจอุปกรณ์ต่อพ่วงที่เปิดใช้งาน BLE nRF Connect สำหรับมือถือรองรับ Bluetooth SIG หลากหลายรูปแบบที่นำมาใช้ เราสามารถตรวจสอบโปรแกรมของเราโดยใช้สิ่งนี้หลังจากติดตั้งแอพเราสามารถจับคู่บอร์ด nRF52 กับโทรศัพท์ของเราได้โดยการสแกนหาอุปกรณ์ BLE ในแอพ ภายในแอตทริบิวต์การตรวจจับสภาพแวดล้อมเราสามารถสังเกตได้ว่าค่าอุณหภูมิและความชื้นได้รับการอัปเดตดังที่แสดงในภาพด้านล่าง
Hariharan Veerappan เป็นที่ปรึกษาอิสระที่มีประสบการณ์มากกว่า 15 ปีในการพัฒนาผลิตภัณฑ์ฝังตัว เขาให้บริการให้คำปรึกษาในการพัฒนาเฟิร์มแวร์ / ลินุกซ์ในตัวนอกจากนี้เขายังให้บริการฝึกอบรมสำหรับองค์กรและออนไลน์ Hariharan สำเร็จการศึกษาระดับปริญญาตรีสาขาวิศวกรรมศาสตร์สาขาวิศวกรรมอิเล็กทรอนิกส์และการสื่อสารผ่านบทความและแบบฝึกหัดของเขาเขาแบ่งปันประสบการณ์และความคิดของเขากับผู้อ่าน Circuit Digest