Kontrol Arduino via Thingspeak Menggunakan Modul GSM SIM800L

Mengendalikan Arduino SIM800L dengan Thingspeak
Control Arduino using ThingSpeak with GSM module SIM800L
Sebelumnya telah dibahas terkait Monitoring data via ThingSpak dengan koneksi internet menggunakan SIM800L. Kali ini akan saya share mengenai cara kontrol Arduino via ThingSpeak dengan koneksi internet dari jaringan telepon (SIM800L). Metode yang dilakukan sama seperti tutorial kontrol lampu via ThingSpeak menggunakan modul ESP-01 hanya saja perangkat konektivitas yang berbeda (wifi x GSM modul) maka pengaplikasiannya juga berbeda. 

A. Wiring
Beberapa perangkat dan sensor yang digunakan dalam tutorial ini adalah:
  • Arduino Uno
  • Modul GSM SIM800L (kayak gini)
  • Modul LM2596 DC-DC Stepdown (kayak gini)
  • Relay Module (buat contoh aja yang 1 channel)
  • Kabel-kabel atau perangkat penyambung lainnya (Proto board, Bread board, dll)
Pastikan supply tegangan ke modul SIM800L dibawah 4V (kurang lebih di 3.7V). Relay yang digunakan pada mode normally open (Active low). Dalam kode program, akan digunakan library yang menggunakan pin reset untuk proses kontrol ke modul SIM800L, nah desainnya jadi seperti dibawah ini:
Control Arduino using ThingSpeak with GSM module SIM800L
B. Kode Program
Siapkan terlebih dahulu channel pada ThingSpeak untuk menampung data status yang nantinya dibaca oleh arduino untuk input dalam mengontrol relay.
Mengendalikan Arduino SIM800L  dengan Thingspeak

Selanjutnya pastikan API key untuk proses Write dan read data pada channel yang telah disiapkan (buka tab menu API Keys).
Mengendalikan Arduino SIM800L  dengan Thingspeak
Lanjut ke program arduino!.. Install terlebih dahulu library SIM800 HTTP Connector dan ArduinoJson. Setelah itu bisa langsung menuju kode program dibawah.
Mengendalikan Arduino SIM800L  dengan Thingspeak
Mengendalikan Arduino SIM800L  dengan Thingspeak

#include <SoftwareSerial.h>
#include <ArduinoJson.h>
#include "SIM800L.h"

#define SIM800_TX_PIN 6
#define SIM800_RX_PIN 7
#define SIM800_RST_PIN 2
#define RELAY  8 

const char APN[] = "3gprs"; //ane pake 3
const char URL1[] = "api.thingspeak.com/channels/Channel_ID_lu/fields/1/last.json";
SIM800L* sim800l;

void setup() {  
  // Initialize Serial Monitor for debugging
  Serial.begin(115200);
  while(!Serial);

  // Initialize a SoftwareSerial
  SoftwareSerial* serial = new SoftwareSerial(SIM800_TX_PIN, SIM800_RX_PIN);
  serial->begin(9600);
  delay(1000);
  pinMode(RELAY, OUTPUT); 
  digitalWrite(RELAY, 1);
  sim800l = new SIM800L((Stream *)serial, SIM800_RST_PIN, 200, 512);
  Serial.println("Waiting for module settings...");
  
  // Setup module for GPRS communication
   int PowerMode= sim800l->getPowerMode(); 
    if(PowerMode==1) {
      Serial.println(F("Module in normal power mode"));
      Serial.println(F("Ready for next setup..."));
    } else {
      Serial.println(F("Switch to normal power mode ..."));
      sim800l->setPowerMode(NORMAL);
      delay(200);
    }
  setupModule();
}
 
void loop() {
   
  // Establish GPRS connectivity (5 trials)
  bool connected = false;
  for(uint8_t i = 0; i < 5 && !connected; i++) {
    delay(1000);
    connected = sim800l->connectGPRS();
  }

  // Check if connected, if not reset the module and setup the config again
  if(connected) {
    Serial.println(F("GPRS connected !"));
  } else {
    Serial.println(F("GPRS not connected !"));
    Serial.println(F("Reset the module."));
    sim800l->reset();
    setupModule();
    return;
  }

  Serial.println(F("Start HTTP GET..."));

  //Read TS Status
  ReadTS_Stat();
  //Feed Back
  
  // Close GPRS connectivity (5 trials)
  bool disconnected = sim800l->disconnectGPRS();
  for(uint8_t i = 0; i < 5 && !connected; i++) {
    delay(1000);
    disconnected = sim800l->disconnectGPRS();
  }
  
  if(disconnected) {
    Serial.println(F("GPRS disconnected !"));
  } else {
    Serial.println(F("GPRS still connected !"));
  }
  
  delay(20000);
}


