用Arudino打造多功能电子闹钟

分享到:

 前段时间入手了一块 LCD12864中文屏幕,带中文字库,有驱动库可以直接驱动;还有一个时钟模块,型号是最常见的DS1302,突发奇想,就做个电子闹钟玩玩吧,又想只做个闹钟有点单调了,既然手头有温湿度传感器,型号是DHT11,那就再加个室内温度和湿度检测吧,说干就干。

 
为了充分体现DIY精神,打算不用Arduino uno板子了,用手头的Atmega8芯片自制Arduino最小系统。
 
原件列表如下:
 
最小系统:
 
Atmega8 28脚直插芯片 × 1
16M晶振 × 1
22pF 电容 × 2
洞洞板、排针、按钮、电容、电阻等若干
LCD12864 中文字幕屏 × 1
DS1302 时钟模块 × 1
DHT11 温湿度传感器 × 1
七彩发光二极管 × 1
有源蜂鸣器 × 1
杜邦线、按钮、电阻等若干
设计并焊接最小系统板
 
首先根据Atmega8接线图,使用洞洞板布局最小系统,使用电烙铁进行焊接。
 
Atmega8 接线图
Atmgea8 最小系统实物图
 
给最小系统烧入Bootload 引导程序
 
我用UsbTinyISP给最小系统烧录引导程序,详细烧录的方法就不在这里介绍了。到这里,最小系统也就是电子闹钟的核心就完成了。
 
焊接操作键盘
 
用四个操作按钮,采用外部上拉,接4个1k电阻。
 
组装硬件
 
先翻出我的DIY材料————塑料条,安装一个简单的电子闹钟架子,然后在正面顶部安装显示屏,左侧安装了蜂鸣器和七彩发光二极管,右侧安装了焊接好的键盘按钮,在背面安装了最小系统板、时钟模块和温湿度传感器,用杜邦线把它们连起来,接线如下。
 
温湿度传感器 接 Arduino A0
时钟模块 CE 接 Arduino D5
时钟模块 IO 接 Arduino D6
时钟模块 SCLK 接 Arduino D7
中文屏幕 Clock 接 Arduino D10
中文屏幕 Data 接 Arduino D11
中文屏幕 Latch 接 Arduino D12
中文屏幕背光灯 接 Arduino D9
键盘确定按钮 接 Arduino A1
键盘向下按钮 接 Arduino A2
键盘向上按钮 接 Arduino A3
键盘菜单按钮 接 Arduino A4
七彩发光二极管 接 D13
有源蜂鸣器 接 D3
由于制作过程中没有拍照,就不上单独的图片了,贴上整图。
硬件都弄完了,就该软件了(设计并编写程序)
 
设计功能操作流程
 
要实现的功能是:
 
上电,电子闹钟启动工作,正常显示当前年月日、星期、时间,在下面显示当前室内温度和湿度;
 
10秒钟无任何操作,进入省电模式,屏幕自动降低亮度,并且长期运行过程中,为了保护屏幕,设计了个屏保程序,随机生成位置坐标,轮询显示时间和温湿度;
 
按任意键唤醒睡眠,进入正常模式;
 
按钮从上到下依次为 菜单(返回)键、向上(左)键、向下(右)键、确认键。
按下菜单键,出现一级菜单,显示设置日期、设置时间和设置闹钟功能,按上下光标键,选择要设置的项,按确认键进入设置;
 
移动光标,选择日期设置,按确认键进入日期设置二级菜单,反复按确认键,光标会循环在要设置的年、月、日和星期下面显示,按上下键,相应的数字会循环显示,设置正确后,按确认键完成设置,按菜单(返回)键回到上层菜单;
 
移动光标,选择时间设置,按确认键进入时间设置二级菜单,反复按确认键,光标会循环在要设置的时、分下面显示,按上下键,相应的数字会循环显示,设置正确后,按确认键完成设置,按菜单(返回)键回到上层菜单;
 
