380 lines
12 KiB
C++
380 lines
12 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"
|
||
#include <Wire.h>
|
||
#include "RTClib.h"
|
||
|
||
DS3231 rtc;
|
||
|
||
#define FLASH_TIME false
|
||
#define relay 5
|
||
|
||
#define ini_month 7
|
||
#define ini_day 24
|
||
#define ini_hour 22
|
||
#define ini_minute 0
|
||
#define ini_second 0
|
||
|
||
#define final_month 7
|
||
#define final_day 25
|
||
#define final_hour 8
|
||
#define final_minute 0
|
||
#define final_second 0
|
||
|
||
|
||
//#define ini_month 11
|
||
//#define ini_day 19
|
||
//#define ini_hour 10
|
||
//#define ini_minute 45
|
||
//#define ini_second 0
|
||
//
|
||
//#define final_month 11
|
||
//#define final_day 20
|
||
//#define final_hour 15
|
||
//#define final_minute 35
|
||
//#define final_second 0
|
||
|
||
|
||
/*=========================================================================
|
||
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);
|
||
}
|
||
|
||
static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); }
|
||
|
||
/**************************************************************************/
|
||
/*!
|
||
@brief Sets up the HW an the BLE module (this function is called
|
||
automatically on startup)
|
||
*/
|
||
/**************************************************************************/
|
||
void setup(void)
|
||
{
|
||
Serial.begin(115200);
|
||
Wire.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
|
||
rtc.begin();
|
||
pinMode(relay, OUTPUT);
|
||
digitalWrite(relay, LOW);
|
||
|
||
#if !FLASH_TIME
|
||
if (! rtc.isrunning()) {
|
||
Serial.println("RTC is NOT running!");
|
||
// following line sets the RTC to the date & time this sketch was compiled
|
||
}
|
||
else Serial.println("RTC is running!");
|
||
#elif FLASH_TIME
|
||
rtc.adjust(DateTime(__DATE__, __TIME__));
|
||
#endif
|
||
|
||
|
||
/* 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("******************************"));
|
||
}
|
||
}
|
||
|
||
unsigned long time_check = 0;
|
||
|
||
/**************************************************************************/
|
||
/*!
|
||
@brief Constantly poll for new command or response data
|
||
*/
|
||
/**************************************************************************/
|
||
|
||
boolean state_one=false;
|
||
boolean state_two=false;
|
||
boolean ble_relay=false;
|
||
boolean rtc_relay=false;
|
||
|
||
void loop(void)
|
||
{
|
||
digitalWrite(relay, rtc_relay||ble_relay);
|
||
|
||
if ((millis()-time_check)>=1000)
|
||
{
|
||
|
||
DateTime now = rtc.now();
|
||
Serial.print(now.year(), DEC);
|
||
Serial.print('/');
|
||
Serial.print(now.month(), DEC);
|
||
Serial.print('/');
|
||
Serial.print(now.day(), DEC);
|
||
Serial.print(' ');
|
||
Serial.print(now.hour(), DEC);
|
||
Serial.print(':');
|
||
Serial.print(now.minute(), DEC);
|
||
Serial.print(':');
|
||
Serial.print(now.second(), DEC);
|
||
Serial.print(" Status: ");
|
||
Serial.print(ble_relay, DEC);
|
||
Serial.print(' ');
|
||
Serial.print(rtc_relay, DEC);
|
||
Serial.println();
|
||
|
||
// if ((now.month()==ini_month)&&(now.day()>=ini_day)&&(now.hour()>=ini_hour)&&(now.minute()>=ini_minute)) state_one = true;
|
||
// else state_one = false;
|
||
|
||
if ((now.month()==ini_month)&&(now.day()>=ini_day))
|
||
{
|
||
if (now.day()>ini_day) state_one = true;
|
||
else if (now.day()==ini_day)
|
||
if (now.hour()>ini_hour) state_one = true;
|
||
else if ((now.hour()==ini_hour))
|
||
if (ini_minute==0) state_one = true;
|
||
else if (now.minute()>=ini_minute) state_one = true;
|
||
else state_one = false;
|
||
}
|
||
else state_two = false;
|
||
|
||
if ((now.month()==final_month)&&(now.day()<=final_day))
|
||
{
|
||
if (now.day()<final_day) state_two = true;
|
||
else if (now.day()==final_day)
|
||
if (now.hour()<final_hour) state_two = true;
|
||
else if ((now.hour()==final_hour))
|
||
if (final_minute==0) state_two = false;
|
||
else if (now.minute()<final_minute) state_two = true;
|
||
else state_two = false;
|
||
}
|
||
else state_two = false;
|
||
|
||
rtc_relay =state_one&state_two;
|
||
// if (state_one&&state_two) rtc_relay=true;
|
||
// else rtc_relay=false;
|
||
|
||
|
||
ble.print("AT+BLEUARTTX=");
|
||
ble.print(now.year(), DEC);
|
||
ble.print('/');
|
||
ble.print(now.month(), DEC);
|
||
ble.print('/');
|
||
ble.print(now.day(), DEC);
|
||
ble.print(' ');
|
||
ble.print(now.hour(), DEC);
|
||
ble.print(':');
|
||
ble.print(now.minute(), DEC);
|
||
ble.print(':');
|
||
ble.print(now.second(), DEC);
|
||
ble.print(" Status: ");
|
||
ble.print(ble_relay, DEC);
|
||
ble.print(' ');
|
||
ble.print(rtc_relay, DEC);
|
||
ble.println('\n');
|
||
time_check = millis();
|
||
|
||
// check response stastus
|
||
if (! ble.waitForOK() ) {
|
||
Serial.println(F("Failed to send?"));
|
||
}
|
||
|
||
}
|
||
|
||
while (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, "OK") == 0) {
|
||
// no data
|
||
return;
|
||
}
|
||
// Some data was found, its in the buffer
|
||
//Serial.print(F("[Recv] ")); Serial.println(ble.buffer);
|
||
if (strcmp(ble.buffer, "STOP") == 0)
|
||
{
|
||
Serial.println("ADIOS");
|
||
ble_relay=false;
|
||
//digitalWrite(relay, LOW);
|
||
}
|
||
else if (strcmp(ble.buffer, "PLAY") == 0)
|
||
{
|
||
Serial.println("HOLA");
|
||
ble_relay=true;
|
||
//digitalWrite(relay, HIGH);
|
||
}
|
||
else if (strcmp(ble.buffer, "UP") == 0)
|
||
{
|
||
Serial.println("Hora + 1");
|
||
DateTime now = rtc.now();
|
||
byte hour = now.hour();
|
||
if (hour<23) hour = hour + 1;
|
||
else hour = 0;
|
||
rtc.write(0x02, bin2bcd(hour));
|
||
//rtc.sethour(now.hour()+1);
|
||
//digitalWrite(relay, HIGH);
|
||
}
|
||
else if (strcmp(ble.buffer, "DOWN") == 0)
|
||
{
|
||
Serial.println("Hora - 1");
|
||
DateTime now = rtc.now();
|
||
byte hour = now.hour();
|
||
if (hour>0) hour = hour - 1;
|
||
else hour = 23;
|
||
rtc.write(0x02, bin2bcd(hour));
|
||
//rtc.sethour(now.hour()+1);
|
||
//digitalWrite(relay, HIGH);
|
||
}
|
||
// void sethour(uint8_t hour) { hh = hour%24; }
|
||
// void setminute(uint8_t minute) { mm = minute%60; }
|
||
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;
|
||
}
|