Arduino Nano 33 BLE Interface with MIT App inventor

Hello Arduino Community,

I am a novice programmer and student who is working on a project. The project requires the use of the integrated gyroscope, BLE and the MIT app inventor. I am having an issue establishing the connection between the MIT app inventor app and the Arduino. Am I initiating the stack incorrectly? The Arduino service does show up and is visible from my phone, but when trying to connect it is unsuccessful. Does anyone have any suggestions? Any help would be appreciated.
#include <Arduino_LSM9DS1.h> //This is the library for the gyroscope
#include <ArduinoBLE.h> //The bluetooth library


float X,Y,Z;//Float variable to be used in the gyroscope

#define LED 13//defines LED as pin 13

///Establishes GUUID along wiith the three characteristics
const  char * UUID_RepTrackservice =  "84582cd0-3df0-4e73-9496-29010d7445dd" ; 
const  char * UUID_repCharacteristic =  "84582cd1-3df0-4e73-9496-29010d7445dd" ; 
const  char * UUID_targetCharacteristic =  "84582cd2-3df0-4e73-9496-29010d7445dd" ;
const  char * UUID_resetCharacteristic =  "84582cd3-3df0-4e73-9496-29010d7445dd" ;

//Establishes the service along with defining the characteristics as a float
BLEService RepTrackservice ( UUID_RepTrackservice );
BLEIntCharacteristic repCharacteristic( UUID_repCharacteristic, BLERead | BLENotify ); 
BLEIntCharacteristic targetCharacteristic ( UUID_targetCharacteristic, BLEWrite | BLENotify );
BLEIntCharacteristic resetCharacteristic( UUID_resetCharacteristic, BLERead | BLENotify ); 

int presetValue = 5;// max value for z axis to detect rep count 
int currentValue = 0;//Current z axis value 
int repAmount=0;//variable used to hold rep amount sent to app commented out for troubleshooting
int repTarget=0;//variable used to hold repetitions wanted sent from app commented out for troubleshooting
int reset=0;//Variable to reset the count sent from app commented out for troubleshooting

//Setting up the arduinos outputs
void setup () 
{
  Serial.begin(115200);//begin the bluetooth
  uint32_t t=millis();
  while (!Serial) // delay 5sec connection
  {
    if ((millis()-t) > 5000) break;
  }
  bool err=false;
  if (!IMU.begin()) 
    {
    Serial.println("IMU: failed");
    err=true;
    }
  Serial.println("IMU: ok");

  // init BLE
  if (!BLE.begin()) 
    {
    Serial.println("BLE: failed");
    err=true;
    }
  Serial.println("BLE: ok");

  // error: flash led forever
  if (err)
    {
    Serial.println("Init error. System halted");
    }

  BLE.setLocalName("RepTrack2.0");//sets the local name 
  BLE.setDeviceName("RepTrack");

  BLE.setAdvertisedService (RepTrackservice);//setting the service to be advertised 

  //Adds services to their own charcteristics
  RepTrackservice.addCharacteristic ( repCharacteristic ) ; 
  RepTrackservice.addCharacteristic ( targetCharacteristic ) ;
  RepTrackservice.addCharacteristic ( resetCharacteristic ) ; 

  BLE.addService ( RepTrackservice);//service is added to he BLE

  //Sets values so that they do not transmit random values
  repCharacteristic.writeValue ( 0 ); 
  targetCharacteristic.writeValue ( 0 );
  resetCharacteristic.writeValue ( 0 ); 

  BLE.advertise();//Publishes the service to start
 


  pinMode (LED, OUTPUT);//sets LED as an output
  digitalWrite(LED, LOW);//turns off LED in case it was on
 
}
void loop() 
{
  static long preMillis = 0;
  int command=0;
  // looks for BLE central devices
  BLEDevice central = BLE.central();

  // Checks for connection
  if (central) 
    {
    Serial.print("Connected to central: ");
    Serial.println(central.address()); // prints address
    
    // Loop while connected
    while (central.connected()) 
      {
    
      if (targetCharacteristic.written()) 
        {
        command = targetCharacteristic.value(); // retrieve value from app
        repTarget=command;
        Serial.print(F("commmand value:  "));
        Serial.println(command);
        }
      
      long curMillis = millis();
      if (preMillis>curMillis) preMillis=0; 
      if (curMillis - preMillis >= 10) // check values every 10mS
        {
        preMillis = curMillis;
        updateApp(); // Calls function to send values to app 
        }
      } 

    // To disconnect
    Serial.print(F("Disconnected from central: "));
    Serial.println(central.address());
    } 
}