移动光标,选择闹铃设置,按确认键进入闹铃设置二级菜单,反复按确认键,光标会循环在要设置的 显示开启/关闭闹铃,闹铃时、分下面显示,按上下键,相应选择项会循环显示,如果选择关闭闹铃,点确认,退出菜单后,屏幕右上角的小圆圈(代表闹铃)就会消失,再次设置闹铃开启,就会显示小圆圈。设置好时间后,退出菜单,等到了设定的闹铃时间,蜂鸣器就会发出滴滴滴的声音,七彩发光二极管也会点亮显示,非常漂亮。
编写程序
 
功能设计完了,开始写程序了,具体的程序调试过程就不在这里写了,直接分享程序代码:
 
制作插曲
 
由于设计的功能较多,程序体积超过了 Atmega8芯片容量(7168字节),无法继续编写,只好先简化程序功能,完成第一版程序。
程序如下
 
附程序代码: 
#include <dht11.h> 
#define DHT11PIN A0 
dht11 DHT11; 
#include <DS1302.h> 
//接口定义 
//CE(DS1302 pin5) -> Arduino D5 
//IO(DS1302 pin6) -> Arduino D6 
//SCLK(DS1302 pin7) -> Arduino D7 
DS1302 rtc(5, 6, 7); 
Time otime; 
#include “LCD12864RSPI.h” 
//latchPin = 12; 
//clockPin = 10; 
//dataPin = 11; 
#define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
// A1/15 确定按钮; A2/16 下移按钮; A3/17 上移按钮; A4/18 返回按钮; 
int clockPin=13; //闹铃 
int bledPin=9; //背光灯
// ⊙℃%: 
unsigned char str2[][2]={ 
0×20,0×20,0xA1,0xD1,0xa1,0xe6,0xa3,0xa5,0xA3,0xBA}; 
// 周一周二周三周四周五周六周日设置日期时间闹铃开启关闭 
unsigned char str4[][4]={ 
0×20,0×20,0×20,0×20,0xD6,0xDC,0xD2,0xBB,0xD6,0xDC,0xB6,0xFE,
0xD6,0xDC,0xC8,0xFD,0xD6,0xDC,0xCB,0xC4,0xD6,0xDC,0xCE,0xE5,
0xD6,0xDC,0xC1,0xF9,0xD6,0xDC,0xC8,0xD5,0xC9,0xE8,0xD6,0xC3,
0xC8,0xD5,0xC6,0xDA,0xCA,0xB1,0xBC,0xE4,0xC4,0xD6,0xC1,0xE5,
0xBF,0xAA,0xC6,0xF4,0xB9,0xD8,0xB1,0xD5};
int mode=1;//0 睡眠; 1 正常; 2 设置; 
int sx=0; //0 主菜单 1 日期 2 时间 3 闹铃 
int Isclock=1; //闹铃是否开启 
int light=10; //背光亮度
void setup() 
Serial.begin(9600); 
rtc.write_protect(false); 
rtc.halt(false); 
LCDA.Initialise(); 
delay(100); 
LCDA.CLEAR(); 
for(int i=15;i<19;i++) { 
pinMode(i,INPUT); 
pinMode(bledPin,OUTPUT); 
digitalWrite(bledPin,HIGH); 
digitalWrite(clockPin,LOW); 
// Time t(2012,12,8,13,53,0,6); 
// rtc.time(t); 
delay(1000); 
}
void loop() 
switch(mode) 
case 0: 
s_ls(); 
break; 
case 2: 
break; 
default : 
s_nr(); 
break; 
void s_nr() 
LCDA.CLEAR(); 
delay(10); 
digitalWrite(bledPin,HIGH); 
int js=0; 
while(1) 
// c_clock(); 
s_fdate(); 
delay(300); 
js++; 
if(js>50) 
mode=0; 
break; 
void s_ls() 
analogWrite(bledPin,light); 
int tr=0,tc=0; 
while(1) 
//if(c_clock()>0){ 
// mode=1; 
// break; 
// } 
if( c_btn()>0){ 
mode=1; 
break; 
LCDA.CLEAR(); 
delay(10); 
tr= (int)random(4); 
tc=(int)random(5); 
s_time(tr,tc); 
delay(5000); 
int c_btn() 
int r=0; 
for(int i=15;i<19;i++) { 
if(digitalRead(i)==HIGH){ 
delay(10); 
if(digitalRead(i)==HIGH) 
r=i-14; 
break; 
return r; 
//int c_clock() 
//{ 
// return 0; 
//} 
void s_fdate() 
LCDA.DisplayString(0,0,(unsigned char *)str2[Isclock],sizeof(str2[Isclock])); 
char tca1[18]; 
otime = rtc.time(); 
snprintf(tca1, sizeof(tca1), “%04d-%02d-%02d %s”,otime.yr, otime.mon,otime.date,str4[otime.day]); 
LCDA.DisplayString(1,0,(unsigned char *)tca1,sizeof(tca1)); 
char tca2[9]; 
snprintf(tca2, sizeof(tca2), “%02d:%02d:%02d”,otime.hr, otime.min,otime.sec); 
LCDA.DisplayString(2,2,(unsigned char *)tca2,sizeof(tca2)); 
s_wsd(3,1); 
void s_time(int r,int c) 
char tca2[6]; 
otime = rtc.time(); 
snprintf(tca2, sizeof(tca2), “%02d:%02d”,otime.hr, otime.min); 
LCDA.DisplayString(r,c,(unsigned char *)tca2,sizeof(tca2)); 
void s_wsd(int r,int c) 
char tws[11]; 
DHT11.read(DHT11PIN); 
snprintf(tws, sizeof(tws), “%2d%.2s %2d%.2s”,(DHT11.temperature-2),str2[2],DHT11.humidity,str2[3]); 
LCDA.DisplayString(r,c,(unsigned char *)tws,sizeof(tws)); 
}
随后,换开发用的 Arduino UNO板子,继续写功能模块。好了,终于都写完了,实现了日期、时间、温度、湿度显示,睡眠模式,日期时间设置,闹铃开启关闭,闹铃时间设置功能。 
 
缺点
 
设计睡眠功能,主要是为了防止长期单点显示对屏幕造成伤害,另外减弱背光也是想省电,但省电结果不是很理想,还是比较费电的。
 
 
继续阅读
基于ATmega8 单片机的工频电压/频率仪设计

基于ATmega8单片机工频电压/频率仪硬件电路简单、性能稳定可靠、经济适用,能满足一般的测量精度要求。

满足您创新创意的需要,亲手打造属于你的Arduino

Arduino,满足您创新创意的需要!Arduino 是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。它适用于艺术家、设计师、爱好

用Arudino打造多功能电子闹钟

前段时间入手了一块 LCD12864中文屏幕,带中文字库,有驱动库可以直接驱动;还有一个时钟模块,型号是最常见的DS1302,突发奇想,就做个电子闹钟玩玩吧,又想只做个闹钟有点单调了,既然手头有温湿

基于AVR单片机的LED显示屏的灰度设计与实现

LED点阵块具有亮度高、发光均匀、可靠性好、拼装方便等优点,能构成各种尺寸的显示屏。目前,LED显示屏已被广泛应用于文字显示并取得了很好的效果,但是大部分仅能显示滚动的文字信息而不能显示图像,并且还

基于ATMEGA8的LED彩灯控制器设计

如果你想改变LED接的管脚,请修改hardware.h文件。如果想修改LED的亮度,请修改globals.h 中的Timings 段定义。本设计外接了两个按钮,一个是选择工作模式,另一个是电源的开关。当你按下模式按钮1.5秒以上时,进入自动模式,会自动演示所有的预设模式。

©2019 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss