衡阳派盒市场营销有限公司

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>如何將RTC DS1與Arduino結合使用來進行提醒

如何將RTC DS1與Arduino結合使用來進行提醒

2023-01-03 | zip | 0.01 MB | 次下載 | 免費

資料介紹

描述

概述

在許多電子項目中,需要根據時間或日期運行一個操作,并且時間和日期的計算不應該在系統關閉時停止。為此,使用了實時時鐘 (RTC) 模塊。在本教程中,您將學習如何將 RTC DS1 與 Arduino 結合使用來進行提醒。

你將學到什么:

  • 什么是實時時鐘
  • DS1307模塊介紹
  • 如何在 Arduino 上使用 DS1307
  • 如何做一個智能提醒

?

?
poYBAGOrtkuAH6NgAACsKvtN9n8397.jpg
?

什么是實時時鐘?

實時時鐘或 RTC 是一種跟蹤當前時間的系統,可用于任何需要保持準確時間的設備。

?

?
pYYBAGOrtk6AadniAAAzIYaIJMA516.jpg
?

您也可以在不使用 RTC 系統的情況下跟蹤準確時間,但 RTC 具有一些重要的優勢。以下是其中一些優點:

  • 低功耗
  • 從時間計算中釋放系統時間(此功能很關鍵,因為在許多情況下 CPU 正在執行一些微妙的任務,例如接收傳感器數據。如果您不使用 RTC,CPU 還必須跟蹤時間,這可能會破壞處理器主任務。)
  • 高準確率

RTC 通常有備用電源,因此它們可以在主電源關閉或不可用時繼續計時。RTC 通常使用 32.768 kHz 晶體振蕩器但為什么是 32、768?32768 等于 215,因此可以輕松生成 1 秒。另外,晶體必須小,寬度適當,功耗低,使用32876 Hz即可滿足。較高的頻率是較大且易碎的晶體,而較低的頻率比 32、768KHz 具有更多的功耗。

您也可以在不使用 RTC 系統的情況下跟蹤準確時間,但 RTC 具有一些重要的優勢。以下是其中一些優點:

  • 低功耗
  • 從時間計算中釋放系統時間(此功能很關鍵,因為在許多情況下 CPU 正在執行一些微妙的任務,例如接收傳感器數據。如果您不使用 RTC,CPU 還必須跟蹤時間,這可能會破壞處理器主任務。)
  • 高準確率

RTC 通常有備用電源,因此它們可以在主電源關閉或不可用時繼續計時。RTC 通常使用 32.768 kHz 晶體振蕩器。但為什么是 32、768?32768 等于 215,因此可以輕松生成 1 秒。另外,晶體必須小,寬度適當,功耗低,使用32876 Hz即可滿足。較高的頻率是較大且易碎的晶體,而較低的頻率比 32、768KHz 具有更多的功耗。

DS1307 模塊特性和規格

DS1307 模塊是最實惠和最常見的 RTC 模塊之一。它可以準確地記錄秒、分、時、日、月和年。

DS1307 的一些重要特性是:

  • 產生可編程方波的能力
  • 電流使用;在電池備份模式下低于 500nA
  • 將日期設置為 2100 年的能力
  • I2C 串行接口

DS1307 模塊能夠安裝 3 伏 CR2023 備用電池。該模塊上還有一個嵌入式 EEPROM 24c32 存儲器,可以保存 32kb 的數據。此外,您還可以通過在內置位置安裝一個DS18B20傳感器來測量環境溫度。您還可以從 BAT 引腳讀取備用電池電壓。

?

?
poYBAGOrtlCAQTYzAAA47qk4vQc935.jpg
?

?

?
pYYBAGOrtlKAVyuNAABt34nPbaM331.png
?

將 DS1307 與 Arduino 連接

該模塊使用簡單,RTC部分使用I2C協議與微控制器通信

電路

?

?
pYYBAGOuPMSAVLHrAACvrZuQxhI561.jpg
?

代碼

您需要 RTClib 庫才能將 DS1307 與 Arduino 一起使用。

