Помогите новичку. Мерцает изображение
- Войдите на сайт для отправки комментариев
Чт, 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 сек. Не важно менялись переменные или нет. Вот только при перепечатывании надо только их перепечатывать. А вот значания их должны быть известны и помещены в глобальные переменные. И никаких лишних запросов и расчетов при перепечатывании.