Translate

Membuat Alat Pelacak Posisi dan Kirim Sms dan Monitor Lokasi via sms ARDUINO

Membuat Alat Pelacak Posisi dan Kirim Sms dan Monitor Lokasi via sms ARDUINO


            Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat digunakan untuk melacak atau mendeteksi posisi suatu benda atau monitoring posisi suatu benda via sms, jadi ketika kita kirim sms ke alat berupa text ''Monitor'' maka akan dibalas dengan posisi alat yang berupa koordinat longitude dan latitude. untuk lebih jelasnya berikut adalah skema dan programnya. 



a. Arduino Uno




b. LCD 16x2 + I2C




c. Modul GPS Ublox Neo 6Mv2




d. Modul SMS SIM800L





e. Modul Buck Converter / Step down






f. Program Arduino Uno

//vcc sim800L = 4v
//vcc modul GPS = 3.3v

#include <Wire.h>  
#include <LiquidCrystal_I2C.h>  
#include "SIM900.h"
#include <SoftwareSerial.h>
#include <TinyGPS.h>

#include "sms.h"
SMSGSM sms;

SoftwareSerial mySerial(2, 3);   //modul sms sim800l
TinyGPS gps;

LiquidCrystal_I2C lcd(0x3F, 16, 2);

void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);

char string[160];
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
char strsms[5];
char latstr[20];
char lonstr[20];
char latlonstr[20];

  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;


void setup()  
{
     Serial.begin(9600);
     
     Serial.println("GSM Shield testing.");

     if (gsm.begin(2400)) {
          Serial.println("\nstatus=READY");
          started=true;
     } else Serial.println("\nstatus=IDLE");

     if(started) {
          if (sms.SendSMS("08523345560", "Alat Ready"))
          Serial.println("\nSMS sent OK");
     }
   
   
   lcd.begin();
   lcd.clear();
   lcd.noCursor();
   
  // Oploen serial communications and wait for port to open:
  Serial.begin(9600);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(2400);
  delay(1000);
  
  Serial.println("uBlox Neo 6M");
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = "); 
  Serial.println(sizeof(TinyGPS));
  Serial.println(); 

}

void loop() // run over and over
{
  bool newdata = false;
  unsigned long start = millis();
  // Every 5 seconds we print an update
  while (millis() - start < 5000) 
  {
    if (Serial.available()) 
    
    {
      char c = Serial.read();
      //Serial.print(c);  // uncomment to see raw GPS data
      if (gps.encode(c)) 
      {
        newdata = true;
        break;  // uncomment to print new data immediately!
      }
    }
  }
  
  if (newdata) 
  {
    //Serial.println("Acquired Data");
    //Serial.println("-------------");
    gpsdump(gps);
    //Serial.println("-------------");
    //Serial.println();
  }
  
  
  dtostrf(flat,10,6,latstr);
  dtostrf(flon,10,6,lonstr);
  sprintf(string,"LAT= %s, LONG= %s", latstr, lonstr);

 if(gsm.begin(2400)){
  started=true;
 }
 int pos=0;
 if(started){
  pos=sms.IsSMSPresent(SMS_ALL);
  if(pos){
    sms.GetSMS(pos,n,smsbuffer,100);
  
    if(!strcmp(smsbuffer,"monitor")){
      sms.SendSMS(n,string);
    }
    if(!strcmp(smsbuffer,"Monitor")){
      sms.SendSMS(n,string);
    }

    delsms();
  }
 }
  
  delay(100);
  
}

void gpsdump(TinyGPS &gps)
{

  gps.get_position(&lat, &lon, &age);
  //Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon); 
  //Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
  
  gps.f_get_position(&flat, &flon, &age);
  //Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
  //Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  lcd.setCursor(0,0);
  lcd.print("LAT:");
  lcd.print(flat, 5);
   
  lcd.setCursor(0,1);
  lcd.print("LONG:");
  lcd.print(flon, 5);
  
}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0) 
  {
     //Serial.print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;
  
  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  //Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    //Serial.print("."); 

  // Extract digits from the remainder one at a time
  while (digits-- > 0) 
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    //Serial.print(toPrint);
    remainder -= toPrint;
  }
}



void delsms()
{
  for (int i=0; i<10; i++)
  {
      int pos=sms.IsSMSPresent(SMS_ALL);
      if (pos!=0)
      {
        if (sms.DeleteSMS(pos)==1){}else{}
      }
  }
}





g. VIDEO HASILNYA











No comments:

Post a Comment