Gửi và nhận SMS bằng Sim800L & Arduino

01/10/2017
gui-va-nhan-sms-bang-sim800l-arduino

Gửi và nhận SMS bằng Sim800L & Arduino

  Sử dụng SIM800 thay thế cho SIM 900 được thực hiện như nhau, Sim800 trong môi trường Arduino để thực hiện công việc gửi, nhận SMS, đọc nội dung SMS, xóa SMS. Bài viết chỉ ở mức cơ bản để các bạn có thể hiểu và sử dụng modul SIM900 trong môi trường Arduino và từ đó tư duy phát triển theo định hướng riêng cho các project khác nhau. 

  Chuẩn bị
Module Sim 900a mini (mình sử dụng loại này bạn nào dùng loại khác thì chú ý nối đúng TX RX).
Mạch Arduino UNO hoặc MEGA
1 Tụ 2200uF / 10V
1 Diode N4007 
Sim điện thoại còn tiền devil
Các bạn tải thư viện Sim900 cho arduino tại đây: GSMSHIELD

Để sử dụng modul sim với nguồn 5V trên mạch Arduino các bạn hàn diode vào chân Vcc và tụ phân cực vào chân Vcc và GND. (Nếu không hàn diode và tụ thì các bạn sử dụng với nguồn 3,3V/2A nhé. nếu dòng nhỏ hơn 2A khi khởi động modul sim sẽ bị tắt do không đủ dòng.) Xem ở đây nhé http://arduino.vn/bai-viet/851-su-dung-module-sim900a-mini-voi-arduino-module-nhan-tin-voi-arduino

   Nối dây
1. Mạch UNO
Module SIM 900A    Arduino UNO
TX    2
RX    3
Power    4
VCC    VCC
GND    GND
2. Mạch MEGA
Module SIM 900A    Arduino MEGA
TX    50
RX    51
Power    4
VCC    VCC
GND    GND
Với mạch MEGA các bạn mở file GSM.cpp trong thư viện ra, ở dòng 27,28

Thay lại pin cho nó trong phần khai báo pin:

#define _GSM_TXPIN_ 2 
#define _GSM_RXPIN_ 3
Thành

#define _GSM_TXPIN_ 50 
#define _GSM_RXPIN_ 51
(Trên đây là cách đơn giản nhất mà mình tìm ra để không phải sửa đổi nhiều thứ trong thư viện)

   Code tham khảo
#include "SIM900.h" 
#include <SoftwareSerial.h> 
#include "sms.h"
 
SMSGSM sms;
 
int numdata; 
boolean started=false; //trạng thái modul sim 
char smstext[160];// nội dung tin nhắn 
char number[20]; // số điện thoại format theo định dạng quốc tế
 
void setup(){   
    Serial.begin(9600);   
    Serial.println("Gui va nhan tin nhan");  
    if (gsm.begin(2400)){     
        Serial.println("\nstatus=READY");     
        started=true;     
    }   else 
        Serial.println("\nstatus=IDLE");  
    
    if(started){     
        sms.SendSMS("+84123456789", "Online");   //đổi lại số của bạn nhé :D
    } 
}
 
void loop() {   
    if(started){     
        int pos; //địa chỉ bộ nhớ sim (sim luu tối đa 40 sms nên max pos = 40)     
        pos = sms.IsSMSPresent(SMS_UNREAD); // kiểm tra tin nhắn chưa đọc trong bộ nhớ     
        //hàm này sẽ trả về giá trị trong khoảng từ 0-40     
        if(pos){//nêu có tin nhắn chưa đọc       
            if(sms.GetSMS(pos, number, smstext, 160)){         
                Serial.print("So dien thoại: ");         
                Serial.println(number);         
                Serial.print("Noi dung tin nhan: ");         
                Serial.println(smstext);         
                sms.SendSMS(number, "Da doc tin");       
            }     
        }     
        delay(1000);   
    } else Serial.println("Offline");
}

 

--------------------------------------------------------------------------------------------------------------------------------------------------------

Sử dụng module SIM900a mini với Arduino - Module nhắn tin với Arduino

   Xây dựng các hệ thống điều khiển từ xa, gửi nhận dữ liệu thu thập từ các cảm biến... ở những nơi không có internet thì sử dụng sóng điện thoại là giải pháp duy nhất vì chi phí rẻ, bất chấp khoảng cách và độ ổn định cao. Với Modul sim 900a kết hợp với mạch xử lý arduino uno hoặc mega các bạn có thể làm được nhiều hệ thống tương đối tốt có thể ứng dụng vào thực tế như bộ định vị, các hệ thống điều khiển thiết bị từ xa qua điện thoại, sms makerting,...

   Nối mạch
