极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14202|回复: 1

Arduino时间小助手

[复制链接]
发表于 2016-1-12 18:21:01 | 显示全部楼层 |阅读模式
时间小助手
组员:张琪  石翊蒙  江汉民  
一、现状:
    目前市面上有的台历或者时钟多半是手动按键调控,而且,闹钟都是按键停止,闹钟模式单一,早晨醒来,发现闹钟不在手边却一直响个不停怎么办,红外调控时间小助手就出世了。

二、实现的功能简介:
    一是实现红外遥控调控设置时间,包括年月日,星期几,几点几分几秒,解决了一个按键一个按键慢慢调的现状,直接按键一步到位;
    二是显示当前室内温湿度,时刻掌握环境信息;
    三是实现闹钟的多种模式选择:
模式一,生活闹钟,一周七天每天都按时提醒,放置在床头的闹钟,使用推到停止功能,手一伸,即可停止;
模式二,工作闹钟,周一到周五工作日提醒,使用推到停止功能,周末无需设定,时间小助手即可给你一个安安静静的周末;
模式三,懒人闹钟,周一至周天按时提醒,但是,推到后不能停止,时间小助手会不停的提醒你,必须使用红外遥控按键才能彻底关闭闹钟;
模式四,自由模式,可设定闹钟时长,不需要按键或推到,时间到后自动停止,当然,如果你嫌声音太吵时间太长,也可以使用红外关闭闹钟,如果你认为模式三仍旧叫不醒你的大脑,模式四则可以给你方便,闹钟时长设置个十分钟,想不醒都难,如果,你只需要提醒你到某一个时间点,而并没有时间来关闭,则可以设置一分钟,一分钟后自动关闭,不扰乱你的节奏,又提醒了时间。


            

三、所需器材
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 &yen;
,{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
回复

使用道具 举报

发表于 2016-1-15 11:06:42 | 显示全部楼层
好厉害                                                   
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 05:01 , Processed in 0.040248 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表