BerandaArduinoTutorial Kirim dan Baca Telegram BOT Dengan SIM800L dan Arduino

Tutorial Kirim dan Baca Telegram BOT Dengan SIM800L dan Arduino

Sebelumnya di channel youtube kita sudah bahas cara akses Telegram BOT dengan menggunakan ESP8266. Ada sedikit kekurangan untuk beberapa project yang membutuhkan koneksi internet tanpa jaringan WIFI. Sekarang kita akan bahas bagaimana cara pemprogram akses dengan memanfaatkan komunikasi SIM800OL agar dapat mengakses internet tanpa harus menggunakan WIFI dan hanya menggunakan kartu Perdana Telekomunikasi dengan menggunakan Paket Data.

SIM800L disini yang akan saya gunakan adalah SIM800L V2, dimana secara kestabilan dan berdasarkan pengalaman menggunakan SIM800L yang kecil merah sangat tidak saya rekomendasikan, karena susahnya dapat sinyal dan kendal-kendala aneh lain. Berikut perbedaan SIM800L V1 dan V2:

Skematik

Silahkan kalian rakit rangkaian berikut untuk melakukan komunikasi dengan Arduino Uno dan SIM800L berlaku juga dengan V1, sesuaikan saja konfirgurasi Pinnya.

skematik sim800l arduino
Skema SIM800L Arduino Uni 1 | Design by FansElectronics.com

Menggunkan module LM2596 sebagai stepdown untuk mendapatkan arus lebih dari 2A bisa menggunakan versi ini atau Arduino bisa menggunkan jalur supply regulator yang terpisah

skematik sim800l arduino
Skema SIM800L Arduino Uni 1 | Design by FansElectronics.com

Daftar Telegram BOT

Karena cara daftar telegram bot sudah pernah saya jelaskan di video saya di youtube. Kalian bisa tonton dulu cara daftarnya di video bawah ini:

Program AT Command

Untuk cek koneksi ke SIM800l dan cek kondisi module apakah aman, kalian bisa menggunakan program dibawah ini untuk memastikanya:

AT Command GPRS

Berikut daftar AT Command untuk melakukan koneksi GPRS dengan SIM800L

// Set Koneksi
AT+SAPBR=3,1,"CONTYPE","GPRS"
// Set APN, cari sendiri jenis APN perdana kalian, saya pakai XL
AT+SAPBR=3,1,"APN","internet"
// Set Settingan Diatas
AT+SAPBR=1,1
// Initialisasi ke HTPP
AT+HTTPINIT
AT+HTTPPARA="CID",1

// Karea
AT+HTTPPARA="URL","http://tryiot.online/telegram.php?token=BOT_TOKEN_KALIAN&chat_id=CHAT_ID)KALIAN&text=FansElectronics"
AT+HTTPACTION=0
AT+HTTPREAD
AT+HTTPTERM
AT+SAPBR=0,1

Dengan menggunakan program di atas kalian dapat mengirim perintah AT Command secara langsung melalui Serial Monitoring ARDUINO IDE.

Program PHP

Karena SIM800L terkadang terkendala koneksi SSL dan TSL 1.0 biasanya saya jembatanin menggunakan website pribadi saya untuk konekasinya:

<?php
if(isset($_GET['token']) && isset($_GET['chat_id']) && isset($_GET['text'])){
    $text = $_GET['text'];
    $token = $_GET['token'];
    $chat_id = $_GET['chat_id'];
    $json = file_get_contents('https://api.telegram.org/bot'.$token.'/sendMessage?chat_id='.$chat_id.'&text='.$text.'&parse_mode=Markdown');
}
else if(isset($_GET['token']) && isset($_GET['limit']) && isset($_GET['offset'])){
    $token = $_GET['token'];
    $limit = $_GET['limit'];
    $offset = $_GET['offset'];
    $json = file_get_contents('https://api.telegram.org/bot'.$token.'/getUpdates?limit='.$limit.'&offset='.$offset);
}else{
    $json = json_encode([]);
}

echo $json . '@';

Buat file php upload ke hosting kalian, kalau kurang paham coba aja pakai api dari saya ini:

  • KIRIM PESAN: “http://tryiot.online/telegram.php?token=BOT_TOKEN_KALIAN&chat_id=CHAT_ID_KALIAN&text=PESAN TEXT
  • BACA PESAN: http://tryiot.online/telegram.php?token=BOT_TOKEN_KALIAN&limit=1&offset=0