//Updating the app function
void updateApp()
{
  //Starting the scan to monitor the gyroscope
  //Checking to see if the Gyro is online and then Reads all 3 axis
   if (IMU.gyroscopeAvailable()) 
    {
    IMU.readGyroscope(X, Y, Z);
  currentValue =Z;//sets current value to the value of Z from the gryo
   }
   //Comparison that is the current value of z is greater than or equal to the preset, then you increase the rep amount. This means a rep was done
  if (currentValue >= presetValue) 
  {
    repAmount=repAmount+1;
    repCharacteristic.writeValue(repAmount);//updates the live value
  }
  //If it was not greater then the repamount stays the same 
  else 
  {
    //repAmount=repAmount;
    repAmount=repAmount;
  }
  //displays values for visual purpose 
  Serial.print("Z:");
  Serial.print(Z);
  Serial.print("Current Value:");
 // Serial.println(currentValue);
 // Serial.println(repAmount);//Sends repamout to app
  Serial.println();
  delay(100);
  //Checks to see if the repAmount is greater than or equal to the rep target, if yes then the LED will light up 
   if (repAmount >= repTarget)
  {
    digitalWrite(LED, HIGH);
  }
  //If not then LED stays off
  else 
  {
    digitalWrite(LED, LOW);
  }
  delay(1000);// Delay to keep the system from readding two reps within a second
  //Reset for the rep amount, recieved from the app 
  if (reset==1)
  {
    digitalWrite(LED,LOW);
    repAmount=0;
    targetCharacteristic.writeValue(repAmount);
   
  }
  
}

I am a novice programmer and student who is working on a project. The project requires the use of the integrated gyroscope, BLE and the MIT app inventor. I am having an issue establishing the connection between the MIT app inventor app and the Arduino. Am I initiating the stack incorrectly? The Arduino service does show up and is visible from my phone, but when trying to connect it is unsuccessful. Does anyone have any suggestions? Any help would be appreciated.

What happens if you use a standard BLE application like LightBlue or nrfConnect.

You need to separate any issues of your BLE code from your MIT app inventor code.

Your topic has been moved to a more suitable location on the forum. Installation and Troubleshooting is not for problems with (nor for advice on) your project :wink: See About the Installation & Troubleshooting category.

Hello, Thank you for your response. I have tried it with LightBlue and was able to connect successfully. It seems I need to look into the MIT code.

At this point I believe you already know it, but the APP Inventor requires a specific add-on to work with BLE. The interface without the add-on can just handle common Bluetooth.

Do you know what the specific add in is. A gentlemen helped me out on the APP forums and got mine to work, but the code he provided to me seemed very confusing and took him a long time to figure out, but it worked. I'm not aware that there was an add in or if it was embedded in the code he provided me with. But I am about to go down that path again.

I also no that APP inventor can do things to a NANO 33 BLE to render it useless for about a day. I actually purchased a new one because I thought I toasted one, but by the time the new one came in the old one was once again work. Seems weird but it is repeatable. Just switch pages in APP inventor and the 33 BLE is toast for a day or two.

Take a look in this thread: https://forum.arduino.cc/t/sending-float-over-ble/859240/8. In post #9 I let a link to the info.

OK I do have that loaded but that was in May of last year. Hopefully it works better now.

Thanks for the reply.

1 Like

A post was merged into an existing topic: How to Send data from Arduino Nano 33 BLE to BlueLight

A post was split to a new topic: Help me with sending Data to App Inventor

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.