Отрисовка часов на OLED 64х128

Marlen S
Offline
Зарегистрирован: 13.01.2015

Здравствуйте Товарищи! 

Подскажите пожалуйста, как отрисовать корректно цифры, если 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);

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Вот код

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 чтобы небыло таких проблем с незначащими нулями, чтобы выводить время и дату в произвольном формате в любой строке.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

О, господи! По сабжекту я подумал, что Вы аналоговые часы со стрелками рисуете :)

zugni
Offline
Зарегистрирован: 14.06.2015

а вот такие часики) 

#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);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

zugni пишет:
myOLED.print("ZYDFHZ", CENTER, 57);

myOLED.print("B>YZ", CENTER, 57);

........

Вроде ж неприличные слова публиковать запретили! И куда роспотребнадзор смотрит?! :)