极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18236|回复: 9

自动动手,5110+am2321+红外+DS1307

[复制链接]
发表于 2013-8-15 10:47:53 | 显示全部楼层 |阅读模式
先上图:


以下是代码部分,多谢论坛内的高手们,我学习到了很多的东西。

[pre lang="arduino" line="1" file="LCD5110.ino"]
#include "Timer.h"            //多线程支持库
Timer t;

#include <LCD5110_CN.h>
#include "CN_1.h"
LCD5110 myGLCD(9,12,10,11,13);//CLk-SCK,Din-MOSI,DC,RST-IO,CS-CE
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];

#include "Wire.h"
byte rtc[7];
int year,month,date,hour,minitue,second,week;

#define I2C_Address_AM2321 0x5C  //AM2321温湿度计I2C地址
const unsigned char Param_AM2321_Read  = 0x03;  //读寄存器命令
const unsigned char REG_AM2321_Humidity_MSB = 0x00;     //湿度寄存器高位
const unsigned char REG_AM2321_Humidity_LSB = 0x01;     //湿度寄存器低位
const unsigned char REG_AM2321_Temperature_MSB = 0x02;  //温度寄存器高位
const unsigned char REG_AM2321_Temperature_LSB = 0x03;  //温度寄存器低位

unsigned int AM2321_Humidity = 0;  //湿度,10倍于原值
int AM2321_Temperature = 0;  //温度,10倍于原值

//long Temperature_clac = 0;
//unsigned long Humidity_clac = 0;

#include <IRremote.h>          // IRRemote函数库
const int irReceiverPin = 2;   // 红外接收器的 OUTPUT 引脚接在 PIN2 接口 定义irReceiverPin变量为PIN2接
IRrecv irrecv(irReceiverPin);  // 设置irReceiverPin定义的端口为红外信号接收端口
decode_results results;        // 定义results变量为红外结果存放位置

int pmbg = 0;

void setup()  
{
  Wire.begin();        //加入I2C总线(地址可选为主机)
  Serial.begin(9600);  // 初始化串口输出
  
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
  
  pinMode(4,OUTPUT);          //定义4口为输出状态
  
  t.every(500, shijian);      //多线程跳转-01
  t.every(1995, wenshidu);     //多线程跳转-02
  t.every(100, yaokongqi);    //多线程跳转-03
  
  irrecv.enableIRIn();   // 启动红外解码
}

void loop()
{
    t.update();
    //    delay(1000);     
}



void wenshidu()
{
     AM2321_Read();
     
     myGLCD.chinese(0,44, CN_5,12,2,0,0);//列,行,显示文字,字体大小,汉字数目
     myGLCD.printNumI(float(AM2321_Temperature)/10, 26, 32);
     myGLCD.chinese(44,44, CN_6,12,2,0,0);//列,行,显示文字,字体大小,汉字数目
     myGLCD.printNumI(float(AM2321_Humidity)/10, 70, 32);
     
}

void AM2321_Read()  //读取AM2321数据值,2次间隔2s以上,本处不做CRC检验
{
        long Temperature_clac = 0;
        unsigned long Humidity_clac = 0;

//        for(unsigned char i = 0; i < 6; i++)
//        {
                //唤醒传感器
                Wire.beginTransmission(I2C_Address_AM2321);
                delay(3);
                Wire.endTransmission();

                //发送读取温、湿度命令
                Wire.beginTransmission(I2C_Address_AM2321);
                Wire.write(Param_AM2321_Read);
                Wire.write(REG_AM2321_Humidity_MSB);
                Wire.write(4);
                Wire.endTransmission();

                //等待数据准备好
                delay(2);

                //回传数据
                Wire.requestFrom(I2C_Address_AM2321, 7);
                delayMicroseconds(30);  //等待30us
                Wire.read();
                Wire.read();
                AM2321_Humidity = (Wire.read()<<8) | Wire.read();
                AM2321_Temperature = (Wire.read()<<8) | Wire.read();
                Wire.read();
                Wire.endTransmission();

                //修正负温度
                if(AM2321_Temperature < 0) AM2321_Temperature = -(AM2321_Temperature&0x7FFF);

//                if(i > 0)  //舍弃第一次读取的数值
//                {
//                        Temperature_clac += AM2321_Temperature;
//                        Humidity_clac += AM2321_Humidity;
//                }

//                delay(2000);
//        }

//        AM2321_Temperature = Temperature_clac/5;
//        AM2321_Humidity = Humidity_clac/5;
}

