You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
236 lines
6.8 KiB
236 lines
6.8 KiB
/*
|
|
|
|
SetTimeFromBLE.ino : Simply use BLE to set the T-Watch RTC time
|
|
Copyright 2020 Lewis he
|
|
|
|
1. Download LightBlue on Google Play or Apple store
|
|
2. Connect the Bluetooth device named <LilyGo-Watch>
|
|
3. Slide to the bottom of the page, the attribute UUID is <beb5483e-36e1-4688-b7f5-ea07361b26a8>, then click it
|
|
4. Select <UTF-8 String> in the Data format of the page
|
|
5. Click the READ AGAIN button, it will return to the format requirements set for the first time,
|
|
the default format is YY, MM, DD, H, M, S
|
|
6. Under <WRITTEN VALUES>, fill in the time you need to set, such as: 2020,08,07,11,20,30
|
|
7. Click the <WRITE> button on the right, the time will be written into the watch
|
|
|
|
Android : https://play.google.com/store/apps/details?id=com.punchthrough.lightblueexplorer&hl=en_US
|
|
Apple : https://apps.apple.com/us/app/lightblue/id557428110
|
|
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include <BLEDevice.h>
|
|
#include <BLEUtils.h>
|
|
#include <BLEServer.h>
|
|
|
|
TTGOClass *ttgo;
|
|
TFT_eSPI *tft;
|
|
PCF8563_Class *rtc;
|
|
|
|
bool deviceConnected = false;
|
|
bool oldDeviceConnected = false;
|
|
uint32_t interval = 0;
|
|
|
|
// See the following for generating UUIDs:
|
|
// https://www.uuidgenerator.net/
|
|
|
|
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
|
|
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
|
|
#define TFT_GREY 0x5AEB
|
|
|
|
|
|
void drawSTATUS(bool status);
|
|
|
|
bool setDateTimeFormBLE(const char *str)
|
|
{
|
|
uint16_t year;
|
|
uint8_t month, day, hour, min, sec;
|
|
String temp, data;
|
|
int r1, r2;
|
|
if (str == NULL)return false;
|
|
|
|
data = str;
|
|
|
|
r1 = data.indexOf(',');
|
|
if (r1 < 0)return false;
|
|
temp = data.substring(0, r1);
|
|
year = (uint16_t)temp.toInt();
|
|
|
|
r1 += 1;
|
|
r2 = data.indexOf(',', r1);
|
|
if (r2 < 0)return false;
|
|
temp = data.substring(r1, r2);
|
|
month = (uint16_t)temp.toInt();
|
|
|
|
r1 = r2 + 1;
|
|
r2 = data.indexOf(',', r1);
|
|
if (r2 < 0)return false;
|
|
temp = data.substring(r1, r2);
|
|
day = (uint16_t)temp.toInt();
|
|
|
|
r1 = r2 + 1;
|
|
r2 = data.indexOf(',', r1);
|
|
if (r2 < 0)return false;
|
|
temp = data.substring(r1, r2);
|
|
hour = (uint16_t)temp.toInt();
|
|
|
|
r1 = r2 + 1;
|
|
r2 = data.indexOf(',', r1);
|
|
if (r2 < 0)return false;
|
|
temp = data.substring(r1, r2);
|
|
min = (uint16_t)temp.toInt();
|
|
|
|
r1 = r2 + 1;
|
|
temp = data.substring(r1);
|
|
sec = (uint16_t)temp.toInt();
|
|
|
|
// No parameter check, please set the correct time
|
|
Serial.printf("SET:%u/%u/%u %u:%u:%u\n", year, month, day, hour, min, sec);
|
|
rtc->setDateTime(year, month, day, hour, min, sec);
|
|
|
|
return true;
|
|
}
|
|
|
|
class MyCallbacks: public BLECharacteristicCallbacks
|
|
{
|
|
void onWrite(BLECharacteristic *pCharacteristic)
|
|
{
|
|
std::string value = pCharacteristic->getValue();
|
|
|
|
if (value.length() > 0) {
|
|
Serial.println("*********");
|
|
Serial.print("New value: ");
|
|
value.c_str();
|
|
for (int i = 0; i < value.length(); i++)
|
|
Serial.print(value[i]);
|
|
Serial.println();
|
|
Serial.println("*********");
|
|
}
|
|
|
|
if (value.length() <= 0) {
|
|
return;
|
|
}
|
|
if (!setDateTimeFormBLE(value.c_str())) {
|
|
Serial.println("DateTime format error ...");
|
|
}
|
|
}
|
|
};
|
|
|
|
class MyServerCallback : public BLEServerCallbacks
|
|
{
|
|
void onConnect(BLEServer *pServer)
|
|
{
|
|
deviceConnected = true;
|
|
Serial.println("onConnect");
|
|
}
|
|
|
|
void onDisconnect(BLEServer *pServer)
|
|
{
|
|
deviceConnected = false;
|
|
Serial.println("onDisconnect");
|
|
}
|
|
};
|
|
|
|
void setupBLE(void)
|
|
{
|
|
|
|
BLEDevice::init("LilyGo-Watch");
|
|
BLEServer *pServer = BLEDevice::createServer();
|
|
|
|
pServer->setCallbacks(new MyServerCallback);
|
|
|
|
BLEService *pService = pServer->createService(SERVICE_UUID);
|
|
|
|
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
|
|
CHARACTERISTIC_UUID,
|
|
BLECharacteristic::PROPERTY_READ |
|
|
BLECharacteristic::PROPERTY_WRITE);
|
|
|
|
pCharacteristic->setCallbacks(new MyCallbacks());
|
|
|
|
pCharacteristic->setValue("Format: YY,MM,DD,h,m,s");
|
|
pService->start();
|
|
|
|
BLEAdvertising *pAdvertising = pServer->getAdvertising();
|
|
pAdvertising->start();
|
|
}
|
|
|
|
void setup()
|
|
{
|
|
Serial.begin(115200);
|
|
Serial.println();
|
|
Serial.println("1. Download <LightBlue> on Google Play");
|
|
Serial.println("2. Connect the Bluetooth device named <LilyGo-Watch >");
|
|
Serial.println("3. Slide to the bottom of the page, the attribute UUID is <beb5483e-36e1-4688-b7f5-ea07361b26a8>, then click it");
|
|
Serial.println("4. Select < UTF-8 String > in the Data format of the page");
|
|
Serial.println("5. Click the READ AGAIN button, it will return to the format requirements set for the first time,the default format is YY, MM, DD, H, M, S");
|
|
Serial.println("6. Under <WRITTEN VALUES>, fill in the time you need to set, such as : 2020, 08, 07, 11, 20, 30");
|
|
Serial.println("7. Click the <WRITE> button on the right, the time will be written into the watch");
|
|
Serial.println();
|
|
|
|
//Get watch instance
|
|
ttgo = TTGOClass::getWatch();
|
|
// Initialize the hardware
|
|
ttgo->begin();
|
|
// Turn on the backlight
|
|
ttgo->openBL();
|
|
// Receive as a local variable for easy writing
|
|
rtc = ttgo->rtc;
|
|
tft = ttgo->tft;
|
|
|
|
|
|
// Time check will be done, if the time is incorrect, it will be set to compile time
|
|
rtc->check();
|
|
|
|
// Some settings of BLE
|
|
setupBLE();
|
|
|
|
// Draw initial connection status
|
|
drawSTATUS(false);
|
|
}
|
|
|
|
void drawSTATUS(bool status)
|
|
{
|
|
String str = status ? "Connection" : "Disconnect";
|
|
int16_t cW = tft->textWidth("Connection", 2);
|
|
int16_t dW = tft->textWidth("Disconnect", 2);
|
|
int16_t w = cW > dW ? cW : dW;
|
|
w += 6;
|
|
int16_t x = 160;
|
|
int16_t y = 20;
|
|
int16_t h = tft->fontHeight(2) + 4;
|
|
uint16_t col = status ? TFT_GREEN : TFT_GREY;
|
|
tft->fillRoundRect(x, y, w, h, 3, col);
|
|
tft->setTextColor(TFT_BLACK, col);
|
|
tft->setTextFont(2);
|
|
tft->drawString(str, x + 2, y);
|
|
}
|
|
|
|
|
|
void loop()
|
|
{
|
|
// disconnected
|
|
if (!deviceConnected && oldDeviceConnected) {
|
|
oldDeviceConnected = deviceConnected;
|
|
Serial.println("Draw deviceDisconnected");
|
|
drawSTATUS(false);
|
|
}
|
|
|
|
// connecting
|
|
if (deviceConnected && !oldDeviceConnected) {
|
|
// do stuff here on connecting
|
|
oldDeviceConnected = deviceConnected;
|
|
Serial.println("Draw deviceConnected");
|
|
drawSTATUS(true);
|
|
}
|
|
|
|
if (millis() - interval > 1000) {
|
|
|
|
interval = millis();
|
|
|
|
tft->setTextColor(TFT_YELLOW, TFT_BLACK);
|
|
|
|
tft->drawString(rtc->formatDateTime(PCF_TIMEFORMAT_DD_MM_YYYY), 50, 200, 4);
|
|
|
|
tft->drawString(rtc->formatDateTime(PCF_TIMEFORMAT_HMS), 5, 118, 7);
|
|
}
|
|
}
|