Search This Blog

Tuesday, 10 June 2025

PING MONITOR DENGAN MODUL GMS AKAN CALL KE NO GSM JIKA JARINGAN PUTUS

 

Komponen yang Anda Butuhkan:

  • ESP32 Development Board
  • Modul GSM/GPRS (SIM800L atau SIM900)
    • Penting: Perhatikan kebutuhan daya. Modul GSM membutuhkan power supply eksternal yang kuat dan stabil (minimal 2A), terpisah dari ESP32. Regulator step-down seperti LM2596 atau MP1584N yang disetel ke 4V (untuk SIM800L) atau 5V (untuk SIM900) adalah pilihan umum. Pastikan juga ground ESP32 dan ground power supply GSM terhubung.
  • Kartu SIM yang aktif, memiliki pulsa, dan tidak terkunci PIN.
  • Antena GSM (biasanya disertakan dengan modul).
  • OLED Display 0.96 inci atau 1.3 inci 128x64 (I2C).
  • Kabel Jumper dan Breadboard (opsional).
  • Resistor untuk Level Shifter (opsional, tapi disarankan): Jika TX output modul GSM Anda 5V (misal SIM900) dan ESP32 adalah 3.3V, gunakan pembagi tegangan resistor atau modul level shifter pada jalur GSM TX ke ESP32 RX (GPIO16).

Skema Pengkabelan (Wiring Diagram Umum)

  • ESP32 OLED 128x64 (I2C):

    • ESP32 GPIO21 (SDA) OLED SDA
    • ESP32 GPIO22 (SCL) OLED SCL
    • ESP32 5V OLED VCC
    • ESP32 GND OLED GND
  • ESP32 Modul GSM (SIM800L/SIM900):

    • ESP32 GPIO17 (TX2) Modul GSM RX
    • ESP32 GPIO16 (RX2) Modul GSM TX (Pertimbangkan Level Shifter di sini!)
    • ESP32 GND Modul GSM GND
    • Power Supply Eksternal Positive Modul GSM VCC/VIN
    • Power Supply Eksternal Negative Modul GSM GND (Juga terhubung ke GND ESP32)

Instalasi Library Arduino IDE

Pastikan Anda telah menginstal semua library ini melalui Sketch > Include Library > Manage Libraries...:

  1. ESP32 Board Package (dari Boards Manager)
  2. TinyGSM Library (oleh Vadim Laptev)
  3. Adafruit GFX Library (oleh Adafruit)
  4. Adafruit SSD1306 Library (oleh Adafruit)

Kode Program Lengkap untuk OLED 128x64

Perhatikan perubahan pada SCREEN_HEIGHT dan penyesuaian posisi setCursor() karena layar kini lebih tinggi.

C++
#include <WiFi.h>              // Untuk koneksi WiFi dan fungsi ping
#include <TinyGsmClient.h>     // Library dasar untuk modul GSM/GPRS
#include <TinyGsmClientSIM800.h> // Untuk modul SIM800L. Ganti ke TinyGsmClientSIM900.h jika menggunakan SIM900
#include <Wire.h>              // Diperlukan untuk komunikasi I2C (OLED)
#include <Adafruit_GFX.h>      // Library grafis dasar untuk OLED
#include <Adafruit_SSD1306.h>  // Library khusus chip OLED SSD1306

// --- Konfigurasi WiFi ---
const char* ssid = "NAMA_WIFI_ANDA";     // Ganti dengan nama WiFi Anda
const char* password = "PASSWORD_WIFI_ANDA"; // Ganti dengan password WiFi Anda

// --- Konfigurasi GSM ---
// Pin RX dan TX untuk komunikasi serial antara ESP32 dan modul GSM
// ESP32 UART2: RX2 (GPIO16), TX2 (GPIO17)
#define GSM_SERIAL_RX 16 // GPIO16
#define GSM_SERIAL_TX 17 // GPIO17

// Nomor telepon tujuan yang akan dihubungi (gunakan format internasional, misal +628123456789)
const char* targetPhoneNumber = "+628123456789"; 

// Objek serial untuk komunikasi dengan modul GSM (UART2)
HardwareSerial gsmSerial(2); 
// Objek TinyGSMClient untuk modul GSM
TinyGsm modem(gsmSerial);

// --- Konfigurasi OLED Display ---
#define SCREEN_WIDTH 128 // Lebar piksel layar OLED
#define SCREEN_HEIGHT 64 // TINGGI PIKSEL LAYAR OLED (Ini yang berubah dari 128x32!)
#define OLED_RESET -1    // Pin reset OLED. Gunakan -1 jika terhubung ke VCC (umumnya pada modul I2C)
// Deklarasi objek display OLED
// Ganti 0x3C dengan alamat I2C OLED Anda jika berbeda (0x3C atau 0x3D adalah yang paling umum)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// --- Konfigurasi Ping ---
const char* pingHost = "8.8.8.8"; // IP Google DNS yang akan di-ping
const int pingCount = 3;         // Jumlah ping percobaan untuk setiap deteksi
const int pingInterval = 1000;   // Jeda antar ping percobaan (ms)

// --- Konfigurasi Panggilan Telepon ---
const int maxCallAttempts = 3;     // Maksimal percobaan panggilan
const unsigned long callDelay = 5 * 60 * 1000; // Jeda antar panggilan jika gagal (5 menit)
int currentCallAttempt = 0;

// --- Variabel Status ---
bool isInternetConnected = false;
unsigned long lastPingTime = 0;
const unsigned long pingCheckInterval = 30 * 1000; // Cek ping setiap 30 detik

unsigned long lastSignalCheckTime = 0;
const unsigned long signalCheckInterval = 60 * 1000; // Cek sinyal GSM setiap 1 menit

// --- Fungsi untuk mengkonversi CSQ (0-31) ke Persentase (0-100%) ---
int csqToPercentage(int csq) {
  if (csq == 99 || csq < 0) { // Sinyal tidak diketahui atau tidak valid
    return 0; // Mengembalikan 0 jika N/A atau error
  }
  // CSQ berkisar dari 0 (terburuk) hingga 31 (terbaik)
  // map(value, fromLow, fromHigh, toLow, toHigh)
  return map(csq, 0, 31, 0, 100);
}

// --- Fungsi untuk Menampilkan Status Koneksi Internet di OLED ---
void updateInternetStatusOLED() {
  display.clearDisplay(); // Bersihkan layar
  display.setTextSize(1); // Ukuran teks normal
  display.setTextColor(SSD1306_WHITE); // Warna teks putih
  display.setCursor(0, 0); // Baris pertama

  if (isInternetConnected) {
    display.println("Internet: OK");
  } else {
    display.println("Internet: DOWN");
  }
  display.display(); // Kirim data ke layar OLED
}

// --- Fungsi untuk Mendapatkan dan Menampilkan Kekuatan Sinyal GSM di Serial dan OLED ---
void printGsmSignalQuality() {
  int csq = modem.getSignalQuality(); // Mendapatkan nilai CSQ (0-31, atau 99)
  int signalPercent = csqToPercentage(csq);
  int rssi_dBm = (2 * csq) - 113; // Konversi ke dBm

  // Tampilkan di Serial Monitor
  Serial.print("Kualitas Sinyal (CSQ): ");
  if (csq == 99) {
    Serial.println("Tidak Diketahui");
  } else {
    Serial.print(csq);
    Serial.print(" (");
    Serial.print(rssi_dBm);
    Serial.print(" dBm) ");
    Serial.print(signalPercent);
    Serial.println("%");
  }

  // Tampilkan di OLED
  display.clearDisplay(); // Bersihkan layar sebelum update
  display.setTextSize(1); // Ukuran teks normal
  display.setTextColor(SSD1306_WHITE);

  display.setCursor(0, 0); // Baris pertama
  display.print("Sinyal: ");
  if (csq == 99) {
    display.println("N/A");
  } else {
    display.print(signalPercent);
    display.println("%");
  }
  
  display.setCursor(0, 10); // Baris kedua (sekitar 10 piksel ke bawah)
  display.print("(");
  display.print(rssi_dBm);
  display.println(" dBm)");
  
  // Karena 128x64 punya lebih banyak ruang, kita bisa tampilkan status Internet juga
  display.setCursor(0, 25); // Baris ketiga/keempat
  if (isInternetConnected) {
    display.println("Internet: OK");
  } else {
    display.println("Internet: DOWN");
  }

  display.display(); // Kirim data ke layar OLED
}

