Control LED with TTGO T-Call ESP32

IoT ডেভেলপমেন্টে যদি এমন কোনো বোর্ড খুঁজে থাকো যা একই সাথে Compact, Powerful আর Super-Versatile, তবে TTGO T-Call ESP32-ই হতে পারে তোমার Best Pick। এটি তৈরি হয়েছে ESP32 Dual-Core Processor এর উপর ভিত্তি করে, যেখানে Built-in WiFi আর Bluetooth Connectivity যা তোমাকে একই সাথে Local এবং Short-Range Device Communication অসাধারণ Flexibility দিয়ে থাকে।

শুধু তাই নয় TTGO T-Call ESP32 মডিউলের সব থেকে বড় ফিচার হলো Integrated SIM800L GSM/GPRS Module। এর মাধ্যমে তুমি WiFi-এর সীমাবদ্ধতা ভুলে গিয়ে Cellular Network ব্যবহার করে পৃথিবীর যেকোনো জায়গা থেকে ডিভাইস Control করতে পারবে। শুধু তাই নয়, Onboard SIM Card Slot আর Lithium Battery Charging Support এটিকে বানিয়েছে IoT ভিত্তিক ডেভেলপমেন্টে একবারেই Ready-to-Go Solution। Remote Monitoring, Smart Agriculture, Security System বা যেকোনো Portable IoT Project-এর জন্য একদমই পারফেক্ট।

ttgo-t-call-esp32-with-sim800l

কিন্তু TTGO T-Call ESP32 বোর্ডটি শুরুতেই ব্যবহার করতে গেলে আমরা অনেকেই লাইব্রেরি বা ইন্টারফেসিং নিয়ে কিছুটা কনফিউজ হয়ে থাকি। তাই আজকের টিউটোরিইয়্যালে আমি দেখাবো কীভাবে TTGO T-Call ESP32 দিয়ে SMS এবং Call এর মাধ্যমে LED Control করা যায়। এর মাধ্যমে একজন Beginner সহজেই বোর্ডের সঙ্গে কাজ শুরু করতে পারবে, আর একজন Advance ইউজার এটি Reference হিসেবে ব্যবহার করে প্রোজেক্ট এক্সপ্যানশনের জন্যও কাজে লাগাতে পারবে।

Get Started

প্রোজেক্টটি শুরু করার আগে কিছু প্রাথমিক প্রস্তুতি দরকার, যাতে করে তোমার Development Time এ কোনো ঝামেলায় না পড়তে হয়। এই রিকেরমেন্টসগুলো ফুলফিল করে নিলেই তুমি Smoothly প্রোজেক্টটি Go Through করতে পারবে। 

ttgo-t-call-esp32-with-sim800l-requirements

Requirements

  • Supporting Component Collection.
  • Arduino IDE Install
  • Adding ESP32 Board to Arduino IDE
  • Related Library Install and Configuration.

Supporting Component Collection:

প্রোজেক্টটি শুরু করতে প্রয়োজনীয় কম্পোনেন্টের তালিকা নিচের Component List নামক টেবিলে Purchase Link সহ সংযোজন করা হলো। (যদি আগে থেকেই তোমার সংগ্রহে কম্পোনেন্টগুলো থেকে থাকে, তাহলে তুমি এই অংশটি Skip করতে পারো।)

ttgo-t-call-esp32-with-sim800l-component-list

Component List:

কম্পোনেন্ট তালিকা
কম্পোনেন্টের নাম পরিমান
Breadboard
1
Male to Male Jumper Wire
2
Red Led
1
120 Ohm Resistor
1

 

Arduino IDE Install:

যদি তোমার কম্পিউটারে আগে থেকেই Arduino IDE ইনস্টল করা থাকে, তবে এই রিকেরমেন্টসটি সহজেই Skip করতে পারো। আর যদি না থাকে সেক্ষেত্রে এই টিউটোরিয়্যালটি ফলো করে Arduino IDE তোমার কম্পিউটারে Install করে নিতে পারো। 

