使用Arduino mini的RTC + Scheduler

时间:2015-01-01 06:05:48

标签: arduino scheduler real-time-clock

我正在为我的项目使用Arduino mini 5V和RTC - 实时时钟模块DS1307 我想在某个时间唤醒董事会并运行一个功能。 (蜂鸣器连接到D3)

当我单独使用TimeAlarm并手动设置时间一切正常时:

#include "Time.h"
#include "TimeAlarms.h"

void setup(){
  setTime(22,29,55,12,31,14); // set time to Saturday 8:29:00am Jan 1 2011

  Alarm.alarmRepeat(10,30,0,buzz);  // 10:30am every day
  Alarm.alarmRepeat(16,30,0,buzz);  // 4:30pm every day 
  Alarm.alarmRepeat(22,30,0,buzz);  // 10:30pm every day 

  Serial.begin(9600);
}

void loop(){
  digitalClockDisplay();
  Alarm.delay(1000);
}

void buzz(){
   tone(3, 220, 1000);
}

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println(); 
}

void printDigits(int digits){
  Serial.print(":");
  if(digits < 10)
  Serial.print('0');
  Serial.print(digits);
}

然而,当我使用RTC时,蜂鸣器功能不会被调用,它仍会打印时间

#include <Wire.h>
#include "RTClib.h"
#include "Time.h"
#include "TimeAlarms.h"

RTC_Millis rtc;

void setup(){
  rtc.begin(DateTime(F(__DATE__), F(__TIME__)));

  Alarm.alarmRepeat(10,30,0,buzz);  // 10:30am every day
  Alarm.alarmRepeat(16,30,0,buzz);  // 4:30pm every day 
  Alarm.alarmRepeat(22,30,0,buzz);  // 10:30pm every day -- modify this to your current time when running the example

  Serial.begin(9600);
}

void loop(){
  //printing the current time
  DateTime now = rtc.now();

  Serial.print(now.year());
  Serial.print('/');
  Serial.print(now.month());
  Serial.print('/');
  Serial.print(now.day());
  Serial.print(' ');
  Serial.print(now.hour());
  Serial.print(':');
  Serial.print(now.minute());
  Serial.print(':');
  Serial.print(now.second());
  Serial.println();
  Alarm.delay(1000); // wait one second between clock display
}

void buzz(){
  tone(3, 220, 1000);
}

2 个答案:

答案 0 :(得分:2)

好的,所以我找到了答案:

第一个问题是:使用RTC_DS1307而不是RTC_Millis

RTC ds1307指的是引脚12C,它在Arduino mini中高于A3和VCC。他们需要焊接。一旦完成,他们应该使用M / F线连接到SDA和SCL

SDA -> to the pin above A3
SCL -> to the pin above VCC

然后我将代码更改为以下内容:

#include <Wire.h>
#include "RTClib.h"
#include "Time.h"
#include "TimeAlarms.h"

RTC_DS1307 rtc;
const int output = 3;

uint32_t syncProvider()//function which sets up the RTC as the source of external time{
  return rtc.now().unixtime();
}


void setup(){
  Wire.begin();
  rtc.begin();
  rtc.adjust(DateTime(__DATE__, __TIME__));//comment this out when the RTC has been set
  setSyncProvider(syncProvider);   // the function to get the time from the RTC


  Alarm.alarmRepeat(10,30,0,buzzer);  // 10:30am every day
  Alarm.alarmRepeat(16,30,0,buzzer);  // 4:30pm every day 
  Alarm.alarmRepeat(22,30,00,buzzer);  // 10:30pm every day 

  pinMode(output , OUTPUT);//new line
  Serial.begin(9600);
}

void loop(){

  //printing the current time
  DateTime now = rtc.now();

  Serial.print(now.year());
  Serial.print('/');
  Serial.print(now.month());
  Serial.print('/');
  Serial.print(now.day());
  Serial.print(' ');
  Serial.print(now.hour());
  Serial.print(':');
  Serial.print(now.minute());
  Serial.print(':');
  Serial.print(now.second());
  Serial.println();
  Alarm.delay(1000); // wait one second between clock display
}

void buzzer(){
 //Do Stuff
}

答案 1 :(得分:0)

只是为了帮助像我这样的人通过使用复制粘贴尝试此代码并获取错误

  

不再支持命名返回值错误编译。

在网上搜索后发现 {臭名昭着的花括号是评论的一部分所以请将其更改为

uint32_t syncProvider() { //function which sets up the RTC as the source of external time       
       return rtc . now() . unixtime(); 
   }