Program Kirim dan Baca Telegram Tanpa Delay

Berikut ini program Kirim dan Baca pesan Telegram tanpa delay disetiap AT Commandnya, agak tidak menggangu alur kerja program lain juga.

//---------------------------------------------------------------------------

#include <ArduinoJson.h>
#include <SoftwareSerial.h> 
// Define PIN
#define LED 13
// Define LOGIKA
#define ON 1
#define OFF 0

//---------------------------------------------------------------------------

const String bot_token = "BOT_TOKEN";
const String chat_id = "CHAT_ID";

//---------------------------------------------------------------------------

String response, json, message, send_message;
long offset;
int step_cmd;
bool send_telegram, response_cmd;
unsigned long response_timeout;

StaticJsonDocument<1000> doc;
SoftwareSerial SIM(8,9);
//---------------------------------------------------------------------------

void setup() {
  Serial.begin(9600);  // Serial KE PC
  SIM.begin(9600);     // Serial ke SIM
}
//---------------------------------------------------------------------------

void loop() {
  if (send_telegram) sendTelegram();  // Jika saat Kirim Pesan, akan dibaca
  else readTelegram();                // Jika Tidak ada kirim pesan, baca pesan masuk
                                      //
  if (message == "!LEDON") {          // Pesan Masuk !RLYON
    Serial.println("LED ON");
    sendMessage("LED ON");
    digitalWrite(LED, ON);
    message = "";
  } else if (message == "!LEDOFF") {  // Pesan Masuk !RLYOFF
    Serial.println("LED OFF");
    sendMessage("LED OFF");
    digitalWrite(LED, OFF);
    message = "";
  }
  // LANJUT PROGRAM UTAMA KALIAN, TANPA DELAY, TETEP LOOPING
}
//---------------------------------------------------------------------------
//-------------------------------------------------------------------------------
void sendMessage(String msg) {
  step_cmd = 1;
  send_message = msg;
  send_telegram = true;
}
//-------------------------------------------------------------------------------
void sendCommand(String cmd) {
  SIM.println(cmd);
  response_cmd = true;
  response_timeout = millis();
}
//-------------------------------------------------------------------------------
void sendTelegram() {
  if (step_cmd == 1 && !response_cmd) sendCommand("AT+HTTPTERM");
  if (step_cmd == 2 && !response_cmd) sendCommand("AT+SAPBR=0,1");
  else if (step_cmd == 3 && !response_cmd) sendCommand("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
  else if (step_cmd == 4 && !response_cmd) sendCommand("AT+SAPBR=3,1,\"APN\",\"internet\"");
  else if (step_cmd == 5 && !response_cmd) sendCommand("AT+SAPBR=1,1");
  else if (step_cmd == 6 && !response_cmd) sendCommand("AT+HTTPINIT");
  else if (step_cmd == 7 && !response_cmd) sendCommand("AT+HTTPPARA=\"CID\",1");
  else if (step_cmd == 8 && !response_cmd) sendCommand("AT+HTTPPARA=\"URL\",\"http://tryiot.online/telegram.php?token=" + bot_token + "&chat_id=" + chat_id + "&text=" + send_message + "\"");
  else if (step_cmd == 9 && !response_cmd) sendCommand("AT+HTTPACTION=0");
  else if (step_cmd == 10 && !response_cmd) sendCommand("AT+HTTPTERM");
  else if (step_cmd == 11 && !response_cmd) sendCommand("AT+SAPBR=0,1");
  // SETELAH COMMAND DIKIRIN, TUNGGU RESPONSE
  if (response_cmd) {                                          // WAITING RESPON
    if (SIM.available() > 0) {                                 // Tunggu Serial Masuk
      response = SIM.readString();                             // Baca Semua Response
      if (response.indexOf("OK") or response.indexOf("ER")) {  // Jika Response OK
        Serial.println(response);                              // Jika Response OK
        response_cmd = false;                                  //
        step_cmd++;                                            //
      }                                                        //
    }                                                          //
                                                               // Waktu Tunggu
    if (millis() - response_timeout > 3000) {                  // TIMEOUT REPONSE
      response_cmd = false;                                    //
      step_cmd++;                                              //
    }                                                          //
  }                                                            //
                                                               // Jika Step selesai
  if (step_cmd > 11) {
    step_cmd = 1;
    send_telegram = false;
    response_cmd = false;
  }
}
//-------------------------------------------------------------------------------
void readTelegram() {
  if (step_cmd == 1 && !response_cmd) sendCommand("AT+SAPBR=0,1");
  else if (step_cmd == 2 && !response_cmd) sendCommand("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
  else if (step_cmd == 3 && !response_cmd) sendCommand("AT+SAPBR=3,1,\"APN\",\"internet\"");
  else if (step_cmd == 4 && !response_cmd) sendCommand("AT+SAPBR=1,1");
  else if (step_cmd == 5 && !response_cmd) sendCommand("AT+HTTPINIT");
  else if (step_cmd == 6 && !response_cmd) sendCommand("AT+HTTPPARA=\"CID\",1");
  else if (step_cmd == 7 && !response_cmd) sendCommand("AT+HTTPPARA=\"URL\",\"http://box-paket.online/telegram.php?token=" + bot_token + "&limit=1&offset=" + String(offset) + "\"");
  else if (step_cmd == 8 && !response_cmd) sendCommand("AT+HTTPACTION=0");
  else if (step_cmd == 9 && !response_cmd) sendCommand("AT+HTTPREAD");
  else if (step_cmd == 10 && !response_cmd) sendCommand("AT+HTTPTERM");
  else if (step_cmd == 11 && !response_cmd) sendCommand("AT+SAPBR=0,1");
  // SETELAH COMMAND DIKIRIN, TUNGGU RESPONSE
  if (response_cmd) {                                               // WAITING RESPON
    if (SIM.available() > 0) {                                      // Tunggu Serial Masuk
      response = SIM.readString();                                  // Baca Semua Response
      if (response.indexOf("OK") or response.indexOf("ER")) {       // Jika Response OK
        Serial.println(response);                                   // Jika Response OK
        if (step_cmd == 9) {                                        //
          json = parsingJSON(response);                             //
          Serial.print("JSON: ");                                   //
          Serial.println(json);                                     // Jika Response OK
          DeserializationError error = deserializeJson(doc, json);  //
          if (!error) {                                             // Jika JSON BENAR
            Serial.println(F("JSON PARSING BERHASIL"));             //
            if (doc["ok"] == true) {                                // JSON OK true
              Serial.println(F("BERHASIL PARSING JSON"));           //
              String update_id = doc["result"][0]["update_id"];     // UPDATE ID
              String msg = doc["result"][0]["message"]["text"];     //
              if (update_id != "null") {                            //
                offset = update_id.toInt() + 1;                     //
                message = msg;                                      //
                Serial.println("UPDATE ID: " + update_id);          //
                Serial.println("OFFSET ID: " + String(offset));     //
                Serial.println("MESSAGET : " + message);            //
              }                                                     //
            }                                                       //
          } else {                                                  //
            Serial.println(F("JSON PARSING GAGAL"));                //
            Serial.print(F("deserializeJson() failed: "));          //
            Serial.println(error.f_str());                          //
          }                                                         //
        }                                                           //
        if (step_cmd != 8) {                                        //
          response_cmd = false;                                     //
          step_cmd++;                                               //
        }                                                           //
      }                                                             //
    }                                                               //
                                                                    // Waktu Tunggu
    if (millis() - response_timeout > 10000) {                      // TIMEOUT REPONSE
      response_cmd = false;                                         //
      step_cmd++;                                                   //
    }                                                               //
  }                                                                 //
                                                                    // Jika Step selesai
  if (step_cmd > 11) {
    step_cmd = 1;
    send_telegram = false;
    response_cmd = false;
  }
}


//-------------------------------------------------------------------------------
// Parsing JSON agar bersih full JSON saja
String parsingJSON(String data) {
  String payload = "";
  int len = data.length();
  bool start = false;
  for (int i = 0; i < len; i++) {
    if (!start) {
      if (data[i] == '{') {
        start = true;
        payload = payload + data[i];
      }
    } else {
      if (data[i] == '@') break;
      else if (data[i] == '\n') continue;
      else payload = payload + data[i];
    }
  }
  return payload;
}

 

Video Tutorial Lengkap

Gimana menurut kalian? gampang dan mudah kan, adapun beberapa kendala yang kalian alami, join ke website ini dan tinggalkan komentar di bawah mari berdiskusi dengan sehat. Terma kasih semoga bermanfaaat tutorial ini. Salam Elektronik.

Irfan Indra Kurniawan
Irfan Indra Kurniawanhttps://fanselectronics.com/
Tukang Solder Yang Penuh Cerita :D

Topic Populer

Tag Populer

Artikel Terkait