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 :
Mantap ....ayo buat 1000 like
BalasHapusmasih bingung layout pemasangannya ada gambar yg lebih jelas?? terimakasih
BalasHapuskalo pakek matrix led gimana
BalasHapus