零知BLE52-/home/introduction.html?gid=1376
/*
* 24小时时间格式RTC时间显示
*/
#include <RTCInt.h>
//创建RTC实例
RTCInt rtc;
void setup()
{
Serial.begin(115200);
//设置显示时间的模式12小时、24小时
rtc.begin(TIME_H24);
//设置当前时间,从程序运行开始计时
rtc.setHour(11,0);
rtc.setMinute(43);
rtc.setSecond(0);
rtc.setDay(8);
rtc.setMonth(1);
rtc.setYear(20);
}
void loop()
{
//获取时间和日期
rtc.getDate();
rtc.getTime();
//打印格式: YYYY/MM/DD
Serial.print(rtc.date.year+2000); // 年
Serial.print('/');
Serial.print(rtc.date.month); // 月
Serial.print('/');
Serial.print(rtc.date.day); // 日
Serial.print(' ');
Serial.print(rtc.time.hour); //时
Serial.print(':');
Serial.print(rtc.time.minute); //分
Serial.print(':');
Serial.println(rtc.time.second); //秒
delay(1000);
}
将代码上传到零知BLE52开发板后打开串口调试工具可以看到时间显示:
(2)加入蓝牙服务并使用手机APP进行时间更新
上述的时间是在程序里面设置的,但是这样很不方便,无法同步实际的实际;比如我们重新上电就无法同步当前的时间了,因此我们可以加入蓝牙服务用手机APP进行时间同步,代码如下:
/*
* 24小时时间格式RTC时间显示
*/
//头文件
#include <bluefruit.h>
#include <RTCInt.h>
//蓝牙服务
BLEUart bleuart; //串口蓝牙服务
//创建RTC实例
RTCInt rtc;
/*************************************蓝牙功能*********************/
/**
* 开始蓝牙广播
*/
void startAdv(void)
{
// 广播设置
BLE52.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
BLE52.Advertising.addTxPower();
BLE52.Advertising.addService(bleuart);
BLE52.ScanResponse.addName();
BLE52.Advertising.restartOnDisconnect(true);
BLE52.Advertising.setInterval(32, 244);
BLE52.Advertising.setFastTimeout(30);
BLE52.Advertising.start(0);
}
//蓝牙连接回调函数
void connect_callback(uint16_t conn_handle)
{
BLEConnection* connection = BLE52.Connection(conn_handle);
char central_name[32] = { 0 };
connection->getPeerName(central_name, sizeof(central_name));
Serial.print("\r\n连接到蓝牙设备:");
Serial.println(central_name);
}
//蓝牙断开连接回调函数
void disconnect_callback(uint16_t conn_handle, uint8_t reason)
{
(void) conn_handle;
(void) reason;
Serial.println();
Serial.print("蓝牙连接断开, reason = 0x"); Serial.println(reason, HEX);
}
void update_time(String buff)
{
Serial.print("update time");
uint16_t time_buff[6];
for(int i=0; i<6; i++){
time_buff[i] = (String(buff[i*2]).toInt())*10+String(buff[i*2+1]).toInt();
Serial.print(":");
Serial.print(time_buff[i]);
}
Serial.println();
rtc.setYear(time_buff[0]);
rtc.setMonth(time_buff[1]);
rtc.setDay(time_buff[2]);
rtc.setHour(time_buff[3],0);
rtc.setMinute(time_buff[4]);
rtc.setSecond(time_buff[5]);
}
void setup()
{
Serial.begin(115200);
//设置显示时间的模式12小时、24小时
rtc.begin(TIME_H24);
//设置当前时间,从程序运行开始计时
rtc.setHour(11,0);
rtc.setMinute(43);
rtc.setSecond(0);
rtc.setDay(8);
rtc.setMonth(1);
rtc.setYear(20);
Serial.println("设置蓝牙.");
//蓝牙设置
BLE52.autoConnLed(true);
BLE52.configPrphBandwidth(BANDWIDTH_MAX);
BLE52.begin();
BLE52.setTxPower(4);
BLE52.setName("BLE52 RTC update");
BLE52.Periph.setConnectCallback(connect_callback);
BLE52.Periph.setDisconnectCallback(disconnect_callback);
//蓝牙服务
Serial.println("开启蓝牙开始广播.");
bleuart.begin();
startAdv();
//蓝牙连接...
Serial.println("等待蓝牙连接.");
}
void loop()
{
//设置时间
String buff;
while ( bleuart.available() )
{
char ch;
ch = bleuart.read();
buff += ch;
}
int len = buff.length();
if(len>0){
Serial.print("recv:");
Serial.println(buff);
}
if(len>3){
// Serial.print("len:");Serial.println(len);
// Serial.println(buff[0]);
if(buff[0] == '{' && buff[len-1] == '}'){
if(len >= 12+2){//{20 01 02 15 17 30}
String timebuff;
for(int i=0; i<12;i++){
timebuff+= String(buff[i+1]);
}
update_time(timebuff);
}
}
}
//获取时间和日期
rtc.getDate();
rtc.getTime();
//打印格式: YYYY/MM/DD
Serial.print(rtc.date.year+2000); // 年
Serial.print('/');
Serial.print(rtc.date.month); // 月
Serial.print('/');
Serial.print(rtc.date.day); // 日
Serial.print(' ');
Serial.print(rtc.time.hour); //时
Serial.print(':');
Serial.print(rtc.time.minute); //分
Serial.print(':');
Serial.println(rtc.time.second); //秒
delay(1000);
}
将上述代码上传到零知BLE52开发板后,打开串口调试工具,可以看到显示在代码里面设置的时间,这个时间没有同步;
我们打开零知星球APP,然后按照如下进行设置:
设置时间{20
01 08 13 01 01}
可以看到设置后时间与我们手机设置的时间同步了:
上述我们使用手机手动发送的数据设置的时间,我们在实际应用中可以自己改写APP使之在连接蓝牙时候自动获取时间并同步到BLE52硬件的RTC时钟。