237 lines
8.2 KiB
C++
237 lines
8.2 KiB
C++
/*********************************************************************
|
||
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. 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/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);
|
||
}
|
||
|
||
#define coin 13
|
||
#define insert_coin A0
|
||
/**************************************************************************/
|
||
/*!
|
||
@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);
|
||
pinMode(coin, OUTPUT);
|
||
pinMode(insert_coin, INPUT);
|
||
digitalWrite(coin, LOW);
|
||
|
||
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!
|
||
|
||
ble.print("AT+GAPDEVNAME=");
|
||
ble.println("Arcade Marzia");
|
||
// check response stastus
|
||
if (! ble.waitForOK() ) {
|
||
Serial.println(F("Failed to send name?"));
|
||
}
|
||
ble.print("ATZ");
|
||
if (! ble.waitForOK() ) {
|
||
Serial.println(F("Failed to send Factory Reset?"));
|
||
}
|
||
|
||
// 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)
|
||
{
|
||
if(digitalRead(insert_coin))
|
||
{
|
||
Serial.println("MONEY INSERT!!!");
|
||
digitalWrite(coin, HIGH);
|
||
}
|
||
else digitalWrite(coin, LOW);
|
||
|
||
/* Wait for connection */
|
||
if(ble.isConnected()) {
|
||
// 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, "COIN") == 0) {
|
||
digitalWrite(coin, HIGH);
|
||
delay(100);
|
||
digitalWrite(coin, LOW);
|
||
Serial.println("MONEY!!!");
|
||
//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;
|
||
}
|