#include <HardwareSerial.h>
#include <Wire.h> // Untuk komunikasi I2C OLED
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definisikan pin RX dan TX untuk komunikasi serial antara ESP32 dan SIM800L
#define SIM800L_RX_PIN 16 // Pin RX ESP32 terhubung ke TX SIM800L
#define SIM800L_TX_PIN 17 // Pin TX ESP32 terhubung ke RX SIM800L
// Ukuran layar OLED (128x64)
#define SCREEN_WIDTH 128 // Lebar piksel OLED
#define SCREEN_HEIGHT 64 // Tinggi piksel OLED
// Deklarasi objek SSD1306 (OLED I2C address 0x3C atau 0x3D)
// Ganti 0x3C jika OLED Anda menggunakan alamat 0x3D
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Buat objek HardwareSerial untuk SIM800L
HardwareSerial sim800lSerial(1); // Gunakan UART1 pada ESP32
void setup() {
// Inisialisasi komunikasi serial untuk debugging (monitor serial)
Serial.begin(115200);
Serial.println("Memulai pengujian koneksi ESP32 dengan SIM800L dan OLED...");
// Inisialisasi OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Alamat I2C umum untuk OLED
Serial.println(F("Alokasi SSD1306 gagal"));
for (;;) ; // Jangan lanjutkan jika gagal
}
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(1); // Ukuran teks 1
display.setTextColor(SSD1306_WHITE); // Warna teks putih
display.setCursor(0, 0);
display.println("ESP32 + SIM800L");
display.println("Inisialisasi...");
display.display();
delay(2000);
// Inisialisasi komunikasi serial untuk SIM800L
sim800lSerial.begin(9600, SERIAL_8N1, SIM800L_RX_PIN, SIM800L_TX_PIN);
delay(1000);
Serial.println("Mengirim AT command untuk memeriksa koneksi...");
display.clearDisplay();
display.setCursor(0, 0);
display.println("Cek Koneksi GSM...");
display.display();
sendATCommand("AT");
delay(1000);
Serial.println("Mengirim AT+CSQ untuk memeriksa kualitas sinyal...");
display.clearDisplay();
display.setCursor(0, 0);
display.println("Mengecek Sinyal...");
display.display();
// Panggil fungsi untuk mendapatkan dan menampilkan sinyal
getAndDisplaySignalStrength();
delay(2000);
Serial.println("Mengirim AT+CREG? untuk memeriksa pendaftaran jaringan...");
display.clearDisplay();
display.setCursor(0, 0);
display.println("Mendaftar Jaringan...");
display.display();
sendATCommand("AT+CREG?");
delay(2000); // Beri waktu lebih untuk pendaftaran jaringan
Serial.println("Mencoba mengirim SMS...");
display.clearDisplay();
display.setCursor(0, 0);
display.println("Mengirim SMS...");
display.display();
sendSMS("+628112508805", "Halo dari ESP32 dan SIM800L!");
delay(1000); // Beri waktu setelah pengiriman SMS
display.clearDisplay();
display.setCursor(0, 0);
display.println("Pengujian Selesai!");
display.println("Cek SMS Anda.");
display.display();
}
void loop() {
// Dalam loop, kita bisa memperbarui kekuatan sinyal secara berkala
// Atau tambahkan fungsionalitas lain
delay(10000); // Perbarui setiap 10 detik
getAndDisplaySignalStrength();
}
// Fungsi untuk mengirim AT command dan menampilkan responsnya
String sendATCommand(String command) {
Serial.print("Mengirim: ");
Serial.println(command);
sim800lSerial.println(command);
String response = "";
long timeout = millis();
while (millis() - timeout < 2000) { // Tunggu respons selama 2 detik
if (sim800lSerial.available()) {
char c = sim800lSerial.read();
Serial.write(c);
response += c;
}
}
Serial.println(); // Baris baru untuk kejelasan
return response;
}
// Fungsi untuk mendapatkan dan menampilkan kekuatan sinyal (RSSI) di OLED
void getAndDisplaySignalStrength() {
String response = sendATCommand("AT+CSQ");
int rssi = -1; // Nilai default jika tidak ditemukan
int commaIndex = response.indexOf(',');
if (response.indexOf("+CSQ:") != -1 && commaIndex != -1) {
String rssiStr = response.substring(response.indexOf(":") + 1, commaIndex);
rssi = rssiStr.toInt();
}
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println("Kekuatan Sinyal:");
display.setTextSize(2); // Ukuran teks lebih besar untuk RSSI
if (rssi >= 0 && rssi <= 31) {
display.print("RSSI: ");
display.print(rssi);
display.print(" (");
display.print(-113 + rssi * 2); // Konversi kasar ke dBm
display.println(" dBm)");
display.setTextSize(1);
display.print("Status: ");
if (rssi >= 20) {
display.println("Sangat Baik");
} else if (rssi >= 10) {
display.println("Baik");
} else if (rssi >= 2) {
display.println("Cukup");
} else {
display.println("Lemah/Tidak Ada");
}
} else {
display.println("Tidak Diketahui");
}
display.display();
}
// Fungsi untuk mengirim SMS
void sendSMS(String phoneNumber, String message) {
Serial.println("Mengatur mode SMS ke Text Mode...");
sendATCommand("AT+CMGF=1"); // Atur ke Text Mode
delay(1000);
Serial.print("Mengirim SMS ke: ");
Serial.println(phoneNumber);
sim800lSerial.print("AT+CMGS=\"");
sim800lSerial.print(phoneNumber);
sim800lSerial.println("\"");
delay(100); // Beri sedikit waktu
sim800lSerial.print(message);
sim800lSerial.write(0x1A); // Karakter Ctrl+Z untuk mengakhiri pesan
Serial.println("Pesan dikirim. Menunggu konfirmasi...");
long timeout = millis();
while (millis() - timeout < 10000) { // Tunggu respons selama 10 detik
if (sim800lSerial.available()) {
Serial.write(sim800lSerial.read());
}
}
Serial.println();
}
No comments:
Post a Comment