ESPCODE.ino 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include <BLEDevice.h>
  2. #include <BLEUtils.h>
  3. #include <BLEServer.h>
  4. #include <Wire.h>
  5. #include <math.h>
  6. #define SERVICE_UUID "d86aecf2-d87d-489f-b664-b02de82b2fc0"
  7. #define CHARACTERISTIC_UUID "d86aecf2-d87d-489f-b664-b02de82b2fc0"
  8. long accelX, accelY, accelZ;
  9. float gForceX, gForceY, gForceZ;
  10. float accelMag;
  11. long gyroX, gyroY, gyroZ;
  12. float rotX, rotY, rotZ;
  13. float gyroMag;
  14. int16_t tempRaw;
  15. float temperature;
  16. float pitch, roll;
  17. BLECharacteristic *pCharacteristic = NULL;
  18. void setup() {
  19. Serial.begin(115200);
  20. // BLE setup
  21. BLEDevice::init("MPU6050_BLE");
  22. BLEServer *pServer = BLEDevice::createServer();
  23. BLEService *pService = pServer->createService(SERVICE_UUID);
  24. pCharacteristic = pService->createCharacteristic(
  25. CHARACTERISTIC_UUID,
  26. BLECharacteristic::PROPERTY_READ |
  27. BLECharacteristic::PROPERTY_WRITE |
  28. BLECharacteristic::PROPERTY_NOTIFY
  29. );
  30. pService->start();
  31. BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  32. pAdvertising->addServiceUUID(SERVICE_UUID);
  33. pAdvertising->setScanResponse(true);
  34. pAdvertising->setMinPreferred(0x06);
  35. pAdvertising->setMinPreferred(0x12);
  36. BLEDevice::startAdvertising();
  37. Serial.println("BLE advertising started");
  38. Wire.begin();
  39. setupMPU();
  40. }
  41. void loop() {
  42. recordAccelRegisters();
  43. recordGyroRegisters();
  44. recordTemp();
  45. computeOrientation();
  46. computeMagnitudes();
  47. String data = formatData();
  48. Serial.println(data);
  49. pCharacteristic->setValue(data.c_str());
  50. pCharacteristic->notify();
  51. delay(200); // Update rate
  52. }
  53. void setupMPU() {
  54. Wire.beginTransmission(0x68);
  55. Wire.write(0x6B); // Power management
  56. Wire.write(0);
  57. Wire.endTransmission();
  58. Wire.beginTransmission(0x68);
  59. Wire.write(0x1B); // Gyro config
  60. Wire.write(0);
  61. Wire.endTransmission();
  62. Wire.beginTransmission(0x68);
  63. Wire.write(0x1C); // Accel config
  64. Wire.write(0);
  65. Wire.endTransmission();
  66. }
  67. void recordAccelRegisters() {
  68. Wire.beginTransmission(0x68);
  69. Wire.write(0x3B);
  70. Wire.endTransmission();
  71. Wire.requestFrom(0x68, 6);
  72. while (Wire.available() < 6);
  73. accelX = Wire.read() << 8 | Wire.read();
  74. accelY = Wire.read() << 8 | Wire.read();
  75. accelZ = Wire.read() << 8 | Wire.read();
  76. processAccelData();
  77. }
  78. void processAccelData() {
  79. gForceX = accelX / 16384.0;
  80. gForceY = accelY / 16384.0;
  81. gForceZ = accelZ / 16384.0;
  82. }
  83. void recordGyroRegisters() {
  84. Wire.beginTransmission(0x68);
  85. Wire.write(0x43);
  86. Wire.endTransmission();
  87. Wire.requestFrom(0x68, 6);
  88. while (Wire.available() < 6);
  89. gyroX = Wire.read() << 8 | Wire.read();
  90. gyroY = Wire.read() << 8 | Wire.read();
  91. gyroZ = Wire.read() << 8 | Wire.read();
  92. processGyroData();
  93. }
  94. void processGyroData() {
  95. rotX = gyroX / 131.0;
  96. rotY = gyroY / 131.0;
  97. rotZ = gyroZ / 131.0;
  98. }
  99. void recordTemp() {
  100. Wire.beginTransmission(0x68);
  101. Wire.write(0x41);
  102. Wire.endTransmission();
  103. Wire.requestFrom(0x68, 2);
  104. while (Wire.available() < 2);
  105. tempRaw = Wire.read() << 8 | Wire.read();
  106. temperature = (tempRaw / 340.0) + 36.53;
  107. }
  108. void computeOrientation() {
  109. pitch = atan2(gForceY, gForceZ) * 180 / PI;
  110. roll = atan2(-gForceX, sqrt(gForceY * gForceY + gForceZ * gForceZ)) * 180 / PI;
  111. }
  112. void computeMagnitudes() {
  113. accelMag = sqrt(gForceX * gForceX + gForceY * gForceY + gForceZ * gForceZ);
  114. gyroMag = sqrt(rotX * rotX + rotY * rotY + rotZ * rotZ);
  115. }
  116. String formatData() {
  117. return String(rotX) + "," + String(rotY) + "," + String(rotZ) + "," +
  118. String(gForceX) + "," + String(gForceY) + "," + String(gForceZ) + "," +
  119. String(gyroMag) + "," + String(accelMag) + "," +
  120. String(pitch) + "," + String(roll) + "," +
  121. String(temperature);
  122. }