Hướng dẫn làm mạch định vị GPS gửi tin nhắn về điện thoại bằng Module SIM 800A
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
I. Linh kiện cần thiết
-
- Arduino UNO
- Module Định vị GPS NEO 6M
- Sim 800c
- Module chỉnh áp LM2596
- Led
- Jump
- Simcard
- C1815
- Trở 1k
- Trở 4.7k
- An ten
II. 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é!
III.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.
bro có thể làm rõ cái sơ đồ đi dây đc ko á,trông rối quá :((