void setup() {
  Serial.begin(115200);
  delay(10); // Memberi waktu serial untuk inisialisasi

  Serial.println("Memulai ESP32 GSM Monitor...");

  // --- Inisialisasi OLED ---
  Wire.begin(); // Memulai komunikasi I2C

  // Inisialisasi display OLED
  // Coba alamat 0x3C, jika gagal, coba 0x3D
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("Alokasi SSD1306 gagal atau OLED tidak ditemukan di 0x3C. Mencoba 0x3D..."));
    if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) {
        Serial.println(F("Alokasi SSD1306 gagal atau OLED tidak ditemukan di 0x3D."));
        for(;;); // Loop tak terbatas jika OLED tidak ditemukan
    }
  }

  // Pengaturan awal display OLED
  display.display(); // Tampilkan logo Adafruit (default)
  delay(2000);
  display.clearDisplay(); // Bersihkan buffer
  display.setTextSize(1);      // Ukuran teks (1x adalah 6x8 piksel per karakter)
  display.setTextColor(SSD1306_WHITE); // Warna teks (putih untuk OLED monokrom)
  display.setCursor(0, 0);
  display.println("Starting...");
  display.display(); // Update display
  Serial.println("OLED Inisialisasi OK!");
  delay(1000);

  // --- Inisialisasi WiFi ---
  Serial.print("Menghubungkan ke WiFi: ");
  Serial.println(ssid);
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("WiFi Conn...");
  display.setCursor(0, 10);
  display.println(ssid);
  display.display();
  
  WiFi.begin(ssid, password);
  int wifiAttempts = 0;
  while (WiFi.status() != WL_CONNECTED && wifiAttempts < 20) {
    delay(500);
    Serial.print(".");
    display.print("."); // Tambahkan titik-titik di OLED
    display.display();
    wifiAttempts++;
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("\nTerhubung ke WiFi!");
    Serial.print("IP Address: ");
    Serial.println(WiFi.localIP());
    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("WiFi Connected!");
    display.setCursor(0, 10);
    display.println(WiFi.localIP());
    display.display();
    delay(2000);
  } else {
    Serial.println("\nGagal terhubung ke WiFi. Ping tidak akan berfungsi.");
    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("WiFi Failed!");
    display.setCursor(0, 10);
    display.println("Ping Disabled");
    display.display();
    delay(2000);
  }

  // --- Inisialisasi Modul GSM ---
  // Sesuaikan baud rate (115200) dengan modul GSM Anda.
  gsmSerial.begin(115200, SERIAL_8N1, GSM_SERIAL_RX, GSM_SERIAL_TX); 
  Serial.println("Menginisialisasi modul GSM...");
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("GSM Init...");
  display.display();

  unsigned long gsmTestStartTime = millis();
  while (!modem.testAT()) {
    Serial.println("Gagal terhubung ke modem, mencoba lagi...");
    display.setCursor(0, 10);
    display.println("Modem Failed.   ");
    display.display();
    delay(1000);
    if (millis() - gsmTestStartTime > 30000) { // Timeout setelah 30 detik
        Serial.println("Timeout: Gagal inisialisasi modem.");
        display.clearDisplay();
        display.setCursor(0, 0);
        display.println("GSM Init FAILED!");
        display.setCursor(0, 10);
        display.println("Check Wiring!");
        display.display();
        while(true); // Hentikan program
    }
  }
  Serial.println("Modem OK");
  display.setCursor(0, 10);
  display.println("Modem OK!       ");
  display.display();
  delay(1000);

  Serial.println("Menunggu pendaftaran jaringan GSM...");
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("GSM Reg...");
  display.display();
  unsigned long gsmRegStartTime = millis();
  while (!modem.isNetworkConnected()) {
    delay(1000);
    Serial.print(".");
    display.print("."); // Tambahkan titik-titik di OLED
    display.display();
    if (millis() - gsmRegStartTime > 60000) { // Timeout setelah 60 detik
        Serial.println("Timeout: Gagal mendaftar ke jaringan GSM.");
        display.clearDisplay();
        display.setCursor(0, 0);
        display.println("GSM Reg FAILED!");
        display.setCursor(0, 10);
        display.println("Check SIM/Sinyal!");
        display.display();
        while(true); // Hentikan program
    }
  }
  Serial.println("\nTerhubung ke jaringan GSM!");
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("GSM Connected!");
  display.display();
  delay(1000);

  // Tampilkan status awal
  updateInternetStatusOLED(); // Tampilkan status internet awal
  delay(1000); // Jeda agar bisa melihat status internet
  printGsmSignalQuality();    // Tampilkan kekuatan sinyal GSM awal
}

