- 29a Bùi Xuân Phái, P.Tây Thạnh, Quận Tân Phú, TPHCM
- linhkienduchuy2018@gmail.com
- 0942954739 - 0919900767
Giao miễn phí trong nội thành TPHCM đối với đơn hàng trên 1 triệu đồng
Tặng ngay 50.000đ cho đơn hàng trên 2 triệu đồng
SIM808 được tích hợp GPS/GSM/GPRS/BLUETOOTH trên cùng 1 module, vì lẽ đó khi chỉ cần sử dụng 1 module này ta có thể : nhắn tin, nghe, gọi, biết được vị trí (GPS), truyền nhận dữ liệu qua bluetooth...vậy thì quá tuyệt vời, thay vì phải sử dụng 3 module ( 1 GSM, 1 GPS, 1 BLUETOOTH) để có cùng chức năng như trên.
TÀI LIỆU KỸ THUẬT MODULE SIM808:
+ Nguồn cấp: 5 -26VDC. Được tích hợp IC ổn áp nên dải điện áp đầu vào rộng.
+ Có hỗ trợ chân cấp nguồn pin Lithium - Ion: 3.5 - 4.2V.
+ Chức năng truyền nhận dữ liệu qua bluetooth.
+ Tích hợp 2 jack phone + micro trên cùng board mạch để tiện cho việc nghe thoại.
+ Tích hợp 3 ăng ten cho các chức năng: GSM/GPRS; GPS; BLUETOOTH
+ Hỗ trợ đầy đủ các sim 2G, 3G, 4G
+ Gửi và nhận dữ liệu GPRS (TCP / IP, HTTP, v.v.).
+ Nhận dữ liệu GPS và dữ liệu A-GPS.
+ Gửi và nhận tin nhắn SMS.
+ Thực hiện cuộc gọi, trả lời tin nhắn tự động.
SƠ ĐỒ GIAO TIẾP ARDUINO VỚI SIM808:
SƠ ĐỒ GIAO TIẾP USB-TTL VỚI SIM808:
TẬP LỆNH AT GIAO TIẾP CƠ BẢN VỚI MODULE SIM:
LỆNH KIỂM TRA MODULE SIM HOẠT ĐỘNG:
Lệnh: AT<CR><LF>
MODULE SIM Trả lời: OK
Mô tả : Kiểm tra đáp ứng , nếu trả về OK thì Module hoạt động tốt
LỆNH KIỂM TRA TỐC ĐỘ BAUD GIAO TIẾP VỚI MODULE SIM:
Lệnh: AT+IPR=[baud rate]<CR><LF>
Trả lời: OK
Mô tả : cài đặt tốc độ giao tiếp dữ liệu với module SIM, chỉ cài được các tốc độ sau
Baud rate : 0 (auto), 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
CÁC LỆNH ĐIỀU KHIỂN CUỘC GỌI:
Mô tả : Hiển thị thông tin cuộc gọi đến
Mô tả : Lệnh thực hiện cuộc gọi, với XXXXX: là số điện thoại cần gọi
Mô tả : Lệnh thực hiện kết thúc cuộc gọi, hoặc cúp máy khi có cuộc gọi đến
Mô tả : Lệnh thực hiện chấp nhận khi có cuộc gọi đến
CÁC LỆNH ĐIỀU KHIỂN TIN NHẮN:
Mô tả : Lệnh đưa SMS về chế độ Text , phải có lệnh này mới gửi nhận tin nhắn dạng Text
XXXXXXX: là số điện thoại cần gửi tin nhắn.
Đợi đến khi có ký tự ‘>’ được gửi về thì đánh nối dung tin nhắn.
Gửi mã Ctrl+Z hay 0x1A để kết thúc nội dung và gửi tin nhắn.
Mô tả : Lệnh gửi tin nhắn
x là địa chỉ tin nhắn cần đọc
Mô tả : Đọc một nhắn vừa gửi đến, lệnh được trả về nội dung tin nhắn, thông tin người gửi, thời gian gửi
Mô tả : Xóa toàn bộ tin nhắn trong các hộp thư
Mô tả : Hiển thị nội dung tin nhắn ngay khi có tin nhắn đến
TẬP LỆNH AT GPS GIAO TIẾP MODULE SIM808:
AT + CGPSPWR=1<CR><LF> lệnh bật/tắt nguồn cho GPS. Trả về OK nếu mạch chấp nhận.
AT + CGPSPWR=?<CR><LF> lệnh kiểm tra các chế độ hiện có của GPS. Trả về giá trị (0-1)
AT + CGPSPWR?<CR><LF> lệnh kiểm tra GPS đang bật/ tắt trả về tín hiệu
0: đang tắt GPS, 1: đang bật GPS.
AT+ CGPSSTATUS?<CR><LF> lệnh trả về trạng thái hiện tại của chân GPS CONTROL PIN. tín hiệu trả về:
( Location Not Fix ) Hệ thống GPS chưa có dữ liệu vị trí chính xác
( Location 3D Fix ) Hệ thống GPS đã xác định được vị trí với độ chính xác 3 chiều (vĩ độ, kinh độ, và độ cao)
( Location 2D Fix ) GPS đã xác định được vị trí với độ chính xác 2 chiều (vĩ độ và kinh độ)
AT + CGPSINF=0<CR><LF> để nhận thông tin vị trí GPS dưới dạng chuỗi dữ liệu
CODE GIAO TIẾP ARDUINO VỚI SIM808:
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
boolean GetGPS_flag = false;
boolean Location_isValid_flag = false;
boolean Password_flag = false;
String value;
String phone_number;
String message_text;
String password = "Hello";
String Message;
#define PIN_TX 10
#define PIN_RX 11
SoftwareSerial mySerial(PIN_TX, PIN_RX);
// The TinyGPS++ object
TinyGPSPlus gps;
String SIM808(String value)
{
String Out;
mySerial.println(value);
delay(10);
while (mySerial.available()) {
Out = (mySerial.readString());
}
Out.trim();
Out.remove(0, value.length() + 3);
return Out;
}
String SIM808(String value, int count) {
String Out;
mySerial.println(value);
delay(10);
while (mySerial.available()) {
Out = (mySerial.readString());
}
Out.trim();
Out.remove(0, value.length() + 3 + count);
return Out;
}
void setup() {
mySerial.begin(9600);
Serial.begin(9600);
}
void loop() {
//ĐOẠN CHƯƠNG TRÌNH NHẬN TIN NHẮN SMS
Serial.println("Start\n");
Serial.println("Power Down The GPS");
SIM808("AT+CGPSPWR=0");
Serial.println("Check AT Connection");
value = SIM808("AT");
Serial.println(value);
Serial.println("");
Serial.println("Put The Module in SMS Text Mode");
SIM808("AT+CMGF=1");
delay(1000);
Serial.println("Delete All Previous Messages");
SIM808("AT+CMGD=1,4");
delay(2000);
value = SIM808("AT+CMGL=\"REC UNREAD\"");
value = SIM808("AT+CMGL=\"REC UNREAD\"");
value = SIM808("AT+CMGL=\"REC UNREAD\"");
do {
delay(2000);
Serial.println("No new Messages Received");
Serial.println("Check for New Messages!");
value = SIM808("AT+CMGL=\"REC UNREAD\"");
//Serial.println("end");
} while (value == "OK");
SIM808("AT+CMGL=\"REC UNREAD\"");
Serial.println("Message Recieved");
value = SIM808("AT+CMGL=\"ALL\"");
Serial.println(value);
phone_number = value;
phone_number.remove(0, 20);
phone_number.remove(15, phone_number.length());
message_text = value;
message_text.remove(0, 63);
message_text.remove(message_text.length() - 6, message_text.length());
Serial.println("Phone Number:");
Serial.println(phone_number);
Serial.println("Message Text:");
Serial.println(message_text);
if (message_text == password) {
GetGPS_flag = true;
Password_flag = true;
Serial.println("password is correct!");
}
//KẾT THÚC
//***********ĐOẠN CHƯƠNG TRÌNH NHẬN DỮ LIỆU GPS*********
if (GetGPS_flag) {
do {
Serial.println("Power Down The GPS");
SIM808("AT+CGPSPWR=0");
//Serial.println("end");
Serial.println("Check The GPS Power");
value = SIM808("AT+CGPSPWR?");
value.remove(11, 17);
Serial.println(value);
//Serial.println("end");
Serial.println("Power Up The GPS");
SIM808("AT+CGPSPWR=1");
//Serial.println("end");
Serial.println("Disable The GPS Output");
SIM808("AT+CGPSOUT=0");
//Serial.println("end\n");
Serial.println("Wait For The GPS To Find Location");
while (!SIM808("AT+CGPSSTATUS?" , 13).startsWith("Location 3D Fix")) {
Serial.println("Location Not Fixed Yet, Please Wait!");
delay(2000);
}
Serial.println("Location Found!");
Serial.println("end\n");
//Get and Analyse The GPS Output
Serial.println("Get and Analyse The GPS Output");
String Out = "";
mySerial.println("AT+CGPSOUT=2");
delay(10);
while (mySerial.available()) {
mySerial.readStringUntil('\n');
mySerial.readStringUntil('\n');
Out = (mySerial.readStringUntil('\n')); Out += "\r\n";
}
mySerial.println("AT+CGPSOUT=0");
delay(100);
mySerial.println("AT+CGPSOUT=32");
delay(10);
while (mySerial.available()) {
mySerial.readStringUntil('\n');
mySerial.readStringUntil('\n');
Out += (mySerial.readStringUntil('\n')); Out += "\r\n";
}
mySerial.println("AT+CGPSOUT=0");
Out.trim();
Serial.println(Out);
Serial.println("");
//GPS Output Analized
int buffint = Out.length();
char buff[buffint];
Out.toCharArray(buff, buffint);
const char *gpsStream = buff;
while (*gpsStream)
if (gps.encode(*gpsStream++))
displayInfo();
Serial.println("");
Serial.println("");
delay(100);
if (gps.location.isValid())
{
Location_isValid_flag = true;
Message = String(gps.location.lat(), 6);
Message += ",";
Message += String(gps.location.lng(), 6);
Message += " ";
Serial.println(Message);
}
} while (!Location_isValid_flag);
}
//******************* KẾT THÚC NHẬN GPS *******************
//******************* SENDING SMS *******************
Serial.println("Start Sending The SMS\n");
Serial.println("Sending The SMS to");
Serial.println(phone_number);
SIM808("AT+CMGS=" + phone_number );
delay(200);
if (Password_flag == true) {
mySerial.println("Open This Link:");
mySerial.print("https://www.google.com/maps/place/");
SIM808(Message);
}
else {
mySerial.println("Password Incorrect! ");
}
Serial.println("Message Sent!");
Serial.println("Delete All Previous Messages");
SIM808("AT+CMGD=1,4");
delay(2000);
//******************* SENDING SMS END*******************
//reinitializing flags
GetGPS_flag = false;
Location_isValid_flag = false;
Password_flag = false;
}
void displayInfo()
{
Serial.print(F("Location: "));
if (gps.location.isValid())
{
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
}
else
{
Serial.print(F("INVALID"));
}
Serial.println();
}
char * floatToString(char * outstr, double val, byte precision, byte widthp) {
char temp[16];
byte i;
// compute the rounding factor and fractional multiplier
double roundingFactor = 0.5;
unsigned long mult = 1;
for (i = 0; i < precision; i++)
{
roundingFactor /= 10.0;
mult *= 10;
}
temp[0] = '\0';
outstr[0] = '\0';
if (val < 0.0) {
strcpy(outstr, "-\0");
val = -val;
}
val += roundingFactor;
strcat(outstr, itoa(int(val), temp, 10)); //prints the int part
if ( precision > 0) {
strcat(outstr, ".\0"); // print the decimal point
unsigned long frac;
unsigned long mult = 1;
byte padding = precision - 1;
while (precision--)
mult *= 10;
if (val >= 0)
frac = (val - int(val)) * mult;
else
frac = (int(val) - val ) * mult;
unsigned long frac1 = frac;
while (frac1 /= 10)
padding--;
while (padding--)
strcat(outstr, "0\0");
strcat(outstr, itoa(frac, temp, 10));
}
// generate space padding
if ((widthp != 0) && (widthp >= strlen(outstr))) {
byte J = 0;
J = widthp - strlen(outstr);
for (i = 0; i < J; i++) {
temp[i] = ' ';
}
temp[i++] = '\0';
strcat(temp, outstr);
strcpy(outstr, temp);
}
return outstr;
}
Bình luận