arduino-ide-download

 

Adding ESP32 Board to Arduino IDE:

এই স্টেপটি Complete করতে এই টিউটোরিয়্যালটি ফলো করতে পারো। ১-২ মিনিটেই ESP32 Board টি তোমার IDE তে ইন্সটল হয়ে যাবে। আর যদি আগে থেকেই করা থাকে তাহলে পরের স্টেপে চলে যাও।

installing-esp32-borard-arduino-ide
Related Library Install: 

প্রথমে তোমার Arduino IDE টি Open করে নাও। তারপর Sketch>Include Library>Manage Library গিয়ে নিচের লাইব্রেরীটি সার্চ করে Install করে নাও!

  • TinyGSM

Hardware Setup

প্রথমেই তোমার প্যাকেটে থাকা Antenna টি নিয়ে TTGO T-Call বোর্ডের SMA Female Connector-এর সাথে কানেক্ট করো। 

এরপর তোমার কাছে থাকা Nano SIM কার্ডটি বোর্ডের SIM card slot-এ ভালোভাবে বসিয়ে নাও।

সার্কিট ডায়াগ্রাম

নিচের কানেকশন টেবিল অনুযায়ী TTGO T-Call ESP32 এর সাথে LED এবং Current Limiting Resistor এর Connections গুলো দিতে হবে।

কোডিং

কোডটি কপি করে Arduino IDE তে পেস্ট করে নাও। বোর্ড হিসাবে ESP32 WROVER Module এবং ডিভাইসটি তোমার কম্পিউটারের যে COM Port এ কানেক্ট হয়েছে সেটি সিলেক্ট করে কোডটি মাইক্রোকন্ট্রোলারে আপলোড করে নাও।

Important: কোডটি আপলোড করার আগে অবশ্যই নিজের ফোন নম্বরটি সেট করতে হবে। অর্থাৎ নিচের অংশে থাকা +8801XXXXXXXXX জায়গায় যে সিম দিয়ে কন্ট্রোল করতে চাচ্ছো সেই  সিমের নাম্বার লিখে দাও।

 

#define SMS_TARGET “+8801XXXXXXXXX”
char* msg = “+cmt: \”+8801XXXXXXXXX\””;
char* ring = “+clip: \”+8801XXXXXXXXX\””;

 

আপলোডের আগে অবশ্যই আপনার নাম্বার পরিবর্তন না করলে মডিউল থেকে সঠিক রেসপন্স পাওয়া যাবে না।

/*
  ================================================================
   TTGO T-Call ESP32 (SIM800L + IP5306) - SMS & Call Controlled LED
   ---------------------------------------------------------------
   Board      : TTGO T-Call ESP32
   Function   : Control LED remotely using SMS & Call via SIM800L
   Developer  : TechShop R&D Dept
   Version    : 1.0
   Date       : 2025-09-29
  ================================================================

   -------------------------------
   FUNCTIONALITY
   -------------------------------
   1. SIM800L is powered & initialized using the onboard IP5306 PMU.
   2. ESP32 receives incoming SMS or call notifications.
   3. If SMS is received from a predefined number:
        -> "led on"  turns ON the LED and sends back confirmation.
        -> "led off" turns OFF the LED and sends back confirmation.
   4. If a call is received from the same number:
        -> The call is automatically cut.
        -> Each call toggles LED ON/OFF and sends back confirmation SMS.

   -------------------------------
   IMPORTANT ⚠️
   -------------------------------
   ➤ You MUST replace the placeholder number in the code with your own 
     valid phone number:
        #define SMS_TARGET "+8801XXXXXXXXX"
     Example:
        #define SMS_TARGET "+8801712345678"
   ➤ This number is used for both SMS and Call authentication.
   ➤ Only this number will be able to control the LED.

   -------------------------------
   HARDWARE NOTES (TTGO T-Call ESP32)
   -------------------------------
   - ESP32, SIM800L GSM modem, and IP5306 PMU are integrated.
   - SIM card slot + micro-USB for power/charging provided.
   - A LiPo battery is recommended for stable SIM800L operation.
   - Peak current of SIM800L ~2A is handled by onboard design.
   - Only user hardware addition: external LED on **GPIO 2**.

   -------------------------------
   CIRCUIT CONNECTIONS (EXTRA)
   -------------------------------
   GPIO  2  --> LED (through current limiting resistor to GND)

   -------------------------------
   LIBRARIES USED
   -------------------------------
   - TinyGSM (SIM800L AT command handling)
   - StreamDebugger (debugging AT commands)
   - Wire (I2C communication with IP5306 PMU)
   - Arduino core for ESP32

*/
#define DUMP_AT_COMMANDS               // Enable AT command debugging
#define TINY_GSM_DEBUG SerialMon       // Route TinyGSM debug to Serial Monitor

