Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengirimkan koordinat posisi GPS latitude dan longitude saat terjadi getaran atau guncangan (Shake). alat ini berfungsi untuk memberikan informasi terkait kondisi kendaraan yang mana jika terjadi kecelakaan maka otomatis alat akan berguncang dan akan langsung mengirimkan notifikasi berupa SMS yang mana isi dari SMS tersebut adalah posisi koordinat dari GPS sehingga dapat dengan mudah orang mengetahuinya. alat ini terdiri dari dua buah sistem. sistem lainnya yaitu kendali relay berbasis android, jadi menggunakan HP android dan bluetooth sehingga dapat mengendalikan sebuah relay. untuk lebih jelaskan berikut adalah skema dan programnya.
a. Arduino Mega
b. Minimum System ATMega16
c. SIM800L + Buck Converter
d. GY - GPS6MV2
e. Relay Modul 5v
f. Bluetooth HC-05
g. Sensor Piezo Electric (Sensor Getar)
h. Program Android
i. Program Arduino IDE
//vcc GPS = 5 volt
//vcc SIM800L = 4 volt
#include <Wire.h> // i2C Conection Library
#include <LiquidCrystal_I2C.h> //i2C LCD Library
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include "SIM900.h"
SoftwareSerial mySerial(10, 11);
TinyGPS gps;
#include "sms.h"
SMSGSM sms;
LiquidCrystal_I2C lcd(0x3F, 20, 4);
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.");
//Start configuration of shield with baudrate.
//For http uses is raccomanded to use 4800 or slower.
if (gsm.begin(2400)) {
Serial.println("\nstatus=READY");
started=true;
} else Serial.println("\nstatus=IDLE");
if(started) {
//Enable this two lines if you want to send an SMS.
if (sms.SendSMS("083129071737", "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(9600);
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
{
int sensorValue = analogRead(A0);
//Serial.println(sensorValue);
lcd.setCursor(0,2);
lcd.print("ADC= ");
lcd.print(sensorValue);
lcd.print(" ");
delay(200);
if(sensorValue > 100){
lcd.clear();
lcd.setCursor(0,2);
lcd.print("KIRIM SMS");
lcd.print(" ");
delay(500);
bool newdata = false;
unsigned long start = millis();
// Every 5 seconds we print an update
while (millis() - start < 5000)
{
if (mySerial.available())
{
char c = mySerial.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)) {
Serial.println("\nstatus=READY");
started=true;
} else Serial.println("\nstatus=IDLE");
if(started) {
if (sms.SendSMS("083129071737", string))
Serial.println("\nSMS sent OK");
if (sms.SendSMS("083129071737", "OK"))
Serial.println("\nSMS sent OK ");
}
}
}
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;
}
}
j. Program Bascom AVR
$regfile = "m8535.dat"
$crystal = 4000000
$baud = 9600
Ddrc = &B11111111
Portc.0 = 1
Dim Perintah As String * 10
Cls
Cursor Off
Do
Perintah = Waitkey()
Select Case Perintah
Case "a" :
Portc.0 = 0
Case "b" :
Portc.0 = 1
End Select
Loop
l. VIDEO HASILNYA
No comments:
Post a Comment