Доброго времени суток, есть код, выводит дату и время на тфт экранчик, проблема заключается в следующим : время переодически начинает показывать ерунду, т.е к примеру 22:5 должно быть, а он выводит 22:59, т.е само время не сбивается, но дабовляется девятка, как только числа доходят до двухзначных , то все ок. не смог прикрутить 0. т.е что бы было 22:00 вместо этого 22:0 соответственно вместо 03:08 3:8, не могу заставить сдвигать второе число по оси Х, а 0 ставить на место первой цыфры. Вот сам код, мб кто-нибудь глянет и подскажет, заранее спасибо! P.S dht объявлен как два объекта, косяк, знаю( Код (C++): #include "DHT.h" #include <UTFT.h> #include <Wire.h> #define DS1307_I2C_ADDRESS 0x68 #define DHTPIN 2 #define DHTPINDVA 3 #define DHTTYPE DHT22 UTFT myGLCD(CTE32HR,38,39,40,41); DHT dht(DHTPIN, DHTTYPE); DHT dhtdv(DHTPINDVA, DHTTYPE); extern uint8_t SixteenSegment[]; extern uint8_t BigFont[]; extern uint8_t SmallFont[]; unsigned long currentTime; unsigned long loopTime; ///// часы .. byte decToBcd(byte val){ return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); } void setDateDs1307(byte second, // 0-59 byte minute, // 0-59 byte hour, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/30/31 byte month, // 1-12 byte year) // 0-99 { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission(); } void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } void setup() { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; Wire.begin(); second = 0; minute = 41; hour = 22; dayOfWeek = 7; dayOfMonth = 1; month = 11; year = 15; //setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); currentTime = millis(); loopTime = currentTime; myGLCD.InitLCD(0); myGLCD.setColor(VGA_BLACK); myGLCD.clrScr(); myGLCD.fillScr(VGA_WHITE); myGLCD.setBackColor(255,255,255); myGLCD.setFont(SixteenSegment); myGLCD.setFont(BigFont); myGLCD.setFont(SmallFont); Serial.begin(9600); dht.begin(); dhtdv.begin(); } void loop() {byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; char week[8][10] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); { currentTime = millis(); // считываем время, прошедшее с момента запуска программы if(currentTime >= (loopTime + 5000)){ float h2 = dhtdv.readHumidity(); float t2 = dhtdv.readTemperature(); float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { myGLCD.setFont(SmallFont); myGLCD.print("YLICA: ", LEFT, 65); myGLCD.print("DOMA: ", 175, 65); //КООРДИНАТЫ Х У myGLCD.print("YLICA: ", LEFT, 165); myGLCD.print("DOMA: ", 175, 165); myGLCD.setFont(BigFont); myGLCD.print("TIME: ", 130, 190); myGLCD.print("DATE: ", 130, 280); myGLCD.print("VLAJNOST: ", CENTER,0); myGLCD.print(" %", 135, 65); myGLCD.print(" %", RIGHT, 65); myGLCD.setFont(SixteenSegment); myGLCD.printNumI( h, 215, 30); myGLCD.printNumI( h2, 55, 30); myGLCD.setFont(BigFont); myGLCD.print("TEMPERATURA: ", CENTER, 100); myGLCD.print(" C", 135, 165); myGLCD.print(" C", RIGHT, 165); myGLCD.setFont(SixteenSegment); myGLCD.printNumI(t, 215, 130); Serial.println(t2); myGLCD.printNumI( t2, 55, 130); //ЧАСЫ myGLCD.print(":", 155, 220); myGLCD.printNumI(hour, 90, 220); //else if //МИНУТЫ myGLCD.printNumI(minute, 180, 220); //else if //ДЕНЬ myGLCD.printNumI(dayOfMonth, 40, 320 ); //МЕСЯЦ myGLCD.printNumI(month, 120, 320 ); //ГОД myGLCD.printNumI(year, 200, 320 ); } loopTime = currentTime;} }} Ниже фото бага. и фото после сброса ардуинки
Используйте sprintf чтобы сформировать строку из времени. В параметрах есть ключ, который "добивает" нулем старшие разряды.
Это не в библиотеке glcd, а в стандартных библиотеках Си Смысл в том, чтобы сначала в памяти сформировать строку и уже ее печатать функцией myGLCD.print: Код (C++): char buffer [50]; sprintf(buffer, "%02d\n", hour); myGLCD.print(buffer, 90, 220); http://www.cplusplus.com/reference/cstdio/printf/ - тут модификаторы все http://www.cplusplus.com/reference/cstdio/sprintf/ - сама функция
TFT LCD экран ультра-hd 320 X 480 Спасибо ANV очень помог, но есть одна проблемка через некоторое время появляются артефакты в виде маленьких черных точек то там то здесь.
Что бы не плодить темы, спрошу в своей же. может кто-нибудь подскажет, с чем может быть связанно появление артефактов на дисплее, спустя несколько часов работы появляются пиксели в разных частях экрана, после сброса все нормально опять на некоторое время...
Я подключал экран от Siemens M65 - банально резисторы перепутал местами (((( Тоже показывало, но с артефактами.
ну тут нечего перепутать, это специально под мегу главное появляется 4-5 пикселей разного цвета в разных местах, пока прописал каждый час обнулять дисплей, но это не выход...
длина проводов какая? У меня такой мусор иногда возникал на ЖК 2004 при кабеле 30 см, после укорочения все излечилось.
Трудно предположить откуда лезут артефакты, может в цепи питания нужно пару конденсаторов добавить, может разделить питание и завести на TFT 5V отдельно, отогнув у него соответствующую ногу. Можно попробовать залить экран черным, а показания выводить белым или лучше зеленым и понаблюдать за артефактами. Вот пример оформления экрана http://forum.amperka.ru/threads/Как-я-подключил-nrf24-к-mega2560.3858/#post-30645
Так и сделал залил экран черным, текст вывел белым артефакты продолжают сыпаться, разноцветными пикселями. С конденсаторами и питанием попробую, отпишусь. P.S артефакты появляются не сразу, через минут 20 после резета 1 пиксель потом другой и т.д пока борюсь тем, что обнуляю дисплей каждый час.