#include <string.h>
#include <Wire.h>

// -------------------------------
// SIM800L + IP5306 Pin Mapping
// -------------------------------
#define MODEM_RST       5     // Modem Reset pin
#define MODEM_PWRKEY    4     // Modem Power Key
#define MODEM_POWER_ON  23    // Modem Power Enable
#define MODEM_TX        27    // ESP32 TX -> SIM800 RX
#define MODEM_RX        26    // ESP32 RX -> SIM800 TX
#define I2C_SDA         21    // I2C SDA for IP5306
#define I2C_SCL         22    // I2C SCL for IP5306
#define LED_GPIO        13    // Status LED GPIO
#define LED_ON          HIGH
#define LED_OFF         LOW

// -------------------------------
// IP5306 Power Management Unit
// -------------------------------
#define IP5306_ADDR           0x75
#define IP5306_REG_SYS_CTL0   0x00

// Configure IP5306 power chip
bool setupPMU() {
  bool en = true;
  Wire.begin(I2C_SDA, I2C_SCL);
  Wire.beginTransmission(IP5306_ADDR);
  Wire.write(IP5306_REG_SYS_CTL0);

  if (en) {
    Wire.write(0x37); // Enable boost keep-on
  } else {
    Wire.write(0x35); // Default register value
  }
  return Wire.endTransmission() == 0;
}

// -------------------------------
// Modem Power Control
// -------------------------------
void setupModem() {
  if (!setupPMU()) {
    Serial.println("PMU Setup Failed!");
  }

  // Modem Reset
  pinMode(MODEM_RST, OUTPUT);
  digitalWrite(MODEM_RST, HIGH);

  // Power Pins
  pinMode(MODEM_PWRKEY, OUTPUT);
  pinMode(MODEM_POWER_ON, OUTPUT);

  // Turn on modem power
  digitalWrite(MODEM_POWER_ON, HIGH);

  // PWRKEY pulse sequence (>1s)
  digitalWrite(MODEM_PWRKEY, HIGH);
  delay(100);
  digitalWrite(MODEM_PWRKEY, LOW);
  delay(1000);
  digitalWrite(MODEM_PWRKEY, HIGH);

  // Status LED
  pinMode(LED_GPIO, OUTPUT);
  digitalWrite(LED_GPIO, LED_OFF);
}

// -------------------------------
// Serial Configuration
// -------------------------------
#define SerialMon Serial       // Debug console
#define SerialAT  Serial1      // AT command UART

// -------------------------------
// TinyGSM Modem Setup
// -------------------------------
#define TINY_GSM_MODEM_SIM800
#define TINY_GSM_RX_BUFFER 1024

#include <TinyGsmClient.h>
#ifdef DUMP_AT_COMMANDS
  #include <StreamDebugger.h>
  StreamDebugger debugger(SerialAT, SerialMon);
  TinyGsm modem(debugger);
#else
  TinyGsm modem(SerialAT);
#endif

// -------------------------------
// Global Variables
// -------------------------------
char* lower = "";
char* response = " ";
String res = "";
bool new_data = 0;
int led_state = 0;

