零知BLE52蓝牙教程-RTC时钟使用 nrf52


本次演示在零知开源平台-零知BLE52硬件上使用RTC实时时钟。

1、硬件




2、软件
(1)串口显示时间
代码功能为:使用RTC的功能显示24小时的时间,显示在串口中。

																		
/*
*   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时钟。