Search This Blog

Sunday, 15 June 2025

tes modul sim800 dan oled

 #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

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...