Introduction
Are you ready to take your Arduino projects to the next level? If so, the Adafruit Bluefruit LE SPI Friend is the perfect device! This handy little device allows you to easily add Bluetooth Low Energy (BLE) connectivity to your Arduino projects, enabling you to communicate with your projects wirelessly from your smartphone or tablet.
With the Adafruit Bluefruit LE SPI Friend, you can easily send and receive data over Bluetooth, allowing you to create all sorts of interactive and engaging projects. Whether you want to create a remote-controlled robot, a gesture-based controller, or add some wireless functionality to an existing project, the Adafruit Bluefruit LE SPI Friend has you covered.
In this blog post, we’ll take an in-depth look at the Adafruit Bluefruit LE SPI Friend, exploring its features, capabilities, and how to use it with your Arduino projects. So if you’re ready to dive into wireless Arduino projects, let’s get started!
What is Adafruit Bluefruit LE SPI Friend?
Adafruit Bluefruit LE SPI Friend is a Bluetooth Low Energy (BLE) board that allows you to connect your project to your smartphone, computer, or tablet. It can be used to control a variety of electronics, such as LEDs, motors, and sensors, and it also has a built-in UART for serial communication. It’s an easy-to-use and powerful tool for creating all kinds of wireless projects.
Hardware Components
You will require the following hardware for Interfacing Adafruit Bluefruit LE SPI Friend with Arduino.
S.no | Component | Value | Qty |
---|---|---|---|
1. | Arduino UNO | – | 1 |
2. | ADAFRUIT BLUEFRUIT LE SPI FRIEND | – | 1 |
3. | Breadboard | – | 1 |
4. | Jumper Wires | – | 1 |
Adafruit Bluefruit LE SPI Friend with Arduino
Here are some steps to help you interface Adafruit Bluefruit LE SPI Friend with Arduino:
Schematic
Make connections according to the circuit diagram given below.
Wiring / Connections
Arduino | Sensor |
---|---|
5V | VCC |
GND | GND |
D4 | RST |
D7 | CS |
D8 | IRQ |
D11 | MOSI |
D12 | MISO |
D13 | SCK |
Installing Arduino IDE
First, you need to install Arduino IDE Software from its official website Arduino. Here is a simple step-by-step guide on “How to install Arduino IDE“.
Installing Libraries
Before you start uploading a code, download and unzip the following libraries at /Progam Files(x86)/Arduino/Libraries (default), in order to use the sensor with the Arduino board. Here is a simple step-by-step guide on “How to Add Libraries in Arduino IDE“.
Code
Now copy the following code and upload it to Arduino IDE Software.
/*********************************************************************
This is an example for our nRF51822 based Bluefruit LE modules
Pick one up today in the Adafruit shop!
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
MIT license, check LICENSE for more information
All text above, and the splash screen below must be included in
any redistribution
*********************************************************************/
#include <Arduino.h>
#include <SPI.h>
#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "Adafruit_BluefruitLE_UART.h"
#include "BluefruitConfig.h"
#if SOFTWARE_SERIAL_AVAILABLE
#include <SoftwareSerial.h>
#endif
/*=========================================================================
APPLICATION SETTINGS
    FACTORYRESET_ENABLE    Perform a factory reset when running this sketch
   
    Enabling this will put your Bluefruit LE module
in a 'known good' state and clear any config
data set in previous sketches or projects, so
    running this at least once is a good idea.
   
    When deploying your project, however, you will
want to disable factory reset by setting this
value to 0.  If you are making changes to your
    Bluefruit LE device via AT commands, and those
changes aren't persisting across resets, this
is the reason why. why.   Factory reset will erase
the non-volatile memory where config data is
stored, setting it back to factory default
values.
       
    Some sketches that require you to bond to a
central device (HID mouse, keyboard, etc.)
won't work at all with this feature enabled
since the factory reset will clear all of the
bonding data stored on the chip, meaning the
central device won't be able to reconnect.
MINIMUM_FIRMWARE_VERSION Minimum firmware version to have some new features
MODE_LED_BEHAVIOUR LED activity, valid options are
"DISABLE" or "MODE" or "BLEUART" or
"HWUART" or "SPI" or "MANUAL"
-----------------------------------------------------------------------*/
#define FACTORYRESET_ENABLE 1
#define MINIMUM_FIRMWARE_VERSION "0.6.6"
#define MODE_LED_BEHAVIOUR "MODE"
/*=========================================================================*/
// Create the bluefruit object, either software serial...uncomment these lines
/*
SoftwareSerial bluefruitSS = SoftwareSerial(BLUEFRUIT_SWUART_TXD_PIN, BLUEFRUIT_SWUART_RXD_PIN);
Adafruit_BluefruitLE_UART ble(bluefruitSS, BLUEFRUIT_UART_MODE_PIN,
BLUEFRUIT_UART_CTS_PIN, BLUEFRUIT_UART_RTS_PIN);
*/
or hardware serial, which does not need the RTS and CTS pins. Uncomment this line */
// Adafruit_BluefruitLE_UART ble(Serial1, BLUEFRUIT_UART_MODE_PIN);
/* ...hardware SPI, using SCK/MOSI/MISO hardware SPI pins and then user selected CS/IRQ/RST */
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
/* ...software SPI, using SCK/MOSI/MISO user-defined SPI pins and then user selected CS/IRQ/RST */
//Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_SCK, BLUEFRUIT_SPI_MISO,
// BLUEFRUIT_SPI_MOSI, BLUEFRUIT_SPI_CS,
// BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
// A small helper
void error(const __FlashStringHelper*err) {
Serial.println(err);
while (1);
}
/**************************************************************************/
/*!
@brief Sets up the HW an the BLE module (this function is called
automatically on startup)
*/
/**************************************************************************/
void setup(void)
{
while (!Serial); // required for Flora & Micro
delay(500);
Serial.begin(115200);
Serial.println(F("Adafruit Bluefruit Command Mode Example"));
Serial.println(F("---------------------------------------"));
/* Initialise the module */
Serial.print(F("Initialising the Bluefruit LE module: "));
if ( !ble.begin(VERBOSE_MODE) )
{
error(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
}
Serial.println( F("OK!") );
if ( FACTORYRESET_ENABLE )
{
/* Perform a factory reset to make sure everything is in a known state */
Serial.println(F("Performing a factory reset: "));
if ( ! ble.factoryReset() ){
error(F("Couldn't factory reset"));
}
}
/* Disable command echo from Bluefruit */
ble.echo(false);
Serial.println("Requesting Bluefruit info:");
/* Print Bluefruit information */
ble.info();
Serial.println(F("Please use Adafruit Bluefruit LE app to connect in UART mode"));
Serial.println(F("Then Enter characters to send to Bluefruit"));
Serial.println();
ble.verbose(false); // debug info is a little annoying after this point!
/* Wait for connection */
while (! ble.isConnected()) {
delay(500);
}
// LED Activity command is only supported from 0.6.6
if ( ble.isVersionAtLeast(MINIMUM_FIRMWARE_VERSION) )
{
// Change Mode LED Activity
Serial.println(F("******************************"));
Serial.println(F("Change LED activity to " MODE_LED_BEHAVIOUR));
ble.sendCommandCheckOK("AT+HWModeLED=" MODE_LED_BEHAVIOUR);
Serial.println(F("******************************"));
}
}
/**************************************************************************/
/*!
@brief Constantly poll for new command or response data
*/
/**************************************************************************/
void loop(void)
{
// Check for user input
char inputs[BUFSIZE+1];
if ( getUserInput(inputs, BUFSIZE) )
{
// Send characters to Bluefruit
Serial.print("[Send] ");
Serial.println(inputs);
ble.print("AT+BLEUARTTX=");
ble.println(inputs);
// check response stastus
if (! ble.waitForOK() ) {
Serial.println(F("Failed to send?"));
}
}
// Check for incoming characters from Bluefruit
ble.println("AT+BLEUARTRX");
ble.readline();
if (strcmp(ble.buffer, "OK") == 0) {
// no data
return;
}
// Some data was found, its in the buffer
Serial.print(F("[Recv] ")); Serial.println(ble.buffer);
ble.waitForOK();
}
/**************************************************************************/
/*!
@brief Checks for user input (via the Serial Monitor)
*/
/**************************************************************************/
bool getUserInput(char buffer[], uint8_t maxSize)
{
// timeout in 100 milliseconds
TimeoutTimer timeout(100);
memset(buffer, 0, maxSize);
while( (!Serial.available()) && !timeout.expired() ) { delay(1); }
if ( timeout.expired() ) return false;
delay(2);
uint8_t count=0;
do
{
count += Serial.readBytes(buffer+count, maxSize);
delay(2);
} while( (count < maxSize) && (Serial.available()) );
return true;
}
Let’s Test It
It’s now time to test the circuit! Once you upload the code, the program does the following things:
- Wait for a serial connection
- Initialize Bluefruit module
- Perform factory reset if the flag is set
- Wait for a BLE connection
- check the firmware version
- Change the LED behavior on the module
- Wait for user input on the serial monitor and send it to the module over BLE.
- Check if there is any incoming data from the BLE module and print it on the serial monitor if found.
Working Explanation
The above code is an example of using the Adafruit Bluefruit LE module in command mode, which allows the module to be controlled through serial commands and respond with status information.
It starts by defining some constants and a couple of functions:
- FACTORYRESET_ENABLE: a flag that controls whether the module should be factory reset before being configured.
- MINIMUM_FIRMWARE_VERSION: the minimum firmware version required for the module to support certain features.
- MODE_LED_BEHAVIOUR: this is used to change the behavior of the mode LED on the Bluefruit module
- error(const __FlashStringHelper*err) is a function that takes an error message as input, displays it on the serial monitor, and then enters an infinite loop to prevent the program from continuing.
- Setup () function is called once when the program starts. It starts by initializing the serial communication and waiting for a serial connection. It then initializes the Bluefruit module; it checks if the module is found, and if not, it will call the error function to stop the program. If the module is found, it performs a factory reset if the FACTORYRESET_ENABLE flag is true.
- The loop () function is called repeatedly after the setup() function has been called. It waits for user input and sends the input data to the Bluefruit module. Then it checks if there is any incoming data from the module; if there is, it will print it on the serial monitor.
- getUserInput() function is called to check for any input coming from the serial monitor; it waits for input and returns true if the information is received. Otherwise, it will return false.
Applications
- Provides wireless communication capabilities to different projects.
Conclusion.
We hope you have found this Interfacing Adafruit Bluefruit LE SPI Friend with Arduino Circuit very useful. If you feel any difficulty making it feel free to ask anything in the comment section.