| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- #include <BLEDevice.h>
- #include <BLEUtils.h>
- #include <BLEServer.h>
- // See the following for generating UUIDs:
- // https://www.uuidgenerator.net/
- #define SERVICE_UUID "d86aecf2-d87d-489f-b664-b02de82b2fc0"
- #define CHARACTERISTIC_UUID "d86aecf2-d87d-489f-b664-b02de82b2fc0"
- #include <Wire.h>
- long accelX, accelY, accelZ;
- float gForceX, gForceY, gForceZ;
- long gyroX, gyroY, gyroZ;
- float rotX, rotY, rotZ;
- BLECharacteristic *pCharacteristic = NULL;
- void setup() {
- Serial.begin(115200);
- BLEDevice::init("Long name works now");
- BLEServer *pServer = BLEDevice::createServer();
- BLEService *pService = pServer->createService(SERVICE_UUID);
- pCharacteristic =
- pService->createCharacteristic(CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE);
- pCharacteristic->setValue("Hello World says Neil");
- pService->start();
- // BLEAdvertising *pAdvertising = pServer->getAdvertising(); // this still is working for backward compatibility
- BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
- pAdvertising->addServiceUUID(SERVICE_UUID);
- pAdvertising->setScanResponse(true);
- pAdvertising->setMinPreferred(0x06); // functions that help with iPhone connections issue
- pAdvertising->setMinPreferred(0x12);
- BLEDevice::startAdvertising();
- Serial.println("Characteristic defined! Now you can read it in your phone!");
- Wire.begin();
- setupMPU();
- Serial.println("HELLO WORLD");
- }
- void loop(){
- recordAccelRegisters();
- recordGyroRegisters();
- String data = printData();
- Serial.println(data);
- pCharacteristic->setValue(data);
- /*
- if(client.available()){
- char text = client.read();
- request += text;
- if (text == '\n'){
- if (request.indexOf("GET /data") != -1){
- … client.print("<html><body><p>");
- client.print(dataArray);
- client.println("</p></body></html>");
- client.println("Connection: close");
- client.println(dataArray);
- }
- }
- }
- //printData();
- }
- */
- }
- void setupMPU(){
- Wire.beginTransmission(0b1101000); //This is the I2C address of the MPU (b1101000/b1101001 for AC0 low/high datasheet sec. 9.2)
- Wire.write(0x6B); //Accessing the register 6B - Power Management (Sec. 4.28)
- Wire.write(0b00000000); //Setting SLEEP register to 0. (Required; see Note on p. 9)
- Wire.endTransmission();
- Wire.beginTransmission(0b1101000); //I2C address of the MPU
- Wire.write(0x1B); //Accessing the register 1B - Gyroscope Configuration (Sec. 4.4)
- Wire.write(0x00000000); //Setting the gyro to full scale +/- 250deg./s
- Wire.endTransmission();
- Wire.beginTransmission(0b1101000); //I2C address of the MPU
- Wire.write(0x1C); //Accessing the register 1C - Acccelerometer Configuration (Sec. 4.5)
- Wire.write(0b00000000); //Setting the accel to +/- 2g
- Wire.endTransmission();
- }
- void recordAccelRegisters() {
- Wire.beginTransmission(0b1101000); //I2C address of the MPU
- Wire.write(0x3B); //Starting register for Accel Readings
- Wire.endTransmission();
- Wire.requestFrom(0b1101000,6); //Request Accel Registers (3B - 40)
- while(Wire.available() < 6);
- accelX = Wire.read()<<8|Wire.read(); //Store first two bytes into accelX
- accelY = Wire.read()<<8|Wire.read(); //Store middle two bytes into accelY
- accelZ = Wire.read()<<8|Wire.read(); //Store last two bytes into accelZ
- processAccelData();
- }
- void processAccelData(){
- gForceX = accelX / 16384.0;
- gForceY = accelY / 16384.0;
- gForceZ = accelZ / 16384.0;
- }
- void recordGyroRegisters() {
- Wire.beginTransmission(0b1101000); //I2C address of the MPU
- Wire.write(0x43); //Starting register for Gyro Readings
- Wire.endTransmission();
- Wire.requestFrom(0b1101000,6); //Request Gyro Registers (43 - 48)
- while(Wire.available() < 6);
- gyroX = Wire.read()<<8|Wire.read(); //Store first two bytes into accelX
- gyroY = Wire.read()<<8|Wire.read(); //Store middle two bytes into accelY
- gyroZ = Wire.read()<<8|Wire.read(); //Store last two bytes into accelZ
- processGyroData();
- }
- void processGyroData() {
- rotX = gyroX / 131.0;
- rotY = gyroY / 131.0;
- rotZ = gyroZ / 131.0;
- }
- String printData() {
- Serial.print("Gyro (deg)");
- Serial.print(" X=");
- Serial.print(rotX);
- Serial.print(" Y=");
- Serial.print(rotY);
- Serial.print(" Z=");
- Serial.print(rotZ);
- Serial.print(" Accel (g)");
- Serial.print(" X=");
- Serial.print(gForceX);
- Serial.print(" Y=");
- Serial.print(gForceY);
- Serial.print(" Z=");
- Serial.println(gForceZ);
- return String(rotX) + "," + String(rotY) + "," + String(rotZ) + "," + String(gForceX) + "," + String(gForceY) + "," + String(gForceZ) + ",";
- }
|