查看: 34654|回复: 21

Arduino 101/Genuino 101 时间控制函数

[复制链接]
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2016-3-9 21:15 | 显示全部楼层 |阅读模式
    时间控制函数
    运行时间函数
    使用运行时间函数millis(),能获取Arduino通电后(或复位后)到现在的时间。
    [mw_shl_code=cpp,true]millis()[/mw_shl_code]
    返回系统运行时间,单位毫秒。
    返回值是uint64_t类型。
    [mw_shl_code=cpp,true]micros()[/mw_shl_code]
    返回系统运行时间,单位微秒。
    返回值是uint64_t类型。
    在不同型号的Arduino上,运行时间函数的精度也不同,在Genuino 101上,精度为2微秒。

    使用以下程序会将系统运行时间输出到串口,你可以通过串口监视器观察到程序运行时间。
    [mw_shl_code=cpp,true]/*
    获取系统运行时间
    */
    unsigned long time1;
    unsigned long time2;

    void setup(){
      Serial.begin(9600);
    }

    void loop(){
      time1 = millis();
      time2 = micros();
      // 输出系统运行时间
      Serial.print(time1);
      Serial.println("ms");
      Serial.print(time2);
      Serial.println("us");
      // 等待1秒开始下一次loop循环
      delay(1000);
    }[/mw_shl_code]



    延时函数
    在之前的Blink程序中,我们通过使用延时函数,使LED按一定频率闪烁。
    Arduino提供了毫秒级和微秒级两种延时函数。运行延时函数时,会等待指定的时间,再运行此后的程序。你可以通过参数设定延时时间。
    [mw_shl_code=cpp,true]delay( uint32_t dwMs )[/mw_shl_code]
    毫秒级延时。
    参数数据类型为uint32_t。

    [mw_shl_code=cpp,true]delayMicroseconds( uint32_t dwUs )[/mw_shl_code]
    微秒级延时。
    参数数据类型为uint32_t。
    Genuino 101上的延时操作精度为+-0.5微秒。

    RTC函数
    我们已经知道使用Arduino的运行时间函数millis()、micros() 可以获取到Arduino的运行时间,但很多场合我们需要记录年月日时分秒等日期信息,使用arduino原有的时间函数会非常不便。解决该问题的普遍方法,就是外接一个RTC(Real-Time Clock,即实时时钟)芯片,Intel Curie内置有RTC,它能准确的记录日期信息。
    要使用RTC功能,我们需要先引用CurieTime.h头文件:
    [mw_shl_code=cpp,true]#include <CurieTime.h>[/mw_shl_code]

    CurieTime中设置时间就一个函数:
    [mw_shl_code=cpp,true]setTime(时,分,秒,日,月,年);[/mw_shl_code]

    设置好时间后,可以通过以下6个函数获取时间信息:
    [mw_shl_code=cpp,true]year();
    month();
    day();
    hour();
    minute();
    second();[/mw_shl_code]

    例程程序如下:
    [mw_shl_code=cpp,true]/*
    Curie RTC例程
    http://www.arduino.cn/
    */

    #include <CurieTime.h>

    void setup() {
      while (!Serial);
      Serial.begin(9600);

      // 将时间设为2016年6月25日18点27分
      setTime(18, 27, 00, 24, 6, 2016);
    }

    void loop() {
      Serial.print("Time now is: ");

      print2digits(hour());
      Serial.print(":");
      print2digits(minute());
      Serial.print(":");
      print2digits(second());

      Serial.print(" ");

      Serial.print(day());
      Serial.print("/");
      Serial.print(month());
      Serial.print("/");
      Serial.print(year());

      Serial.println();

      delay(1000);
    }
    // 生成占位用的字符“0”
    void print2digits(int number) {
      if (number >= 0 && number < 10) {
        Serial.print('0');
      }
      Serial.print(number);
    }
    [/mw_shl_code]

    该用户从未签到

    发表于 2016-3-20 10:29 | 显示全部楼层
    请问CurieTime库文件在哪里下?
  • TA的每日心情
    奋斗
    2016-7-29 10:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-7-28 17:44 | 显示全部楼层
    用这个方法读到的时间,为何前几秒是settime之前的默认时间?
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2016-7-28 18:51 | 显示全部楼层
    wangzway 发表于 2016-7-28 17:44
    用这个方法读到的时间,为何前几秒是settime之前的默认时间?

    哪个方法?
  • TA的每日心情
    奋斗
    2016-7-29 10:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-7-29 10:51 | 显示全部楼层

    #include "CurieIMU.h"
    #include <CurieTime.h>
    #include <SPI.h>
    #include <SD.h>

    void setup() {
      Serial.begin(9600); // initialize Serial communication
    // while (!Serial);    // wait for the serial port to open

      delay(7000);  
      // initialize device
      Serial.println("Setting Time...");
       
      setTime(10, 00, 00, 11, 7, 2016);
      
    }

    void loop() {

      Serial.println(getTime());

    }


    String getTime() {
      String timeString = "";
      timeString += String(year());
      timeString += "/";
      timeString += String(month());
      timeString += "/";
      timeString += String(day());
      timeString += " ";

      timeString += print2digits(hour());
      timeString += ":";
      timeString += print2digits(minute());
      timeString += ":";
      timeString += print2digits(second());
      timeString += " ";
      
      return timeString;
    }

    // 生成占位用的字符“0”
    String print2digits(int number) {
      if (number >= 0 && number < 10) {
        String twodigitsString = "";
        twodigitsString += '0';
        twodigitsString += String (number);
        return twodigitsString;
      }
      return String(number);
    }
  • TA的每日心情
    奋斗
    2016-7-29 10:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-7-29 10:55 | 显示全部楼层
    wangzway 发表于 2016-7-29 10:51
    #include "CurieIMU.h"
    #include
    #include

    用  delay(7000);  代替了  while (!Serial);    // wait for the serial port to open 的作用,把settime放到delay(7000)的前面的话读到的时间就没有初始时间了,这是为何?
  • TA的每日心情
    奋斗
    2016-7-29 10:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-7-29 10:56 | 显示全部楼层

    本人新手,求赐教
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2016-7-29 19:14 | 显示全部楼层
    wangzway 发表于 2016-7-29 10:55
    用  delay(7000);  代替了  while (!Serial);    // wait for the serial port to open 的作用,把settim ...

    初始时间指的是什么?
  • TA的每日心情
    擦汗
    2017-2-26 14:29
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    发表于 2016-12-18 19:34 | 显示全部楼层
    uint64_t类型是什么?  还有什么 uint8? 在奈何的书中,数据类型那块也没找到
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2016-12-18 21:43 | 显示全部楼层
    zjy 发表于 2016-12-18 19:34
    uint64_t类型是什么?  还有什么 uint8? 在奈何的书中,数据类型那块也没找到 ...

    前面写个U就是说类型无符号,64就是64位
    所以这个是无符号64位整形
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    这个F()函数是做什么的?
    这个F()函数是做什么的
    如图上,在看代码的时候,发现了这么一个函数,然后后面又一行英文注释。 我用有道翻
    隔离论坛在搞一个开源的arduino墨水屏,值得入手吗?
    隔离论坛在搞一个开源的ar
    amobbs论坛出来了一个众筹的arduino的墨水屏终端,100多块钱,有大神加入了吗? 看着
    两轮自平衡小车的线性CCD循迹总结
    两轮自平衡小车的线性CCD
    继之前的两轮自平衡小车的制作总结(https://www.arduino.cn/thread-99011-1-1.html)
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表