Selasa, 30 Agustus 2016

GPS TRACKER with LCD 2.4" and Auto SMS Location Sender + RTC & Temperature Sensor



Membuat "GPS TRACKER with LCD 2.4" and Auto SMS Location Sender + RTC & Temperature Sensor" dengan Arduino UNO Atmega328



Module yang dibutuhkan dalam Project ini :

- 1 Unit Arduino Uno Atmega328
- 1 Unit Module RTC DS3231
- 1 Unit Module LCD TFT 2,4 inch dengan Chip Controller ILI9328 / ILI9325 / ILI9341
- 1 Unit Memory microSD 1GB atau 2GB (4GB juga gak papa) untuk save image dan data
- 1 Unit Module GPS, pilih salah satu :
   Ublox Neo6M-V1   dapatkan disini
   Ublox Neo6M-V2   dapatkan disini
   Ublox Neo7M        dapatkan disini
- 1 Unit Module GSM/GPRS SIM800L V.2 (alternatif bisa pakai V.1+stepdown)
- Beberapa pcs kabel Jumper Dupont Male-Female dan Female-Female

  (Apabila anda mempunyai LCD TFT 2,4 yang berbeda Seri Chip Driver Controllernya mungkin tidak
   bisa berjalan dengan Library Adafruit dan HARUS menggunakan library mcufriend_kbv atau Uglib
   sehingga harus ada modifikasi coding pada bagian tampilan display nya )

 

Library Arduino yang dibutuhkan dalam Project ini :

