Помогите новичку. Мерцает изображение

dominion
Offline
Зарегистрирован: 30.05.2016

Помогите разобраться. Не пойму в чем дело. Загружаю ардуину, проходит инициализация, и отображение даты и времени начинает бешено мигать. В такт с ней мигает лампочка L на ардуино. Плата ардуино нано. Код ниже

 

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <gfxfont.h>
#include <Adafruit_ST7735.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;

#define TFT_CS     10    //CS на дисплее
#define TFT_RST    9     //RESET на дисплее
#define TFT_DC     8     //AO на дисплее
#define TFT_SCLK   13    //SCK на дисплее
#define TFT_MOSI   11    //SDA на дисплее
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

int ButPin = 2; // Подключаем кнопку к выходу 2
int flag = 0; // флаг состояния
int regim = 0; // Переключалка
long previousMillis = 0;
int val=0; //счетчик
int counter=0; //счетчик ошибок
char convert[32];
void setup()
{
  tft.initR(INITR_BLACKTAB);
  tft.setRotation(3);
  tft.setCursor(15,30);
  tft.setTextColor(ST7735_RED);
  tft.setTextSize(4);
  tft.print("CARpc");//Слава мне, любимому
  tft.setCursor(15, 80);
  tft.print("v.1.0");
  delay (3000);
 tft.fillScreen(ST7735_BLACK);
   {
    delay(300);
    Serial.begin(9600);
    rtc.begin();
   if (! rtc.isrunning()) {
    tft.setCursor(0, 0);
    tft.setTextColor(ST7735_GREEN);
    tft.setTextSize(3);
    tft.println("RTC is NOT");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(2015, 5, 29, 13, 55, 0));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}
 Serial.begin(10400);
  
  
}

#define BUFFER_SIZE 256

unsigned char startCommunication[]                 = {0x81,0x10,0xf1,0x81,0x03};                          //старт диагностического сеанса
unsigned char readDataByLocalIdentifier_RLI_ASS[]  = {0x82,0x10,0xF1,0x21,0x01,0xA5};                     //запрос диагностических данных
unsigned char readDTCByStatus[]                    = {0x84,0x10,0xF1,0x18,0x00,0x00,0x00,0x9D};           //запрос кодов ошибок
unsigned char clearDiagnosticInformation[]         = {0x83,0x10,0xf1,0x14,0x00,0x00,0x98};                //стирание ошибок
unsigned char cislo_oshibok = 0; 
unsigned char otvet_length = 0;
byte MaxSpd = 0;
byte Spd = 0;
byte To = 0;
short obr = 0;
float u = 0;
float FuelRateKm = 0;
int ysk = 0;
unsigned long start_razgon = 0;
unsigned long time_razgon = 0;

byte Spd1 = 0;
byte To1 = 0;
short obr1 = 0;
float u1 = 0;
float FuelRateKml = 0;

byte err = 0;
byte i = 0;
unsigned char buffer[BUFFER_SIZE];                                      //буфер для приема сообщений с тачки
byte bufSize = 0;
byte Sp_Fuil = 0;
byte V_Sp = 0;
byte Errors = 0;
int t = 2;
int k = 0;




void loop() {
  if(digitalRead(ButPin) == HIGH && flag == 0) 
{ 
regim ++;
flag = 1;

if(regim > 6) // Если номер режима превышает требуемого
{ // то отсчет начинается с нуля
regim = 0;
}
}
if(digitalRead(ButPin) == LOW && flag == 1)
{
flag = 0;
}


    menu();   


}
void menu(){
   if(regim == 0){

  tft.fillScreen(ST7735_BLACK);
     clockRTC();
   
           
        }
}

 void clockRTC()
{
  DateTime now = rtc.now();
  tft.setTextColor(ST7735_WHITE);
  tft.setTextSize(2);
  tft.setCursor(5, 0);
  if (now.day() < 10) tft.println ("0");
  tft.println(now.day(), DEC);
  tft.setCursor(15, 0);
  tft.println(".");
  tft.setCursor(23, 0);
  if (now.month() < 10) tft.println ("0");
  tft.setCursor(29, 0);
  tft.println(now.month(), DEC);
  tft.setCursor(33, 0);
  tft.println(".");
  tft.setCursor(39, 0);
  tft.println(now.year(), DEC);
  tft.setCursor(115, 0);
  tft.println(now.hour(), DEC);
  tft.setCursor(125, 0);
  tft.println(":");
  tft.setCursor(130, 0);
    if (now.minute() < 9) tft.println ("0");
  tft.setCursor(137, 0);
  tft.println(now.minute(), DEC);
  
  
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А зачем Вы при каждом проходе loop заново весь экран перезаписываете? Причём каждый раз стираете и снова всё выписываете?Конечно будет мигать. Менять на экране надо только то, что изменилось и тогда, когда изменилось.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А еще точнее. Неправильно спроектирована библиотека. В нормальной библиотеке все пишется в буфер памяти, а потом по методу show загружается сразу весь буфер в устройство. Много памяти, но мигание пропадает.

dominion
Offline
Зарегистрирован: 30.05.2016

ЕвгенийП пишет:

А зачем Вы при каждом проходе loop заново весь экран перезаписываете? Причём каждый раз стираете и снова всё выписываете?Конечно будет мигать. Менять на экране надо только то, что изменилось и тогда, когда изменилось.

 

Подскажите, как правильно написать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dominion пишет:

Подскажите, как правильно написать?

Так я же уже подсказал.

ЕвгенийП пишет:

Менять на экране надо только то, что изменилось и тогда, когда изменилось.

dominion
Offline
Зарегистрирован: 30.05.2016

ЕвгенийП пишет:

 

Так я же уже подсказал.

ЕвгенийП пишет:

Менять на экране надо только то, что изменилось и тогда, когда изменилось.

 

Спасибо! Дошло))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

2 вариант. Тупо перепечатывать раз в 0.5 сек. Не важно менялись переменные или нет. Вот только при перепечатывании надо только их перепечатывать. А вот значания их должны быть известны и помещены в глобальные переменные. И никаких лишних запросов и расчетов при перепечатывании.