Hướng dẫn lập trình module sim900A và Arduino

Xin chào các bạn!

Hôm nay, mình hướng dẫn các bạn cách lập trình module Sim900A  với  Arduino Uno (Trong bài mình sử dụng mạch Uno VN01)

Cụ thể,  bài viết hướng dẫn các bạn các phần sau:

Một số lện AT thường dùng với module Sim900A

1.Lệnh chung

Lệnh:      AT<CR><LF>

Trả lời:   OK<CR><LF>

Mô tả : Kiểm tra đáp ứng của Module Sim 900A, nếu trả về OK thì Module hoạt động

 

Lệnh:      ATE[x]<CR><LF>

Trả lời:   OK<CR><LF>

Mô tả : Chế độ echo là chế độ phản hồi dữ liệu truyền đến của module Sim 900A,

x = 1 bật chế độ echo , x = 0 tắt chế độ echo (bạn nên tắt chế độ này)

 

Lệnh:      AT+IPR=[baud rate]<CR><LF>

Trả lời:   OK<CR><LF>

Mô tả : cài đặt tốc độ giao tiếp dữ liệu với module Sim 900A, chỉ cài được các tốc độ sau

baud rate :    0  (auto), 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200

 

2.Lệnh điều khiển cuộc gọi

Lệnh:      ATD[Số_điện_thoại];<CR><LF>

Trả lời:   OK<CR><LF>

Mô tả : Lệnh thực hiện cuộc gọi

 

Lệnh:      ATH<CR><LF>

Trả lời:   OK<CR><LF>

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

Lệnh:      ATA<CR><LF>

Trả lời:   OK<CR><LF>

Mô tả : Lệnh thực hiện chấp nhận khi có cuộc gọi đến

Chú ý: khi nhân được cuộc gọi đến thì Module Sim 900A sẽ phản hồi về như sau

    RING

    RING

Nếu muốn hiển thị thông tin người gọi đến các bạn thực hiên thêm lệnh sau

Lệnh:      AT+CLIP=1<CR><LF>

Trả lời:   OK<CR><LF>

 

3.Lệnh điều khiển tin nhắn

Lệnh:      AT+CMGF=1<CR><LF>

Trả lời:   OK<CR><LF>

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

 

Cấu trúc gửi tin nhắn

Lệnh:      AT+CMGS=”Số_điện _thoại”<CR><LF>

Đợi đến khi có ký tự ‘>’ được gửi về

Gửi nội dụng tin nhắn : “This is a test

Gửi mã Ctrl+Z  hay  0x1A để kết thúc nội dung và gửi tin nhắn

Trả lời :  OK<CR><LF>

 

Lệnh:      AT+CMGR=1<CR><LF>

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

Chú ý: Nếu Module Sim 900A nhận được một tin nhắn bất kỳ, thì nó gửi về cụm “+CMTI” để thông báo

Trong trường hợp bạn muốn hiển thị trực tiếp nội dung tin nhắn(không lưu vào bộ nhớ của sim) bạn gửi lệnh sau

AT+CNMI=2,2<CR><LF>

Chú ý: sau mỗi lệnh các bạn thường thấy <CR><LF>  thực chất nó là hai mã điều khiển  <CR>  tương ứng 0x0D(hexa)

                                                                                                                                    <LF>  tương ứng 0x0A(hexa)  

nếu các bạn test trên máy tính sau mỗi lệnh các bạn chỉ cần ấn phím Enter

Ví dụ  : gõ AT rồi ấn Enter

 

Chuẩn bị phần cứng và kết nối

   1 Nguồn 12VDC/1A

   http://mlab.vn/1272384-adapter-dc-12v-1a.html

   1  Sim900A Shield 

   http://mlab.vn/408321-module-sim900a.html

   1 Uno VN01

   http://mlab.vn/1697809-uno-vn01-arduino-uno-phien-ban-viet-nam.html

   1 Module Relay 12V

   http://mlab.vn/186624-module-relay-12vdc.html

   1 thiết bị điện mà bạn muốn điều khiển. Trong bài hướng dẫn này mình sử dụng bóng đèn 12V.

    Dây kết nối