//
void shijian()
{
      bcdRtc();
////////////////////////////////////////////////////////
    if(year < 100){
    myGLCD.print("20",0, 4);
    myGLCD.printNumI(year, 12, 0);
    }
    else if (year > 100){
    myGLCD.print("0000",0, 5);  
    }
    myGLCD.chinese(24,0, CN_1,12,1,0,0);//列,行,显示文字,字体大小,汉字数目
////////////////////////////////////////////////////////      

////////////////////////////////////////////////////////
   if(month > 100){
        myGLCD.print("00",36, 0);
    }
   else if(month <= 9){
        myGLCD.print("0",36, 0);
        myGLCD.printNumI(month, 42, 0);
    }
    else if (month > 9 &&  month < 100){
        myGLCD.printNumI(month, 36, 0);
    }
    myGLCD.chinese(48,0, CN_2,12,1,0,0);//列,行,显示文字,字体大小,汉字数目
////////////////////////////////////////////////////////  

////////////////////////////////////////////////////////
     if(date > 100){
        myGLCD.print("00",60, 0);
    }
    else if(date <= 9){
        myGLCD.print("0",60, 0);
        myGLCD.printNumI(date, 66, 0);
    }
    else if (date > 9 &&  month < 100){
        myGLCD.printNumI(date, 60, 0);
    }
    myGLCD.chinese(72,0, CN_3,12,1,0,0);//列,行,显示文字,字体大小,汉字数目
////////////////////////////////////////////////////////

////////////////////////////////////////////////////////  
    if(hour > 100){
        myGLCD.print("00",17, 18);
    }
    else if(hour <= 9){
        myGLCD.print("0",17, 18);
        myGLCD.printNumI(hour, 23, 18);
    }
    else if (hour > 9 &&  month < 100){
        myGLCD.printNumI(hour, 17, 18);
    }
    myGLCD.print(":",29, 18);
////////////////////////////////////////////////////////

////////////////////////////////////////////////////////
    if(minitue > 100){
        myGLCD.print("00",36, 18);
    }
    else if(minitue <= 9){
        myGLCD.print("0",36, 18);
        myGLCD.printNumI(minitue, 42, 18);
    }
    else if (minitue > 9 &&  month < 100){
        myGLCD.printNumI(minitue, 36, 18);
    }
    myGLCD.print(":",48, 18);
////////////////////////////////////////////////////////   
   
////////////////////////////////////////////////////////
    if(second > 100){
        myGLCD.print("00",54, 18);
    }
    else if(second <= 9){
        myGLCD.print("0",54, 18);
        myGLCD.printNumI(second, 60, 18);
    }
    else if (second > 9 &&  month < 100){
        myGLCD.printNumI(second, 54, 18);
    }
////////////////////////////////////////////////////////   
}

void registerSet(int deviceAddress, int registerAddress, int registerValue)  // 写寄存器
{
    Wire.beginTransmission(deviceAddress);
    Wire.write(registerAddress);
    Wire.write(registerValue);
    Wire.endTransmission();
}

void registerRead(int deviceAddress, int registerAddress) // 读寄存器
{
    int i;
    Wire.beginTransmission(deviceAddress);
    Wire.write(registerAddress);  
    Wire.endTransmission();
    Wire.requestFrom(deviceAddress,7);  
        if(Wire.available() <= 7);;
          {
           for( i = 0 ; i < 7 ; i++)  
            rtc = Wire.read();
           }
        Wire.endTransmission();  
}

void bcdRtc()
{        
        registerRead(0x68,0x00);
        year = (rtc[6]/16*10) + (rtc[6]%16);                        //并不需要进行什么换算了,寄存器中的数据就是BCD格式,十秒位,秒位会自动更新
        month = (rtc[5]/16*10) + (rtc[5]%16);
        date = (rtc[4]/16*10) + (rtc[4]%16);
        hour = (rtc[2]/16*10) + (rtc[2]%16);
        minitue = (rtc[1]/16*10) + (rtc[1]%16);
        second = (rtc[0]/16*10) + (rtc[0]%16);
        week = (rtc[3]/16*10) + (rtc[3]%16);
}

void yaokongqi()
{
  if (irrecv.decode(&results)) {   // 解码成功,把数据放入results变量中
    // 把数据输入到串口
    Serial.print("irCode: ");
    Serial.print(results.value, HEX); // 显示红外编码
    Serial.print("||");
    Serial.print(results.value); // 显示红外编码
    Serial.print(",  bits: ");
    Serial.println(results.bits); // 显示红外编码位数
    irrecv.resume();    // 继续等待接收下一组信号
  }
  
   /*====================================================================================刷新屏幕*/
if (results.value == 16736925)
  {   
    results.value = 0;
    myGLCD.clrScr();
  }
  /*===================================================================================刷新屏幕*/
  
  if (results.value == 16730805){

        registerSet(0x68,0x00,0x00);        //时钟计数器开始
        registerSet(0x68,0x07,0x93);        //初始化为24时制
        registerSet(0x68,0x00,0x00);        //设置开始为0秒
        registerSet(0x68,0x01,0x27);        //设置开始为分钟
        registerSet(0x68,0x02,0x22);        //设置开始为点
        registerSet(0x68,0x03,0x03);        //设置开始为星期
        registerSet(0x68,0x04,0x14);        //设置开始为号
        registerSet(0x68,0x05,0x08);        //设置开始为月
        registerSet(0x68,0x06,0x13);        //设置开始为年
        results.value = 0;
        myGLCD.clrScr();
}
     
     
  if (results.value == 16748655 && pmbg == 0){
      pmbg = 1;
      results.value = 0;
     }
  else if (results.value == 16748655 && pmbg == 1){
      pmbg = 0;
      results.value = 0;
     }
     
  if (pmbg == 0){
      digitalWrite(4,HIGH);
     }
  else if (pmbg == 1){
      digitalWrite(4,LOW);
     }
}[/code]