void loop() {
  unsigned long currentMillis = millis();

  // --- Bagian Pemantauan Koneksi Internet (Ping) ---
  if (currentMillis - lastPingTime >= pingCheckInterval) {
    lastPingTime = currentMillis;

    Serial.print("Mengecek koneksi ke ");
    Serial.print(pingHost);
    Serial.print("...");

    bool pingSuccess = false;
    // Hanya ping jika WiFi terhubung
    if (WiFi.status() == WL_CONNECTED) {
        for (int i = 0; i < pingCount; i++) {
            if (WiFi.ping(pingHost)) {
                pingSuccess = true;
                break;
            }
            delay(pingInterval);
        }
    }

    if (pingSuccess) {
      if (!isInternetConnected) {
        Serial.println("Koneksi Internet PULIH.");
        currentCallAttempt = 0; // Reset percobaan panggilan
      }
      isInternetConnected = true;
      Serial.println("Koneksi Internet OK.");
    } else {
      if (isInternetConnected) {
        Serial.println("Koneksi Internet TERPUTUS!");
        currentCallAttempt = 0; // Reset percobaan panggilan saat deteksi awal putus
      }
      isInternetConnected = false;
      Serial.println("Koneksi Internet TERPUTUS.");
    }
    updateInternetStatusOLED(); // Perbarui status internet di OLED
  }

  // --- Bagian Pemantauan Kekuatan Sinyal GSM Berkala ---
  // Fungsi ini sekarang juga menampilkan status internet di OLED
  if (currentMillis - lastSignalCheckTime >= signalCheckInterval) {
    lastSignalCheckTime = currentMillis;
    printGsmSignalQuality(); // Perbarui kekuatan sinyal dan status internet di OLED
  }

  // --- Bagian Logika Panggilan Telepon ---
  // Panggilan hanya dilakukan jika internet terputus DAN masih ada percobaan panggilan tersisa
  if (!isInternetConnected && currentCallAttempt < maxCallAttempts) {
    // Pastikan GSM terhubung ke jaringan sebelum mencoba memanggil
    if (modem.isNetworkConnected()) { 
        static unsigned long lastCallAttemptTime = 0;

        // Kondisi untuk memulai panggilan baru: sudah melewati callDelay ATAU ini adalah panggilan pertama
        if (currentMillis - lastCallAttemptTime >= callDelay || lastCallAttemptTime == 0) {
            lastCallAttemptTime = currentMillis;
            currentCallAttempt++;
            Serial.print("Percobaan panggilan ke-");
            Serial.print(currentCallAttempt);
            Serial.print(" ke ");
            Serial.print(targetPhoneNumber);
            Serial.println("...");

            display.clearDisplay(); // Bersihkan layar
            display.setTextSize(1);
            display.setTextColor(SSD1306_WHITE);
            display.setCursor(0, 0);
            display.println("Calling...");
            display.setCursor(0, 10);
            display.print("Attempt ");
            display.print(currentCallAttempt);
            display.println("/3");
            display.display(); // Update OLED

            if (modem.call(targetPhoneNumber)) {
                Serial.println("Panggilan DITRIGER!");
                delay(20000); // Tunggu 20 detik agar panggilan berdering/diangkat
                modem.hangCall(); // Pastikan panggilan diakhiri
                Serial.println("Panggilan diakhiri.");
            } else {
                Serial.println("Gagal melakukan panggilan.");
                display.clearDisplay();
                display.setTextSize(1);
                display.setTextColor(SSD1306_WHITE);
                display.setCursor(0, 0);
                display.println("Call Failed!");
                display.setCursor(0, 10);
                display.println("Retrying...");
                display.display();
                delay(2000); // Tampilkan pesan gagal sebentar
            }
            // Setelah panggilan selesai (berhasil/gagal), kembali ke tampilan status normal
            updateInternetStatusOLED();
            printGsmSignalQuality();
        }
    } else {
        // Jika GSM tidak terhubung ke jaringan saat internet putus, tidak bisa memanggil
        Serial.println("GSM tidak terhubung ke jaringan, tidak bisa melakukan panggilan.");
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(SSD1306_WHITE);
        display.setCursor(0, 0);
        display.println("GSM Disconn!");
        display.setCursor(0, 10);
        display.println("No Call.");
        display.display();
        delay(1000);
    }
  } else if (currentCallAttempt >= maxCallAttempts) {
    // Jika maksimal percobaan panggilan sudah tercapai
    Serial.println("Maksimal percobaan panggilan tercapai. Menunggu koneksi pulih.");
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 0);
    display.println("Max Calls Done");
    display.setCursor(0, 10);
    display.println("Waiting for Net");
    display.display();
  }

  delay(100); // Sedikit jeda untuk stabilitas
}

