P14 – Kết Nối Internet Sử Dụng Module Sim A9G

A9G hỗ trợ SIM với đầy đủ các dải tần của nhà mạng ở Việt Nam. Ngoài ra, IC này còn cung cấp khả năng thoại, tin nhắn cũng như thu âm như một thiết bị di động thực thụ. Với dòng tiêu thụ trung bình 2mA giúp nó dễ dàng có thể triển khai trong những ứng dụng sử dụng nguồn điện pin.

Linh kiện A9G của Ai-thinker là IC tích hợp hỗ trợ giao tiếp GSM/GPRS kết hợp với công nghệ định vị GPS/BD. Nó có thể được sử dụng trong các ứng dụng IoT và tự động hóa, định vị thông minh…

Dựa trên khuyến cáo của nhà sản xuất, sơ đồ nguyên lý được thực hiện với đầy đủ các thành phần. Hãng Ai-thinker cung cấp mạch thiết kế sẵn với tên mã Pudding A9G. Nhờ vậy, người dùng không cần phải tự làm mạch in.

Pudding A9G

Tiêu chuẩn kỹ thuật:

  • Điện áp nguồn nuôi 5V hoặc từ pin (3,8V đến 4,2V)
  • Dòng điện nguồn nuôi tối thiểu phải đủ khả năng đạt đỉnh 1A
  • Chú ý gắn anten trước khi bật nguồn

Giao tiếp với A9G thông qua chuẩn USART phổ biến. Tốc độ baudrate tự động nhận dạng giúp nguời dùng dễ dàng làm việc. Sử dụng câu lệnh AT đơn giản theo tài liệu hướng dẫn. Tải tài liệu tại đây.

Ngoài ra, người dùng có thể dùng CSDK để lập trình trực tiếp cho Pudding A9G. Tuy nhiên một số phần trong đó vẫn chưa hoàn thiện. Do vậy, thực thi công việc bằng lệnh AT vẫn là lựa chọn ổn định hiện nay.

Vị trí chức năng chân A9G

Chương trình ví dụ gửi dữ liệu lên Thingspeak thông qua kết nối GPRS thay vì Wifi. Hệ thống sử dụng một vi điều khiển kết nối A9G qua USART để gửi lệnh AT.

#include <SoftwareSerial.h>
#define DEBUG true
// Data
String fromOut = "0.0";
String froma9g = "";
uint8_t Get = 0;
uint8_t xpos = 0;
char Gbuffer[5];
String Gg;
String tsData;
bool ModuleState=false;
// GPS
String gpsData;
String LATval;
String LNGval;
String Gdata;
//Thingspeak
String ThingspeakAdd = "api.thingspeak.com";  // trang hiển thị
String apiKey = "xxx";         // mã API 
SoftwareSerial A9GSerial = SoftwareSerial(8,9); //RxTx
void setup()
{
  // initialize serial ports:
  Serial.begin(9600);
  A9GSerial.begin(9600);
  Serial1.begin(9600);
  // wait for A9G to boot
  delay(3000);
  // check AT 
  ModuleState = moduleStateCheck();
  if (ModuleState == false) 
  {
    Serial.println("A9G not ok.");
  }
  else
  {
    ConnectGPRS();
    ConnectGPS();
    delay(30000);
    GetGPS();
    delay(2000);
    Serial.println(LATval);
    Serial.println(LNGval);
    connectThingSpeak();
    tsData = "&field1=" + fromOut + "&field2=" + LATval + "&field3=" + LNGval + "\r\n";
    updateThingSpeak(tsData);
   }
}

void loop()
{
  // read from Outside
  while (Serial1.available())
  {
    char c = Serial1.read();
    fromOut += c;
    delay(2);
    Get = 1;
  }
  
  if (Get == 1)
  {
    Get = 0;
    Serial.println(fromOut);
    Gdata = "xxx";
    Serial.println(Gdata);
    connectThingSpeak();
    tsData = "&field1=" + Gdata + "&field2=" + LATval + "&field3=" + LNGval + "\r\n";
    updateThingSpeak(tsData);
    fromOut = "";
    tsData="";
  }
}

bool moduleStateCheck()
{
  int i = 0;
  bool state = false;
  for (i = 0; i < 10; i++)
  {
    String msg = String("");
    msg = sendA9G("AT", 1000, DEBUG);
    if (msg.indexOf("OK") >= 0)
    {
      Serial.println("A9G turned on.");
      state = true;
      return state;
    }
    delay(500);
  }
  return state;
}

String sendA9G(String command, const int timeout, boolean debug)
{
  String response = "";
  A9GSerial.println(command);
  long int time = millis();
  while ((time + timeout) > millis())
  {
    while (A9GSerial.available())
    {
      char c = A9GSerial.read();
      response += c;
    }
  }
  if (debug)
  {
    Serial.print(response);
  }
  return response;
}

void ConnectGPRS(void)
{
  sendA9G("AT+CGATT=1", 2000, DEBUG);
  sendA9G("AT+CGDCONT=1,\"IP\",\"v-internet\"", 2000, DEBUG);
  sendA9G("AT+CGACT=1,1", 2000, DEBUG);
}

//
void updateThingSpeak(String tsData)
{
  String postRequest = "GET http://api.thingspeak.com/update?api_key=" + apiKey + tsData; 
  String sendCmd = "AT+CIPSEND=";
  A9GSerial.print(sendCmd);
  A9GSerial.println(postRequest.length());
  //
  Serial.print(sendCmd);
  Serial.println(postRequest.length());
  //
  delay(2000);
  //
  if(A9GSerial.find(">"))
  {
    Serial.println("Sending.."); 
    //
    A9GSerial.print(postRequest);
    //
    Serial.print(postRequest);
    delay(1000);
    //
    if(A9GSerial.find("OK"))
    {
      Serial.println("Packet sent");
      //
      //
      A9GSerial.print("AT+CIPCLOSE\r\n");
    }
    else
    {
      Serial.println("Packet error");
      //
      A9GSerial.print("AT+CIPCLOSE\r\n");
    }
   
   } 
   else
   {
     Serial.println("NOT SENT");
     //
     A9GSerial.print("AT+CIPCLOSE\r\n");
   }
}

void connectThingSpeak()
{
  String cmdTCP = "AT+CIPSTART=\"TCP\",\"";
  cmdTCP += ThingspeakAdd;
  cmdTCP += "\",80";
  cmdTCP += "\r\n";
  sendA9G(cmdTCP, 5000, DEBUG);
  delay(1000);
}
//
void ConnectGPS()
{
  sendA9G("AT+GPS=1", 1000, DEBUG);
  sendA9G("AT+GPSRD=15", 1000, DEBUG);
}

void GetGPS()
{
  String response = "";
  A9GSerial.println("AT+LOCATION=2");
  long int time = millis();
  while ((time + 1000) > millis())
  {
    while (A9GSerial.available())
    {
      char c = A9GSerial.read();
      response += c;
    }
  }
  xpos = response.indexOf("=2");
  if (xpos > 0)
  {
    LATval = response.substring(xpos + 6, xpos + 13);
    LNGval = response.substring(xpos + 16, xpos + 24);
  }
  else
  {
    LATval = "11.9";
    LNGval = "108.4";
  }
}

Thay đổi chương trình theo ứng dụng cụ thể.

Leave a Reply

Your email address will not be published. Required fields are marked *