Помощь. Скетч. Вывод часов RTC на экран 128x128
- Войдите на сайт для отправки комментариев
Пт, 22/04/2016 - 15:47
Всем привет.
Помогите со скетчом. Программлю 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;
}
я не знаком с этой библиотекой, но наверянкак могу сказать что есть какаято функция для установки курсора, вот его то и нужно выставлять. сначала очищааеем поле часов потом ставим курсор потом записываем значения
перед строкой 48 поставь:
перед строкой 48 поставь:
кот обормот ))
не дал человеку в библиотеке поковыряться ))
Ааа, я не знал, что сеткурсор помимо указания координат выступает в качестве своеобразного якоря для объета. Спасибо! Буду пробовать.
Пл идее и так должно было работать, видимо библа не допилена
Всё просто и очевидно, хочешь текст, поставь курсор ))
Да, все получилось, а еще один вопрос, привел к виду
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); }И часы оновлябтся, не пишут друг на друг, но обновлне идет всего иэкарна и это сильн заметно, как это обойти, исправить?
Так ты сам и очищаешь весь экран
display.clearScreen();только наверно нужно обновлять "поле" под вывод, чтото типа feelRect (231, 12, 488, 12) должно быть
решил, это громко сказано, нашел, что ожно сделать пока что )
А поподробнее можно? Поскольку ни tft.FillRect(0, 20, 1, 1, BLACK); , display.FillRect(0, 20, 1, 1, BLACK); компилятор пропускать не хочет :(
найди функцию в библиотеке, котоорая заливает прямоугольник
Запилил
Идут, нобегают адово )) Есть мнеее богопротивные варианты? За эпиолепитиков в конторе волнуюсь )))
byte previous_sec = 0; void setup() { бла бла } void loop() { if(previous_sec !=second()) { display.fillRect(0, 20, 128, 15, 0);//это лучше внутрь DigitalClockk запихать DdigitalClockDisplay(); previous_sec = second(); //сохраняем текущее время как старое } }Ага получилось, уже очень даже не плохо. Спасибо! опробую допилить до большго смуфа.
Но зачем делать условие лишнее?
с чего это оно лишнее?
обновляется только тогда когда нужно
Спасибо!
А не в курсе как вывести месяц русским? Я так понимаю, в примере SetTime месяца задаются в списке
const char *monthName[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };Можно ли к нему как-то применить функцию utf2rus?
Я не знаю никогда не русифицировал, хотя скоро придётся
В интернете куча примеров этого
Еще бы хоть один из них нормально работал, все приходится в результатет переписывать )