[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–):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 | #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(); 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; } |