Chào các bạn hôm nay mình sẽ hướng dẫn các bạn làm mạch định vị GPS gửi tin nhắn về điện thoại bằng module sim 800c dựa trên nền tảng Arduino

1. Linh kiện cần thiết

  1. Arduino UNO
  2. Module Định vị GPS NEO 6M
  3. Sim 800c
  4. Module chỉnh áp LM2596
  5. Led
  6. Jump
  7. Simcard
  8. C1815
  9. Trở 1k
  10. Trở 4.7k
  11. An ten

2. Module SIM800A

Moule sim 800c này mình tự làm cho mạch này, các bạn có thể dùng module mua sẵn hoặc làm theo mình cũng được.

Mặt sau

Mặt trước

PCB

Các bạn có thể Tải file mạch in Tại đây

Các bạn có thể Xem nguyên lý Tại đây để biết giá trị của linh kiện nhé!

 

Mạch chính

Mạch chính mình sử dụng module arduino uno

Đây là file PCB các bạn có thể Tải về làm.

Xem file Nguyên lý Ở đây nhé

Các bạn có thể tải về để xem

Code

#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <TinyGPS.h>

//#include <LiquidCrystal_I2C.h>;
//LiquidCrystal_I2C lcd(0x27,16,2);

#define PIN_TX 10
#define PIN_RX 11
#define BAUDRATE 9600

#define PHONE_NUMBER "+841654151020"
#define MESSAGE "Module duoc kich hoat"

#define EXP 1000000 // độ chính xác đến 6 chữ số thập phân

int PWERKEY = 6;
String text1="Get_location";

#define SMS_LENGTH 160
char message[SMS_LENGTH];
int messageIndex = 0;

int gsm_status=7;
int gps_status=8;

char phone[16];
char datetime[24];

char sms_cmd[]="http://maps.google.com/maps?q=%ld.%ld,%ld.%ld&t=m&z=36\n\r";
char sms_report[70];
//int sms_report_status=0;

TinyGPS gps;
SoftwareSerial ss(4, 3);
GPRS Sendsms(PIN_TX,PIN_RX,BAUDRATE);

//Function
void parse_float(float val, unsigned long &prefix, unsigned long &suffix);
void Creat_SMS(float longitude, float latitude);

void setup() {

int count_gsm_init=0;

//lcd.init(); //Khởi động màn hình. Bắt đầu cho phép Arduino sử dụng màn hình
//lcd.backlight(); //Bật đèn nền

//lcd.setCursor(0,0);
//lcd.print("Initialize GSM-GPS");
INIT:
count_gsm_init=0;
pinMode(gsm_status,OUTPUT);
pinMode(gps_status,OUTPUT);
pinMode(PWERKEY,OUTPUT);

digitalWrite(gsm_status,HIGH);
digitalWrite(gps_status,HIGH);
digitalWrite(PWERKEY,HIGH);
ss.begin(9600);
GPRS Sendsms(PIN_TX,PIN_RX,BAUDRATE);
Serial.begin(9600);
while(!Sendsms.init())
{
delay(1000);
Serial.println("int error\r\n");
count_gsm_init++;
if(count_gsm_init==5)
goto INIT;
}
digitalWrite(gsm_status,LOW);
Serial.println("Kiem tra thanh cong");
Sendsms.sendSMS(PHONE_NUMBER,MESSAGE);
delay(2000);
Serial.println(" Da gui tin nhan");
//lcd.setCursor(0,1);
//lcd.print("Succesful!");
//delay(2000);
//

//lcd.clear();
}

void loop() {
bool newData = false;
unsigned long chars;
unsigned short sentences, failed;
ss.begin(9600);
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start < 1000;)
{
while (ss.available())
{
char c = ss.read();
// Serial.write(c); // uncomment this line if you want to see the GPS data flowing
if (gps.encode(c)) // Did a new valid sentence come in?
newData = true;
}
}

if (newData)
{
float flat, flon;
float kinhdo, vido;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
//Serial.print("LAT=");
kinhdo=(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon);
vido=(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat);
//Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
//Serial.print(vido, 6);
//Serial.print(" LON=");
//Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
//Serial.print(kinhdo, 6);
//Serial.print(" SAT=");
//Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
//Serial.print(" PREC=");
// Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
digitalWrite(gps_status,LOW);
Creat_SMS(vido,kinhdo);
}
else
{
gps.stats(&chars, &sentences, &failed);
Serial.print(" CHARS=");
Serial.print(chars);
Serial.print(" SENTENCES=");
Serial.print(sentences);
Serial.print(" CSUM ERR=");
Serial.println(failed);
if (chars == 0)
Serial.println("** No characters received from GPS: check wiring **");
sprintf(sms_report,"Chua xac dinh duoc toa do\r\n");
}

GPRS Sendsms(PIN_TX,PIN_RX,BAUDRATE);
messageIndex = Sendsms.isSMSunread();
if( messageIndex > 0)
{
Sendsms.readSMS(messageIndex, message, SMS_LENGTH, phone, datetime);
Sendsms.deleteSMS(messageIndex);
Serial.print(" So dien thoai gui: ");
Serial.println(phone);
Serial.print(" Ngay thang: ");
Serial.println(datetime);
Serial.print(" Noi dung: ");
Serial.println(message);
if(text1.equalsIgnoreCase(message))
{
Serial.println(text1+": Bang nhau " );
Serial.println(" Dang gui lai " );
Sendsms.sendSMS(PHONE_NUMBER,sms_report);
Serial.println(" Da gui xong" );
}
else
{
Sendsms.sendSMS(PHONE_NUMBER,"Tin nhan sai cu phap. De lay toa do, gui tin nhan co dang: <Get_Location>.\r\n");
Serial.println(text1+": Khong bang nhau" );
}
}
}

void parse_float(float val, unsigned long &prefix, unsigned long &suffix) {
prefix = long(val);
suffix = (val - prefix) * EXP;
}

void Creat_SMS(float latitude, float longitude) {

//char lcd_buff[16];

unsigned long longitude_pre, longitude_suf, latitude_pre, latitude_suf;

parse_float(longitude, longitude_pre, longitude_suf); // 2 biến prefix, suffix là ánh xạ đến vùng nhớ của biến temp_pre, temp_suf
parse_float(latitude, latitude_pre, latitude_suf);
sprintf(sms_report, sms_cmd, latitude_pre, latitude_suf, longitude_pre, longitude_suf);
/*
sprintf(lcd_buff,lcd_line1,latitude_pre, latitude_suf);
lcd.setCursor(0,0);
lcd.print(lcd_buff);

sprintf(lcd_buff,lcd_line2,longitude_pre, longitude_suf);
lcd.setCursor(0,1);
lcd.print(lcd_buff);
*/
//Serial.println(sms_report);
}

/////////////////////////////////////

 

Chúc các bạn thành công,

Hình ảnh về mạch thật

Nếu bạn cần hỗ trợ về code thì cứ liên hệ với liên hệ với mình.