[pre lang="arduino" line="1" file="CN_1.h"]
unsigned char CN_1[]=
{
      0x90,0x88,0x84,0xF3,0x92,0x92,0xFE,0x92,
      0x92,0x93,0x92,0x82,0x00,0x00,0x00,0x00,
      0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,//"年"
};
unsigned char CN_2[]=
{
      0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,
      0x49,0xFF,0x00,0x00,0x08,0x04,0x02,0x01,
      0x00,0x00,0x04,0x08,0x08,0x07,0x00,0x00,//"月"
};
unsigned char CN_3[]=
{
      0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,
      0x22,0xFF,0x02,0x00,0x00,0x00,0x00,0x07,
      0x02,0x02,0x02,0x02,0x02,0x07,0x00,0x00,//"日"
};
unsigned char CN_4[]=
{
      0x00,0x00,0xFE,0xAA,0xAA,0xEA,0xAA,0xAA,
      0xAA,0xBF,0x82,0x00,0x0A,0x09,0x0A,0x0A,
      0x0A,0x0F,0x0A,0x0A,0x0A,0x0A,0x08,0x08,//"星"
      
      0x04,0xFF,0x54,0x54,0xFF,0x04,0x00,0xFE,
      0x92,0x92,0x92,0xFF,0x09,0x05,0x03,0x01,
      0x03,0x09,0x04,0x03,0x00,0x04,0x08,0x07,//"期"
};

unsigned char CN_5[]=
{
      0x88,0xD1,0x22,0x80,0xBF,0x95,0x95,0x95,
      0x95,0xBF,0x80,0x00,0x00,0x0F,0x08,0x0F,
      0x08,0x0F,0x08,0x08,0x0F,0x08,0x0F,0x08,//"温"

      0x00,0x00,0xFE,0x0A,0x8A,0xBE,0xAB,0xAA,
      0xBE,0x0A,0x0A,0x00,0x0C,0x02,0x09,0x08,
      0x04,0x05,0x02,0x05,0x04,0x08,0x08,0x08,//"度"
};
unsigned char CN_6[]=
{
      0x88,0xD1,0x22,0x80,0x3F,0x15,0xD5,0x15,
      0xD5,0x15,0xBF,0x40,0x00,0x0F,0x08,0x08,
      0x0B,0x08,0x0F,0x08,0x0F,0x09,0x08,0x08,//"湿",
      
      0x00,0x00,0xFE,0x0A,0x8A,0xBE,0xAB,0xAA,
      0xBE,0x0A,0x0A,0x00,0x0C,0x02,0x09,0x08,
      0x04,0x05,0x02,0x05,0x04,0x08,0x08,0x08,//"度"
};[/code]

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2013-8-15 10:51:37 | 显示全部楼层
自己的床自己躺!
回复 支持 反对

使用道具 举报

发表于 2013-8-15 13:47:42 | 显示全部楼层
支持DIY,不错啊啊!
回复 支持 反对

使用道具 举报

发表于 2013-8-15 18:44:24 | 显示全部楼层
这个是两个黑色盒子是什么东西啊?有没有电路图放上来啊?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-16 09:50:20 | 显示全部楼层
philhoo 发表于 2013-8-15 18:44
这个是两个黑色盒子是什么东西啊?有没有电路图放上来啊?

这个不是黑盒子,这个是继电器,因为我这个是个半成品,最终要实现的功能并不只是这些
回复 支持 反对

使用道具 举报

发表于 2013-8-17 10:06:33 | 显示全部楼层
写的不错,支持原创
回复 支持 反对

使用道具 举报

发表于 2013-8-17 14:29:28 | 显示全部楼层
恩恩行行
回复 支持 反对

使用道具 举报

发表于 2013-12-21 23:52:40 | 显示全部楼层
两个IIC模块怎么接到arduino的一个IIC接口上呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-9 23:44:40 | 显示全部楼层
philhoo 发表于 2013-12-21 23:52
两个IIC模块怎么接到arduino的一个IIC接口上呢?

看代码啦,!!
回复 支持 反对

使用道具 举报

发表于 2017-2-25 20:02:26 | 显示全部楼层
请问楼主,我只有一个ds1302的芯片和晶振,但是没有完整模块怎么么办
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 16:07 , Processed in 0.042514 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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