Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membat sebuah alat yang dapat memonitor jarak dan lokasi menggunakan arduino dan ditampilkan ke handphone android secara realtime. alat ini menggunakan media bluetooth sebagai media pengiriman datanya sehingga jaraknya tidak bisa jauh. untuk lebih jelasnya berikut adalah skema dan programnya.
a. Arduino Uno
b. LCD + I2C
c. Bluetooth HC-05
d. Sensor Jarak HC-SRF04
e. GPS NEO UBLOX 6MV2
g. Program Arduino IDE
//vcc pada GPS modul adalah 3,3 volt
/*********************
*10 to GPS Module TX*
*09 to GPS Module RX*
*********************/
#include <Wire.h> // i2C Conection Library
#include <LiquidCrystal_I2C.h> //i2C LCD Library
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#define trigPin 9
#define echoPin 8
SoftwareSerial mySerial(10, 11);
TinyGPS gps;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);
long duration, distance;
void setup()
{
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
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
{
digitalWrite(trigPin, LOW); // Added this line
delayMicroseconds(2); // Added this line
digitalWrite(trigPin, HIGH);
delayMicroseconds(10); // Added this line
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
lcd.setCursor(13,0);
lcd.print(distance);
lcd.print(" ");
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();
}
}
void gpsdump(TinyGPS &gps)
{
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;
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);
Serial.print("jarak= ");
Serial.print(distance);
Serial.println(" cm");
Serial.print("long= ");
Serial.println(flat, 5);
Serial.print("lat= ");
Serial.println(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;
}
}
/*********************
*10 to GPS Module TX*
*09 to GPS Module RX*
*********************/
#include <Wire.h> // i2C Conection Library
#include <LiquidCrystal_I2C.h> //i2C LCD Library
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#define trigPin 9
#define echoPin 8
SoftwareSerial mySerial(10, 11);
TinyGPS gps;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);
long duration, distance;
void setup()
{
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
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
{
digitalWrite(trigPin, LOW); // Added this line
delayMicroseconds(2); // Added this line
digitalWrite(trigPin, HIGH);
delayMicroseconds(10); // Added this line
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
lcd.setCursor(13,0);
lcd.print(distance);
lcd.print(" ");
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();
}
}
void gpsdump(TinyGPS &gps)
{
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;
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);
Serial.print("jarak= ");
Serial.print(distance);
Serial.println(" cm");
Serial.print("long= ");
Serial.println(flat, 5);
Serial.print("lat= ");
Serial.println(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;
}
}
h. VIDEO HASILNYA