蓝牙时钟,自定义倒计时,自定义字符串
2014-06-08 20:58
211 查看
#include <DS3231.h> #include <Wire.h> #include <U8glib.h> #include <DHT.h> #include<EEPROM.h> DHT dht; U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); extern uint8_t SmallFont[]; int q[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; extern unsigned char TinyFont[]; char zidingyi[60] = "Copyright lxm. All rights reserved."; DS3231 Clock; bool Century = false, h12 = false, PM; long ds, dd; int n = 14, y = 10, r = 1, h = 0, m = 0, s = 0; int second, minute, hour, date, month, year, temperature; float humidity, temp; char a[20]; void ReadDS3231() { second = Clock.getSecond(); minute = Clock.getMinute(); hour = Clock.getHour(h12, PM); date = Clock.getDate(); month = Clock.getMonth(Century); year = Clock.getYear(); temperature = Clock.getTemperature(); } int runnian(int i) { if ((i % 400 == 0) || ((i % 4 == 0) && (i % 100 != 0)))return 1; else return 0; } void lhy() { long s1, s2, d1 = 0, d2 = 0; ds = 0; dd = 0; s1 = hour * 3600 + minute * 60 + second; s2 = h * 3600 + m * 60 + s; ds = s2 - s1; int i, j; for (i = year + 1; i < n; i++) { if (runnian(i)) { dd += 366; } else dd += 365; } if (runnian(year))q[1] = 29; else q[1] = 28; for (j = 1; j <= month; j++) d1 += q[j - 1]; d1 += date; if (runnian(n))q[1] = 29; else q[1] = 28; for (j = 1; j <= y; j++) d2 += q[j - 1]; d2 += r; dd += (d2 - d1); ds = dd * 86400 + ds; } void u8g_prepare(void) { u8g.setFont(u8g_font_6x12); u8g.setFontRefHeightExtendedText(); u8g.setDefaultForegroundColor(); u8g.setFontPosTop(); } void shuaxin() { int wz = 0, hei = 9,l=1; lhy(); u8g_prepare(); u8g.firstPage(); do { wz = -1; u8g.drawFrame(0,0,127,19); sprintf(a, "20%02d-%02d-%02d %02d:%02d:%02d", year, month, date, hour, minute, second); u8g.drawStr( l+6, wz+1, a); wz += hei; sprintf(a, "Wendu=%dC Shidu=%d%%", (int)temp, (int) humidity); u8g.drawStr( l+6, wz, a); wz += hei; sprintf(a, "To20%02d-%02d-%02d %02d:%02d:%02d", n, y, r, h, m, s); u8g.drawStr( l, wz+1, a); wz += hei; sprintf(a, "Left:%lddays", dd); u8g.drawStr( l, wz, a); wz += hei; sprintf(a, "%ldseconds", ds); u8g.drawStr( l, wz, a); wz += hei; if (strlen(zidingyi) < 22) { u8g.drawStr( l, wz, zidingyi); wz += hei; } else { char tmp = zidingyi[21]; zidingyi[21] = 0; u8g.drawStr( l, wz, zidingyi); wz += hei; zidingyi[21] = tmp; u8g.drawStr( l, wz, zidingyi + 21); wz += hei; } } while ( u8g.nextPage() ); } int delaytime, nowtime, lasttime; char time[45], time2[45]; char rec; void setup() { if ( u8g.getMode() == U8G_MODE_R3G3B2 ) { u8g.setColorIndex(255); // white } else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) { u8g.setColorIndex(3); // max intensity } else if ( u8g.getMode() == U8G_MODE_BW ) { u8g.setColorIndex(1); // pixel on } else if ( u8g.getMode() == U8G_MODE_HICOLOR ) { u8g.setHiColorByRGB(255, 255, 255); } Wire.begin(); Serial.begin(9600); dht.setup(7); int i; if(EEPROM.read(0)!=255){ for(i=0;i<=EEPROM.read(0)&&i<45;i++) time2[i]=EEPROM.read(i+1); sscanf(time2, "20%d-%d-%d %d:%d:%d", &n, &y, &r, &h, &m, &s); } if(EEPROM.read(100)!=255){ for(i=0;i<=EEPROM.read(100)&&i<60;i++) zidingyi[i]=EEPROM.read(101+i); } } int lasttime2; void loop() { nowtime = millis(); //if(nowtime-lasttime >=1000) { ReadDS3231(); shuaxin(); lasttime=nowtime; } if (nowtime - lasttime >= delaytime) { delaytime = dht.getMinimumSamplingPeriod(); lasttime = nowtime; humidity = dht.getHumidity(); temp = dht.getTemperature(); } if(Serial.available()) { rec = Serial.read(); if ( rec == 'a') { Serial.print("a"); delay(50); Serial.readBytesUntil('a', time, 45); Serial.println(time); sscanf(time, "20%d-%d-%d %d:%d:%d", &year, &month, &date, &hour, &minute, &second); Clock.setSecond(second); Clock.setMinute(minute); Clock.setHour(hour); Clock.setDate(date); Clock.setMonth(month); Clock.setYear(year); } if (rec == 'b') { Serial.print("b"); delay(50); Serial.readBytesUntil('b', time2, 45); Serial.println(time2); int i; EEPROM.write(0,strlen(time2)); for(i=0;i<=strlen(time2)&&i<45;i++) {EEPROM.write(i+1,time2[i]);} sscanf(time2, "20%d-%d-%d %d:%d:%d", &n, &y, &r, &h, &m, &s); } if (rec == '*') { Serial.print("*"); delay(50); Serial.readBytesUntil('*', zidingyi, 60); int i; EEPROM.write(100,strlen(zidingyi)); for(i=0;i<=strlen(zidingyi)&&i<=60;i++) {EEPROM.write(101+i,zidingyi[i]);} Serial.println(zidingyi); } } delay(100); }
相关文章推荐
- 代码阅读总结之Fitch and Mather 7.0(自定义字符串缓存页)
- 让 VB 执行自定义字符串代码的 API 函数。
- C# 利用正则表达式进行忽略大小写的字符串替换的应用--自定义高亮显示
- 对字符串的“sum”——在Oracle中自定义聚集函数的例子
- C# 自定义格式字符串随笔(IFormattable,IFormatProvider,ICustomFormatter三接口的实现)
- 对字符串的“sum”——在Oracle中自定义聚集函数的例子
- [转]ASP.NET 缓存(九)--根据自定义字符串缓存页的版本
- SQL实现split函数,自定义分割字符,自定义取出第几个分割字符前的字符串
- 用Oracle自定义聚合函数实现字符串连接的聚合
- 对字符串的“sum”——在Oracle中自定义聚集函数的例子
- SQL实现split函数,自定义分割字符,自定义取出第几个分割字符前的字符串
- 解析自定义时间格式字符串
- ASP自定义函数:对字符串正则替换
- 自定义验证控件验证输入字符串长度!!
- 自定义连接字符串
- 根据自定义字符串缓存页的版本
- [收藏]在oracle里定义一个自定义字符串的聚集函数
- 自定义验证控件验证输入字符串长度!!
- C#中字符串处理的一些自定义方法
- C#中字符串处理的一些自定义方法