- Library SPFD5408 untuk LCD TFT dengan chip ILI9325/9328 download disini.
- Library Adafruit_LCD_TFT untuk LCD TFT dengan chip ILI9341/Other Chip download disini.
- Library mcufriend_kbv untuk LCD TFT yang tidak mau jalan dengan Lib Adafruit download disini.
- Library GPS Ublox Neo6M / Neo7M download disini.
- Library RTC DS3231 download disini. 

  (Beberapa kasus apabila anda menggunakan LCD TFT 2,4 yang menggunakan library selain 
  SPFD5408 (mcufriend dan Adafrui TFT_LCD) harus mengatur ulang posisi cursor text & shape.


Wiring Module ke Arduino Board Project ini :

Menghubungkan Arduino uno dengan  Module LCD TFT 2,4"

-Karena Module LCD TFT 2,4" sudah berbentuk Uno Shiled maka tidak perlu adanya Wiring jumper dari module ini ke Arduino Board.Yang perlu kita perhatikan adalah adanya pin yang nantinya akan dipakai bersama oleh Module LCD TFT dan Module RTC DS3231 yaitu pin Analog A4.

-Pin A4 pada Arduino dipakai oleh Module TFT LCD sebagai RESET PIN yang fungsinya sebagai Trigger LCD BEGIN atau untuk memulai penggunaan LCD dan pengkosongan layar.


#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

Pada sample coding dari library kita dapat melihat bahwa pin Analog A0 sampai dengan A4 digunakan oleh LCD termasuk A4 sebagai LCD RESET.

Pada sample diatas juga disebutkan bahwa pin LCD RESET dapat menggunakan pin selain A4 (Apabila pin A4 akan digunakan untuk keperluan lain.misal komunikasi i2c/iic/twi) yaitu dengan menggabungkan pin LCD RESET dengan PIN RESET (RST) pada board Arduino.

Sebetulnya kita bisa saja memindahkan posisi PIN LCD RESET ke pin lain yang tersisa seperti A5,D0 ataupun D1,sayangnya semua pin tersebut akan kita pakai untuk koneksi dengan Module RTC, GPS dan SIM800L sehingga tidak ada jalan lain kita akan menggunakan PIN Reset Arduino sebagai Pin Reset LCD.

Artinya untuk memulai LCD kita harus mereset Arduino terlebih dulu.jadi saat Arduino baru mendapat power LCD blum bekerja sampai kita melakukan RESET pada board arduino baik dari tombol Reset yang di Board Arduino ataupun Tombol Reset yang berada di Module LCD TFT.

Pada penggunaan LCD nya kita tidak boleh memasukan pin LCD Reset ke dalam lubang A4 pada Board Arduino karena kita akan menghubungkanya dengan pin Reset Arduino.Jadi Jika kita akan menancapkan langsung LCD ke Arduino Board kita harus "membengkokan" pin LCD RST ke dalam atau keluar agar tidak masuk ke lubang A4 kemudian kita dapat menggunakan kabel Jumper untuk menghubungkan pin LCD RESET dengan Pin Reset pada Arduino Uno Board.

(Gambar diatas : PIN LCD RST pada LCD TFT Module saya bengkokan agar tidak masuk ke lubang A4 pada board Arduino.Kabel jumper hitam kita hubungkan ke pin Reset Arduino)

(Gambar diatas : PIN Reset pada Arduino Board (Arduino Uno Clone double header ditambah pin Male pada lubang sebelah female header) saya bengkokan untuk menerima kabel jumper dari PIN LCD RST pada lcd tft module.Kabel jumper hitam kita hubungkan ke pin LCD RST.

Untuk #define LCD_RESET pada codingnya bisa kita atur ke sembarang PIN,disini saya sarankan ke PIN 13 namun tetap pada actual wiringnya kita menyambungkan pin LCD RESET ke pin Reset Arduino.

Maka pada Define pin LCD akan kita rubah seperti di bawah ini :


#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET 13 // Fake Reset PIN

Setelah selesai melakukan Wiring LCD dengan Board Arduino maka akan didapatkan Sisa Pin A4, A5, D0 dan D1.Kita akan menggunakan 4 pin tersebut untuk keperluan berikut :

A4 dan A5 = koneksi data i2C dengan module RTC DS3231
D0 (RX) = Menerima data Serial dari Module GPS Neo6M / Neo7M
D1 (TX) = Mengirimkan data Serial ke Module SIM800L untuk perintah Kirim SMS

Memasukan background image ke memory untuk ditampilkan di LCD

Untuk mempercantik tampilan display GPS kita akan menampilkan gambar pada background nya.
gambar akan kita taruh pada kartu microSD yang nantinya akan kita masukan ke dalam slot memory yang ada di LCD TFT Module. Jenis LCD ini mampu membaca memory hingga 8GB (belum coba sampai 16GB dan 32GB).

Syarat gambar yang dapat kita load ke LCD adalah jenis bitmap (.bmp) dan resolusi gambar sama dengan resolusi LCD yaitu 320*240pixel dengan kerapatan 72-96dpi.

Pada sampel kode ini saya sertakan contoh gambar yang saya Load ke  LCD (bersama ino file) yang bisa di download pada link download di link download.

Menghubungkan Arduino uno dengan  Module RTC DS3231

DS3231 < --> Arduino Uno Board
VCC  <--> pin 5V Arduino
GND  <--> pin GND Arduino
SDA  <--> pin SDA Arduino (A4)
SCL  <--> pin SCL Arduino (A5)


Menghubungkan Arduino uno dengan  Module GPS Ublox Neo6M/Neo7M
GPS Ublox < --> Arduino Uno Board
VCC  <--> pin 5V Arduino atau 5V Eksternal Power Supply
GND <--> pin GND Arduino atau GND Eksternal Power Supply
TX    <--> pin D0 Arduino (RX)
RX    <--> tidak dihubungkan (Not Connected)

Menghubungkan Arduino uno dengan  Module GPS Ublox Neo6M/Neo7M
SIM800L V.2 < --> Arduino Uno Board
VCC  <--> pin 5V Arduino atau 5V Eksternal Power Supply
GND <--> pin GND Arduino atau GND Eksternal Power Supply
TX    <--> tidak dihubungkan (Not Connected)
RX    <--> pin D1 Arduino (TX)

Warning : Jika kita mengambil Power untuk SIM800L V.2 dari pin 5V Arduino beberapa kasus yang terjadi adalah SIM800L gagal booting karena drop tegangan (arus kurang), perhatikan lampu RING/PWR pada module SIM800L V.2, apabila dia berkedip berulang berarti SIM800L V.2 mengalami auto reset akibat gagal booting karena kurang power, namun jika lampu led pada RING/PWR dapat menyala terus dan diikuti dengan lampu NET/SIGNAL berkedip mencari signal maka power masih cukup untuk booting module SIM800L.

Warning :Jika anda menggunakan SIM800L V.1 (pcb warna merah) maka anda harus menggunakan tambahan step down converter (misal module LM2596) untuk merubah tegangan 5V menjadi sekitar 3,9-4,1 V untuk power supply SIM800L V.1 (Versi 1 membutuhkan tegangan VCC min 3,7V max 4,2V).

Indikator pada Module SIM800L (analisa error) 
-Lampu Ring/Power Menyala terus : Power kuat untuk melakukan booting
-Lampu Ring/Power berkedip setiap beberapa detik : Power kurang untuk melakukan booting (auto resart)
-Lampu NET/Signal berkedip cepat : Search Network / Registrasi Network
-Lampu NET/Signal berkedip pelan :Sudah terdaftar pada Jaringan / mendapatkan signal operator
 *Jika Lampu Net/Signal terus berkedip cepat dan tida melambat berarti Module SIM800L tidak berhasil mendapatkan jaringan dan terus mencari,bisa karena signal Operator yang minim di tempat tersebut ataupun kartu SIM yang sudah Expired atau posisi Kartu SIM terbalik.
-Lampu Ring/Power Kedip Cepat 3 kali kemudian padam (SIM800L V.1) : Over Voltage tegangan melebihi 4,2V.Semua fungsi akan dihentikan.


Sketch Coding / Sourche code untuk project ini :

Untuk .ino file dan sampel .bmp background silahkan download disini.

Anda bisa melihatnya terlebih dulu kemudian copy paste code berikut ke Arduino IDE anda dan upload sketch nya ke dalam Arduino Board anda.


Warning : Saat Upload sketch melalui Arduino IDE lepas sambungan kabel jumper dari TX GPS ke RX (D0) Arduino Board, setelah selesai Upload silahkan dihubungkan kembali karena Arduino Board tidak bisa menerima program selama PIN D0 (TX) masih terhubung dengan module lain.



//▒▒▒▒▒▒▐███████▌Coding ini dibuat Oleh Dani-Rajacell
//▒▒▒▒▒▒▐░▀░▀░▀░▌support by www.tokopedia.com/rajacell
//▒▒▒▒▒▒▐▄▄▄▄▄▄▄▌untuk www.belajarduino.com
//▄▀▀▀█▒▐░▀▀▄▀▀░▌▒█▀▀▀▄ Mohon tidak menghapus codeMark ini sebagai
//▌▌▌▌▐▒▄▌░▄▄▄░▐▄▒▌▐▐▐▐ bentuk apresiasi penggunaan coding ini secara GRATIS
// Apabila ada bugs atau kesulitan dalam penggunaan coding ini bisa hubungi creator melalui akun FB
// https://www.facebook.com/dani.ardianto.98 atau via comment posting artikel ini  www.belajarduino.com
// Anda bisa melakukan donasi untuk free coding ini dengan membeli module nya di www.tokopedia.com/rajacell
#include <SPFD5408_Adafruit_TFTLCD.h>  //memanggil library Adafruit SPFD5408 (ILI9325/9328/9341)
#include <TinyGPS++.h>   //memanggil library GPS Ublox Neo
#include <SD.h>          //memanggil library SD Card Module pada LCD (untuk Loading gambar)
#include <DS3231.h>      //memanggil library RTC DS3231

#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET 13 //LCD Fake Reset PIN
#define SD_CS 10  // SD Card CS pin
#define BUFFPIXEL 20 //Picture buffer

//Define Warna agar memudahkan saat melakukan coding
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
DS3231  rtc(SDA, SCL);
TinyGPSPlus gps;

//fungsi counter millis
uint32_t targetTime = 0;   
uint8_t hh=0, mm=0, ss=0, hh2=0;
String pesan1 = "Koordinat Lat : ";
String pesan2 = " Koordinat Lon : ";

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600); // Serial kita gunakan untuk komunikasi dengan SIM800L dan GPS
rtc.begin();        // Memulai RTC
tft.begin(0x9328);  //Memulai LCD pada Address ILI9328 (ganti address sesuai kode Chip LCD anda)
tft.setRotation (1);
tft.fillScreen (BLACK); //Set Background Color

//init kartu SD pada slot card LCD TFT
if (!SD.begin(SD_CS)) {
progmemPrintln(PSTR("failed!"));
return; }
progmemPrintln(PSTR("OK!"));

//Memanggil gambar background untuk GPS
bmpDraw("001.bmp", 0, 0);
delay(1000);
}
//▒▒▒▒▒▒▐███████▌Coding ini dibuat Oleh Dani-Rajacell
//▒▒▒▒▒▒▐░▀░▀░▀░▌support by www.tokopedia.com/rajacell
//▒▒▒▒▒▒▐▄▄▄▄▄▄▄▌untuk www.belajarduino.com
//▄▀▀▀█▒▐░▀▀▄▀▀░▌▒█▀▀▀▄ Mohon tidak menghapus codeMark ini sebagai
//▌▌▌▌▐▒▄▌░▄▄▄░▐▄▒▌▐▐▐▐ bentuk apresiasi penggunaan coding ini secara GRATIS
// Apabila ada bugs atau kesulitan dalam penggunaan coding ini bisa hubungi creator melalui akun FB
// https://www.facebook.com/dani.ardianto.98 atau via comment posting artikel ini  www.belajarduino.com
// Anda bisa melakukan donasi untuk free coding ini dengan membeli module nya di www.tokopedia.com/rajacell
void loop() {
  // put your main code here, to run repeatedly:
while (Serial.available() > 0)
gps.encode(Serial.read());  // Membaca status dari GPS

//Print data GPS ke LCD TFT
tft.setTextColor (YELLOW,BLACK);
tft.setTextSize (2);
tft.setCursor (5,15);
tft.print(gps.location.age()); tft.print(F(" Age   "));
tft.setCursor (5,35);
tft.print(gps.location.lat(), 6); tft.print(F(" Lat "));
tft.setCursor (5,55);
tft.print(gps.location.lng(), 6); tft.print(F(" Lon "));
tft.setCursor (5,75);
tft.print(gps.satellites.value(), 5); tft.print(F(" Sat.Sign"));
tft.setCursor (5,95);
tft.print(gps.hdop.value(), 5); tft.print(F(" Hdop"));
tft.setCursor (270,30);
tft.print(gps.speed.kmph(), 2);
tft.setCursor (270,50);
tft.print(F("KMph"));
tft.setCursor (215,180);
tft.print(F("GPS Time"));
tft.setCursor (207,200);
tft.print(gps.date.day()); tft.print(F("/"));
tft.print(gps.date.month()); tft.print(F("/"));
tft.print(gps.date.year());
tft.setCursor (220,220);
tft.print(gps.time.hour()+7);  tft.print(F(":"));
if(gps.time.minute()<10){tft.print(F("0"));}
tft.print(gps.time.minute());  tft.print(F(":"));
if(gps.time.second()<10){tft.print(F("0"));}
tft.println(gps.time.second());

//Print data Date&Time dari RTC ke LCD TFT
tft.setTextColor (CYAN,BLACK);
tft.setCursor (5,180);
tft.print(rtc.getDOWStr());
tft.setCursor (5,200);
tft.print(rtc.getDateStr());
tft.setCursor (5,220);
tft.print(rtc.getTimeStr());

//Print data millis/timer ke LCD TFT
tft.setTextColor (RED,BLACK);
tft.setCursor (220,150);
if (targetTime < millis()) {
    targetTime = millis() + 1000;
    ss++;              // Advance second
    if (ss == 60) {
      ss = 0;
      mm++;            // Advance minute
      if (mm > 59) {
        mm = 0;
        hh++;          // Advance hour
        if (hh > 23) {
          hh = 0;
        }
      }
    }
}
tft.print (hh); tft.print (F("."));
if (mm<10){tft.print(F("0"));}
tft.print (mm); tft.print (F("."));
if (ss<10){tft.print(F("0"));}tft.print (ss);

//Print data Temperature dari RTC ke LCD TFT
tft.setTextColor (GREEN,BLACK);
tft.setCursor (5,150);
tft.print(F("Temp:"));
tft.print(rtc.getTemp(),1);
tft.print(F("C"));
 
//Buffer data GPS yang akan dikirim secara periodik melalui SMS
String SMS=pesan1+String(gps.location.lat(),6)+pesan2+String(gps.location.lng(),6);

//Perintah pengiriman SMS setiap 1 jam sekali dilakukan pada menit ke 3 setiap jam nya
if (mm==3 && ss>0 && ss<3){SendTextMessage(SMS);}


}
//▒▒▒▒▒▒▐███████▌Coding ini dibuat Oleh Dani-Rajacell
//▒▒▒▒▒▒▐░▀░▀░▀░▌support by www.tokopedia.com/rajacell
//▒▒▒▒▒▒▐▄▄▄▄▄▄▄▌untuk www.belajarduino.com
//▄▀▀▀█▒▐░▀▀▄▀▀░▌▒█▀▀▀▄ Mohon tidak menghapus codeMark ini sebagai
//▌▌▌▌▐▒▄▌░▄▄▄░▐▄▒▌▐▐▐▐ bentuk apresiasi penggunaan coding ini secara GRATIS
// Apabila ada bugs atau kesulitan dalam penggunaan coding ini bisa hubungi creator melalui akun FB
// https://www.facebook.com/dani.ardianto.98 atau via comment posting artikel ini  www.belajarduino.com
// Anda bisa melakukan donasi untuk free coding ini dengan membeli module nya di www.tokopedia.com/rajacell
void SendTextMessage(String message)
{
//Serial.println("Set format SMS ke ASCII");
Serial.print("AT+CMGF=1\r\n");
delay(1000);
//Serial.println("SIM800L Set SMS ke Nomor Tujuan");
Serial.println("AT+CMGS=\"089666699910\"\r\n"); //ganti nomor hp nya 
delay(1000);
//Serial.println("SIM800L Send GPS Position");
Serial.println(message);//the content of the message
delay(100);
//Serial.println("Mengakhiri pengiriman SMS");
Serial.println((char)26);//the ASCII code of the ctrl+z is 26
delay(100);
//Serial.println("SMS Selesai Dikirim!");
Serial.println();
}