現在將以下代碼上傳到您的板上,并在串行監視器窗口中查看結果。

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include 
#include "RTClib.h"
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup () {
 while (!Serial); // for Leonardo/Micro/Zero
 Serial.begin(57600);
 if (! rtc.begin()) {
   Serial.println("Couldn't find RTC");
   while (1);
 }
 if (! rtc.isrunning()) {
   Serial.println("RTC is NOT running!");
   // following line sets the RTC to the date & time this sketch was compiled
   rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   // This line sets the RTC with an explicit date & time, for example to set
   // January 21, 2014 at 3am you would call:
   // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
 }
}
void loop () {
 DateTime now = rtc.now();
 Serial.print(now.year(), DEC);
 Serial.print('/');
 Serial.print(now.month(), DEC);
 Serial.print('/');
 Serial.print(now.day(), DEC);
 Serial.print(" (");
 Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
 Serial.print(") ");
 Serial.print(now.hour(), DEC);
 Serial.print(':');
 Serial.print(now.minute(), DEC);
 Serial.print(':');
 Serial.print(now.second(), DEC);
 Serial.println();
 Serial.print(" since midnight 1/1/1970 = ");
 Serial.print(now.unixtime());
 Serial.print("s = ");
 Serial.print(now.unixtime() / 86400L);
 Serial.println("d");
 // calculate a date which is 7 days and 30 seconds into the future
 DateTime future (now + TimeSpan(7, 12, 30, 6));
 Serial.print(" now + 7d + 30s: ");
 Serial.print(future.year(), DEC);
 Serial.print('/');
 Serial.print(future.month(), DEC);
 Serial.print('/');
 Serial.print(future.day(), DEC);
 Serial.print(' ');
 Serial.print(future.hour(), DEC);
 Serial.print(':');
 Serial.print(future.minute(), DEC);
 Serial.print(':');
 Serial.print(future.second(), DEC);
 Serial.println();
 Serial.println();
 delay(3000);
}

您可以通過兩種方式設置日期和時間。首先是使用以下代碼在您的 PC 上設置它們:

rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); 

第二種方法是使用以下代碼手動設置日期和時間:

rtc.adjust(DateTime(YEAR, MONTH, DAY, HOUR , MINUTE, SECOND));

注意您只需在項目中設置一次日期和時間,之后,您應該從代碼中刪除相關行。否則,每次打開系統時都會設置日期和時間,這可能會導致一些錯誤。

注意在您的 Arduino 上上傳代碼需要幾秒鐘,與實時相比,這可能會導致您的時間延遲幾秒鐘。所以我們建議您在上傳代碼之前將您的時間提前幾秒。

獎勵項目:做一個智能提醒

您可以使用 DS1307 模塊制作一個簡單而有用的提醒。

其他所需材料

LCD 鍵盤護罩

無源蜂鳴器

電路

?

?
pYYBAGOuPMaAReCAAADlRc4GyYs917.jpg
?

?

代碼

將以下代碼上傳到您的 Arduino 板上,您的智能提醒已準備就緒!

