SMS gateway pengontrol Arduino dengan SIM800L

Library SIM800L ini berbasis AT command dengan improvisasi koding sehingga akses lebih cepat dan stabil.
Download library untuk arduino SIM800L anti lelet update GSM library termasuk sim800l

SMS gateway adalah perangkat penerima dan pengirim SMS. dengan bantuan Arduino dan modul SIM 800, SMS gateway dapat difungsikan sebagai pengontrol bagi perangkat lain.

Kelebihan :

  • Template/format database yang mudah digunakan
  • Mampu mengontrol seluruh pin arduino karena menggunakan kompigurasi metode tabel/database
  • Cepat tanpa delay berlebihan
  • Responsif terhadap SMS baru yang masuk
  • Menyimpan database dalam flash sehingga menghemat memory
  • Pada arduino mega, sistem ini mampu mengontrol hingga 57 kanal/perangkat
  • Case insensitive, Perintah SMS tidak mempedulikan huruf besar/kecil

Fungsi-fungsi SMS server yang diterapkan antara lain :

  • Menghidupkan perangkat
  • Mematikan perangkat
  • Membaca masukan digital
  • Membaca masukan analog

Fungsi ini bisa dikembangkan sebagai pembaca dan pengontrol perangkat dengan komunikasi digital seperti Serial, I2C/TWI, One wire, SPI dan lainnya.

pastikan modul SIM800L mendapatkan Tegangan 3.6-4.2 Volt yang stabil dengan Arus 2A yang memadai. Juga gunakan power supply external jika sumber tegangan dari USB(PC/Laptop) saat memprogram dirasa kurang

Komponen sistem kendali SMS melalui arduino:

  • Arduino Mega 2560
  • Modul SIM800L
  • LM2596
  • Modul/perangkat lain yang ingin dikontrol

skema SMS Gateway pengontrol Arduino menggunakan modul SIM 800L:

Perangkat yang akan dikontrol bisa bermacam-macam seperti LED, relay, sensor asap, solenoid dan lain-lain.

Pada perancangan SMS gateway menggunakan SIM800L ini menerapkan struktur database sehingga pengaturan isi SMS perintah dan pin yang dikontrol lebih mudah dan yang lebih penting program dapat berjalan efektif.
Item yang perlu dikonfigurasi adalah :

  • isiPerintah, yaitu isi pesan/perintah yang akan dikirimkan melalui SMS
  • pinKeluaran, nomor pin arduino yang dikontrol/dibaca apabila SMS IsiPerintah diterima
  • mode, terdiri dari mode_TulisNilai, mode_TulisAnalog, mode_Pemicu, mode_InputDigital dan mode_InputAnalog
  • nilaiPin, adalah nilai HIGH/LOW yang akan diterapkan ke pinKeluaran apabila SMS IsiPerintah diterima

Untuk menghidupkan/aktif dan mematikan/nonaktif sebuah pin digital, masukkan pinKeluaran yang sama dengan nilaiPin yang berbeda sesuai karakteristik modul/perangkat yang akan dikontrol.

untuk modul/perangkat sensor bisa diambil datanya dengan mengkonfigurasinya sebagai mode_InputDigital dan mode_InputAnalog, apabila ada permintaan melalui SMS sesuai text isiPerintah, maka sistem arduino akan mengirimkan datanya melalui SMS.

sketch / program SMS gateway sim800 (Gunakan library dari semesin.com –link diatas–):

#include <sim800l.h>
#include <SoftwareSerial.h>
#include <avr/pgmspace.h>

#define pinSIM800RX 2
#define pinSIM800TX 3
#define pinSIM800Reset 4

struct Perintah
{
  char isiPerintah[33];
  byte pinKeluaran;
  byte mode;
  byte nilaiPin;
};

enum mode
{
  mode_TulisNilai,
  mode_TulisAnalog,
  mode_Pemicu,
  mode_InputDigital,
  mode_InputAnalog
};

