Нужна подсказка

Тема в разделе "Arduino & Shields", создана пользователем JEKONYA, 3 ноя 2015.

  1. JEKONYA

    JEKONYA Нерд

    Доброго времени суток, есть код, выводит дату и время на тфт экранчик, проблема заключается в следующим : время переодически начинает показывать ерунду, т.е к примеру 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;}
    }}
    Ниже фото бага. и фото после сброса ардуинки
     
    Последнее редактирование: 3 ноя 2015
  2. JEKONYA

    JEKONYA Нерд

  3. ANV

    ANV Гуру

    Используйте sprintf чтобы сформировать строку из времени. В параметрах есть ключ, который "добивает" нулем старшие разряды.
     
  4. JEKONYA

    JEKONYA Нерд

    извиняюсь, а можно пример? Не нашел такого параметра в библиотеке UTFT
     
  5. ANV

    ANV Гуру

    Это не в библиотеке 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/ - сама функция
     
    Tomasina нравится это.
  6. JEKONYA

    JEKONYA Нерд

    Большое спасибо, буду разбираться.
     
  7. Максим B

    Максим B Гуру

    А что за экран???
     
  8. JEKONYA

    JEKONYA Нерд

    TFT LCD экран ультра-hd 320 X 480
    Спасибо ANV очень помог, но есть одна проблемка через некоторое время появляются артефакты в виде маленьких черных точек то там то здесь.
     
  9. JEKONYA

    JEKONYA Нерд

    Что бы не плодить темы, спрошу в своей же. может кто-нибудь подскажет, с чем может быть связанно появление артефактов на дисплее, спустя несколько часов работы появляются пиксели в разных частях экрана, после сброса все нормально опять на некоторое время...
     
  10. Mestniy

    Mestniy Гуру

    Экран замените и посмотрите сколько продержится.
     
  11. JEKONYA

    JEKONYA Нерд

    к сожалению второго такого нет
     
  12. Максим B

    Максим B Гуру

    Я подключал экран от Siemens M65 - банально резисторы перепутал местами (((( Тоже показывало, но с артефактами.
     
  13. JEKONYA

    JEKONYA Нерд

    ну тут нечего перепутать, это специально под мегу:) главное появляется 4-5 пикселей разного цвета в разных местах, пока прописал каждый час обнулять дисплей, но это не выход...
     
  14. Tomasina

    Tomasina Сушитель лампочек Модератор

    длина проводов какая? У меня такой мусор иногда возникал на ЖК 2004 при кабеле 30 см, после укорочения все излечилось.
     
  15. JEKONYA

    JEKONYA Нерд

    воткнут напрямую в мегу.
     
  16. AlexVS

    AlexVS Гик

    Трудно предположить откуда лезут артефакты, может в цепи питания нужно пару конденсаторов добавить, может разделить питание и завести на TFT 5V отдельно, отогнув у него соответствующую ногу.
    Можно попробовать залить экран черным, а показания выводить белым или лучше зеленым и понаблюдать за артефактами.
    Вот пример оформления экрана http://forum.amperka.ru/threads/Как-я-подключил-nrf24-к-mega2560.3858/#post-30645
     
  17. JEKONYA

    JEKONYA Нерд

    Так и сделал залил экран черным, текст вывел белым артефакты продолжают сыпаться, разноцветными пикселями. С конденсаторами и питанием попробую, отпишусь.
    P.S артефакты появляются не сразу, через минут 20 после резета 1 пиксель потом другой и т.д пока борюсь тем, что обнуляю дисплей каждый час.
     
  18. Максим B

    Максим B Гуру

    хм...глупо - греется? )
     
  19. JEKONYA

    JEKONYA Нерд

    нет, абсолютно холодный.