Что за артефакт появляется на экране

McLay
Offline
Зарегистрирован: 13.09.2015
#include <UTFT.h>
 UTFT myGLCD(TFT01_22SP, 5, 4, 8, 7, 6);

 extern uint8_t SmallFont[];

 float dhtT;

 #define INTERVAL 1000 // Интервал через который производится опрос датчиков

   byte addressVBaze = 0;       // начальный порядковый номер столбца в массиве
   byte dlinaGraphika = 100;    // количество показаний в графике
   int dataTempOut[100];        // количество показаний в массиве
   byte otstup =45;             // отступ от левого края для построения графика
   byte y;
   
 void setup(){
 myGLCD.InitLCD(0);
 delay(1000);
 myGLCD.fillScr(255,255,255); 
 myGLCD.setBackColor(VGA_WHITE);
 delay(1000);
 myGLCD.setColor(VGA_BLACK);
   }
 void loop(){
 static unsigned long previousMillis = 0;
 if(millis() - previousMillis > INTERVAL) {
     previousMillis = millis(); 
     proverka();  // если настоло время производим опрос
     recordTempData ();  // записываем полученную инфо в массив
     myGLCD.setFont(SmallFont); // выводим на экран шкалу температуры
     myGLCD.print("30 C", 2, 203);
     myGLCD.print("15 C", 2, 225);
     myGLCD.drawLine(45, 253 ,240 ,253);
     myGLCD.print("0 C", 2, 247);
     myGLCD.print("-15 C", 2, 269);
     myGLCD.print("-30 C", 2, 291);
     grafik(); // рисуем график изменения температуры за промежуток времени
 }
} 

// функция снятия инфо с датчиков
 void proverka (){
     dhtT = 10; // тестовое значение температуры
 }

// функция записи очередного данного температуры в массив
void recordTempData () {
   dataTempOut[addressVBaze] = dhtT;
   ++addressVBaze;                 //  устанавливаем следующий адрес 
   if (addressVBaze > dlinaGraphika){
      addressVBaze = 0;}
}

// функция создания графика температуры
void grafik()  {
byte y =  addressVBaze;

for (byte x=dlinaGraphika; x>0;--x){
  
  myGLCD.setColor(VGA_BLACK);
  myGLCD.drawPixel(x+otstup, 253-(dataTempOut[y]*1.5));
    ++y;
    if (y>dlinaGraphika)
    {y=0;}
     }
 }
McLay
Offline
Зарегистрирован: 13.09.2015

 Всем привет!

Я наверное как и все новички в первых своих проектах касался темы метео станции.

И при работе с моим первым проектом метеостанции столкнулся с одной на мой взгляд интересной проблемой. При выводе создании графика температуры, на экране по мере сознания графика температуры, появляется диагональная линия идущая с лево на право (см.фото). Пользуюсь экраном http://amperka.ru/product/tft-color-display-320x240, библиотекой https://github.com/amperka/UTFT.

Помогите убрать эту линию

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
1.
в строках 50 и 63 замените > на >=, иначе вылезете за границу массива. Думаю, что это и даёт Вам диагональ;
 
2.
строки 11 и 12 лучше записать так
const byte dlinaGraphika = 100;
int dataTempOut[dlinaGraphika];

Тогда не будет возможности поменять 100 в одном месте и забыть в другом.

3.
в строке 48 Вы присваиваете float int'у. Само по себе не страшно, если Вы понимаете, что делаете.
 
4.
в функции grafik Вы всегда рисуете весь график на всю ширину, не обращая внимания на то, что у Вас, возможно, пока ещё не хватает данных в массиве dataTempOut (а массив Вы, кстати, не инициализировали)
 
5.
При этом Вы не стираете старые значения по тому же X, т.е. со временем у Вас на экране образуются несколько кривых.

 

McLay
Offline
Зарегистрирован: 13.09.2015

Спасибо ЕвгенийП, ваш первый совет помог. Проблема изчезла.

Второй, соглашусь.

По четвертому, на фото я просто хотел показать проблему. А так да массив до конца не был заполнен данными.

По пятому, просто хотелось по максимуму урезать скетч, чтобы лишний раз помошники не забивали голову не нужной инфо в скетче.