Bạn có thể xem hình sẽ thấy trực quan hơn

Quy trình kết nối , 

Đơn giản, chỉ cần cắm Shield Sim900A lên kit Arduino Uno

Lúc này ác dây chân Gnd, Rx, Tx, PWR_KEY được kết nối giữa Module Sim900A và Arduino

Tiếp theo dùng dây để kết nối các thành phần còn lại (bạn kết nối như hình mô tả trên cùng)

Cắm dây USB 5V vào Arduino , Cắm nguồn 12V vào Shield Sim900A để cấp nguồn cho module Sim900A hoạt động

Như vậy ta đã chuẩn bị xong phần cứng

Phần lập trình , các bạn mở Arduino IDE lên và copy đoạn code dưới vào

Trong code mình đã ghi chú khá chi tiết

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

// Bai toan : nhan tin dieu khien bat tat bong den
// Neu noi dung tin nhan la : LAMP_ON       thi bat bong den
// Neu noi dung tin nhan la : LAMP_OFF      thi tat bong den
 
 
const String myphone = "01689951815";     // Thay so cua ban vao day
const int PWR_KEY =  9;                          // Chan so 9 arduino uno dung lam chan dieu khien bat tat module sim900A
const int RELAY =  12;                              // Chan so 12 arduino uno dung lam chan dieu khien dong/cat Relay de On/Off den
 
String RxBuff = "";                                    // Khai bao bo dem nhan du lieu
                                                                // Tat ca du lieu nhan ve tu module sim deu duoc luu trong day 
 
int Index_Lamp_On = -1;                           // vi tri cua chuoi "LAMP_ON"
int Index_Lamp_Off = -1;                           // vi tri cua chuoi "LAMP_OFF"
 
void Gsm_Power_On();                                            // Bat module Sim 900A
void Gsm_Init();                                                       // Cau hinh Module Sim 900A
void Gsm_MakeCall(String phone);                            // Ham goi dien
void Gsm_MakeSMS(String phone,String content);     // Ham nhan tin
 
 
void setup() {
  Serial.begin(9600);                           // Cau hinh UART de giao tiep module Sim 900A
 
  digitalWrite(RELAY, LOW);               // Khai bao chan  de dieu khien dong cat RELAY
  pinMode(RELAY, OUTPUT);
 
  digitalWrite(PWR_KEY, LOW);         // Khai bao chan PWR_KEY de dieu khien bat bat module Sim 900A
  pinMode(PWR_KEY, OUTPUT);
  
  delay(1000);                       
  Gsm_Power_On();                                      // Bat Module Sim 900A
  delay(10000);
  Gsm_Init();                                                 // Cau hinh module Sim 900A
  Gsm_MakeCall(myphone);                          // Test cuoc goi 
  Gsm_MakeSMS(myphone,"I'm a test");       // Test tin nhan
}
 
void loop() {
  delay(1000);                                                                    // tre 1s 
  Index_Lamp_On = RxBuff.indexOf("LAMP_ON");              // Tim vi tri cua chuoi "LAMP_ON" trong bo dem nhan RxBuff
  if(Index_Lamp_On >= 0)                                                   // Neu tim thay "LAMP_ON" trong RxBuff
  {
    Index_Lamp_On = -1;                                                     // 
    RxBuff = "";                                                                   // Xoa bo dem
    digitalWrite(RELAY, HIGH);                                             // Dong Relay de bat den // Bat bong den
  }
  else
  {                                                                                    // Neu khong tim thay "LAMP_ON" thi tiep tuc tim "LAMP_OFF"
    Index_Lamp_Off = RxBuff.indexOf("LAMP_OFF");          // Tim vi tri cua chuoi "LAMP_OFF" trong bo dem nhan RxBuff  
    if(Index_Lamp_Off >= 0)                                                // Neu tim thay "LAMP_OFF" trong RxBuff
    {
      Index_Lamp_Off = -1;                                                   // 
      RxBuff = "";                                                                // Xoa bo dem
      digitalWrite(RELAY, LOW);                                           // Cat Relay de tat den
    }
  }
}
 