const PROGMEM Perintah perintah[] = {
//Isi SMS perintah (32 karakter)     pin  nilai pin
{"Hidupkan lampu 1\0               ", 22, mode_TulisNilai,   HIGH },
{"Matikan lampu 1\0                ", 22, mode_TulisNilai,   LOW  },//pin yang sama
{"Hidupkan lampu 2\0               ", 23, mode_TulisNilai,   HIGH },
{"Matikan lampu 2\0                ", 23, mode_TulisNilai,   LOW  },
{"Hidupkan kipas\0                 ", 24, mode_TulisNilai,   HIGH },
{"Matikan kipas\0                  ", 24, mode_TulisNilai,   LOW  },
{"Hidupkan dispenser\0             ", 25, mode_TulisNilai,   HIGH },
{"Matikan dispenser\0              ", 25, mode_TulisNilai,   LOW  },
{"Buka pintu\0                     ", 26, mode_TulisNilai,   HIGH },
{"Kunci pintu\0                    ", 26, mode_TulisNilai,   LOW  },
{"Hidupkan relay 1\0               ", 27, mode_TulisNilai,   HIGH },
{"Matikan relay 1\0                ", 27, mode_TulisNilai,   LOW  },
{"Hidupkan relay 2\0               ", 28, mode_TulisNilai,   HIGH },
{"Matikan relay 2\0                ", 28, mode_TulisNilai,   LOW  },
{"Hidupkan relay 3\0               ", 29, mode_TulisNilai,   HIGH },
{"Matikan relay 3\0                ", 29, mode_TulisNilai,   LOW  },
{"Hidupkan relay 4\0               ", 30, mode_TulisNilai,   HIGH },
{"Matikan relay 4\0                ", 30, mode_TulisNilai,   LOW  },
{"Hidupkan motor\0                 ", 31, mode_TulisAnalog,  175  },
{"Matikan motor\0                  ", 31, mode_TulisAnalog,  0    },
{"\0                               ", 32, mode_TulisNilai,   LOW  },
{"Beri makan ikan\0                ", 33, mode_Pemicu,       HIGH },//pin bersifat trigger
{"Baca temperatur\0                ", 34, mode_InputDigital, LOW  },//digitalRead()
{"\0                               ", 35, mode_InputDigital, LOW  },
{"\0                               ", 36, mode_InputDigital, LOW  },
{"\0                               ", 37, mode_InputDigital, LOW  },
{"\0                               ", 38, mode_InputDigital, LOW  },
{"\0                               ", 39, mode_InputDigital, LOW  },
{"\0                               ", 40, mode_InputDigital, LOW  },
{"\0                               ", 41, mode_InputDigital, LOW  },
{"\0                               ", 42, mode_InputDigital, LOW  },
{"\0                               ", 43, mode_InputDigital, LOW  },
{"\0                               ", 44, mode_InputDigital, LOW  },
{"\0                               ", 45, mode_InputDigital, LOW  },
{"\0                               ", 46, mode_InputDigital, LOW  },
{"\0                               ", 47, mode_InputDigital, LOW  },
{"\0                               ", 48, mode_InputDigital, LOW  },
{"\0                               ", 49, mode_InputDigital, LOW  },
{"\0                               ", 50, mode_InputDigital, LOW  },
{"\0                               ", 51, mode_InputDigital, LOW  },
{"\0                               ", 52, mode_InputDigital, LOW  },
{"\0                               ", 53, mode_InputDigital, LOW  },
{"\0                               ", A0, mode_TulisNilai,   LOW  },
{"\0                               ", A1, mode_TulisNilai,   LOW  },
{"\0                               ", A2, mode_TulisNilai,   LOW },
{"\0                               ", A3, mode_TulisNilai,   LOW  },
{"Baca konsentrasi Asap\0          ", A4, mode_InputAnalog,  LOW  },//analogRead()
{"\0                               ", A5, mode_InputAnalog,  LOW  },
{"\0                               ", A6, mode_InputAnalog,  LOW  },
{"\0                               ", A7, mode_InputAnalog,  LOW  },
{"\0                               ", A8, mode_InputAnalog,  LOW  },
{"\0                               ", A9, mode_InputAnalog,  LOW  },
{"\0                               ",A10, mode_InputAnalog,  LOW  },
{"\0                               ",A11, mode_InputAnalog,  LOW  },
{"\0                               ",A12, mode_InputAnalog,  LOW  },
{"\0                               ",A13, mode_InputAnalog,  LOW  },
{"\0                               ",A14, mode_InputAnalog,  LOW  },
{"\0                               ",A15, mode_InputAnalog,  LOW  },
};

//Software serial
//#define pinSIM800RX 2
//#define pinSIM800TX 3
//#define pinSIM800Reset 4
//SoftwareSerial mySerial(pinSIM800RX, pinSIM800TX); // RX, TX jika menggunakan software serial
//SIM800 sim(&mySerial, pinSIM800Reset, 9600);

//Hardware serial
#define pinSIM800Serial Serial1
#define pinSIM800Reset 17
SIM800 sim(&pinSIM800Serial, pinSIM800Reset, 9600);//Menggunakan hardware serial

