|
先上图:
以下是代码部分,多谢论坛内的高手们,我学习到了很多的东西。
[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
|