void serialEvent() {                                          // Chuong trinh ngat nhan du lieu
  while (Serial.available()) {                               // Doi den khi co du lieu nhan ve
    // get the new byte:
    char inChar = (char)Serial.read();                  // Doc mot byte du lieu vua nhan ve
    RxBuff += inChar;                                       // Ghi byte do vao bo dem nhan RxBuff (ta se xu ly RxBuff trong vong loop()) 
    if(RxBuff.length()>= 128)                              // Neu bo dem qua dai thi xoa bo dem di
    {
      RxBuff = "";
    }
  }
}
 
void Gsm_Power_On()
{
  digitalWrite(PWR_KEY, HIGH);                // Du chan PWR_KEY len cao it nhat 1s 
  delay(1500);                                            // o day ta de 1,5s
  digitalWrite(PWR_KEY, LOW);                  // Du chan PWR_KEY xuong thap
  delay(100);                                              // cac ban xem trong Hardware designed sim900A de hieu ro hon
}
 
void Gsm_Init()
{
  Serial.println("ATE0");                            // Tat che do phan hoi (Echo mode)
  delay(2000);
  Serial.println("AT+IPR=9600");              // Dat toc do truyen nhan du lieu 9600 bps
  delay(2000);
  Serial.println("AT+CMGF=1");                // Chon che do TEXT Mode
  delay(2000);
  Serial.println("AT+CLIP=1");                  // Hien thi thong tin nguoi goi den
  delay(2000);
  Serial.println("AT+CNMI=2,2");              // Hien thi truc tiep noi dung tin nhan
  delay(2000);
}
 
void Gsm_MakeCall(String phone)           
{
  Serial.println("ATD" + phone + ";");         // Goi dien 
  delay(10000);                                        // Sau 10s
  Serial.println("ATH");                              // Ngat cuoc goi
  delay(2000);
}
 
void Gsm_MakeSMS(String phone,String content)
{
  Serial.println("AT+CMGS=\"" + phone + "\"");     // Lenh gui tin nhan
  delay(3000);                                                     // Cho ky tu '>' phan hoi ve 
  Serial.print(content);                                          // Gui noi dung
  Serial.print((char)26);                                         // Gui Ctrl+Z hay 26 de ket thuc noi dung tin nhan va gui tin di
  delay(5000);                                                      // delay 5s
}
 

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

Các ấn biên dịch rồi nạp chương trình xuống
Chú ý: Do Arduino Uno R3 chỉ có 1 cổng UART , mà lại có hai chức năng
          - Nạp chương trình xuống Chip
          - Giao tiếp Module Sim900A
Vì thế trong quá trình nạp bạn cần tắt Module Sim900A đi (trên module có một nút ấn , bạn ấn giữ khoảng 2 s rồi nhả ra)
Thấy đèn trên module không nháy nữa thì bạn mới nạp chương trình xuống
 
Trong chương trình : có lệnh test gọi điện và gửi tin nhắn ngay khi bắt đầu chạy.
Dựa vào điều này bạn lấy số trên của Sim và thực hiện điều khiển bật tắt bóng đèn qua điện thoại
Cú pháp  "LAMP_ON"  bật đèn
               LAMP_OFF" tắt đèn
Và đây là kết quả
 
 
 
 
Chúc các bạn thành công!

 

Viết đánh giá

Họ và tên:


Đánh giá của bạn: Lưu ý: Không hỗ trợ HTML!

Bình chọn: Dở            Hay

Nhập mã bảo vệ: