Arduino+DS1302+OLED I2C 128x64

myxaz
Offline
Зарегистрирован: 23.05.2015
Доброго времени суток.
 
В наличии Arduino Nano, DS1302 и OLED I2C 128x64.
 
Собрал, всё работает, но есть проблемы с выводом минут и секунд. Когда значение меньше 10, т.е. одна цифра, перед ней отсутствует "0". В связи с этим "часики" смотрятся негармонично.
 
Гугл читал, ничего не нашёл. Прошу совета, по правке программного кода.
 
Скрины и код прилагаю.
 
 
 
#include <OLED_I2C.h>

OLED  myOLED(SDA, SCL, 8);

#include <DS1302.h>
DS1302 rtc(5, 6, 7); // Инициализация библиотеки с указанием пинов 5-rst, 6-dat, 7-clk.

extern uint8_t TinyFont[]; 
extern uint8_t SmallFont[]; 
extern uint8_t BigNumbers[];
extern uint8_t MediumNumbers[];
extern uint8_t MegaNumbers[];

Time t; // Инициализация структуры 


void setup()
{
  myOLED.begin();
  
  
  
  rtc.halt(false); // Установка режимов 
  rtc.writeProtect(false); // работы часов
  // Следующих три строки нужно закомментировать после 
  // установки времени и загрузить скетч в плату повторно 
  rtc.setDOW(MONDAY);        // Установка дня недели
  rtc.setTime(12, 59, 58);  // Установка времени 12:59:58
  rtc.setDate(12, 03, 2016);   // Установка даты 12 марта 2016
}

void loop()
{
  t = rtc.getTime(); // Получение времени и его запись в структуру t
  myOLED.setFont(BigNumbers); // Установка набора символов
  myOLED.clrScr(); // Очистка экрана
 
  myOLED.printNumI(int(t.hour), 7, 0); // Вывод часов
  myOLED.print("-", 35, 0);
  
  myOLED.printNumI(int(t.min), 49, 0); // Вывод минут
  myOLED.print("-", 78, 0);

  myOLED.printNumI(int(t.sec), 92, 0); // Вывод секунд
  
  myOLED.setFont(SmallFont); // Установка набора символов
  myOLED.print(rtc.getDOWStr(), CENTER, 25); // Вывод дня недели
  myOLED.setFont(MediumNumbers);
  myOLED.print(rtc.getDateStr(), CENTER, 33); // Вывод даты
  myOLED.setFont(TinyFont); // Установка набора символов
  myOLED.print("Mini Text", CENTER, 52);
  myOLED.update(); // Вывод вместимого буфера на дисплей
  delay (930); // Задержка 930 мс
}

 

 
 
 
 
 
 
 
T.Rook
Offline
Зарегистрирован: 05.03.2016

Ну наверное проще всего что-то вроде этого:

  // Вывод минут
  If (int(t.min) < 10) then {
    //тут вывод с нулем
  }
  else (
      myOLED.printNumI(int(t.min), 49, 0); // Вывод минут
  }

Можно посмотреть в сторону substring("0"+t.min)...

Ну а правильное решение - почитать документацию к OLED_I2C, функция printNumI параметр filler

крик отчаяния: блиииииин! ну когда уже моя УНО приедет чтобы тоже мог что нить выводить.... :((((

 

mixan
Offline
Зарегистрирован: 03.09.2015

У меня написано так:

  // Выводм Часы с добавлением ноля если значение меньше 10
  if (now.hour() < 10) {
    lcd_print_char(0, 0, '0');
    lcd_print_int(0, 1, now.hour());
  } else {
    lcd_print_int(0, 0, now.hour());
  }

 

T.Rook
Offline
Зарегистрирован: 05.03.2016

Повторяю БОЛЬШИМ ПЛАКАТОМ:

Ну а правильное решение - почитать документацию к OLED_I2C, функция printNumI параметр filler.

RTFM!

Logik
Offline
Зарегистрирован: 05.08.2014

Противная проблемка. Коректное решение действительно форматированый вывод. Но можно проще. Прибавляете к секундам 100, и выводите на позицию в строку, где должен быть "-", после вывода - заменяете эту лишнюю "1"  на "-". Такой вот легкий хак))). Минуты также. 

T.Rook
Offline
Зарегистрирован: 05.03.2016

Logik пишет:

Противная проблемка. Коректное решение действительно форматированый вывод. Но можно проще. Прибавляете к секундам 100, и выводите на позицию в строку, где должен быть "-", после вывода - заменяете эту лишнюю "1"  на "-". Такой вот легкий хак))). Минуты также. 

В данном случае никакой проблемы нет - всё уже написано в библиотеке. Просто нужно понять, что программирование это постоянная учеба и чтение доков.

Logik
Offline
Зарегистрирован: 05.08.2014

А Вы сами в эти библиотеки заглядывали?! Или свято верите что их надо учить как святое письмо? Конкретно в  этот выпердок кривомозгого дигинерата OLED_I2C? Качество библиотек ардуиновских удручающее. Ладно, заглянем на эту функцию, хотя мне до сих пор эта либка памятна своим незабвенным uint8_t scrbuf[1024]; для процессора с 2КБ памяти, также впечетлен передачей всего scrbuf для перересовки одного пикселя. И это по I2C!!!

void OLED::printNumI(long num, int x, int y, int length, char filler)
{
	char buf[25];
	char st[27];

Помоему достаточно.

А в принципе, что касается библиотек gcc, Вы правы, их надо знать. А вот на то что не входит в состав gcc, нужно смотреть очень аккуратно, на сторонние либы к устройствам вообще расчитывать не стоит, из нескольких десятков попавших мнетолько одну вспомню с уважением, на гироскоп 6050. Остальное дерьмо. А голова - не мусорный бак, чтоб в неё такое класть. 

T.Rook
Offline
Зарегистрирован: 05.03.2016

Logik пишет:

А Вы сами в эти библиотеки заглядывали?! Или свято верите что их надо учить как святое письмо?

Ваш подход прекрасен! Отвечая на Ваш вопрос: Я свято верю что перед заданием вопроса надо попытаться самому на него ответить. И прежде всего, хотя бы,  почитать доки на используемые функции. Что и пытался донести до ТС.

(Остальное потер, потому как не место тут препираться об уровне библов вообщем и этой конкретной. Да и согласен я с Вами :)  )

T.Rook
Offline
Зарегистрирован: 05.03.2016

myxaz попробуйте так

myOLED.printNumI(int(t.min), 49, 0,     2, "0");

 

myxaz
Offline
Зарегистрирован: 23.05.2015

T.Rook пишет:

myxaz попробуйте так

myOLED.printNumI(int(t.min), 49, 0,     2, "0");

 

Не выходит. 

Выдаёт следующее - invalid conversion from 'const char*' to 'char' [-fpermissive]

myxaz
Offline
Зарегистрирован: 23.05.2015

"if then " - зароботало, большое спасибо!