Навчальні конструктори та DIY електроніка

Работа с дисплеем 2.4" для Arduino Uno

2016-10-27

Данные дисплеи выпускаются производителем с различными контроллерами, поэтому возможны различные варианты их запуска:


Вариант 1:

Контроллер дисплея: ILI9341 (SPFD5408)

http://www.instructables.com/id/How-to-use-24-inch-TFT-LCD-SPFD5408-with-Arduino-U/?ALLSTEPS

Наша статья: Пример работы Arduino Uno R3 с данным дисплеем и библиотекой от Adafruit >>


Вариант 2:

Контроллер дисплея: ILI9325

Пример скетча:

#include <SD.h>
#include "TFTLCD.h"

//подключение дисплея
#define LCD_CS A3    
#define LCD_CD A2    
#define LCD_WR A1   
#define LCD_RD A0    
#define LCD_RESET A4

//подключение карты SD
#define SD_CS 10

//цвета
#define	BLACK           0x0000
#define	BLUE            0x001F
#define	RED             0xF800
#define	GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0 
#define WHITE           0xFFFF

#define GRIDCOLOR       0x8778
#define GRAPHCOLOR      0xFFE0

//такой файл будем искать на карте
#define LOG_NAME "LOG.CSV"

//настройки экрана
#define TITLE_STRING "arduino.shopium.ua logger" //25 символов максимум, верхний колонтитул
#define MIN_X 0
#define MAX_X 320 //размер экрана X
#define MIN_Y 0
#define MAX_Y 240 //размер экрана Y
#define GRIDSTEP 20 //шаг сетки
#define MIN_VALUE -100 //мин. значение на графике
#define MAX_VALUE 100 //макс. значение на графике

File ini_file;

TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

//определяем область графика - по оси X от 0 до максимума (ширины экрана), по оси Y - с отступами по 20 пкс
uint16_t gr_x = MIN_X;
uint16_t gr_min_x = MIN_X;
uint16_t gr_max_x = MAX_X;
uint16_t gr_y = MIN_Y;
uint16_t gr_min_y = MIN_Y+20;
uint16_t gr_max_y = MAX_Y-20;

long Vcc = 0;

void setup() {
  Serial.begin(115200);
  tft.reset();
  tft.initDisplay();
  tft.setRotation(3);//Uno R3: разъём USB слева
  pinMode(10, OUTPUT);//CS SD-карты
  if (!SD.begin(10)) {
    Serial.println("SD failed");
  }
  Serial.println("SD init");
}

void loop() {
  Serial.println("draw_graph_bg();");
  draw_graph_bg();
  Serial.println("dump_csv_as_text();");
  dump_csv_as_text();
  Serial.println("dump_csv_as_graph();");
  dump_csv_as_graph();
  Serial.println("read_and_draw_Vcc();");
  read_and_draw_Vcc();  
  Serial.println("while(1)");
  while(1);
}

void dump_csv_as_graph() {
  for (int i = MIN_X; i < MAX_X; i++) {
    int val = analogRead(A5);
    int val_tft = map(val, 0, 1024, gr_max_y, gr_min_y);
    tft.drawPixel(i, val_tft, YELLOW);
  }
}

void dump_csv_as_text() {
//  return;
  ini_file = SD.open(LOG_NAME);
  tft.setCursor(200, MAX_Y-14);
  tft.setTextColor(RED);
  if (!ini_file) {
    tft.println("No log file");
    Serial.println("No log file");
    while(1);
  } else {
    tft.println("Log found");
    Serial.println("Log found");
  }
  ini_file.seek(0);
  String csv1;
  char character;
  while (ini_file.available()) {
    while (character != '\n') {//read 1 line
      character = ini_file.read();
      if (character != ';') {//read 1-st value in line
        csv1.concat(character);
      } else {
        tft.println(csv1);
        Serial.println(csv1);
      }
    }
  }
  ini_file.close();
}

void draw_graph_bg() {
   tft.fillScreen(BLACK);
   tft.fillRect(0, 0, MAX_X, 20, BLUE);
   tft.fillRect(0, MAX_Y-20, MAX_X, 20, BLUE);
   tft.setCursor(10, 2);
   tft.setTextColor(YELLOW);
   tft.setTextSize(2);
   tft.println(TITLE_STRING);
   tft.setTextSize(1);   
   uint16_t h_center = (MAX_Y-MIN_Y)/2;//координаты Y поиск нулевой линии
   tft.drawHorizontalLine(gr_min_x, h_center, gr_max_x, RED);//нулевая линия
   tft.setCursor(0, 123);
   int h_center_val = (MAX_VALUE+MIN_VALUE)/2;
   if (h_center_val < 10){
     tft.print("  ");//2 отступа если у нас одна цифра
   } else {
     if (h_center_val < 100) {
       tft.print(" ");//1 отступ если у нас две цифры
     }
   }
   tft.println(h_center_val);//подпись оси Y - нулевое значение

   for (uint16_t i = h_center+GRIDSTEP; i < gr_max_y; i += GRIDSTEP) {//подписи оси Y вниз
     int podp = map (i, h_center, gr_max_y, 0, MIN_VALUE);
     tft.drawHorizontalLine(gr_min_x, i, gr_max_x, GRIDCOLOR);
     tft.setCursor(0, i+3);
     tft.println(podp);
   }
   for (uint16_t i = h_center-GRIDSTEP; i > gr_min_y; i -= GRIDSTEP) {//подписи оси Y вверх
     int podp = map (i, h_center, gr_min_y, 0, MAX_VALUE);
     tft.drawHorizontalLine(gr_min_x, i, gr_max_x, GRIDCOLOR);
     tft.setCursor(0, i+3);
     tft.print("+");
     tft.println(podp);
   }
   for (uint16_t i = gr_min_x+GRIDSTEP; i <= gr_max_x; i += GRIDSTEP) {tft.drawVerticalLine(i, gr_min_y, gr_max_y-20, GRIDCOLOR);}
}

void read_and_draw_Vcc() {
  long result;
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2);
  ADCSRA |= _BV(ADSC);
  while (bit_is_set(ADCSRA, ADSC));
  result = ADCL;
  result |= ADCH << 8;
  result = 1126400L / result;
  char buffer[10];
  float fresult = result;
  fresult =  fresult / 1000;
  ftoa(buffer, fresult, 3);
//  tft.fillRect(0, MAX_Y-12, 50, MAX_Y-2, BLUE);
  tft.setCursor(10, MAX_Y-14);
  tft.print("Vcc: ");
  tft.println(buffer);
}

char *ftoa(char *a, double f, int precision) {
  long p[] = {0,10,100,1000,10000,100000,1000000,10000000,100000000};
  char *ret = a;
  long heiltal = (long)f;
  itoa(heiltal, a, 10);
  while (*a != '\0') a++;
  *a++ = '.';
  long decimal = abs((long)((f - heiltal) * p[precision]));
  itoa(decimal, a, 10);
  return ret;
}


Вариант 3:

Контроллер дисплея: 0х0154

https://forum.arduino.cc/index.php?topic=366304.0

Здесь следует

  1. Загрузить библиотеку Adafruit_GFX.h из GitHub (можно скачать с нашего сервера: adafruit-gfx-library-master)
  2. Загрузить приложенную к топикук библиотеку MCUFRIEND_kbv.zip (можно скачать с нашего сервера: mcufriend_kbv_2-90)
  3. Запустить тестовый скетч GLUE_Demo_320x240 или testcard_kbv

Проверено с Arduino IDE 1.6.12


 

Автор: hobbytech


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *


© HobbyTech 2016