void ReadTS_Stat(){
  // Do HTTP GET communication with 10s for the timeout (read)
  uint16_t rc = sim800l->doGet(URL1, 10000);
  if(rc == 200) {
    // Success, output the data received on the serial
    Serial.print(F("HTTP GET successful ("));
    Serial.print(sim800l->getDataSizeReceived());
    Serial.println(F(" bytes)"));
    Serial.print(F("Received : "));
    String TS_data=sim800l->getDataReceived();
    Serial.println(TS_data);
    StaticJsonBuffer<200> jsonBuffer;
    JsonObject& root = jsonBuffer.parseObject(TS_data);
    // Test if parsing succeeds.
    if (!root.success()) {
      Serial.println("parseObject() failed");
      return;
    }
    
    int Control_stat= root["field1"];
    if (Control_stat==1){ 
      digitalWrite(RELAY, 0); // relay on 
      Serial.println("Relay On");
    }
    else if (Control_stat==0){
      digitalWrite(RELAY, 1); // relay off 
      Serial.println("Relay Off");
    }
    else{
      Serial.println("Command Error");
    }
  } else {
    // Failed...
    Serial.print(F("HTTP GET error "));
    Serial.println(rc);
  }
  
}

void setupModule() {
    // Wait until the module is ready to accept AT commands
  while(!sim800l->isReady()) {
    Serial.println(F("Problem to initialize AT command, retry in 1 sec"));
    delay(1000);
  }
  Serial.println(F("Setup Complete!"));
 
  // Wait for operator network registration (national or roaming network)
  NetworkRegistration network = sim800l->getRegistrationStatus();
  while(network != REGISTERED_HOME && network != REGISTERED_ROAMING) {
    delay(1000);
    network = sim800l->getRegistrationStatus();
  }
  Serial.println(F("Network registration OK"));
  delay(1000);

  // Setup APN for GPRS configuration
  bool success = sim800l->setupGPRS(APN);
  while(!success) {
    success = sim800l->setupGPRS(APN);
    delay(5000);
  }
  Serial.println(F("GPRS config OK"));
}
Dalam program, beberapa hal yang perlu diperhatikan adalah APN dari kartu yang kamu gunakan, Channel ID dari channel yang tadi dibuat, serta alamat URL untuk proses membaca data. Data yang akan dibaca adalah data terakhir yang ada di field 1. Format URLnya adalah begini:
https://api.thingspeak.com/channels/Channel_ID/fields/1/last.json
Setelah semua sudah dipastikan benar, langsung saja untuk upload program ke arduino.

C. Test Sistem
Metodenya hampirsama dengan tutorial input data ThingSpeak via XMLHTTP Requast. Jadi kita nulis status dulu di Channel (via write API Request) selanjutnya arduino akan membaca data pada Field 1 secara berkala. Saat nilai data sama dengan 0 maka arduino akan mematikan relay, saat data bernilai 1 maka arduino akan mengaktifkan relay. Nah untuk input data pada ThingSpeak dapat dilakukan dengan memberikan nilai pada field dengan format:
https://api.thingspeak.com/update?api_key=WRITE API_KEY_CHANNEL_KAMU &field1=NILAI_DATA
Input format diatas via URL browser dan isi nilai data dengan 0 atau 1. Ntar apabila sukses sinput data, akan dapet feedback berupa  entry_id
Cara lain untuk proses input data ini, kamu dapat menggunakan aplikasi android yang dapat di download DISINI. Masukkan Write API Keynya dan tekan tombol on/off untuk mengatur nyala lampu.
Control Arduino using ThingSpeak with GSM module SIM800L
Pemantauan Proses dapat dilakukan via Serial monitor yang kira-kira hasilnya akan seperti ini.
Control Arduino using ThingSpeak with GSM module SIM800L