|
|
时间小助手
组员:张琪 石翊蒙 江汉民
一、现状:
目前市面上有的台历或者时钟多半是手动按键调控,而且,闹钟都是按键停止,闹钟模式单一,早晨醒来,发现闹钟不在手边却一直响个不停怎么办,红外调控时间小助手就出世了。
二、实现的功能简介:
一是实现红外遥控调控设置时间,包括年月日,星期几,几点几分几秒,解决了一个按键一个按键慢慢调的现状,直接按键一步到位;
二是显示当前室内温湿度,时刻掌握环境信息;
三是实现闹钟的多种模式选择:
模式一,生活闹钟,一周七天每天都按时提醒,放置在床头的闹钟,使用推到停止功能,手一伸,即可停止;
模式二,工作闹钟,周一到周五工作日提醒,使用推到停止功能,周末无需设定,时间小助手即可给你一个安安静静的周末;
模式三,懒人闹钟,周一至周天按时提醒,但是,推到后不能停止,时间小助手会不停的提醒你,必须使用红外遥控按键才能彻底关闭闹钟;
模式四,自由模式,可设定闹钟时长,不需要按键或推到,时间到后自动停止,当然,如果你嫌声音太吵时间太长,也可以使用红外关闭闹钟,如果你认为模式三仍旧叫不醒你的大脑,模式四则可以给你方便,闹钟时长设置个十分钟,想不醒都难,如果,你只需要提醒你到某一个时间点,而并没有时间来关闭,则可以设置一分钟,一分钟后自动关闭,不扰乱你的节奏,又提醒了时间。
三、所需器材
arduino UNO
DS1302
nokia5110
温湿度传感器
倾斜开关
蜂鸣器
红外传感器
连接线若干
四、硬件连接
NOKIA5110连接图
实验过程:
五、程序原代码:
#include <stdio.h>
#include <string.h>
#include <DS1302.h>
#include <IRremote.h>
#include <dht11.h>
int mo=1,sjj;
/*****************************/定义温湿度传感器
dht11 DHT11;
#define DHT11PIN 14
/******************************************/定义红外遥控键值
int RECV_PIN = 11;
long nu1=0x00FF30CF;
long nu2=0x00FF18E7;
long nu3=0x00FF7A85;
long nu4=0x00FF10EF;
long nu5=0x00FF38C7;
long nu6=0x00FF5AA5;
long nu7=0x00FF42BD;
long nu8=0x00FF4AB5;
long nu9=0x00FF52AD;
long nu0=0x00FF6897;
long on1=0x00FFA25D;
long off1=0x00FF629D;
long on2=0x00FFE21D;
long off3=0x00FF02FD;
long on3=0x00FF22DD;
IRrecv irrecv(RECV_PIN);
decode_results results;int on = 0;
unsigned long last = millis();
int judge(long val)////判断红外键值
{
if (val == nu1 ) return(1);
if (val == nu2 ) return(2);
if (val == nu3 ) return(3);
if (val == nu4 ) return(4);
if (val == nu5 ) return(5);
if (val == nu6 ) return(6);
if (val == nu7 ) return(7);
if (val == nu8 ) return(8);
if (val == nu9 ) return(9);
if (val == nu0 ) return(0);
return(11);
}
/*******************************/ 定义时间芯片
/* 接口定义
CE(DS1302 pin5) -> Arduino D5
IO(DS1302 pin6) -> Arduino D6
SCLK(DS1302 pin7) -> Arduino D7 */
uint8_t CE_PIN = 8;
uint8_t IO_PIN = 9;
uint8_t SCLK_PIN = 10;
int moo=1;
/* 日期变量缓存 */
char buf1[20];
char buf2[20];
char buf3[20];
char day[10];
int clo[5]={0};
/* 串口数据缓存 */
String comdata = "";
int numdata[7] ={0};
/* 创建 DS1302 对象 */
DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
void read_time()//////从时间芯片读取时间,从温湿度传感器读取温湿度
{
char c0='%';
/* 从 DS1302 获取当前时间 */
Time t = rtc.time();
/* 将星期从数字转换为名称 */
memset(day, 0, sizeof(day));
switch (t.day)
{
case 1: strcpy(day, "Sun"); break;
case 2: strcpy(day, "Mon"); break;
case 3: strcpy(day, "Tue"); break;
case 4: strcpy(day, "Wed"); break;
case 5: strcpy(day, "Thu"); break;
case 6: strcpy(day, "Fri"); break;
case 7: strcpy(day, "Sat"); break;
}
int chk = DHT11.read(DHT11PIN);
/* 将日期代码格式化凑成buf等待输出 */
snprintf(buf1, sizeof(buf1), "%04d-%02d-%02d", t.yr, t.mon, t.date);
snprintf(buf2, sizeof(buf2), "%02d:%02d:%02d", t.hr, t.min, t.sec);
snprintf(buf3, sizeof(buf3), "%s %02dC %02d%c", day,DHT11.temperature,DHT11.humidity,c0);
if (t.hr==clo[0]&&t.min==clo[1]) clo[3]=1;else clo[3]=0;
sjj=t.min;
}
void settime()///红外控制设定时间
{
int i=0,k=0;
int j=0;
int bl=1;
int aa=0;
char cc[20]="";
char ab[3];
gotoXY(4,5);
LcdString("date: ");
while (bl)
{
if (irrecv.decode(&results))
{
if (millis() - last > 250)
{
on = !on;
digitalWrite(13, on ? HIGH : LOW);
}
aa=judge(results.value);
if (results.value == off1) bl=0;
if (aa>=0&&aa<=9)
{
itoa(aa,ab,10);
comdata += ab;
itoa(aa,&cc,10);
i+=1;if(i==4|| i==7){cc='-';i+=1;}
gotoXY(4,5);
LcdString(cc);
ab[0]= NULL;ab[1]=NULL;ab[2]=NULL;
}
last = millis();
irrecv.resume();
}
}
bl=1;j=i;i=0;
gotoXY(4,5);
LcdString("time: ");
for(k=0;k<20;k+=1)cc[k]=' ';
while (bl)
{
if (irrecv.decode(&results))
{
if (millis() - last > 250)
{
on = !on;
digitalWrite(13, on ? HIGH : LOW);
}
aa=judge(results.value);
if (results.value == off1) bl=0;
if (aa>=0&&aa<=9)
{
itoa(aa,ab,10);
comdata += ab;
itoa(aa,&cc,10);
i+=1;j+=1;if(i==2|| i==5){cc=':';i+=1;}
if(i==8){cc='-';i+=1;}
gotoXY(4,5);
LcdString(cc);
ab[0]= NULL;ab[1]=NULL;ab[2]=NULL;
}
last = millis();
irrecv.resume();
}
}
for(k=0;k<12;k+=1)cc[k]=' ';
gotoXY(4,5);
LcdString(" ");
j=0;
/* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
for(int i = 0; i < 15 ; i++)
{
if (i>=0&&i<=3){numdata[j] = numdata[j] * 10 + (comdata - '0');}
if (i>=4&&i<=5){numdata[j] = numdata[j] * 10 + (comdata - '0');}
if (i>=6&&i<=7){numdata[j] = numdata[j] * 10 + (comdata - '0');}
if (i>=8&&i<=9){numdata[j] = numdata[j] * 10 + (comdata - '0');}
if (i>=10&&i<=11){numdata[j] = numdata[j] * 10 + (comdata - '0');}
if (i>=12&&i<=13){numdata[j] = numdata[j] * 10 + (comdata - '0');}
if (i==14){numdata[j] = numdata[j] * 10 + (comdata - '0');}
if ((i==3)||(i==5)||(i==7)||(i==9)||(i==11)||(i==13)) j+=1;
}
/* 将转换好的numdata凑成时间格式,写入DS1302 */
Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
rtc.time(t);
/* 清空 comdata 变量,以便等待下一次输入 */
comdata = String("");
/* 清空 numdata */
for(int i = 0; i < 7 ; i++) numdata=0;
}
void setclock()////红外控制设定闹钟及模式
{
int i=0,k=0;
int j=0;
int bl=1;
int aa=0;
char cc[12]="";
gotoXY(4,5);
LcdString("clock:");
j=0;i=0;
clo[0]=0;clo[1]=0;
while (bl)
{
if (irrecv.decode(&results))
{
if (millis() - last > 250)
{
on = !on;
digitalWrite(13, on ? HIGH : LOW);
}
aa=judge(results.value);
if (results.value == off1) bl=0;
if (aa>=0&&aa<=9)
{
clo[j]=clo[j]*10+aa;
itoa(aa,&cc,10);
mo=aa;
i+=1;if(i==2||i==5){cc=':';i+=1;j+=1;}
if(i==6){cc='-';i+=1;}
gotoXY(4,5);
LcdString(cc);
}
last = millis();
irrecv.resume();
}
}
clo[4]=1;
for(k=0;k<12;k+=1)cc[k]=' ';
gotoXY(4,5);
LcdString(" ");
bl=1;
if (mo==4) {gotoXY(4,5);
LcdString("min: ");while(bl)
{
if (irrecv.decode(&results))
{
if (millis() - last > 250)
{
on = !on;
digitalWrite(13, on ? HIGH : LOW);
}
aa=judge(results.value);
if (results.value == off1) bl=0;
if (aa>=0&&aa<=9)
{
itoa(aa,&cc[0],10);
moo=aa;
gotoXY(4,5);
LcdString(cc);
}
last = millis();
irrecv.resume();
}}
}cc[0]=' ';
gotoXY(4,5);
LcdString(" ");
}
/*******************************/ 定义5110显示器
// The pins to use on the arduino
#define PIN_SCE 7
#define PIN_RESET 6
#define PIN_DC 5
#define PIN_SDIN 4
#define PIN_SCLK 3
// COnfiguration for the LCD
#define LCD_C LOW
#define LCD_D HIGH
#define LCD_CMD 0
// Size of the LCD
#define LCD_X 84
#define LCD_Y 48
int scrollPosition = -10;
static const byte ASCII[][5] =
{
{0x00, 0x00, 0x00, 0x00, 0x00} // 20
,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥
,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j
,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ←
,{0x00, 0x06, 0x09, 0x09, 0x06} // 7f →
};
void LcdCharacter(char character)
{
LcdWrite(LCD_D, 0x00);
for (int index = 0; index < 5; index++)
{
LcdWrite(LCD_D, ASCII[character - 0x20][index]);
}
LcdWrite(LCD_D, 0x00);
}
void LcdClear(void)
{
for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
{
LcdWrite(LCD_D, 0x00);
}
}
void LcdInitialise(void)
{
pinMode(PIN_SCE, OUTPUT);
pinMode(PIN_RESET, OUTPUT);
pinMode(PIN_DC, OUTPUT);
pinMode(PIN_SDIN, OUTPUT);
pinMode(PIN_SCLK, OUTPUT);
digitalWrite(PIN_RESET, LOW);
digitalWrite(PIN_RESET, HIGH);
LcdWrite(LCD_CMD, 0x21); // LCD Extended Commands.
LcdWrite(LCD_CMD, 0xBf); // Set LCD Vop (Contrast). //B1
LcdWrite(LCD_CMD, 0x04); // Set Temp coefficent. //0x04
LcdWrite(LCD_CMD, 0x14); // LCD bias mode 1:48. //0x13
LcdWrite(LCD_CMD, 0x0C); // LCD in normal mode. 0x0d for inverse
LcdWrite(LCD_C, 0x20);
LcdWrite(LCD_C, 0x0C);
}
void LcdString(char *characters)
{
while (*characters)
{
LcdCharacter(*characters++);
}
}
void LcdWrite(byte dc, byte data)
{
digitalWrite(PIN_DC, dc);
digitalWrite(PIN_SCE, LOW);
shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
digitalWrite(PIN_SCE, HIGH);
}
/**
* gotoXY routine to position cursor
* x - range: 0 to 84
* y - range: 0 to 5
*/
void gotoXY(int x, int y)
{
LcdWrite( 0, 0x80 | x); // Column.
LcdWrite( 0, 0x40 | y); // Row.
}
void drawBox(void)
{
int j;
for(j = 0; j < 84; j++) // top
{
gotoXY(j, 0);
LcdWrite(1, 0x01);
}
for(j = 0; j < 84; j++) //Bottom
{
gotoXY(j, 5);
LcdWrite(1, 0x80);
}
for(j = 0; j < 6; j++) // Right
{
gotoXY(83, j);
LcdWrite(1, 0xff);
}
for(j = 0; j < 6; j++) // Left
{
gotoXY(0, j);
LcdWrite(1, 0xff);
}
}
void Scroll(String message)
{
for (int i = scrollPosition; i < scrollPosition + 11; i++)
{
if ((i >= message.length()) || (i < 0))
{
LcdCharacter(' ');
}
else
{
LcdCharacter(message.charAt(i));
}
}
scrollPosition++;
if ((scrollPosition >= message.length()) && (scrollPosition > 0))
{
scrollPosition = -10;
}
}
void mos1()//////响铃模式一
{
digitalWrite(12,1);
delay(100);
digitalWrite(12,0);
delay(100);
digitalWrite(12,1);
delay(100);
digitalWrite(12,0);
delay(100);
digitalWrite(12,1);
delay(100);
digitalWrite(12,0);
delay(500);
}
void mos2()响铃模式二
{
Time t = rtc.time();
if (t.day>1&&t.day<7){
digitalWrite(12,1);
delay(100);
digitalWrite(12,0);
delay(100);
digitalWrite(12,1);
delay(100);
digitalWrite(12,0);
delay(100);
digitalWrite(12,1);
delay(100);
digitalWrite(12,0);
delay(500);}
}
/*******************************/
void setup(void)
{
LcdInitialise();
LcdClear();
drawBox();
Serial.begin(9600);
rtc.write_protect(false);
rtc.halt(false);
// rtc.time(ttt);
pinMode(RECV_PIN, INPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
irrecv.enableIRIn();
}
/*******************************/
void loop(void)
{
int gz,sj=0;
gz=analogRead(5);
read_time();
gotoXY(4,1);
LcdString(buf1);
gotoXY(4,2);
LcdString(buf2);
gotoXY(4,3);
LcdString(buf3);
Serial.println(gz);
if((gz<980)&&(mo==1||mo==2)) clo[3]=0;
Serial.println(clo[4]);
Serial.println(clo[3]);
Serial.println(clo[0]);
Serial.println(clo[1]);
Serial.print("mo:");
Serial.println(mo);
if (mo==4) sj=clo[1]+moo;
if (sj>=60) sj-=60;
if (mo==4&&sjj<=sj&&sjj>=clo[1])clo[3]=1;
if (clo[4]&&clo[3])
{
if (mo==1||mo==3||mo==4) mos1();
if (mo==2) mos2();
}else delay(1000);
if (irrecv.decode(&results))
{
if (millis() - last > 250)
{
on = !on;
digitalWrite(13, on ? HIGH : LOW);
}
if (results.value == on1) settime();
if (results.value == on2) setclock();
if (results.value == on3) clo[4]=1;
if (results.value == off3) clo[4]=0;
last = millis();
irrecv.resume();
}
}
连好之后就可以用遥控器控制闹钟了!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|