Помощь. Скетч. Вывод часов RTC на экран 128x128

ardunoob
Offline
Зарегистрирован: 22.04.2016

Всем привет. 

Помогите со скетчом. Программлю 5 день, и, конечно, трудно. 

Имею http://ru.aliexpress.com/item/1PCS-1-44-128-128-SPI-TFT-LCD-Module-Replace-Nokia-5110-LCD-51/32332271521.html, часы DS1307 и плату arduino nano. Хочу вывести просто часики на экран. Проблема в том, что в том скетче который я наляпал часы обновляются построчно как при выводе в серийный порт, а хотелось бы, чтобы менялист цифры на одном месте, как это и полагается на часах. Помогите, пожалуйста.

 

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <TFT_ILI9163C.h>
#include <DS1307RTC.h>

// Color definitions
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0  
#define WHITE   0xFFFF

#define __CS 10
#define __DC 9

TFT_ILI9163C display = TFT_ILI9163C(__CS, __DC);

float p = 3.1415926;

void setup(void) {
  display.begin();
  display.cp437(true); //Поправка на 256-й символ в функции русификации

  uint16_t time = millis();
  time = millis() - time;

    Serial.begin(9600);
  while (!Serial) ; // wait until Arduino Serial Monitor opens
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  if(timeStatus()!= timeSet) 
     Serial.println("Unable to sync with the RTC");
  else
     Serial.println("RTC has set the system time"); 

//  lcdTestPattern();
//  delay(1000);

  tftPrintTest();
  delay(10000);

}

void loop() {
  if (timeStatus() == timeSet) {
    digitalClockDisplay();
  } else {
    Serial.println("The time has not been set.  Please run the Time");
    Serial.println("TimeRTCSet example, or DS1307RTC SetTime example.");
    Serial.println();
    delay(4000);
  }
  delay(1000);
}


void tftPrintTest() {
  display.clearScreen();
  display.setCursor(0,0);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println(utf8rus("Сейчас"));

}

void digitalClockDisplay(){

  // digital clock display of the time
  display.print(hour());
  printDigits(minute());
  printDigits(second());
  display.println(" ");
  display.print(day());
  display.print(" ");
  display.print(month());
  display.print(" ");
  display.print(year()); 
  display.println(); 

}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  display.print(":");
  if(digits < 10)
    display.print('0');
  display.print(digits);
}


/* Recode russian fonts from UTF-8 to Windows-1251 */

String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

 

releyshic
Offline
Зарегистрирован: 20.11.2015

 я не знаком с этой библиотекой, но наверянкак могу сказать что есть какаято функция для установки курсора, вот его то и нужно выставлять. сначала очищааеем поле часов потом ставим курсор потом записываем значения

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

перед строкой 48 поставь:

  display.setCursor(0,20);

 

releyshic
Offline
Зарегистрирован: 20.11.2015

Tomasina пишет:

перед строкой 48 поставь:

  display.setCursor(0,20);

 

кот обормот ))

не дал человеку в библиотеке поковыряться ))

ardunoob
Offline
Зарегистрирован: 22.04.2016

Ааа, я не знал, что сеткурсор помимо указания координат выступает в качестве своеобразного якоря для объета. Спасибо! Буду пробовать. 

releyshic
Offline
Зарегистрирован: 20.11.2015

Пл идее и так должно было работать, видимо библа не допилена

Всё просто и очевидно, хочешь текст, поставь курсор ))

ardunoob
Offline
Зарегистрирован: 22.04.2016

Да, все получилось,  а еще один вопрос, привел к виду

 

void loop() {

digitalClockDisplay();
delay(1000);
display.clearScreen();

}


void digitalClockDisplay(){
  // digital clock display of the time
  display.setCursor(10,20);
  display.print(hour());
  printDigits(minute());
  printDigits(second());
  display.println(" ");
  display.print(day());
  display.print(" ");
  display.print(month());
  display.print(" ");
  display.print(year()); 
  display.println(); 


}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  display.print(":");
  if(digits < 10)
    display.print('0');
  display.print(digits);
}

 

И часы оновлябтся, не пишут друг на друг, но обновлне идет всего иэкарна и это сильн заметно, как это обойти, исправить?

releyshic
Offline
Зарегистрирован: 20.11.2015

Так ты сам и очищаешь весь экран display.clearScreen();

только наверно нужно обновлять "поле" под вывод, чтото типа feelRect (231, 12, 488, 12) должно быть

ardunoob
Offline
Зарегистрирован: 22.04.2016

решил, это громко сказано, нашел, что ожно сделать пока что )

ardunoob
Offline
Зарегистрирован: 22.04.2016

А поподробнее можно? Поскольку ни tft.FillRect(0, 20, 1, 1, BLACK); , display.FillRect(0, 20, 1, 1, BLACK); компилятор пропускать не хочет :(

releyshic
Offline
Зарегистрирован: 20.11.2015

найди функцию в библиотеке, котоорая заливает прямоугольник

ardunoob
Offline
Зарегистрирован: 22.04.2016

Запилил  

 display.fillRect(0, 20, 128, 15, 0);
 delay(0.001);

Идут, нобегают адово )) Есть мнеее богопротивные варианты? За эпиолепитиков в конторе волнуюсь )))

releyshic
Offline
Зарегистрирован: 20.11.2015
byte previous_sec = 0;

void setup()
{
бла бла
}
void loop()
{
if(previous_sec !=second())
{
display.fillRect(0, 20, 128, 15, 0);//это лучше внутрь DigitalClockk запихать
DdigitalClockDisplay();
previous_sec = second(); //сохраняем текущее время как старое
}
}
	 

 

ardunoob
Offline
Зарегистрирован: 22.04.2016

Ага получилось, уже очень даже не плохо. Спасибо! опробую допилить до большго смуфа.

Но зачем делать условие лишнее? 

 

releyshic
Offline
Зарегистрирован: 20.11.2015

с чего это оно лишнее?

обновляется только тогда когда нужно

ardunoob
Offline
Зарегистрирован: 22.04.2016

Спасибо! 

А не в курсе как вывести месяц русским? Я так понимаю, в примере SetTime месяца задаются в списке 

const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

 

Можно ли к нему как-то применить функцию utf2rus?

 

 

releyshic
Offline
Зарегистрирован: 20.11.2015

Я не знаю никогда не русифицировал, хотя скоро придётся

В интернете куча примеров этого

ardunoob
Offline
Зарегистрирован: 22.04.2016

Еще бы хоть один из них нормально работал, все приходится в результатет переписывать )