// Control Numbers
#define SMS_TARGET "+8801XXXXXXXXX"    // Replace with authorized number
char* msg  = "+cmt: \"+8801XXXXXXXXX\"";
char* ring = "+clip: \"+8801XXXXXXXXX\"";

// SMS Commands
char* value1 = "led on";
char* value0 = "led off";

// LED Pin
#define LED_PIN 2

// -------------------------------
// Setup
// -------------------------------
void setup() {
  SerialMon.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  delay(10);

  if (!setupPMU()) {
    Serial.println("PMU Power Error!");
  }
  setupModem();

  // Start SIM800 Serial
  SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
  delay(6000);

  SerialMon.println("Initializing modem...");
  modem.restart();

  // Print Modem Info
  String modemInfo = modem.getModemInfo();
  SerialMon.print("Modem Info: ");
  SerialMon.println(modemInfo);
  delay(1000);

  // AT Commands for SMS
  SerialAT.println("AT");
  updateSerial();
  SerialAT.println("AT+CMGF=1");       // SMS Text Mode
  updateSerial();
  SerialAT.println("AT+CNMI=1,2,0,0,0"); // New SMS Notify
  updateSerial();
}

// -------------------------------
// Main Loop
// -------------------------------
void loop() {
  updateSerial();
}

// -------------------------------
// Serial Communication Handler
// -------------------------------
void updateSerial() {
  delay(500);

  // Forward Serial Monitor -> Modem
  while (Serial.available()) {
    SerialAT.write(Serial.read());
  }

  // Read Modem -> Serial Monitor
  while (SerialAT.available()) {
    char add = SerialAT.read();
    res += add;
    delay(1);
    new_data = 1;
  }

  // Process received data
  if (new_data) {
    response = &res[0];
    const int length = strlen(response);

    // Convert to lowercase
    lower = (char*)malloc(length + 1);
    lower[length] = 0;
    for (int i = 0; i < length; i++) {
      lower[i] = tolower(response[i]);
    }

    Serial.println(lower);
    Serial.println("\n");

    // LED control
    led_control(lower);

    // Reset
    response = "";
    res = "";
    lower = "";
    new_data = 0;
  }
}

// -------------------------------
// LED Control via SMS or Call
// -------------------------------
void led_control(char* lower) {
  // SMS Command Handling
  if (strstr(lower, msg)) {
    String source = (String)lower;
    char* desti = &source[0];
    int i = 0;
    while (desti[i + 2] != '\n') i++;
    String destin = (String)desti;
    source = source.substring(51);

    Serial.print("Your message is = ");
    Serial.print(source);

    char* relay1 = &source[0];

    // "led on"
    if (strstr(relay1, value1)) {
      digitalWrite(LED_PIN, HIGH);
      bool res = modem.sendSMS(SMS_TARGET, String("LED is turned on"));
      DBG("SMS:", res ? "OK" : "fail");
      led_state = 1;
      return;
    }

    // "led off"
    if (strstr(relay1, value0)) {
      digitalWrite(LED_PIN, LOW);
      bool res = modem.sendSMS(SMS_TARGET, String("LED is turned off"));
      DBG("SMS:", res ? "OK" : "fail");
      led_state = 0;
      return;
    }
  }

  // Call Handling
  if (strstr(lower, ring)) {
    bool res = modem.callHangup();
    DBG("Hang up:", res ? "OK" : "fail");

    // Toggle LED on call
    if (led_state == 1) {
      digitalWrite(LED_PIN, LOW);
      led_state = 0;
      res = modem.sendSMS(SMS_TARGET, String("LED is turned off"));
      DBG("SMS:", res ? "OK" : "fail");
      return;
    }

    if (led_state == 0) {
      digitalWrite(LED_PIN, HIGH);
      led_state = 1;
      res = modem.sendSMS(SMS_TARGET, String("LED is turned on"));
      DBG("SMS:", res ? "OK" : "fail");
      return;
    }
  }
}

Demonstration

Mahbub Morshed Rifat
Mahbub Morshed Rifat

Engineer
TechShop Bangladesh

Leave a Reply

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.