极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10420|回复: 3

我的红外遥控时钟

[复制链接]
发表于 2012-11-17 17:05:35 | 显示全部楼层 |阅读模式
本帖最后由 ttyp 于 2012-11-25 10:34 编辑

这是我第一个实用的arduino成品。

使用DS1307为时钟模块,接VCC,GND,A4,A5
LCD1602为显示模块,接2,3,4,5,6,7脚
红外接收模块VS1838B,接11脚

使用红外遥控的mode按钮进入调整日期调整模式,power按钮退出,+,-按钮调整日期,play可以暂停日期,DHT11模块为可扩展模块,插上后在右下角会闪烁显示当前温度和湿度(可热插拔)

下面是代码:

  1. /*
  2. The circuit:
  3. * LCD RS pin to digital pin 7
  4. * LCD Enable pin to digital pin 6
  5. * LCD D4 pin to digital pin 5
  6. * LCD D5 pin to digital pin 4
  7. * LCD D6 pin to digital pin 3
  8. * LCD D7 pin to digital pin 2
  9. * LCD R/W pin to ground
  10. * 10K resistor:
  11. * ends to +5V and ground
  12. * DHT11 data to digital pin 11
  13. * VS1838B data to digital pin 12
  14. * DS1307 sda,sck to analog pin 4,5
  15. */

  16. // include the library code:
  17. #include <LiquidCrystal.h>
  18. #include <Wire.h>
  19. #include <DS1307A.h>
  20. #include <IRremote.h>
  21. #include <dht.h>

  22. dht DHT;

  23. int DHT11_PIN =11; //DHT11 PIN 11 连接UNO 11
  24. int RECV_PIN = 12;//定义红外接收器的引脚为12

  25. IRrecv irrecv(RECV_PIN);

  26. decode_results results;

  27. DS1307A ds = DS1307A(2000);
  28. DS1307A_RAM ram;

  29. int mode = 0;
  30. int show = 1;

  31. bool pause = false;
  32. bool blink = false;

  33. // initialize the library with the numbers of the interface pins
  34. LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

  35. void setup() {
  36.     // set up the LCD's number of columns and rows:
  37.     Serial.begin(9600);
  38.     lcd.begin(16, 2);
  39.     byte C[8] = {
  40.       B10000,
  41.       B00000,
  42.       B00111,
  43.       B01000,
  44.       B01000,
  45.       B01000,
  46.       B00111,
  47.     };   
  48.    
  49.     lcd.createChar(0, C);      
  50.     irrecv.enableIRIn(); // 初始化红外接收器
  51.     //ds.setDate(2012,11,14);
  52.     //ds.setTime(22,47,40);
  53.     //ds.setWeek(WEDNESDAY);  
  54. }

  55. void loop() {
  56.     // set the cursor to column 0, line 1
  57.     // (note: line 1 is the second row, since counting begins with 0):
  58.     Time t = ds.getTime();
  59.    
  60.     if (irrecv.decode(&results)) {
  61.         switch(results.value){
  62.             case 0xFF906F://+
  63.               change(&t,mode,1);              
  64.               break;
  65.             case 0xFFA857://-
  66.               change(&t,mode,-1);
  67.               break;
  68.             case 0xFFC23D://>>
  69.               break;
  70.             case 0xFF02FD://<<      
  71.               break;
  72.             case 0xFFA25D://power
  73.               mode = 0;
  74.               blink = false;
  75.               break;
  76.             case 0xFFE21D://silence
  77.               break;
  78.             case 0xFF629D://mode
  79.               if(mode<8)
  80.                 mode++;
  81.               else
  82.                 mode=0;
  83.               break;
  84.             case 0xFF22DD://play
  85.               pause=!pause;
  86.               ds.halt(pause);
  87.               break;
  88.             case 0xFFE01F://EQ
  89.               break;
  90.             case 0xFF6897://0
  91.               break;
  92.             case 0xFF30CF://1
  93.               break;
  94.             case 0xFF18E7://2
  95.               break;
  96.             case 0xFF7A85://3
  97.               break;
  98.             case 0xFF10EF://4
  99.              break;
  100.             case 0xFF38C7://5
  101.              break;
  102.             case 0xFF5AA5://6
  103.               break;
  104.             case 0xFF42BD://7
  105.               break;
  106.             case 0xFF4AB5://8
  107.               break;
  108.             case 0xFF52AD://9
  109.               break;
  110.             case 0xFF9867://return
  111.               break;
  112.             case 0xFFB04F://usd
  113.               break;
  114.         }      
  115.       irrecv.resume();
  116.     }   
  117.    

  118.   
  119.     lcd.setCursor(0,0);
  120.    
  121.     char D[12];
  122.     char T[9];
  123.     char W[5];
  124.    
  125.     if(mode!=0)blink=!blink;
  126.    
  127.     strcpy(D,ds.getDateString("YMD",'-'));
  128.     strcpy(T,ds.getTimeString("HMS",':'));
  129.     strcpy(W,ds.getWeekString(FORMAT_SHORT));

  130.     if(blink)
  131.     {
  132.       switch(mode)
  133.       {
  134.         case 1:
  135.           D[0] = ' ';
  136.           D[1] = ' ';     
  137.           D[2] = ' ';
  138.           D[3] = ' ';               
  139.           break;
  140.         case 2:
  141.           D[5] = ' ';
  142.           D[6] = ' ';        
  143.           break;
  144.         case 3:
  145.           D[8] = ' ';
  146.           D[9] = ' ';        
  147.           break;
  148.         case 4:
  149.           W[0] = ' ';
  150.           W[1] = ' ';
  151.           W[2] = ' ';         
  152.           break;                    
  153.         case 5:
  154.           T[0] = ' ';
  155.           T[1] = ' ';
  156.           break;
  157.         case 6:
  158.           T[3] = ' ';
  159.           T[4] = ' ';
  160.           break;
  161.         case 7:
  162.           T[6] = ' ';
  163.           T[7] = ' ';
  164.           break;                           
  165.       }      
  166.     }
  167.         
  168.     lcd.print(D);   
  169.     lcd.print("   ");
  170.     lcd.print(W);
  171.     lcd.setCursor(0, 1);        
  172.     lcd.print(T);
  173.    
  174.     lcd.setCursor(13,1);
  175.    
  176.     int chk = DHT.read11(DHT11_PIN);
  177.    
  178.     char M[5] = {0};
  179.     char N[5] = {0};

  180.    
  181.     switch (chk)
  182.     {
  183.       case DHTLIB_OK:
  184.             if(DHT.humidity>=10){
  185.               M[0] = '0' + DHT.humidity /10;
  186.             }else{
  187.               M[0] = ' ';
  188.             }            
  189.             M[1] = '0' + ((int)DHT.humidity%10);              
  190.             if(DHT.temperature>=10){
  191.               N[0] = '0' + DHT.temperature /10;
  192.             }else{
  193.               N[0] = ' ';
  194.             }            
  195.             N[1] = '0' + ((int)DHT.temperature%10);     
  196.             
  197.             M[2] = '%';
  198.             M[3] = '\0';
  199.             N[2] = '\0';
  200.    
  201.             if(show%6==3)
  202.               lcd.print(M);
  203.             else if(show%6==0){                           
  204.               lcd.print(N);   
  205.               lcd.write((uint8_t)0);
  206.             }     
  207.                
  208.             if(show++>256)show=1;              
  209.             break;
  210.       default:
  211.             lcd.print("   ");
  212.             break;
  213.     }            
  214.    

  215.    
  216.    
  217.     delay(500);
  218. }

  219. void change(Time *t,int m,int v)
  220. {
  221.   int dir = 0;
  222.   if(v>0)
  223.     dir=1;
  224.   else
  225.     dir=-1;
  226.   
  227.    if(dir==1)  
  228.      switch(m)
  229.       {
  230.         case 1:
  231.           if(t->year<2098)
  232.             t->year+=dir;
  233.           else
  234.             t->year=2000;  
  235.           break;
  236.         case 2:
  237.           if(t->month<12)
  238.             t->month+=dir;
  239.           else
  240.             t->month=1;      
  241.           break;
  242.         case 3:
  243.           if(t->date<31)
  244.             t->date+=dir;
  245.           else
  246.             t->date=1;     
  247.           break;
  248.         case 4:
  249.           if(t->week<6)
  250.             t->week+=dir;
  251.           else
  252.             t->week=0;      
  253.           break;                    
  254.         case 5:
  255.           if(t->hour<23)
  256.             t->hour+=dir;
  257.           else
  258.             t->hour=0;
  259.           break;
  260.         case 6:
  261.           if(t->minute<59)
  262.             t->minute+=dir;
  263.           else
  264.             t->minute=0;
  265.           break;
  266.         case 7:
  267.           if(t->second<59)
  268.             t->second+=dir;
  269.           else
  270.             t->second=0;
  271.           break;                           
  272.       }
  273.     else
  274.      switch(m)
  275.       {
  276.         case 1:
  277.           if(t->year>2000)
  278.             t->year+=dir;
  279.           else
  280.             t->year=2099;  
  281.           break;
  282.         case 2:
  283.           if(t->month>1)
  284.             t->month+=dir;
  285.           else
  286.             t->month=12;      
  287.           break;
  288.         case 3:
  289.           if(t->date>1)
  290.             t->date+=dir;
  291.           else
  292.             t->date=31;     
  293.           break;
  294.         case 4:
  295.           if(t->week>0)
  296.             t->week+=dir;
  297.           else
  298.             t->week=6;      
  299.           break;                    
  300.         case 5:
  301.           if(t->hour>0)
  302.             t->hour+=dir;
  303.           else
  304.             t->hour=23;
  305.           break;
  306.         case 6:
  307.           if(t->minute>0)
  308.             t->minute+=dir;
  309.           else
  310.             t->minute=59;
  311.           break;
  312.         case 7:
  313.           if(t->second>0)
  314.             t->second+=dir;
  315.           else
  316.             t->second=59;
  317.           break;                           
  318.       }     
  319.       
  320.       if(m>=1&&m<=3)
  321.         ds.setDate(t->year,t->month,t->date);
  322.       else if(m==4)
  323.         ds.setWeek(t->week);
  324.       else if(m>=5&&m<=7)
  325.         ds.setTime(t->hour,t->minute,t->second);      
  326. }
复制代码


这是效果:



下面是用到的库:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-11-18 12:21:32 | 显示全部楼层
{:soso_e154:}求重新更新下附件。。前两天给论坛打安全补丁。。。没有修复附件上传部分。。结果文件没传到服务器上@@
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-18 14:10:28 | 显示全部楼层
已经更新,可以下载了
回复 支持 反对

使用道具 举报

发表于 2012-11-18 14:21:57 | 显示全部楼层
程序好长。。。。。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-5 05:42 , Processed in 0.042466 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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