//▒▒▒▒▒▒▐███████▌Coding ini dibuat Oleh Dani-Rajacell
//▒▒▒▒▒▒▐░▀░▀░▀░▌support by www.tokopedia.com/rajacell
//▒▒▒▒▒▒▐▄▄▄▄▄▄▄▌untuk www.belajarduino.com
//▄▀▀▀█▒▐░▀▀▄▀▀░▌▒█▀▀▀▄ Mohon tidak menghapus codeMark ini sebagai
//▌▌▌▌▐▒▄▌░▄▄▄░▐▄▒▌▐▐▐▐ bentuk apresiasi penggunaan coding ini secara GRATIS
// Apabila ada bugs atau kesulitan dalam penggunaan coding ini bisa hubungi creator melalui akun FB
// https://www.facebook.com/dani.ardianto.98 atau via comment posting artikel ini  www.belajarduino.com
// Anda bisa melakukan donasi untuk free coding ini dengan membeli module nya di www.tokopedia.com/rajacell
void bmpDraw(char *filename, int x, int 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 in buffer (R+G+B per pixel)
  uint16_t lcdbuffer[BUFFPIXEL];  // pixel out buffer (16-bit 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();
  uint8_t  lcdidx = 0;
  boolean  first = true;

  if((x >= tft.width()) || (y >= tft.height())) return;

  Serial.println();
  progmemPrint(PSTR("Loading image '"));
  Serial.print(filename);
  Serial.println('\'');
  // Open requested file on SD card
  if ((bmpFile = SD.open(filename)) == NULL) {
    progmemPrintln(PSTR("File not found"));
    return;
  }

  // Parse BMP header
  if(read16(bmpFile) == 0x4D42) { // BMP signature
    progmemPrint(PSTR("File size: ")); Serial.println(read32(bmpFile));
    (void)read32(bmpFile); // Read & ignore creator bytes
    bmpImageoffset = read32(bmpFile); // Start of image data
    progmemPrint(PSTR("Image Offset: ")); Serial.println(bmpImageoffset, DEC);
    // Read DIB header
    progmemPrint(PSTR("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
      progmemPrint(PSTR("Bit Depth: ")); Serial.println(bmpDepth);
      if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed

        goodBmp = true; // Supported BMP format -- proceed!
        progmemPrint(PSTR("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...
          // Seek to start of scan line.  It might seem labor-
          // intensive to be doing this on every line, but this
          // method covers a lot of gritty details like cropping
          // and scanline padding.  Also, the seek only takes
          // place if the file position actually needs to change
          // (avoids a lot of cluster math in SD library).
          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 column...
            // Time to read more pixel data?
            if (buffidx >= sizeof(sdbuffer)) { // Indeed
              // Push LCD buffer to the display first
              if(lcdidx > 0) {
                tft.pushColors(lcdbuffer, lcdidx, first);
                lcdidx = 0;
                first  = false;
              }
              bmpFile.read(sdbuffer, sizeof(sdbuffer));
              buffidx = 0; // Set index to beginning
            }

            // Convert pixel from BMP to TFT format
            b = sdbuffer[buffidx++];
            g = sdbuffer[buffidx++];
            r = sdbuffer[buffidx++];
            lcdbuffer[lcdidx++] = tft.color565(r,g,b);
          } // end pixel
        } // end scanline
        // Write any remaining data to LCD
        if(lcdidx > 0) {
          tft.pushColors(lcdbuffer, lcdidx, first);
        } 
        progmemPrint(PSTR("Loaded in "));
        Serial.print(millis() - startTime);
        Serial.println(" ms");
      } // end goodBmp
    }
  }

  bmpFile.close();
  if(!goodBmp) progmemPrintln(PSTR("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;
}

// Copy string from flash to serial port
// Source string MUST be inside a PSTR() declaration!
void progmemPrint(const char *str) {
  char c;
  while(c = pgm_read_byte(str++)) Serial.print(c);
}
//▒▒▒▒▒▒▐███████▌Coding ini dibuat Oleh Dani-Rajacell
//▒▒▒▒▒▒▐░▀░▀░▀░▌support by www.tokopedia.com/rajacell
//▒▒▒▒▒▒▐▄▄▄▄▄▄▄▌untuk www.belajarduino.com
//▄▀▀▀█▒▐░▀▀▄▀▀░▌▒█▀▀▀▄ Mohon tidak menghapus codeMark ini sebagai
//▌▌▌▌▐▒▄▌░▄▄▄░▐▄▒▌▐▐▐▐ bentuk apresiasi penggunaan coding ini secara GRATIS
// Apabila ada bugs atau kesulitan dalam penggunaan coding ini bisa hubungi creator melalui akun FB
// https://www.facebook.com/dani.ardianto.98 atau via comment posting artikel ini  www.belajarduino.com
// Anda bisa melakukan donasi untuk free coding ini dengan membeli module nya di www.tokopedia.com/rajacell
// Same as above, with trailing newline
void progmemPrintln(const char *str) {
  progmemPrint(str);
  Serial.println();
}


Video Review :


3 komentar:

Copyright © 2014 Belajar Arduino | Designed With By Blogger Templates | Distributed By Gooyaabi Templates
Scroll To Top