SMS gateway pengontrol Arduino dengan SIM800L

[CEK IMEI di kemenperin sebelum mencoba]

 

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.project.semesin.com/");

  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;
}

78 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

  8. Mas, saya ada project untuk tugas akhir, menggunakan arduino dan modul gsm sim 800L, jadi prinsip kerja nya alat ini menggunakan arduino dan sensor soil moisture untuk monitoring kelembapan tanah. nah hasil output sensor tsb akan dikirim menggunakan modul gsm sim 800L lewat sms. alat sudah 70% running, namun saya masih bingung untuk codingan modul sim 800l nya untuk di impelementasi kan ke sensor soil moisture nya. sudah saya coba cari, tapi tidak ada yang 1 codingan untuk sensor soil moisture.
    Apakah bisa dibuat sendiri berdasarkan postingan blog mas di atas ?

    mohon bantuan nya mas, terima kasih.

    1. mungkin sketch ini lebih komplek
      barangkali yang dibutuhkan hanya ‘sendSms’ saja
      bisa dengan cara manual atau menggunakan library seperti skecth ini
      contoh manual:

      void kirimSMS(char *nomor)
      {
      SerialSIM800.println("AT");
      updateSerial();

      SerialSIM800.println("AT + CMGF = 1");
      updateSerial();
      SerialSIM800.println("AT + CMGS = \"");
      SerialSIM800.println(nomor);
      SerialSIM800.println("\"");
      updateSerial();
      SerialSIM800.print("kelembaban = ");
      SerialSIM800.print(kelembaban);
      updateSerial();
      SerialSIM800.write(26);
      updateSerial();
      }

      void updateSerial()
      {
      delay(500);
      while (Serial.available())
      {
      SerialSIM800.write(Serial.read());
      }
      while (SerialSIM800.available())
      {
      Serial.write(SerialSIM800.read());
      }
      }

  9. Bg Kalo sim800l saya dia tidak mau nangkep sinyal bg, kartu udh saya ganti”, label jumper hugs, tegangan udh di set di 3.6-4volt, tpi retro ajah dia gk nangkep sinyal, net led nya kedip terus secara cepat bg, itu gmna yah bg?

  10. selamat siang mas, mau tanya, untuk mendapatkan nomer pengirim sms bagaimana ya, saya masih bingung memahami program sketh diatas, terimakasih

    1. baris2 kode ini berfungsi membaca data sms masuk

      byte IndexSMSBaru;
      String bufferIsiSMS = "";
      String bufferNomorPengirim = "";
      sim.readSMS(IndexSMSBaru, &bufferIsiSMS, &bufferNomorPengirim) == 0)

  11. Mas, mau nanya nih…kalau sensor us-100, bme-280, ds18d20, kec. dan arah angin, rain gauge mau disimpan di datalogger pake microsd, lalu data simpanan tsb dikirim via sms melalui sim800L, kira2 gimana ya programnya. untuk compile gabungan semua sensor sdh ada gambaran, tp utk tahap program menyimpan di datalogger lalu kirim via sms itu yang masih bingung. gimana ya…mhn pencerahannya…jazakumullohu khoiron…

  12. Mas saya mau nanyak nih.. Saya da project membuat ‘ tirai otomatis menggunakan arduino dengan sensor ldr ‘ semuanya udah oke.. Tinggal coding yg sim800l nya masih bingung mas.. Untuk memberikan notifikasi sms klw pas tirai tertutup da pesan masuk ke handphone begitu juga klw terbuka

  13. mas, mau tanya dong saya kan pakai sim800L V2 sudah saya input langsung di 5v dari arduino tapi masih berkedip 1X1 per detik. saya menggunakan perintah AT tapi waktu sensor api saya sudah berhasil dan buzzer berbunyi, di serial monitor sudah jalan mas perintah AT nya. tp tetap tidak bisa menangkap sinyal dan menerima pesan di hp saya. bagaimana ya itu mas? tetap harus menggunakan tegangan eksternal apa bagaimana mas? mohon dibantu ya mas.

  14. Terimakasih mas, Contoh nya seperti data fleksibel bel sekolah bisa tidak mas, didalamnya berisi nama guru nomer dan mapelnya beserta waktu aktif nya

  15. Mas saya ada project bikin absensi dan SMS gateway,saya mau nanya pak,”char buf[100];
    sprintf(buf, “nama guru : %s, nomor : %s, mapel : %s, waktu %s”, namaGuru, nomer, mapel, waktuAktif);
    sim.sendSMS(NomorPengirim, buf);” bagian ini untuk menyimpan apa mengambil data mas

  16. Betul,,kang Asep.mungkin ada pencerahan masalah imei sim800l register kemenprin.Soalnya bagi yang awam /anaksekolh uangkan pas-pasan,jadinya udah semangat praktekin tak taunya stuck sampai disini.Sebenarnya dari abang-abang senior yang sharing coding,kayak punyanya kang Asep,klo di serial monitor status terkirim tapi di alamat tujuan nggak ngrespon.Btw atau memang sudah nggak ada solusinya…Trimakasih atas waktunya..kang Asep.

  17. Saya udah buat program sms dgn sim800l utk beberapa sensor (us100, bme280, ds18b20, kec dan arah angin, rain gauge). Mekanismenya request dgn kirim format tertentu ke nmr yg ada di sim800l, lalu sim800l mengirim semua nilai sensor ke nomor kita. Tp kendalanya utk sensor U100 ini, kl programnya ditaruh di void loop malah nilainya ga kebaca di sms (alias nol), tp kl programnya di taruh di void setup, nilai data sensornya muncul tp ga mau berubah. Saya pake arduino UNO, Mas dan US 100 nya pake sofware serial, sim800lx jg pake software serial. Makasih pencerahanx…jazakallohu khairan..

    1. teori: SoftwareSerial hanya bisa menerima (pin-pin RX) 1 SoftwareSerial (yang sedang aktif) saja dalam 1 waktu.
      jika terdapat 2 atau lebih software serial, gunakan kontrol begin(), end(), listen() untuk mengontrolnya

  18. Iya betul tolong dicarikan solisi utk regitrasi IMEI, kalau perlu bayar (tapi gak pake mahal) gak apa² deh ke pemerintaj asal gsm module kita bisa ON sinyalnya.

  19. Bagaimana coding SIM800L V2 kontrol sms relay 1 channel ?
    Mohon informasinya mas, ini saya buat Tugas Akhir saya.
    Terima kasih

  20. Bedanya library gsm.h dengan SofwareSerial.h apa ya ? saya coba mengirim dan terima sms pake gsm.h malah sim800 gak respon. makasih sebelumnya

    1. library gsm.h dengan SofwareSerial.h punya fungsi masing-masing tapi masih saling berhubungan (jika menggunakan modul dihubungkan ke SofwareSerial)
      jika gak respon cek baudrate (biasanya 115200 / 38400 / 9600)

  21. gan mohon bantuannya, saya ada tugas dimna data yang pengukuran dari arduino dikirim ke thingspeak.. kalau boleh tahu programnya seperti apa min..mohon bantuannya terimakasih

  22. mas, mohon arahan toko online yang kepercayaan mas untuk pembelian sim800L, saya udah 4 kali beli sim800l dan tidak bisa di pakai, tidak bisa menangkap sinyal 🙏🏻 terima kasih mas mohon bantuan nya. karna untuk tugas akhir saya. Sehat selalu dan sukses selalu mas.

Leave a Reply to zacky Cancel reply

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