void setup() {
  Serial.begin(115200);
  Serial.println("SMS gateway menggunakan Arduino");
  Serial.println("http://www.semesin.com/project/");

  Serial.println();
  Serial.println("Inisialisasi...");

  for(byte i=0;i<sizeof(perintah)/sizeof(perintah[0]);i++)
  {
    switch(perintah[i].mode)
    {
      case mode_TulisNilai:
      case mode_Pemicu:
        pinMode(pgm_read_byte(&perintah[i].pinKeluaran), OUTPUT);
        digitalWrite(pgm_read_byte(&perintah[i].pinKeluaran), LOW);
        break;
      case mode_InputDigital:
      case mode_InputAnalog:
        pinMode(pgm_read_byte(&perintah[i].pinKeluaran), INPUT);
        break;
    }
  }

  while(sim.init(9600) != 0) {
    Serial.println("Mengulangi inisialisasi");
  }  
  Serial.println("Menghubungkan ke jaringan selular");
  while(!sim.waitSIMReady());
  Serial.println("SMS gateway telah aktif");
}

void loop() 
{
  byte IndexSMSBaru;
  
  if(IndexSMSBaru = sim.checkEvent())
  {
    if(IndexSMSBaru != newEventCall)
    {
      String bufferIsiSMS = "";
      String bufferNomorPengirim = "";
      char bufferPerintah[sizeof(perintah[0])];
      
      if(sim.readSMS(IndexSMSBaru, &bufferIsiSMS, &bufferNomorPengirim) == 0)
      {
        Serial.println();
        Serial.print("Perintah : ");
        Serial.println(bufferIsiSMS);
        Serial.print("Nomor pengirim : ");
        Serial.println(bufferNomorPengirim);
  
        bool perintahDilaksanakan = false;
        char NomorPengirim[16];
        char nilaiInput[5];
        char aktif[] = "Aktif";
        char tidakAktif[] = "Tidak aktif";
        
        for(byte i=0;i<sizeof(perintah)/sizeof(perintah[0]);i++)
        {
          copyFlashString(bufferPerintah, (char*)(&perintah[i].isiPerintah));
          if(bufferIsiSMS.equalsIgnoreCase((String)bufferPerintah))
          {
            byte nomorPin = pgm_read_byte(&perintah[i].pinKeluaran);
            byte nilaiPin = pgm_read_byte(&perintah[i].nilaiPin);
            
            bufferNomorPengirim.toCharArray(NomorPengirim, 16);
            
            switch(pgm_read_byte(&perintah[i].mode) == mode_TulisNilai)
            {
              case mode_TulisNilai:
                digitalWrite(nomorPin, nilaiPin);
                break;
              case mode_TulisAnalog:
                analogWrite(nomorPin, nilaiPin);
                break;
              case mode_Pemicu:
                digitalWrite(nomorPin, nilaiPin);
                delay(1000);
                digitalWrite(nomorPin, !nilaiPin);
                break;
              case mode_InputDigital:
                sim.sendSMS(NomorPengirim, digitalRead(nomorPin)?aktif:tidakAktif);
                break;
              case mode_InputAnalog:
                sprintf (nilaiInput, "%04i", analogRead(nomorPin));
                sim.sendSMS(NomorPengirim, nilaiInput);
                break;
            }
            Serial.print("Perintah ");
            Serial.print(bufferIsiSMS);
            Serial.println(" Telah dilaksanakan");
            perintahDilaksanakan = true;
            break;
          }
        }
        if(!perintahDilaksanakan)
        {
          Serial.println("Perintah tidak dikenali!");
        }
        sim.deleteSMS(IndexSMSBaru);
      }
    }
  }
}
void copyFlashString(char* buf, const char* alamat)
{
  char c;
  while(c = pgm_read_byte(alamat++))
  {
    *buf++ = c;
  }
  *buf = 0;
}
Bagikan Link halaman ini :