Modul sim900a mini mình hàn thêm diot vào chân vcc và tụ 2200uF/10V để sử dụng được nguồn 5v từ mạch arduino

5V nối với chân 5V của board Arduino.
GND nối với chân GND của board Arduino.
TX nối với chân 51/2 của board Arduino MEGA/UNO.
RX nối với chân 50/3 của board Arduino MEGA/UNO.
PWR: Đây là chân bật tắt modul sim900a.     
SPK: Chân này cần kết nối nếu bạn muốn xuất âm thanh ra loa thoại. 
MIC: Chân này cần kết nối nếu bạn muốn tạo mic để đàm thoại.
Tùy theo mạch các bạn đang sử dụng để sửa lại chân tx rx trong thư viện, nếu bạn nào sử dung lệnh AT thì có thể sử dụng chân khác

Sơ đồ nối dây trên mình nối để sử dụng với thư viện SIM900 LIB

  Các chức năng
Thư viện hỗ trợ tương đối đầy đủ các chức năng mà SIM900 có.

Gọi điện
Nhận cuộc gọi
Gửi tin nhắn
Nhận tin nhắn
Xóa tin nhắn
Đọc tin nhắn
GPS
GPRS
Etc...
Mình chỉ mới tìm hiểu chừng đó mà mình thấy như thế là gần như full chức năng rồi. Có thời gian các bạn tìm hiểu thêm phần MIC và LOA nhé. Mình hơi bận nên không tìm hiểu vì không dùng tới, những dự án của mình làm chủ yếu dùng SMS, GPS, GPRS. Hiện mình đang sử dụng thư viện này trong bộ định vị xe máy và phát hiện mất xe báo về số điện thoại mình.(Chả là mình vừa mới bị hack mấy con xe nên cay cú mới làm bộ giám sát này crying). Bạn nào muốn làm 1 bộ cho xe thì có thể để lại comment mình sẽ viết bài hưỡng dẫn. heart

Mình không biết nó có hoạt động được với những modul sử dụng ic SIM900A không vì mình chỉ mới test trên Modul SIM900A mini mình có thôi. Bạn nào sử dụng modul khác mà được thì để lại comment chia sẻ nhé(nó miễn phí mà devil). Mà các bạn có ý định mua thì modul SIM900A mini là đủ dùng rồi, nhỏ gọn lại rẻ tiền nữa phù hợp với sinh viên làm mấy cái project nhỏ nhỏ, đồ án, bài tập lớn... hay đại loại thứ gì đó tương tự.

   Các hàm trong thư viện
1. Hàm này dùng để thiết lập một kết nối GPRS với tên miền sử dụng chứng thực (nếu cần thiết)
int attachGPRS(char* domain, char* dom1, char* dom2)
Thông số và giá trị trả về:

doamin: Con trỏ đến một chuỗi chứa tên miền địa chỉ của kết nối GPRS
dom1: Con trỏ đến chuỗi tên người dùng (không sử dụng nếu không cần thiết)
dom2: Con trỏ đến chuỗi mật khẩu (không sử dụng nếu không cần thiết)
Giá trị trả về kiểu boolean:

0 - Không thể thiết lập một kết nối GPRS
1 - Kết nối thiết lập thành công
2. Ngắt kết nối GPRS
int dettachGPRS()
3. Bắt đầu một kết nối tới máy chủ tại 1 port
int connectTCP(const char* server, int port)
Thông số và giá trị trả về:

server: Con trỏ đến chuỗi địa chỉ máy chủ, nó có thể là IP hoặc địa chỉ bình thường
port: cổng được sử dụng để thiết lập kết nối
Ví dụ. gsm.connectTCP ("www.google.com", 80) Ví dụ. gsm.connectTCP ("74.125.39.106", 80)

Kiểu trả về boolean:

0 - Không thể bắt đầu kết nối TCP
1 - Kết nối đến máy chủ thành công
4. Dừng các kết nối TCP đến máy chủ.
int disconnectTCP ()
5. Thiết lập SIM900 vào chế độ máy chủ, chờ khách hàng kết nối TCP đến trên cổng xác định.
int connectTCPServer(int port)
Thông số và giá trị trả về:

