Add bluefruit neopixel code from my hat
This commit is contained in:
parent
9630723b66
commit
19b37ba30a
|
@ -0,0 +1,57 @@
|
|||
// COMMON SETTINGS
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// These settings are used in both SW UART, HW UART and SPI mode
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
#define BUFSIZE 128 // Size of the read buffer for incoming data
|
||||
#define VERBOSE_MODE true // If set to 'true' enables debug output
|
||||
#define BLE_READPACKET_TIMEOUT 500 // Timeout in ms waiting to read a response
|
||||
|
||||
|
||||
// SOFTWARE UART SETTINGS
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// The following macros declare the pins that will be used for 'SW' serial.
|
||||
// You should use this option if you are connecting the UART Friend to an UNO
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
#define BLUEFRUIT_SWUART_RXD_PIN 9 // Required for software serial!
|
||||
#define BLUEFRUIT_SWUART_TXD_PIN 10 // Required for software serial!
|
||||
#define BLUEFRUIT_UART_CTS_PIN -1//11 // Required for software serial!
|
||||
#define BLUEFRUIT_UART_RTS_PIN -1 // Optional, set to -1 if unused
|
||||
|
||||
|
||||
// HARDWARE UART SETTINGS
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// The following macros declare the HW serial port you are using. Uncomment
|
||||
// this line if you are connecting the BLE to Leonardo/Micro or Flora
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
//#ifdef Serial1 // this makes it not complain on compilation if there's no Serial1
|
||||
#define BLUEFRUIT_HWSERIAL_NAME Serial1
|
||||
//#endif
|
||||
|
||||
|
||||
// SHARED UART SETTINGS
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// The following sets the optional Mode pin, its recommended but not required
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
#define BLUEFRUIT_UART_MODE_PIN -1//12 // Set to -1 if unused
|
||||
|
||||
|
||||
// SHARED SPI SETTINGS
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// The following macros declare the pins to use for HW and SW SPI communication.
|
||||
// SCK, MISO and MOSI should be connected to the HW SPI pins on the Uno when
|
||||
// using HW SPI. This should be used with nRF51822 based Bluefruit LE modules
|
||||
// that use SPI (Bluefruit LE SPI Friend).
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
#define BLUEFRUIT_SPI_CS 8
|
||||
#define BLUEFRUIT_SPI_IRQ 7
|
||||
#define BLUEFRUIT_SPI_RST 4 // Optional but recommended, set to -1 if unused
|
||||
|
||||
// SOFTWARE SPI SETTINGS
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// The following macros declare the pins to use for SW SPI communication.
|
||||
// This should be used with nRF51822 based Bluefruit LE modules that use SPI
|
||||
// (Bluefruit LE SPI Friend).
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
#define BLUEFRUIT_SPI_SCK 13
|
||||
#define BLUEFRUIT_SPI_MISO 12
|
||||
#define BLUEFRUIT_SPI_MOSI 11
|
|
@ -0,0 +1,201 @@
|
|||
/*********************************************************************
|
||||
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 <string.h>
|
||||
#include <Arduino.h>
|
||||
#include <SPI.h>
|
||||
#include <Adafruit_NeoPixel.h>
|
||||
#include "Adafruit_BLE.h"
|
||||
#include "Adafruit_BluefruitLE_SPI.h"
|
||||
#include "Adafruit_BluefruitLE_UART.h"
|
||||
|
||||
|
||||
#include "BluefruitConfig.h"
|
||||
|
||||
|
||||
/*=========================================================================
|
||||
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. 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.
|
||||
PIN Which pin on the Arduino is connected to the NeoPixels?
|
||||
NUMPIXELS How many NeoPixels are attached to the Arduino?
|
||||
-----------------------------------------------------------------------*/
|
||||
#define FACTORYRESET_ENABLE 1
|
||||
|
||||
#define PIN 9
|
||||
#define NUMPIXELS 10
|
||||
/*=========================================================================*/
|
||||
|
||||
Adafruit_NeoPixel pixel = Adafruit_NeoPixel(NUMPIXELS, PIN);
|
||||
|
||||
// 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/CTS pins. Uncomment this line */
|
||||
Adafruit_BluefruitLE_UART ble(BLUEFRUIT_HWSERIAL_NAME, 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);
|
||||
}
|
||||
|
||||
// function prototypes over in packetparser.cpp
|
||||
uint8_t readPacket(Adafruit_BLE *ble, uint16_t timeout);
|
||||
float parsefloat(uint8_t *buffer);
|
||||
void printHex(const uint8_t * data, const uint32_t numBytes);
|
||||
|
||||
// the packet buffer
|
||||
extern uint8_t packetbuffer[];
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@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);
|
||||
|
||||
// turn off neopixel
|
||||
pixel.begin(); // This initializes the NeoPixel library.
|
||||
for(uint8_t i=0; i<NUMPIXELS; i++) {
|
||||
//pixel.setPixelColor(i, pixel.Color(0,0,0)); // off
|
||||
pixel.setPixelColor(i, pixel.Color(8,8,8)); // default
|
||||
}
|
||||
pixel.show();
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.println(F("Adafruit Bluefruit Neopixel Color Picker 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 Controller mode"));
|
||||
Serial.println(F("Then activate/use the sensors, color picker, game controller, etc!"));
|
||||
Serial.println();
|
||||
|
||||
ble.verbose(false); // debug info is a little annoying after this point!
|
||||
|
||||
/* Wait for connection */
|
||||
while (! ble.isConnected()) {
|
||||
delay(500);
|
||||
}
|
||||
|
||||
Serial.println(F("***********************"));
|
||||
|
||||
// Set Bluefruit to DATA mode
|
||||
Serial.println( F("Switching to DATA mode!") );
|
||||
ble.setMode(BLUEFRUIT_MODE_DATA);
|
||||
|
||||
Serial.println(F("***********************"));
|
||||
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Constantly poll for new command or response data
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void loop(void)
|
||||
{
|
||||
/* Wait for new data to arrive */
|
||||
uint8_t len = readPacket(&ble, BLE_READPACKET_TIMEOUT);
|
||||
if (len == 0) return;
|
||||
|
||||
/* Got a packet! */
|
||||
// printHex(packetbuffer, len);
|
||||
|
||||
// Color
|
||||
if (packetbuffer[1] == 'C') {
|
||||
uint8_t red = packetbuffer[2];
|
||||
uint8_t green = packetbuffer[3];
|
||||
uint8_t blue = packetbuffer[4];
|
||||
Serial.print ("RGB #");
|
||||
if (red < 0x10) Serial.print("0");
|
||||
Serial.print(red, HEX);
|
||||
if (green < 0x10) Serial.print("0");
|
||||
Serial.print(green, HEX);
|
||||
if (blue < 0x10) Serial.print("0");
|
||||
Serial.println(blue, HEX);
|
||||
|
||||
for(uint8_t i=0; i<NUMPIXELS; i++) {
|
||||
pixel.setPixelColor(i, pixel.Color(red,green,blue));
|
||||
}
|
||||
pixel.show(); // This sends the updated pixel color to the hardware.
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,140 @@
|
|||
#include <string.h>
|
||||
#include <Arduino.h>
|
||||
#include <SPI.h>
|
||||
#if not defined (_VARIANT_ARDUINO_DUE_X_) && not defined (_VARIANT_ARDUINO_ZERO_)
|
||||
#include <SoftwareSerial.h>
|
||||
#endif
|
||||
|
||||
#include "Adafruit_BLE.h"
|
||||
#include "Adafruit_BluefruitLE_SPI.h"
|
||||
#include "Adafruit_BluefruitLE_UART.h"
|
||||
|
||||
|
||||
#define PACKET_ACC_LEN (15)
|
||||
#define PACKET_GYRO_LEN (15)
|
||||
#define PACKET_MAG_LEN (15)
|
||||
#define PACKET_QUAT_LEN (19)
|
||||
#define PACKET_BUTTON_LEN (5)
|
||||
#define PACKET_COLOR_LEN (6)
|
||||
#define PACKET_LOCATION_LEN (15)
|
||||
|
||||
// READ_BUFSIZE Size of the read buffer for incoming packets
|
||||
#define READ_BUFSIZE (20)
|
||||
|
||||
|
||||
/* Buffer to hold incoming characters */
|
||||
uint8_t packetbuffer[READ_BUFSIZE+1];
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Casts the four bytes at the specified address to a float
|
||||
*/
|
||||
/**************************************************************************/
|
||||
float parsefloat(uint8_t *buffer)
|
||||
{
|
||||
float f = ((float *)buffer)[0];
|
||||
return f;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Prints a hexadecimal value in plain characters
|
||||
@param data Pointer to the byte data
|
||||
@param numBytes Data length in bytes
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void printHex(const uint8_t * data, const uint32_t numBytes)
|
||||
{
|
||||
uint32_t szPos;
|
||||
for (szPos=0; szPos < numBytes; szPos++)
|
||||
{
|
||||
Serial.print(F("0x"));
|
||||
// Append leading 0 for small values
|
||||
if (data[szPos] <= 0xF)
|
||||
{
|
||||
Serial.print(F("0"));
|
||||
Serial.print(data[szPos] & 0xf, HEX);
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(data[szPos] & 0xff, HEX);
|
||||
}
|
||||
// Add a trailing space if appropriate
|
||||
if ((numBytes > 1) && (szPos != numBytes - 1))
|
||||
{
|
||||
Serial.print(F(" "));
|
||||
}
|
||||
}
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Waits for incoming data and parses it
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint8_t readPacket(Adafruit_BLE *ble, uint16_t timeout)
|
||||
{
|
||||
uint16_t origtimeout = timeout, replyidx = 0;
|
||||
|
||||
memset(packetbuffer, 0, READ_BUFSIZE);
|
||||
|
||||
while (timeout--) {
|
||||
if (replyidx >= 20) break;
|
||||
if ((packetbuffer[1] == 'A') && (replyidx == PACKET_ACC_LEN))
|
||||
break;
|
||||
if ((packetbuffer[1] == 'G') && (replyidx == PACKET_GYRO_LEN))
|
||||
break;
|
||||
if ((packetbuffer[1] == 'M') && (replyidx == PACKET_MAG_LEN))
|
||||
break;
|
||||
if ((packetbuffer[1] == 'Q') && (replyidx == PACKET_QUAT_LEN))
|
||||
break;
|
||||
if ((packetbuffer[1] == 'B') && (replyidx == PACKET_BUTTON_LEN))
|
||||
break;
|
||||
if ((packetbuffer[1] == 'C') && (replyidx == PACKET_COLOR_LEN))
|
||||
break;
|
||||
if ((packetbuffer[1] == 'L') && (replyidx == PACKET_LOCATION_LEN))
|
||||
break;
|
||||
|
||||
while (ble->available()) {
|
||||
char c = ble->read();
|
||||
if (c == '!') {
|
||||
replyidx = 0;
|
||||
}
|
||||
packetbuffer[replyidx] = c;
|
||||
replyidx++;
|
||||
timeout = origtimeout;
|
||||
}
|
||||
|
||||
if (timeout == 0) break;
|
||||
delay(1);
|
||||
}
|
||||
|
||||
packetbuffer[replyidx] = 0; // null term
|
||||
|
||||
if (!replyidx) // no data or timeout
|
||||
return 0;
|
||||
if (packetbuffer[0] != '!') // doesn't start with '!' packet beginning
|
||||
return 0;
|
||||
|
||||
// check checksum!
|
||||
uint8_t xsum = 0;
|
||||
uint8_t checksum = packetbuffer[replyidx-1];
|
||||
|
||||
for (uint8_t i=0; i<replyidx-1; i++) {
|
||||
xsum += packetbuffer[i];
|
||||
}
|
||||
xsum = ~xsum;
|
||||
|
||||
// Throw an error message if the checksum's don't match
|
||||
if (xsum != checksum)
|
||||
{
|
||||
Serial.print("Checksum mismatch in packet : ");
|
||||
printHex(packetbuffer, replyidx+1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// checksum passed!
|
||||
return replyidx;
|
||||
}
|
||||
|
Loading…
Reference in New Issue