|
|
今日学着用LCD12864显示时间和温度,通过串口监视器校时,设置的初始时间和电脑系统时间一致,经过半小时运行后发现,时间快了2分钟,很是不准,由于DS1302是淘宝上买的模块,供电是通过pinMode(vccPin,OUTPUT);digitalWrite(vccPin,HIGH);实现,会不会是此处电压影响?还是晶振不好水货?另外发现时钟模块上没有并联电容?哪位知道怎样才能让时间更准确点?
附上实验源码:
//#include <stdio.h>
//#include <string.h>
#include <DS1302.h>
#include "U8glib.h"
// Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
#include <OneWire.h>
#include <DallasTemperature.h>
U8GLIB_ST7920_128X64_4X u8g(9, 8, 7); // SPI Com: SCK = en = 9, MOSI = rw = 8, CS = di = 7
uint8_t RST_PIN = 5;
uint8_t IO_PIN = 6;
uint8_t SCLK_PIN = 4;
int vccPin = 3;
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int vcc_tPin = 11; //用作18B20温度模块供电+
int gndPin = 10; //用作18B20温度模块供电-
/* 日期变量缓存 */
char buf[50];
char day[10];
/* 串口数据缓存 */
String comdata ="";
int numdata[7] ={0},j=0,mark =0 ;
/* 创建 DS1302 对象 */
DS1302 rtc(RST_PIN,IO_PIN,SCLK_PIN);
void print_time(){
/* 从 DS1302 获取当前时间 */
Time t = rtc.time();
/* 将星期从数字转换为名称 */
memset(day,0,sizeof(day));
switch (t.day)
{
case 1: strcpy(day,"Sumday");break;
case 2: strcpy(day,"Monday");break;
case 3: strcpy(day,"Tuesday");break;
case 4: strcpy(day,"");break;
case 5: strcpy(day,"Wednesday");break;
case 6: strcpy(day,"Friday");break;
case 7: strcpy(day,"Saturday");break;
}
/* 将日期代码格式化凑成buf等待输出 */
snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
/* 输出日期到串口 */
Serial.println(buf);
/* 输出当前时间到LCD12864 */
u8g.setPrintPos(1, 35);
u8g.setFont(u8g_font_cu12);
u8g.print(t.yr);
u8g.print("-");
u8g.print(t.mon);
u8g.print("-");
u8g.print(t.date);
u8g.print(" ");
u8g.print(t.hr);
u8g_printDigits(t.min);
u8g_printDigits(t.sec);
u8g.setPrintPos(2, 55);
u8g.print(day);
/* 输出当前温度到LCD12864 */
printTemperatures();
}
void u8g_printDigits(int digits){
u8g.print(":");
if(digits<10)
u8g.print('0');
u8g.print(digits);
}
void printTemperatures(){
u8g.setPrintPos(75, 55);
// u8g.setFont(u8g_font_fur17);
sensors.setWaitForConversion(false); // makes it async
sensors.requestTemperatures();
sensors.setWaitForConversion(true);
u8g.print(sensors.getTempCByIndex(0));
u8g.print("C");
}
void draw(void) {
// graphic commands to redraw the complete screen should be placed here
//Font Overview ,please see http://code.google.com/p/u8glib/wiki/fontgroup
// u8g.setFont(u8g_font_unifont);
// u8g.setFont(u8g_font_osb21);
//u8g.setFont(u8g_font_tpss);
u8g.setFont(u8g_font_baby);
u8g.drawStr( 0, 12, "http://hi.baidu.com/mizuda/");
print_time();
}
void setup(){
Serial.begin(9600);
rtc.write_protect(false);
rtc.halt(false);
sensors.begin();
pinMode(vccPin,OUTPUT);
digitalWrite(vccPin,HIGH);
pinMode(vcc_tPin,OUTPUT);
digitalWrite(vcc_tPin,HIGH);
pinMode(gndPin,OUTPUT);
digitalWrite(gndPin,LOW);
}
void loop(){
//picture loop
u8g.firstPage();
do{
draw();
}while(u8g.nextPage());
//set current datetime
/* 当串口有数据的时候,将数据拼接到变量comdata */
while(Serial.available()>0)
{
comdata += char(Serial.read());
delay(2);
mark = 1;
}
/* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
if(mark ==1){
Serial.print("You inputed : ");
Serial.println(comdata);
for(int i=0;i<comdata.length();i++){
if(comdata==',' || comdata == 0x10 || comdata == 0x13){
j++;
}
else
{
numdata[j] = numdata[j]*10 + (comdata - '0');
}
}
/* 将转换好的numdata凑成时间格式,写入DS1302 */
Time t(numdata[0],numdata[1],numdata[2],numdata[3],numdata[4], numdata[5], numdata[6]);
rtc.time(t);
mark = 0;j= 0;
/* 清空 comdata 变量,以便等待下一次输入 */
comdata = String("");
/* 清空 numdata */
for(int i=0;i<7;i++)
numdata=0;
}
delay(800);
} |
|