Arduino (IoT): Simple Tutorial TFT Pantalla 1.8″ Parte III

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial TFT 1.8″ Parte III

Ver imágenes en una pantalla tft.

Requisitos:

  1. Computadora (mac)
  2. Arduino MEGA (u otra variante Arduino) o incluso Arduino clone, Edison, Raspberry…  Este tutorial en particular usa una Arduino UNO.
  3. MicroSD
  4. 1.8″ TFT
  5. Breadboard
  6. Arduino IDE (https://www.arduino.cc/en/Main/Software)

El código lo bajamos aquí:

Documents/Arduino/Adafruit-ST7735-Library-Master

Las conexiones son:

Shield——————–UNO

SCK – 13

DI –

DO – 11

TCS – 10

Reset(9) – 9

DC – 8

CCS4 – 4

Es importante set los pines en codigo correctamente:

/***************************************************
 ADAFRUIT
 ****************************************************/
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <SD.h>
#define TFT_CS 10 // Chip select line for TFT display
#define TFT_RST 9 // Reset line for TFT (or see below...)
#define TFT_DC 8 // Data/command line for TFT
#define SD_CS 4 // Chip select line for SD card
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
void setup(void) {
 Serial.begin(9600);
 // Use this initializer if you're using a 1.8" TFT
 tft.initR(INITR_BLACKTAB);
 // Use this initializer (uncomment) if you're using a 1.44" TFT
 //tft.initR(INITR_144GREENTAB);
 Serial.print("Initializing SD card...");
 if (!SD.begin(SD_CS)) {
 Serial.println("failed!");
 return;
 }
 Serial.println("OK!");
 // change the name here!
 bmpDraw("parrot.bmp", 0, 0);
 // wait 5 seconds
 delay(5000);
}
void loop() {
// uncomment these lines to draw bitmaps in different locations/rotations!
/*
 tft.fillScreen(ST7735_BLACK); // Clear display
 for(uint8_t i=0; i<4; i++) // Draw 4 parrots
 bmpDraw("parrot.bmp", tft.width() / 4 * i, tft.height() / 4 * i);
 delay(1000);
 tft.setRotation(tft.getRotation() + 1); // Inc rotation 90 degrees
*/
}
#define BUFFPIXEL 20
void bmpDraw(char *filename, uint8_t x, uint8_t y) {
 File bmpFile;
 int bmpWidth, bmpHeight; // W+H in pixels
 uint8_t bmpDepth; // Bit depth (currently must be 24)
 uint32_t bmpImageoffset; // Start of image data in file
 uint32_t rowSize; // Not always = bmpWidth; may have padding
 uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel)
 uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer
 boolean goodBmp = false; // Set to true on valid header parse
 boolean flip = true; // BMP is stored bottom-to-top
 int w, h, row, col;
 uint8_t r, g, b;
 uint32_t pos = 0, startTime = millis();
 if((x >= tft.width()) || (y >= tft.height())) return;
 Serial.println();
 Serial.print("Loading image '");
 Serial.print(filename);
 Serial.println('\'');
 // Open requested file on SD card
 if ((bmpFile = SD.open(filename)) == NULL) {
 Serial.print("File not found");
 return;
 }
 // Parse BMP header
 if(read16(bmpFile) == 0x4D42) { // BMP signature
 Serial.print("File size: "); Serial.println(read32(bmpFile));
 (void)read32(bmpFile); // Read & ignore creator bytes
 bmpImageoffset = read32(bmpFile); // Start of image data
 Serial.print("Image Offset: "); Serial.println(bmpImageoffset, DEC);
 // Read DIB header
 Serial.print("Header size: "); Serial.println(read32(bmpFile));
 bmpWidth = read32(bmpFile);
 bmpHeight = read32(bmpFile);
 if(read16(bmpFile) == 1) { // # planes -- must be '1'
 bmpDepth = read16(bmpFile); // bits per pixel
 Serial.print("Bit Depth: "); Serial.println(bmpDepth);
 if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
 goodBmp = true; // Supported BMP format -- proceed!
 Serial.print("Image size: ");
 Serial.print(bmpWidth);
 Serial.print('x');
 Serial.println(bmpHeight);
 // BMP rows are padded (if needed) to 4-byte boundary
 rowSize = (bmpWidth * 3 + 3) & ~3;
 // If bmpHeight is negative, image is in top-down order.
 // This is not canon but has been observed in the wild.
 if(bmpHeight < 0) {
 bmpHeight = -bmpHeight;
 flip = false;
 }
 // Crop area to be loaded
 w = bmpWidth;
 h = bmpHeight;
 if((x+w-1) >= tft.width()) w = tft.width() - x;
 if((y+h-1) >= tft.height()) h = tft.height() - y;
 // Set TFT address window to clipped image bounds
 tft.setAddrWindow(x, y, x+w-1, y+h-1);
 for (row=0; row<h; row++) { // For each scanline...
 if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
 pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
 else // Bitmap is stored top-to-bottom
 pos = bmpImageoffset + row * rowSize;
 if(bmpFile.position() != pos) { // Need seek?
 bmpFile.seek(pos);
 buffidx = sizeof(sdbuffer); // Force buffer reload
 }
 for (col=0; col<w; col++) { // For each pixel...
 // Time to read more pixel data?
 if (buffidx >= sizeof(sdbuffer)) { // Indeed
 bmpFile.read(sdbuffer, sizeof(sdbuffer));
 buffidx = 0; // Set index to beginning
 }
 // Convert pixel from BMP to TFT format, push to display
 b = sdbuffer[buffidx++];
 g = sdbuffer[buffidx++];
 r = sdbuffer[buffidx++];
 tft.pushColor(tft.Color565(r,g,b));
 } // end pixel
 } // end scanline
 Serial.print("Loaded in ");
 Serial.print(millis() - startTime);
 Serial.println(" ms");
 } // end goodBmp
 }
 }
 bmpFile.close();
 if(!goodBmp) Serial.println("BMP format not recognized.");
}
uint16_t read16(File f) {
 uint16_t result;
 ((uint8_t *)&result)[0] = f.read(); // LSB
 ((uint8_t *)&result)[1] = f.read(); // MSB
 return result;
}
uint32_t read32(File f) {
 uint32_t result;
 ((uint8_t *)&result)[0] = f.read(); // LSB
 ((uint8_t *)&result)[1] = f.read();
 ((uint8_t *)&result)[2] = f.read();
 ((uint8_t *)&result)[3] = f.read(); // MSB
 return result;
}

Ese proyecto se puede ver aquí:

Arduino Tutorial Adafruit 1.8" TFT Santiapps Marcio Valenzuela
Arduino Tutorial Adafruit 1.8″ TFT

 

Cool!  Podemos ver datos en una pantalla, usar menus, movernos en la pantalla, seleccionar y almacenar datos.

Leave a comment