port: cổng được sử dụng để thiết lập kết nối
Kiểu trả về boolean:

0 - Không thể bắt đầu kết nối máy chủ
1 - Máy chủ bắt đầu thành công, chờ đợi kết nối từ máy khách
6. Nghe và gọi
include "call.h";
CallGSM call_classname;
Thực hiện cuộc gọi đến 1 số điện thoại

Call(char *number_string)
Ví dụ:

call_classname.Call("+84123456789"); //sdt phải format theo định dạng quốc tế
Thực hiện cuộc gọi đến 1 số điện thoại đã được lưu trong sim

Call(int sim_position) // sim_position: Vị trí sdt lưu trong bộ nhớ Sim
Gọi tới 1 số điện thoại đã được lưu trong bộ nhớ SIM. Ví dụ:

call_classname.Call(1); // gọi số được lưu ở vị trí số 1 trong danh bạ SIM
Tắt cuộc gọi

HangUp(void)
Ví dụ:

call_classname.HangUp();
Nhận cuộc gọi

PickUp(void)
Nhận cuộc gọi tới Ví dụ

call_classname.PickUp();
7. Gửi nhận tin nhắn
include "sms.h";
SMSGSM sms_classname; //khai báo class
Gửi tin nhắn

SendSMS(char *number_str, char *message_str)
number_str: số điện thoại (format theo định dạng quốc tế)
message_str: nội dung tin nhắn
Kiểu trả về

0 - gửi sms không thành công
1 - gửi sms thành công
Ví dụ

sms_classname.SendSMS("+84123456789", "noi dung tin nhan");
Gửi tin đến sdt lưu trong danh bạ sim

SendSMS(byte sim_phonebook_position, char *message_str)
sim_phonebook_position: Vị trí sdt
message_str: nội dung tin nhắn
Ví dụ

sms_classname.SendSMS(1, "noi dung tin nhan");
Xác định trạng thái tin nhắn trong hộp thư đến

IsSMSPresent(byte required_status)
Trạng thái:

SMS_UNREAD: Chưa đọc
SMS_READ: Đã đọc
SMS_ALL: Toàn bộ tin nhắn có trong hộp thư
Ví dụ:

char position;
char phone_number[20]; // sdt
char *sms_text;
position = sms_classname.IsSMSPresent(SMS_UNREAD);
if (position) { // có tin nhắn mới
   sms_classname.GetGSM(position, tel_number, sms_text);
}
Đọc nội dung tin nhắn

GetSMS(byte position, char *phone_number, char *SMS_text, byte max_SMS_len)
position: vị trí tin nhắn trong hộp thư
phone_number: số điện thoại gửi tin
SMS_text: nội dung tin nhắn
max_SMS_len: Độ dài tin nhắn vừa nhận
Trả về:

GETSMS_NO_SMS: không tìm thấy tin nhắn
GETSMS_UNREAD_SMS: tìm thấy tin nhắn
GETSMS_READ_SMS: đã đọc tin nhắn
Ví dụ:

GSM gsm;
include "sms.h";
SMSGSM sms_classname;
char position;
char phone_num[20]; // sdt
char sms_text[100]; // nội dung tin nhắn
position = sms_classname.IsSMSPresent(SMS_UNREAD);
if (position) {
    // nếu có tin nhắn 
    sms_classname.GetGSM(position, phone_num, sms_text, 100);
    Serial.println("DEBUG SMS phone number: ", 0);
    Serial.println(phone_num, 0);
    Serial.println("\r\n SMS text: ", 0);
    Serial.println(sms_text, 1);
}
Đọc tin nhắn từ vị trí xác định

GetAuthorizedSMS( byte position, char *phone_number, char *SMS_text, byte max_SMS_len, byte first_authorized_pos, byte last_authorized_pos)
GETSMS_NO_SMS: không tìm thấy sms
GETSMS_NOT_AUTH_SMS: không tìm thấy sms
GETSMS_AUTH_SMS: tìm thấy sms
Xóa sms tại vị trí nào đó trong bộ nhớ sim

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

Bình luận (2)
binh-luan

Anhky

01/10/2017

em muốn tìm hiểu về code định vị xe bằng module sim ạ: anh có thể gợi ý cho em dc ko
binh-luan

Nguyễn Văn Thắng

01/10/2017

em muốn sim gửi giá trị mà cảm biến đo được tới điện thoại thì viết code như nào đk ạ ??
VIẾT BÌNH LUẬN CỦA BẠN