在这篇文章中,我们将使用Arduino、16 x 2显示器和实时时钟模块构建一个自动学校铃声/大学铃声系统。您可以对该项目进行编程,以您喜欢的时间和分钟,每天最多鸣钟16次。铃声的长度可以以秒为单位编程。
寻找更简单的版本而无需编码?得到它在这里
概述
过去的日子一去不复返了,学校里的一位牡丹敲响了“锡锡”的铃声,学生们满载而归地跑出了校门。当牡丹提前几分钟敲响最后一个铃时,有些人可能会更高兴。
这是15到20年前的情景,但现在所有的学校和学院都严格遵守时间限制,钟声都是自动化的。
作者童年/青少年时期的快速成长请记住:
在我上小学和中学期间,我戴的数字手表与学校的钟系统同步,精度为1秒。
在钟声响起后,所有学生都惊讶地盯着我,我会大喊大叫“钟声将在5秒钟内响起”。有一天,我和我的亲密朋友开始倒计时10,9,8,7 ...... ..在最后的钟声。
我所有的朋友都说这是一块神奇的手表,但他们没有意识到一个简单的事实,那就是学校的铃声是自动的。哈哈!!
我们打算用Arduino做一个这样的学校/大学钟。
你也可能对一个基于IC 4017的学校铃声系统
显示到Arduino连接
显示器连接到Arduino的方式与我们通常连接的方式略有不同,这里使用的引脚是9、8、7、6、5和4。引脚2和3被用作硬件中断通过按钮.
有关钟和继电器连接的详细信息:
更新:A5至SCL,A4至SDA(非A4至SCK)
实时时钟模块
这个实时时钟模块保持跟踪时间,即使长时间断电。一个9V继电器用于开关钟的开关。
请在继电器上连接一个反向偏置的1N4007二极管(原理图中没有显示),它将从继电器吸收有害的高压反电动势。
使用电源为电路供电9V / 500mA壁适配器.
提供三个按钮,其中一个用于在某些情况下手动操作铃。手动铃响后,按下“退出”按钮将停止铃。
“铃声禁用按钮”将永远禁用铃声。要重新启动门铃,请按“退出”按钮。
如何设置时间到RTC模块:
下载RTC库:
链接:github.com/PaulStoffregen/DS1307RTC
-----------------------------------------------------------------
下载timeLib.h:
github.com/PaulStoffregen/Time
------------------------------------------------------------------
上传程序
上传下面的程序,将时间设置为RTC
//----------------------------------------------------//
# include < Wire.h >
#包括
#包括
int P = A3;//为RTC分配电源插头
int N = A2;
const char * [12] = {
“一月”、“二月”、“三月”、“四月”、“五月”、“六月”,
“七月”、“八月”、“九月”、“十月”、“Nov”、“Dec”
};
TMU\t tm;
无效设置(){
pinMode(P,输出);
Pinmode(n,输出);
digitalWrite (P、高);
digitalWrite (N,低);
bool parse=false;
bool配置= false;
//获取编译器运行的日期和时间
if(getDate(\uuuuuuuuuuuuuuuuuuuuuuuuu)和&getTime(\uuuuuuuuuuuuuuuu)){
parse=true;
//配置RTC
如果(RTC.write (tm)) {
配置= true;
}
}
Serial.begin(9600);
而(串行);//等待Arduino串行监视器
延迟(200);
if(parse && config){
串行打印(“DS1307配置时间=”);
串行打印(时间);
系列。打印(”,日期= ");
serial.println(__日期__);
} else if (parse) {
系列。println("DS1307通信错误:-{");
Serial.println(“请检查电路”);
}否则{
系列。print("无法从编译器解析信息,时间=\"");
串行打印(时间);
串行打印(“\”,日期=\”);
并同时__DATE__);
以“\”);
}
}
无效循环(){
}
Bool GetTime(const char * str)
{
整小时,分钟,秒;
如果(sscanf (str,“% d: % d: % d”,小时,分钟,秒)! = 3)返回false;
tm。小时= 1小时;
tm。分钟=最小;
tm.second =秒;
返回true;
}
BOOL GETDATE(const char * str)
{
半个月[12];
泰铢日;
uint8_t monthIndex;
如果(sscanf(str,“%s%d%d”、月、日、年)!=3)返回false;
对于(monthIndex=0;monthIndex<12;monthIndex++){
如果(strcmp(月,月名[monthName])==0)中断;
}
if(月胎> = 12)返回false;
tm。一天=一天;
tm.month =莲属ex + 1;
tm.Year=日历年(年);
返回true;
}
//----------------------------------------------------//
上传代码后,打开串行显示器,它会说出时间。
一旦成功地完成了上面的步骤,继续下一步。
现在将下面的代码上传到Arduino。
主要计划代码:
//------------ 项目由R.GIRISH ------------//
# include < EEPROM.h >
# include < Wire.h >
#包括
#包括
# include < LiquidCrystal.h >
液晶LCD(9,8,7,6,5,4);
int i=0;
int H = 0;
int M = 0;
int S=0;
int设置_值;
Const Int Bell = 10;
const int P = A3;
常数int N=A2;
const int设置_地址=0;
Const int over_ride_off = 11;
Boolean bell_status = true;
布尔覆盖=真;
//------------------- 设置从小时钟计时1到23小时 -------------------//
// ----第一钟------ //
Const int h1 = 0;/ /小时
Const int m1 = 0;/ /分钟
//---- 2nd bell ------//
常数int h2=0;
常数int m2=0;
//----第三钟------//
Const int h3 = 0;
Const int m3 = 0;
//---- 4th bell ------//
Const int h4 = 0;
const int m4 = 0;
//----第五钟------//
Const int h5 = 0;
常数int m5=0;
//---- sixth bell ------//
常数int h6=0;
常数int m6=0;
//---- 7th bell ------//
const int h7 = 0;
常数int m7=0;
//----第八钟------//
Const int h8 = 0;
Const int m8 = 0;
//---- 9号钟------//
常数int h9=0;
常数int m9=0;
// -----第10钟 - - ----- //
const int h10 = 0;
常数int m10=0;
//----第十一钟------//
Const int h11 = 0;
Const int m11 = 0;
//---- 12th bell ------//
常数int h12=0;
Const int m12 = 0;
// ----第13钟钟------ //
常数int h13=0;
Const int m13 = 0;
//----第十四钟------//
Const Int H14 = 0;
Const int m14 = 0;
//----第十五钟------//
常数int h15=0;
const int m15 = 0;
// ----第16钟钟------ //
Const int h16 = 0;
Const int m16 = 0;
//---------------铃响长度(秒)-------//
const int lenght = 3;//片刻之间
//-------------------------- -------------------------//
无效设置()
{
LCD.BEGIN(16,2);
PinMode(P,输出);
pinMode (N、输出);
pinMode(钟、输出);
pinMode(超越行驶关闭,输入);
digitalWrite (P、高);
DigitalWrite(n,低);
digitalWrite (over_ride_off、高);
附加中断(0,超驰,上升);
attachInterrupt (1 bell_setting上升);
if (EEPROM.read(setting_address) != 1)
{
bell_setting();
}
}
无效循环()
{
TMU\t tm;
lcd.clear();
如果(实时读取(tm))
{
H = tm.Hour;
M=tm.分钟;
S=tm.秒;
液晶显示器。setCursor (0,0);
lcd.print(“:”);
lcd.print (tm.Hour);
lcd.打印(“:”);
lcd.print (tm.Minute);
lcd.打印(“:”);
lcd.打印(tm.秒);
lcd.setCursor(0,1);
lcd.print(“日期:”);
lcd.print (tm.Day);
lcd.打印(“/”);
lcd.print(tm.month);
lcd.打印(“/”);
lcd.print(tmyeartocalengar(tm.year));
}否则{
if(rtc.chippresent())
{
液晶显示器。setCursor (0,0);
lcd.打印(“RTC停止!!!”;
lcd.setCursor(0,1);
lcd.print(“Run Settime Code”);
}否则{
lcd.clear();
液晶显示器。setCursor (0,0);
lcd.print(“读错误!”);
lcd.setCursor(0,1);
lcd.print(“检查电路!”);
}
}
if (EEPROM.read(setting_address) == 1) / /设置地址
{
if(h == 0 && m == 0 && s == 0)
{
数字写入(钟形,低电平);
}
if(h == h1 && m == m1 && s == 0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
如果(H==h2&&M==m2&&S==0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
如果(H==h3&&M==m3&&S==0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
如果(H==h4&&M==m4&&S==0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
if (H == h5 && M == m5 && S == 0), colorred, linethick0;
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
if (H == h6 && M == m6 && S == 0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
if (H == h7 && M == m7 && S == 0), colorred, linethick0;
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
if (H == h8 && M == m8 && S == 0), colorred, linethick0;
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
如果(H==h9&&M==m9&&S==0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
如果(H==h10&&M==m10&&S==0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
如果(H==h11&&M==m11&&S==0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
if(h == h12 && m == m12 && s == 0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
if(h == h13 && m == m13 && s == 0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
if(h == h14 && m == m14 && s == 0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
如果(H==h15&&M==m15&&S==0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
if(h == h16 && m == m16 && s == 0)
{
对于(i=0;i
digitalWrite(贝尔,高);
延迟(1000);
}
数字写入(钟形,低电平);
我= 0;
}
}
延迟(1000);
}
空白over_ride ()
{
lcd.clear();
而(Over_ride)
{
digitalWrite(贝尔,高);
液晶显示器。setCursor (0,0);
lcd.print(“新闻退出到”);
lcd.setCursor(0,1);
液晶显示器。打印(“停止贝尔! !”);
如果(数字读取(过骑离)=低)
{
Over_ride = false;
数字写入(钟形,低电平);
}
}
over_ride = true;
}
空白bell_setting ()
{
setain_value = 0;
EEPROM写入(设置地址、设置值);
lcd.clear();
while(bell_状态)
{
液晶显示器。setCursor (0,0);
lcd.print(“贝尔被禁用”);
lcd.setCursor(0,1);
液晶显示器。打印(“按退出。”);
如果(数字读取(过骑离)=低)
{
bell_status = false;
}
}
bell_status = true;
setain_value = 1;
EEPROM写入(设置地址、设置值);
}
//------------ 项目由R.GIRISH ------------//
上传上述代码后,您应该可以在显示屏上看到以小时为单位的时间。
达到计划代码。
如何使用这个自动铃系统:
在完成硬件设置后执行此操作。
1.先上传“时间设定”代码,然后打开串口显示器。
2.在主程序中设置继电器需要触发的时间。
// ----第一钟------ //
Const int h1 = 0;/ /小时
Const int m1 = 0;/ /分钟
//---- 2nd bell ------//
常数int h2=0;
常数int m2=0;
//----第三钟------//
Const int h3 = 0;
Const int m3 = 0;
//---- 4th bell ------//
Const int h4 = 0;
const int m4 = 0;
•h1用小时表示,取值范围为1 ~ 23小时,m1用分钟表示,取值范围为0 ~ 59。
•h1至h16和m1至m16相同。
•如果您想禁用某些钟形叶值h=0和m=0,例如:h5=0和m5=0,则零将禁用该特定钟形叶。
3.在这里设置要打开和关闭时段的响铃的时间长度:
//---------------铃响长度(秒)-------//
const int lenght = 3;//片刻之间
默认情况下,值设置为3秒钟。当设定时间到达时继电器将开启3秒,然后关闭。如果需要的话可以更改。
4.将修改后的代码上传到Arduino。
5.要禁用铃声,请按“铃声禁用按钮”。要重新启用,请按“退出”按钮。
6.要手动敲打铃声按下“手动铃声开关”并停止铃声“退出”。
项目到此结束,如果您有任何关于这个项目的问题,请在评论部分自由表达。
先生,我如何在程序中设置本节假日的假期日期?我们的假期24小时休息。请给我发送代码先生…………………。。
Omkar,很抱歉,我在Arduino方面帮不了什么忙,因为文章的作者正忙于其他工作,没有空。您可以做一件事,请在以下论坛上参考此链接:
https://forum.arduino.cc/
你必须与他们签约,然后你可以从专家那里获得帮助。
hii先生……我可以使用4×4矩阵键盘取代按钮。请把那个代码连同电路图和连接发给我
你好Omkar,我不太清楚接口的细节,你可以参考Arduino。抄送论坛,问他们这是否可能。
先生,怎么连接继电器,我不知道怎么解释
我已经添加了一个新图表,钟线细节,您现在可以查看
嘿。是否有可能每天添加超过16个戒指?
根据我的说法,这是可能的,你可以在Arduino.cc论坛上参考这个问题,并轻松解决它。
非常抱歉,先生。终于成功了…耶耶…I did it I add some code to execute MP3 onto it … Thx very much, sir
太棒了,Jappar,我们很高兴它按照你的要求工作!
它能在230AC电源下工作吗?
我应该使用哪个继电器,电路的其余部分会保持不变吗?我想把这个项目用于我的大学的日常使用。请回复! !
谢谢你!
它适用于220V和120V,这取决于您使用的AC-DC适配器类型和输入电源规格。对于220V电源,您显然将使用220V至9V DC适配器,或者12V也可以工作。确保根据适配器输出使用继电器,如果是12V,则使用12V继电器,如果是9V,则使用9V继电器。记住在继电器线圈上使用1N4007二极管,图中错误地没有显示。
先生
我已经为我们学校做了这个,它工作的很好,但我们需要一些修改。星期五的时间安排与其他日子不同,所以请建议将时间安排在两个不同的顺序。
对于其他日子,时间安排应该是合理的
9-00
9-15
10-00
10-40
11-20
12-00
12-35
13-15
13-55
14-25
星期五应该是
9-00
9-15
10-00
10-40
11-20
12-00
13-00.
13-35
14-10
14-45
嗨Lakhiganj HSS,如果可能,我们会尝试联系本文的作者,并在此处更新解决方案。
(3) 先生,我在RTC示意图中看到有一个为RTC分配电源引脚到A3和A2,我可以用5v和gnd来交换它们吗?真的很抱歉打扰您-因为我已经用5v和gnd来做另一个示意图了&它可以工作了
嗨jappar,
是的,你可以用5v和gnd。
我制作了A2和A3作为RTC的电源,因为我的RTC能够简单地插入Arduino引脚,而无需任何电线。
问候
非常感谢您的宝贵时间,先生。
但我知道mssg“tmElements\t”没有在这个范围内声明-我如何解决这个问题,先生
先生,我有几个问题要问你,请帮帮我
(1) RTC连接SCL, SDA, 5v, Gnd - A5, A4, A3, A2(我觉得很奇怪,应该是A5, A4, 5v, Gnd)
(2) 我使用DS3231 RTC模块,有什么变化吗??
亲爱的SIR首先,我将电路S连接,因为根据相同的组件所示。然后我复制代码并编译它显示错误。请帮助我先生这是我的第一个项目。谢谢希望
Mr. GR会尽快回复您的评论并给出解决方案
嗨thambu,
我已经检查了代码,代码没有错。
您下载了上面提到的库文件并添加到IDE中了吗?
问候
错误消息如下所示
Arduino: 1.8.5 (Windows 7), Board:“Arduino/Genuino Uno”
C:\ Users \ Lab 1 \ Documents \ arduino \ Libraries \ Timelib \ exampleare \ Timertc \ timertc.ino:7:21:致命错误:timelib.h:没有这样的文件或目录
#包括
^
编译终止。
退出状态1
单板Arduino/Genuino Uno编译错误。
本报告将提供更多信息
“在编译期间显示详细输出”
在文件->首选项中启用选项。
嗨Thambu
下载Timlib。从给定的链接,请阅读文章。
问候
你好,
我想删除开关,只使用RTC和LCD。我将在代码中配置所需的计时。请帮助我指导我需要删除或注释的所有代码。
我不需要手动停车和紧急铃声。
请帮帮我。
嗨,丹尼斯
只需删除那些按钮和保持下拉10K电阻,因为它是,并上传相同的代码。
如果没有开关,您将错过启用/禁用铃声功能。
问候
先生,大学自动铃中的继电器类型是什么
Beran,你可以使用任何普通SPDT 12V
问题:为什么电路在提供和上传两个程序后显示“rtc停止!!!,运行设置时间代码”?这里,按钮工作正常。告诉我如何解决。
你好,贝兰多
上传第一个代码(时间设置代码)与RTC连接到Arduino。
问候
先生,在我的Arduino中,第二个程序没有被上传。请对此提供帮助
Maheswari,有时网站系统会自动修改代码,因此我在Arduino中不断出现错误,但别担心,我会很快更新它……请稍等片刻
请现在检查一下
你好先生,
我决定在大学提交这个项目。我需要知道,我如何用2个程序来模拟Proteus中的这个项目
或者我还有其他选择吗
有没有可能在proteus中模拟它,或者我必须直接制作项目
1次设置,你已经使用在这里
2主程序
Mr. GR,很快会回答你的问题。
嗨,忙于习慕兰钱德拉,
我没有仿真软件的经验,所以我无法帮助你
问候
…因为这个项目是经过测试的,所以我认为没有必要进行任何模拟,任何人都可以直接构建和使用它。
你好,先生
哪个arduino你用它?
这个arduino uno吗?
你好Ranjan,请看第二张图,它是写在Arduino板上的UNO,所以它是UNO
嗨Ranjan萨普克塔,
您可以使用任何Arduino Board。
问候
先生,请解释一下如何将16个报警存储到EEprom中。如果是常量int,它是否会自动存储。
请帮助。
你好,先生,实际上我在使用RTC DS1307,但我的时钟显示相反的时间,上午12点后显示1小时,晚上12点后显示13小时。你知道时间正在倒转,请尽快给我一个解决方案
你好,拉姆克里希纳,
我会和GR先生商量,他会尽快帮你解决的。
嗨Ramkrishna Bhattacharya
RTC上的时间纯粹取决于计算机上的时间,如果您的计算机的时间在上传时间设置程序时倒车(AM / PM),则结果将在Arduino上颠倒时间。
问候
嗨。我有一个ds1302,所以我必须改变程序或不?呢?
SCK引脚的功能是什么
我已经将所有组件连接到一个面包板....上如何查看连接是否有故障?....但当铃声和继电器的电源被切断时,继电器绝对工作正常。它根据设定的时间和转弯的相应。年代o I think current in the output circuit is affecting the input circuit of relay. What should I do now?I am using BC548 transistor,and 1N4007 diode in reverse bias across the relay coil.
按照我的说法,继电器电路应该对Arduino没有影响,但是为了使设计在技术上更完美,你可以尝试将BC548的基电阻改变到10K或22K。
要完全确保Arduino侧正好工作,您可以从设置中拆下晶体管和继电器,并用LED(阳极与电阻,阴极到地)连接基底电阻器端,现在重新检查整个过程模拟所提出的学校定时器功能......检查LED是否响应,因为继电器应该响应和开启/关闭。
如果您仍然觉得问题存在,我们将尝试联系Mr. GR。
我有5v D-1继电器屏蔽…如何使用?
怎么样使用5V继电器屏蔽?
先生,问题依然存在....我使用12v继电器....我也尝试了6v继电器,但是问题没有解决....我也连接了二极管,但问题是一样的,我使用的是1N4007二极管....先生,请帮帮我
.....我该怎么办?我必须通知你,当切断电源时,给铃和继电器供电。继电器按设定的时间开/关,但当市电向铃和继电器供电时是开的;问题见....有时当继电器打开....时LCD显示消失请尽快帮助我
阿披实,你是如何连接外部组件的,你是通过试验板还是PCB连接它们的,请确保你通过在PCB上焊接来连接这些组件。
我不确定是否必须使用继电器屏蔽,但您可以尝试。
请让我知道连接的情况,如果你已经将外部部件组装在PCB上,但仍然存在问题,那么我可能需要联系Mr. GR来解决问题。
嗨,先生
我需要一个基于运动检测的报警和照明系统电路。当检测到人的移动时,灯和警报器应该打开(距离大约6米)。30秒或1分钟后,灯和警报器应自动关闭。同样,当检测到移动时,它应该打开。我希望你已经有了一个设计。
谢谢提前
Naresh。年代
嗨,先生
你有没有一条没有阿迪诺的赛道。按照我的要求。
Naresh。年代
嗨,纳雷什,
在这个网站上有许多运动检测器电路,一些使用PIR和一些使用光电二极管,你可以轻松地选择其中的任何一个,并根据你的要求定制
先生,我是一名学生。我完成了这个项目。但有时我会遇到一个问题,当达到指定时间时,铃声会响,但不会自动停止…我需要按退出按钮来停止铃声…请尽快帮助我
Abhishek,
请从以下原始文件中复制代码,并重新编程IC,看看是否解决了问题,如果问题仍然存在,我将联系GR先生并要求他为您解决。
https://drive.google.com/file/d/1bMkxK2quwTP3I4TMUpOsZmUFfhEaCq5Z/view?usp=sharing
你好。我是学生。做这个项目要花多少钱?也请把这个项目的全部招聘信息发给我。请,我想尝尝。谢谢你!
你好santosh,零件已经在图中显示了:
有一块Arduino板。
3个10k 1/4瓦电阻器(4.7K也使用10k)
1no BC547(代替BC548)
3nos微动开关按钮
1 NO继电器12V 470欧姆/ SPDT
1没有RtC模块
如果您只是向店主向顾客展示图像,他将能够为您提供所有的材料
我不确定总成本....
海先生…。
PLS告诉4V,6V,12V铅酸电池的低电压电平。
还有3.7v的狮子电池,长官
嗨Kesav,对于12V电池,较低阈值约为10.5V至11V,因此使用此尺度可以计算其他电池的值。
例如,对于6V电池,您可以使用以下关系:
12/6 = 11 / x,其中x是未知值
请帮助我新鲜的分配器。它可以手动重新填充我
海先生……
我需要一个电路,长官
自动路灯使用LDR,BJT,预设,双向晶闸管…电路完全与交流不在直流…无继电器。负载必须由双向晶闸管激活…
请给我带连杆的电路
嗨,凯萨夫,
您可以尝试本文中的最后一个电路
https://www.homemade-circules.com/simple-led-automatic-daynight-lamp/
谢谢你,先生…。
先生告诉TRIOC BT136的电力额定值
400V, 1安培
这是最大延迟毫秒我可以在Arduino中设置。