24 thoughts on “SMS gateway pengontrol Arduino dengan SIM800L

    1. Dalam proses inisialisasi SIM800L akan mencari layanan yang disediakan operator GSM seperti Call, SMS, GPRS.
      Program/library arduino akan menunggu kode dari sim800L berupa :
      “Call Ready” dan
      “SMS Ready”
      Program arduino akan menunggu diterimanya teks tersebut. Respon teks dari sim800l tersebut juga menyatakan kalo sim800l sudah siap menerima SMS atau panggilan.
      * khusus: tidak semua sim800l / modul gsm mendukung pemberitahuan seperti ini, jika memang tidak ada, baris ini bisa dihapus

      while(!sim.waitSIMReady());
      

      atau diganti delay() untuk memastikan modul gsm siap menerima/mengirim SMS.

  1. saya masih bingung, coba di tuliskan cara pengetesannya dong bang, supaya jelas, saya juga pake arduino uno
    tolong jelasin
    makasihh

    1. Arduino uno hanya memiliki satu hardware serial,
      untuk komunikasi serial pada uno bisa menggunakan Serial biasa atau software serial

      dalam contoh ini software serial diaktifkan dengan jalan mengganti baris 88-98
      dengan catatan:
      sim800L RX – pin 2 arduino uno
      sim800L TX – pin 3 arduino uno
      sim800L Reset – pin 4 arduino uno

      //Software serial
      #define pinSIM800RX 2
      #define pinSIM800TX 3
      #define pinSIM800Reset 4
      SoftwareSerial mySerial(pinSIM800RX, pinSIM800TX); // RX, TX jika menggunakan software serial
      SIM800 sim(&mySerial, pinSIM800Reset, 9600);
       
      //Hardware serial
      //#define pinSIM800Serial Serial1
      //#define pinSIM800Reset 17
      //SIM800 sim(&pinSIM800Serial, pinSIM800Reset, 9600);//Menggunakan hardware serial
      
    1. kendala umum:
      * komunikasi sim800-arduino tidak stabil
      > cek dengan koneksi kabel rx< ->tx tx< ->rx
      > coba beberapa baud rate
      > cek dengan komunikasi langsung (contoh: examples-softwareserial-softwareserialexample) dengan mengirim ‘AT’ ke sim800
      * pin RST dalam kondisi running mode
      * pastikan sim800 mendapat sinyal sesuai operator (ditandai kedipan led)
      * gunakan kartu 2G jika memungkinkan
      * pastikan pulsa-nya tersedia

  2. gan aku mau dia hanya kirim notifikasi sms, jadi gini kan ada 4 motor, jika motor di matikan maka sms masuk ke hp saya, motor 1 off, motor 2 off gitu dan jika hidup juga gitu?
    bisa gan gamna kira”

  3. Mas,,
    mohon bantuannya, modul SIM800L saya sudah terhubung ke arduino, dan kedip lampu modul nya sudah 1 x per 3 detik ( sudah menangkap sinyal ), tapi ketika di AT command kok tidak merepson ya di serial, PIN TX sim800l saya hubungkan ke D3 dan RX sim800l ke D2, mohon pencerahannya

    1. *cek baudrate
      *cek tegangan supply 3.7-4.2v
      *cek tegangan pin (arduino 5v < -> sim800 3v3)

      nb : Jika menggunakan softwareSerial, baudrate 115200 (baudrate standard 115200) mungkin tidak stabil, jika varian sim800l autobaud sebaiknya gunakan baudrate 9600.

  4. Mas,, ini knp ya modul sim800l saya tidak ada kirim pesan sama sekali, padahal pin RX-TX udh bener trus kedipan led udh 1x dalam 3 detik, trus kadang klo udh dikasih perintah kirim pesan kedipan led jadi spt awal lgi (1x dalam 1 detik), kira2 itu kenapa mas?

  5. Mas..
    Kenapa ya, saya terapkan di fingerprint, saya pakai software serial, ketika mode sms diterapkan di Void setup() sms bisa dikirimkan ke no yg sudah set,

    Tp ketika saya taruh coding di void loop(), ketika Fingerprint tdk di deteksi seharusnya sms terkirim..ini malah ga jalan / sms ga terkirim sama sekali..bisa dibantu?

    1. saya asumsikan sms dan fingerprint pake software serial
      jika ya, masalahnya ada di software serial karena softwareserial hanya bisa difungsikan satu saja dalam satu waktu
      untuk switch/bertukar softwareserial yang aktif gunakan

      softSerial.listen();

  6. Mas mohon bantuan nya. Penggunaan power eksternal itu langsung masuk ke modul gsm atau arduino? Saya pake modul sim800L v2 dengan robotdyn mega 2560. Baudrate Sudah 9600. Nah ketentuan arus dan tegangan yg cocok untuk modul gsm sim800L V2 itu berapa ya mas?

  7. mas, saya punya project arduino dan sim800L buat tugas akhir. Prinsip kerjanya, ada dua sensor switch active HIGH, apabila aktif salah satunya maka akan mengirim SMS pemberitahuan, dan kita dapat memerintahkan untuk mengaktifkan relat lewat SMS juga. jadi bisa mengirim dan Menerima SMS. sudah saya coba cari programnya cuma ada bisa kirim SMS saja, ga bisa nerima. ada bisa menerima saja tapi ga bisa kirim. Bagai mana cara menggabung kan program kirim dan terima SMS. apakah ada programnya.
    Project untuk pengaman sepeda motor menggunakan arduino dan sim800l.
    Terima kasih

    1. tergantung library yang dipakai
      seperti di koding+library di halaman ini bisa membaca sms masuk dan mengirim sms konfirmasi
      untuk membaca sim.readSMS(…)
      uintuk mengirim sim.sendSMS(…)

Tinggalkan Balasan ke baihaqi Batalkan balasan

Alamat email Anda tidak akan dipublikasikan.