/*
Arduino Reminder
modified on 13 March 2019
by Saeed Hosseini @ Electropeak
https://electropeak.com/learn/
*/
#include #include #include "RTClib.h"
#define NOTE_C4  262
#define NOTE_D4  294
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_G4  392
#define NOTE_A4  440
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_D5  587
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_G5  784
#define NOTE_A5  880
#define NOTE_B5  988
//LCD Pin to Arduino
const int pin_RS = 8;
const int pin_EN = 9;
const int pin_d4 = 4;
const int pin_d5 = 5;
const int pin_d6 = 6;
const int pin_d7 = 7;
const int pin_BL = 10;
//BUZZER Pin to Arduino
const int buzzer = 2;  
LiquidCrystal lcd( pin_RS,  pin_EN,  pin_d4,  pin_d5,  pin_d6,  pin_d7);
RTC_DS1307 rtc;
byte smiley[8] = {
 B00000,
 B10001,
 B00000,
 B00000,
 B10001,
 B01110,
 B00000,
};
String menuItems[] = {"1-Medicin", "2-Wake up", "3-Go out"};
int songspeed = 1.5;
int flag = 0;
int menuPage = 0;
int maxMenuPages = round(((sizeof(menuItems) / sizeof(String)) / 2) + .5);
int cursorPosition = 0;
int btn;
int h = 0, m = 0;
int duration[] = {         //duration of each note (in ms) Quarter Note is set to 250 ms
 125, 125, 250, 125, 125,
 125, 125, 250, 125, 125,
 125, 125, 250, 125, 125,
 125, 125, 375, 125,
 125, 125, 250, 125, 125,
 125, 125, 250, 125, 125,
 125, 125, 250, 125, 125,
 125, 125, 375, 125,
 125, 125, 250, 125, 125,
 125, 125, 250, 125, 125,
 125, 125, 250, 125, 125,
 125, 125, 125, 250, 125,
 125, 125, 250, 125, 125,
 250, 125, 250, 125,
 125, 125, 250, 125, 125,
 125, 125, 375, 375,
 250, 125,
 //Rpeat of First Part
 125, 125, 250, 125, 125,
 125, 125, 250, 125, 125,
 125, 125, 375, 125,
 125, 125, 250, 125, 125,
 125, 125, 250, 125, 125,
 125, 125, 250, 125, 125,
 125, 125, 375, 125,
 125, 125, 250, 125, 125,
 125, 125, 250, 125, 125,
 125, 125, 250, 125, 125,
 125, 125, 125, 250, 125,
 125, 125, 250, 125, 125,
 250, 125, 250, 125,
 125, 125, 250, 125, 125,
 125, 125, 375, 375,
 //End of Repeat
 250, 125, 375, 250, 125, 375,
 125, 125, 125, 125, 125, 125, 125, 125, 375,
 250, 125, 375, 250, 125, 375,
 125, 125, 125, 125, 125, 500,
 250, 125, 375, 250, 125, 375,
 125, 125, 125, 125, 125, 125, 125, 125, 375,
 250, 125, 375, 250, 125, 375,
 125, 125, 125, 125, 125, 500
};
int notes[] = {       //Note of the song, 0 is a rest/pulse
 NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
 NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
 NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
 NOTE_A4, NOTE_G4, NOTE_A4, 0,
 NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
 NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
 NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
 NOTE_A4, NOTE_G4, NOTE_A4, 0,
 NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
 NOTE_A4, NOTE_C5, NOTE_D5, NOTE_D5, 0,
 NOTE_D5, NOTE_E5, NOTE_F5, NOTE_F5, 0,
 NOTE_E5, NOTE_D5, NOTE_E5, NOTE_A4, 0,
 NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
 NOTE_D5, NOTE_E5, NOTE_A4, 0,
 NOTE_A4, NOTE_C5, NOTE_B4, NOTE_B4, 0,
 NOTE_C5, NOTE_A4, NOTE_B4, 0,
 NOTE_A4, NOTE_A4,
 //Repeat of first part
 NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
 NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
 NOTE_A4, NOTE_G4, NOTE_A4, 0,
 NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
 NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
 NOTE_C5, NOTE_D5, NOTE_B4, NOTE_B4, 0,
 NOTE_A4, NOTE_G4, NOTE_A4, 0,
 NOTE_E4, NOTE_G4, NOTE_A4, NOTE_A4, 0,
 NOTE_A4, NOTE_C5, NOTE_D5, NOTE_D5, 0,
 NOTE_D5, NOTE_E5, NOTE_F5, NOTE_F5, 0,
 NOTE_E5, NOTE_D5, NOTE_E5, NOTE_A4, 0,
 NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, 0,
 NOTE_D5, NOTE_E5, NOTE_A4, 0,
 NOTE_A4, NOTE_C5, NOTE_B4, NOTE_B4, 0,
 NOTE_C5, NOTE_A4, NOTE_B4, 0,
 //End of Repeat
 NOTE_E5, 0, 0, NOTE_F5, 0, 0,
 NOTE_E5, NOTE_E5, 0, NOTE_G5, 0, NOTE_E5, NOTE_D5, 0, 0,
 NOTE_D5, 0, 0, NOTE_C5, 0, 0,
 NOTE_B4, NOTE_C5, 0, NOTE_B4, 0, NOTE_A4,
 NOTE_E5, 0, 0, NOTE_F5, 0, 0,
 NOTE_E5, NOTE_E5, 0, NOTE_G5, 0, NOTE_E5, NOTE_D5, 0, 0,
 NOTE_D5, 0, 0, NOTE_C5, 0, 0,
 NOTE_B4, NOTE_C5, 0, NOTE_B4, 0, NOTE_A4
};
void show_time()
{
 lcd.clear();
 DateTime now = rtc.now();
 lcd.setCursor(0, 0);
 lcd.print("* Electropeak *");
 lcd.setCursor(5, 0);
 lcd.print(now.hour(), DEC);
 lcd.print(":");
 lcd.print(now.minute(), DEC);
 if (now.hour() == h && now.minute() == m)
 {
   lcd.clear();
   lcd.setCursor(0 , 0);
   switch (flag)
   {
     case 1:
       lcd.print("** ?edicine Time **");
       break;
     case 2:
       lcd.print("You'r late!!");
       lcd.setCursor(0, 1);
       lcd.print("Come onnnnnnn");
       break;
     case 3:
       lcd.print("Befor you go:");
       lcd.setCursor(0, 1);
       lcd.print("Wallet,Keys,...");
       break;
   }
   for (int i = 0; i < 203; i++) {       //203 is the total number of music notes in the song
     int wait = duration[i] * songspeed;
     tone(buzzer, notes[i], wait);        //tone(pin,frequency,duration)
     delay(wait);
   }
 }
 delay(2000);
}
void welcome_menu(int show_delay)
{
 lcd.setCursor(0, 0);
 lcd.print("Arduino reminder");
 lcd.createChar(1, smiley);
 lcd.setCursor(7, 1);
 lcd.write(1);
 delay(show_delay);
 lcd.clear();
}
int detect_button() {
 int readkey = 0;
 int result = 0;
 int activeButton = 0;
 while (activeButton == 0) {
   readkey = analogRead(0);
   if (readkey < 790) {
     delay(100);
     readkey = analogRead(0);
     if (readkey < 60) {
       result = 1; // right
     } else if (readkey < 200) {
       result = 2; // up
     } else if (readkey < 400) {
       result = 3; // down
     } else if (readkey < 600) {
       result = 4; // down
     } else if (readkey < 800) { result = 5; // select } return result; } } activeButton = 1; } int choose_menu() { lcd.clear(); lcd.print("Remmeber what?"); while (btn != 5) { btn = detect_button(); if (btn == 1) { if (menuPage > maxMenuPages) menuPage = 0;
     lcd.clear();
     lcd.print("Remmeber what?");
     lcd.setCursor(0, 1);
     lcd.print(menuItems[menuPage]);
     menuPage = menuPage + 1;
   }
 }
 return menuPage;
}
void set_alarm() {
 int sit = 0;
 lcd.clear();
 lcd.setCursor(1, 0);
 lcd.print("**Set Alarm**");
 lcd.setCursor(5, 1);
 lcd.print("00:00");
 while (sit != 1)
 {
   sit = detect_button();
   if (sit == 2)
   {
     lcd.clear();
     lcd.setCursor(1, 0);
     lcd.print("**Set Alarm**");
     h++;
     if (h > 23)
     {
       h = 0;
     }
     lcd.setCursor(5, 1);
     lcd.print(h);
     lcd.print(":00");
   }
   else if (sit == 3)
   {
     lcd.clear();
     lcd.setCursor(1, 0);
     lcd.print("**Set Alarm**");
     h--;
     if (h < 0) { h = 23; } lcd.setCursor(5, 1); lcd.print(h); lcd.print(":00"); } } while (sit != 5) { sit = detect_button(); if (sit == 2) { lcd.clear(); lcd.setCursor(1, 0); lcd.print("**Set Alarm**"); m++; if (m > 59)
     {
       m = 0;
     }
     lcd.setCursor(5, 1);
     lcd.print(h);
     lcd.print(":");
     lcd.print(m);
   }
   else if (sit == 3)
   {
     lcd.clear();
     lcd.setCursor(1, 0);
     lcd.print("**Set Alarm**");
     m--;
     if (m < 0)
     {
       m = 59;
     }
     lcd.setCursor(5, 1);
     lcd.print(h);
     lcd.print(":");
     lcd.print(m);
   }
 }
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("Alarm set");
 lcd.setCursor(0, 1);
 lcd.print("I'll be on time");
 delay(1500);
}
void setup() {
 lcd.begin(16, 2);
 rtc.begin();
 pinMode(buzzer, OUTPUT);
 welcome_menu(1000);
 flag = choose_menu();
 set_alarm();
}
void loop()
{
 show_time();
} 

?

如果您需要有關 LCD Keypad Shield 的更多信息,請閱讀Using 1602 LCD Keypad Shield w/ Arduino [+Practical Projects]。

打開設備后,LCD 上會顯示一個菜單。選擇您的提醒模式(您可以通過右鍵在選項之間移動并通過按選擇鍵選擇您想要的模式。)然后設置您的鬧鐘時間(通過向上和向下鍵設置小時,然后通過向右轉到分鐘并設置它.) 現在開始您的日常工作,不用擔心!

下一步是什么?

  • 試著做一個叫醒鬧鐘
  • 在 DS1307 模塊上安裝溫度傳感器,嘗試用 TFT LCD 制作一個顯示環境溫度的酷炫圖形時鐘 2, 4

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1A7159和A7139射頻芯片的資料免費下載
  2. 0.20 MB   |  55次下載  |  5 積分
  3. 2PIC12F629/675 數據手冊免費下載
  4. 2.38 MB   |  36次下載  |  5 積分
  5. 3PIC16F716 數據手冊免費下載
  6. 2.35 MB   |  18次下載  |  5 積分
  7. 4dsPIC33EDV64MC205電機控制開發板用戶指南
  8. 5.78MB   |  8次下載  |  免費
  9. 5STC15系列常用寄存器匯總免費下載
  10. 1.60 MB   |  7次下載  |  5 積分
  11. 6模擬電路仿真實現
  12. 2.94MB   |  4次下載  |  免費
  13. 7PCB圖繪制實例操作
  14. 2.92MB   |  2次下載  |  免費
  15. 8零死角玩轉STM32F103—指南者
  16. 26.78 MB   |  1次下載  |  1 積分

本月

  1. 1ADI高性能電源管理解決方案
  2. 2.43 MB   |  452次下載  |  免費
  3. 2免費開源CC3D飛控資料(電路圖&PCB源文件、BOM、
  4. 5.67 MB   |  141次下載  |  1 積分
  5. 3基于STM32單片機智能手環心率計步器體溫顯示設計
  6. 0.10 MB   |  137次下載  |  免費
  7. 4A7159和A7139射頻芯片的資料免費下載
  8. 0.20 MB   |  55次下載  |  5 積分
  9. 5PIC12F629/675 數據手冊免費下載
  10. 2.38 MB   |  36次下載  |  5 積分
  11. 6如何正確測試電源的紋波
  12. 0.36 MB   |  19次下載  |  免費
  13. 7PIC16F716 數據手冊免費下載
  14. 2.35 MB   |  18次下載  |  5 積分
  15. 8Q/SQR E8-4-2024乘用車電子電器零部件及子系統EMC試驗方法及要求
  16. 1.97 MB   |  8次下載  |  10 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935121次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
  4. 1.48MB  |  420062次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233088次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191367次下載  |  10 積分
  9. 5十天學會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183335次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73810次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65988次下載  |  10 積分
八卦24山| 百家乐官网视频游戏大厅| 大发888下载亚洲城| 水晶百家乐官网筹码| 波音百家乐官网网上娱乐| 阿尔山市| 百家乐官网娱乐网站| 名山县| 招远市| 当阳市| 百家乐官网二游戏机| 百家乐官网gamble| 至尊百家乐官网20130201| 机器百家乐官网作弊| 新加坡百家乐官网规则| 百家乐大小技巧| 百家乐国际娱乐网| 北京太阳城小区| 大发888在线娱乐| 巴登娱乐城| 模拟百家乐官网游戏软件| 百家乐官网开发软件| 百家乐官网直揽经验| 博发百家乐游戏| 百家乐可以破解吗| 永利高现金网| 百利宫娱乐城官方网| 百家乐官网如何看牌| 最新百家乐官网出千赌具| 墓地附近做生意风水| 百家乐tt娱乐场开户注册| 235棋牌游戏| 希尔顿百家乐官网试玩| 永发国际娱乐城| 百家乐官网也能赢钱么| 个人百家乐官网策略| 百家乐手机投注| 免佣百家乐官网规则| 网上玩百家乐有钱| 江西老虎机遥控器| 沙洋县|