Помогите новичку. Мерцает изображение
- Войдите на сайт для отправки комментариев
Чт, 22/06/2017 - 21:52
Помогите разобраться. Не пойму в чем дело. Загружаю ардуину, проходит инициализация, и отображение даты и времени начинает бешено мигать. В такт с ней мигает лампочка 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);
}
А зачем Вы при каждом проходе loop заново весь экран перезаписываете? Причём каждый раз стираете и снова всё выписываете?Конечно будет мигать. Менять на экране надо только то, что изменилось и тогда, когда изменилось.
А еще точнее. Неправильно спроектирована библиотека. В нормальной библиотеке все пишется в буфер памяти, а потом по методу show загружается сразу весь буфер в устройство. Много памяти, но мигание пропадает.
А зачем Вы при каждом проходе loop заново весь экран перезаписываете? Причём каждый раз стираете и снова всё выписываете?Конечно будет мигать. Менять на экране надо только то, что изменилось и тогда, когда изменилось.
Подскажите, как правильно написать?
Подскажите, как правильно написать?
Так я же уже подсказал.
Менять на экране надо только то, что изменилось и тогда, когда изменилось.
Так я же уже подсказал.
Менять на экране надо только то, что изменилось и тогда, когда изменилось.
Спасибо! Дошло))
2 вариант. Тупо перепечатывать раз в 0.5 сек. Не важно менялись переменные или нет. Вот только при перепечатывании надо только их перепечатывать. А вот значания их должны быть известны и помещены в глобальные переменные. И никаких лишних запросов и расчетов при перепечатывании.