Отрисовка часов на OLED 64х128
- Войдите на сайт для отправки комментариев
Пнд, 10/08/2015 - 19:41
Здравствуйте Товарищи!
Подскажите пожалуйста, как отрисовать корректно цифры, если hour < 10 ?
Часы
#define DS1307_I2C_ADDRESS 0x68 // Clock
byte decToBcd(byte val){ return ( (val/10*16) + (val%10) ); }
byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); }
void setDateDs1307(byte second,byte minute,byte hour) {
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.endTransmission();
}
void getDateDs1307(byte *second,byte *minute,byte *hour) {
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 3);
*second = bcdToDec(Wire.read());
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read());
}
Код отрисовки
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
myOLED.drawRoundRect(0, 0, 127, 63);
myOLED.setFont(MediumNumbers);
myOLED.print (String(hour), 10, 12);
myOLED.print ("-", 36, 12);
myOLED.print (String(minute), 50, 12);
myOLED.print ("-", 76, 12);
myOLED.print (String(second), 90, 12);
myOLED.update();
myOLED.setFont(MediumNumbers);
myOLED.print (String(dayOfMonth), 10, 38);
myOLED.print ("-", 36, 38);
myOLED.print (String(month), 50, 38);
myOLED.print ("-", 76, 38);
myOLED.print (String(year), 90, 38);
myOLED.update();
Не могу понять как привильно это сделать. Дописываю DEC HEX не проходит :(
По этому примеру не чего не выходит :(
if (HOUR < 10) Serial.print("0"); Serial.print(HOUR); Serial.print(":");
if (MIN < 10) Serial.print("0"); Serial.print(MIN); Serial.print(":");
if (SEK < 10) Serial.print("0"); Serial.println(SEK);
Вот код
char* DateTime::format(char* ret){ for(int i=0;i<strlen(ret)-1;i++){ if(ret[i] == 'h' && ret[i+1] == 'h'){ ret[i] = '0'+hh/10; ret[i+1] = '0'+hh%10; } if(ret[i] == 'm' && ret[i+1] == 'm'){ ret[i] = '0'+mm/10; ret[i+1] = '0'+mm%10; } if(ret[i] == 's' && ret[i+1] == 's'){ ret[i] = '0'+ss/10; ret[i+1] = '0'+ss%10; } if(ret[i] == 'D' && ret[i+1] == 'D'){ ret[i] = '0'+d/10; ret[i+1] = '0'+d%10; } if(ret[i] == 'M' && ret[i+1] == 'M'){ ret[i] = '0'+m/10; ret[i+1] = '0'+m%10; } if(ret[i] == 'Y'&& ret[i+3] == 'Y'){ ret[i] = '2'; ret[i+1] = '0'; ret[i+2] = '0'+yOff/10; ret[i+3] = '0'+yOff%10; }else if(ret[i] == 'Y'&& ret[i+1] == 'Y'){ ret[i] = '0'+yOff/10; ret[i+1] = '0'+yOff%10; } } return ret; }Который заменяет в строке "hh:mm:ss" буквы цифрами "17:06:01". есть у него и недостатки - строку нужно каждый раз копировать через strcpy, потому что код работает с указателями.
P.S. код писал для модификации библиотеки RTC чтобы небыло таких проблем с незначащими нулями, чтобы выводить время и дату в произвольном формате в любой строке.
О, господи! По сабжекту я подумал, что Вы аналоговые часы со стрелками рисуете :)
а вот такие часики)
#include <DS1302.h> #include <OLED_I2C.h> OLED myOLED(SDA, SCL, 8); extern uint8_t MegaNumbers[]; extern uint8_t RusFont[]; extern uint8_t SmallFont[]; DS1302 rtc(2, 3 , 4);// (RST, DAT, CLK) Time t; void setup() { myOLED.begin(); // rtc.halt(false); //// rtc.setDOW(SATURDAY); //// rtc.setTime(14, 04, 0); //// rtc.setDate(01, 8, 2015); } void loop() { myOLED.setFont(RusFont); t = rtc.getTime(); switch (t.dow) { case 1: myOLED.print("GJYTLTKMYBR", CENTER, 0); break; case 2: myOLED.print("DNJHYBR", CENTER, 0); break; case 3: myOLED.print("CHTLF", CENTER, 0); break; case 4: myOLED.print("XTNDTHU", CENTER, 0); break; case 5: myOLED.print("GZNYBWF", CENTER, 0); break; case 6: myOLED.print("CE<<JNF", CENTER, 0); break; case 7: myOLED.print("DJCRHTCTYMT", CENTER, 0); break; } String stringOne = rtc.getTimeStr(); myOLED.setFont(MegaNumbers); myOLED.print(stringOne.substring(0, 2), 4, 12); myOLED.print("/", 51, 12); myOLED.print(stringOne.substring(3, 5), 75, 12); myOLED.setFont(RusFont); switch (t.mon) { case 1: myOLED.print(String(t.date), 30, 57); myOLED.print("ZYDFHZ", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 2: myOLED.print(String(t.date), 26, 57); myOLED.print("ATDHFKZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 3: myOLED.print(String(t.date), 30, 57); myOLED.print("VFHNF", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 4: myOLED.print(String(t.date), 30, 57); myOLED.print("FGHTKZ", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 5: myOLED.print(String(t.date), 36, 57); myOLED.print("VFZ", CENTER, 57); myOLED.print(String(t.year), 82, 57); break; case 6: myOLED.print(String(t.date), 35, 57); myOLED.print("B>YZ", CENTER, 57); myOLED.print(String(t.year), 81, 57); break; case 7: myOLED.print(String(t.date), 35, 57); myOLED.print("B>KZ", CENTER, 57); myOLED.print(String(t.year), 81, 57); break; case 8: myOLED.print(String(t.date), 28, 57); myOLED.print("FDUECNF", CENTER, 57); myOLED.print(String(t.year), 90, 57); break; case 9: myOLED.print(String(t.date), 24, 57); myOLED.print("CTYNZ<HZ", CENTER, 57); myOLED.print(String(t.year), 94, 57); break; case 10: myOLED.print(String(t.date), 26, 57); myOLED.print("JRNZ<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 11: myOLED.print(String(t.date), 28, 57); myOLED.print("YJZ<HZ", CENTER, 57); myOLED.print(String(t.year), 90, 57); break; case 12: myOLED.print(String(t.date), 26, 57); myOLED.print("LTRF<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; } myOLED.update(); delay(500); myOLED.setFont(MegaNumbers); myOLED.print("-", 51, 12); myOLED.update(); delay(500); }........