Perubahan Utama untuk OLED 128x64

  1. Definisi Layar:
    C++
    #define SCREEN_HEIGHT 64 // TINGGI PIKSEL LAYAR OLED (Ini yang berubah!)
    
  2. Tata Letak Teks di OLED: Karena layarnya dua kali lebih tinggi (64 piksel vs 32 piksel), Anda memiliki lebih banyak ruang untuk menampilkan informasi.
    • Fungsi updateInternetStatusOLED() sekarang hanya menampilkan status internet.
    • Fungsi printGsmSignalQuality() sekarang juga menampilkan status internet di baris yang lebih bawah (sekitar display.setCursor(0, 25)). Ini memanfaatkan ruang tambahan dan membuat informasi lebih terpadu di satu layar.
    • Posisi display.setCursor(x, y) lainnya disesuaikan sedikit untuk memastikan teks tidak tumpang tindih dan terlihat rapi.

Sebelum Mengunggah Kode:

  • Ganti Kredensial:
    • const char* ssid = "NAMA_WIFI_ANDA";
    • const char* password = "PASSWORD_WIFI_ANDA";
    • const char* targetPhoneNumber = "+628123456789"; (Pastikan format internasional, misal +62 untuk Indonesia).
  • Pilih Modul GSM yang Benar:
    • Jika Anda menggunakan SIM800L, biarkan #include <TinyGsmClientSIM800.h>.
    • Jika Anda menggunakan SIM900, ubah menjadi #include <TinyGsmClientSIM900.h>.
  • Verifikasi Alamat I2C OLED:
    • Kebanyakan OLED 128x64 menggunakan alamat 0x3C. Kode sudah menambahkan logika untuk mencoba 0x3D jika 0x3C gagal. Namun, jika Anda tahu pasti alamatnya, Anda bisa langsung mengaturnya di display.begin(SSD1306_SWITCHCAPVCC, 0xXX).
  • Periksa Baud Rate GSM:
    • gsmSerial.begin(115200, SERIAL_8N1, GSM_SERIAL_RX, GSM_SERIAL_TX);. Baud rate 115200 umum untuk SIM800L yang baud rate otomatisnya diaktifkan. Jika modul Anda menggunakan baud rate tetap, coba 9600 atau 19200.
  • Perhatikan Daya Modul GSM:
    • Ini adalah hal paling krusial. Kegagalan modul GSM seringkali disebabkan oleh suplai daya yang tidak memadai. Pastikan PSU eksternal Anda stabil dan mampu memberikan arus puncak yang tinggi saat GSM melakukan panggilan.
  • Pilih Board dan Port: Di Arduino IDE, pilih board ESP32 yang benar (biasanya "ESP32 Dev Module") dan port COM/Serial yang terhubung ke ESP32 Anda.

Dengan layar OLED 128x64, Anda memiliki lebih banyak fleksibilitas untuk menampilkan informasi. Selamat mencoba!

No comments:

Post a Comment

CARGER AKI CONTROLER INA226-LIBARY WE ROTARI SW+OLED 0.96 SUKSES TAMPILAN LEBIH BAIK

 #include <Wire.h>  #include <Adafruit_GFX.h>    // Library grafis Adafruit #include <Adafruit_SSD1306.h> // Library untuk...