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("https://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;
}