ESP32 + PlatformIO: প্রথম Hello World প্রজেক্ট

ESP32 কী এবং কেন?

ESP32 হলো একটি ছোট ও কম দামী মাইক্রোকন্ট্রোলার, যার মধ্যে Wi-Fi ও Bluetooth বিল্ট-ইন থাকে। এটি বিভিন্ন সেন্সর, LED, মোটর, ডিসপ্লে ইত্যাদি নিয়ন্ত্রণ করতে পারে। বিভিন্ন প্রোটোটাইপ অথবা হবি প্রজেক্ট সহজে তৈরি করা যায় ESP32 ব্যবহার করে।

কেন ESP32 ব্যবহার করব?
কম দামে Wi-Fi ও Bluetooth পাওয়া যায়, পাশাপাশি এটি দ্রুত কাজ করে এবং অনেক ধরনের GPIO, ADC ও অন্যান্য hardware interface রয়েছে। তাই IoT, robotics, automation, sensor monitoring এবং smart device তৈরির জন্য ESP32 খুব জনপ্রিয়।

ESP32 এবং Arduino দুটিই মাইক্রোকন্ট্রোলার-ভিত্তিক development board, তবে ESP32 তুলনামূলকভাবে বেশি শক্তিশালী। সাধারণ Arduino board-এ Wi-Fi বা Bluetooth বিল্ট-ইন থাকে না, যেখানে ESP32-তে দুটিই built-in থাকে। এই লেখায় আমরা দেখব কিভাবে ESP32 ব্যবহার করে এর বিল্টইন LED blink করা যায়। আর এর জন্য আমরা VS Code ব্যবহার করব। Arduinio IDE ব্যবহার করেও ESP32 তে কোড ডিপ্লয় করা যায়। অন্যন্য সব কাজে এবং কোডিং এর জন্য AI মডেল ব্যবহার করার সুবিধার কারণেই VS Code ব্যবহার করব।

যা যা লাগবে

  • ESP32 development board
  • USB cable
  • Laptop/PC
  • VS Code
  • PlatformIO extension

VS Code-এ PlatformIO ইনস্টল

VS Code ওপেন করে Extensions এ যাবো এবং PlatformIO IDE লিখে সার্চ করব। এরপর এটি ইন্সটল করব। ইনস্টল হওয়ার পরে VS Code restart করতে হতে পারে।


নতুন Project তৈরি করুন

VS Code-এর বাম পাশে PlatformIO-এর icon দেখতে পাবেন। এখানে Create New Project এ ক্লিক করলে PIO Home ইন্টারফেস দেখা যাবে। সেখান থেকে আবার New Project এ ক্লিক করব। এরপর একটা নাম দিব, যেমনঃ HelloESP32

Board: আপনার ESP32 board select করুন। ESP32 Dev লিখে সার্চ করে Espressif ESP32 Dev Module সিলেক্ট করে নিব।

Framework: ফ্রেমওয়ার্ক সিলেক্ট করব Arduino। তারপর Finish এ ক্লিক করব।

PlatformIO নিজে থেকেই project structure তৈরি করবে।

Project structure

আপনার project মোটামুটি এরকম হবে:

আমাদের মূল code থাকবে src/main.cpp ফাইলে।

main.cpp

src folder-এর ভিতরে main.cpp খুলুন।

আগের code থাকলে মুছে দিয়ে লিখুন:

#include <Arduino.h>

// Define LED pin (GPIO 2 is standard for built-in LED on ESP32 / ESP8266 boards)
const int ledPin = 2;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}

এটাই আমাদের প্রথম ESP32 program।

কোড ডিপ্লয়

USB cable দিয়ে ESP32-কে Mac/PC-এর সাথে connect করুন। তারপর PlatformIO-এর নিচের toolbar-এ সাধারণত Upload button পাবেন। Arrow/Upload icon চাপুন। অথবা PlatformIO আইকনে ক্লিক করে Upload and Monitor এ ক্লিক করুন। PlatformIO code compile করে ESP32-তে upload করবে।

সফল হলে এরকম কিছু দেখতে পাবেন:

SUCCESS
========================

এবং বোর্ডে থাকা ডিফল্ট ব্লু LED জ্বলবে এবং নিববে।

Code বুঝে নিই

#include <Arduino.h>

#include &lt;Arduino.h>

এটা Arduino framework-এর প্রয়োজনীয় functions এবং definitions আমাদের program-এ নিয়ে আসে।

setup()

const int ledPin = 2;
void setup() {
  pinMode(ledPin, OUTPUT);
}

setup() শুধু একবার চালু হওয়ার সময় execute হয়।

এখানে শুরুতে আমরা LED পিন সিলেক্ট করেছি। 2 হচ্ছে ডিফল্ট বোর্ডে থাকা পিন। এই পিনের সাথে একটা LED থাকে। এই code-এর মূল কাজ হলো ESP32-এর GPIO 2 pin-কে LED-এর জন্য output হিসেবে প্রস্তুত করা।

loop()

void loop() {
}

loop() function বারবার execute হয়।

যেমন:

void loop() {
    Serial.println("Hello World!");
    delay(1000);
}

তাহলে প্রতি ১ সেকেন্ডে:

Hello World!
Hello World!
Hello World!
Hello World!

দেখাবে কনসলে। আমরা লিখেছিঃ

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}

এর মানে একবার led pin এ হাই ভোল্টেজ দিবে। একবার লো ভোল্টেজ দিবে। delay দিয়ে কতক্ষণ গ্যাপ থাকবে পরের কোড রান করার জন্য, তা সেট করেছি আমরা।

platformio.ini কী?

প্রতিটা Project-এর root folder-এ platformio.ini নামে একটি file আছে।

সাধারণ ESP32 Arduino project-এ এটা এমন হতে পারে:

[env:esp32doit-devkit-v1]
platform = espressif32
board = esp32doit-devkit-v1
framework = arduino
monitor_speed = 115200

এখানে:

লেখাকাজ
platform = espressif32ESP32 platform
board = esp32doit-devkit-v1ESP32 Dev Module
framework = arduinoArduino framework
monitor_speed = 115200Serial Monitor-এর speed

এবার কোডে ledPin এর ভ্যালু দুই এর পরিবর্তে যে কোন পিন যেমন 4 সেট করে এরপর বোর্ডে যদি আমরা একটা LED যোগ করি, তাহলে ঐ LED এমন জ্বলবে নিববে।

ESP32 Development Board সম্পর্কে বিস্তারিত

ESP32 হলো আমাদের পুরো project-এর মূল controller। আমরা যে sensor, LED, button, OLED display বা relay ব্যবহার করব, সেগুলোর বেশিরভাগই ESP32-এর সাথে সংযুক্ত হবে। তাই ESP32 দিয়ে কাজ শুরু করার আগে সবচেয়ে গুরুত্বপূর্ণ বিষয় হলো—কোন pin কী কাজ করে এবং কোন pin কখন ব্যবহার করা নিরাপদ, এগুলো সম্পর্কে জানা।

একটা বিষয় শুরুতেই মনে রাখা দরকার যে ESP32-এর সব GPIO (General Purpose Input/Output) pin একই রকম নয়।

কিছু pin শুধু input হিসেবে কাজ করে, কিছু pin Wi-Fi চালু করলে analog reading-এর জন্য ব্যবহার করা যায় না, আবার কিছু pin ESP32 boot করার সময় বিশেষ ভূমিকা পালন করে।

ESP32-এর গুরুত্বপূর্ণ Pin

শুরুতে সবগুলো pin মুখস্থ করার প্রয়োজন নেই। আমাদের project-এ যেগুলো বেশি ব্যবহার হবে, সেগুলো আগে চিনে নিই।

Pinকী কাজে ব্যবহার করবসহজ ব্যাখ্যা
3V3Sensor/module-এর power3.3V regulated power দেয়
GNDGroundCircuit-এর common ground
VIN / 5V5V প্রয়োজন এমন moduleUSB থেকে আসা 5V পাওয়া যায়
GPIO 32, 33Analog / DigitalSensor reading এবং সাধারণ GPIO
GPIO 34, 35Analog InputSensor reading-এর জন্য ভালো
GPIO 21I²C SDAOLED-এর data line
GPIO 22I²C SCLOLED-এর clock line
GPIO 4, 5, 13–19, 23, 25–27Digital I/OLED, button, relay, buzzer ইত্যাদি

শুরুতে সবচেয়ে বেশি মনে রাখার মতো তিনটি হলো:

3V3 → Power
GND → Ground
GPIO → Signal

3V3, GND এবং VIN — কোনটা কী?

ESP32-এর power pin নিয়ে শুরুতেই পরিষ্কার ধারণা থাকা খুব গুরুত্বপূর্ণ।

3V3: 3V3 pin থেকে regulated 3.3V পাওয়া যায়। আমাদের বেশিরভাগ sensor এবং ছোট module এখান থেকেই power নেবে।

যেমন:

ESP32 3V3 ───── Sensor VCC
ESP32 GND ───── Sensor GND

GND: GND হলো circuit-এর common reference বা ground। ESP32 এবং sensor-এর মধ্যে communication করতে হলে সাধারণত তাদের GND অবশ্যই common হতে হবে। বোর্ডে একাধিক GND pin থাকতে পারে। এগুলো একই ground-এর সাথে connected।

VIN / 5V: কিছু ESP32 board-এ VIN, আবার কিছু board-এ 5V লেখা থাকে। এখানে সাধারণত USB থেকে আসা 5V পাওয়া যায়। এটি GPIO নয়। তাই কোনো GPIO pin-এর সাথে VIN/5V connect করা যাবে না। সবচেয়ে গুরুত্বপূর্ণ নিয়ম: GPIO-তে 5V দেওয়া যাবে না। ESP32 3.3V logic ব্যবহার করে। অর্থাৎ GPIO pin-গুলো 3.3V-এর জন্য designed। তাই কোনো GPIO-তে সরাসরি 5V দেওয়া বিপজ্জনক এবং pin স্থায়ীভাবে নষ্ট হয়ে যেতে পারে। বিশেষ করে potentiometer ব্যবহার করার সময় এটি মনে রাখতে হবে।

Analog Sensor-এর জন্য কোন Pin ব্যবহার করব?

ESP32-এর ADC (Analog-to-Digital Converter) ব্যবহার করে আমরা sensor বা potentiometer-এর মতো component থেকে analog value পড়তে পারি। কিন্তু এখানে একটি গুরুত্বপূর্ণ বিষয় আছে। ESP32-এর ADC দুই ভাগে বিভক্ত:

  • ADC1
  • ADC2

ADC2 এবং Wi-Fi-এর সমস্যা

ESP32-এর ADC2 hardware Wi-Fi-এর সাথে shared। ফলে Wi-Fi ব্যবহার করার সময় ADC2-এর pin দিয়ে analogRead() করলে সমস্যা হতে পারে। তাই beginner হিসেবে সবচেয়ে সহজ নিয়ম হচ্ছে Analog sensor-এর জন্য ADC1-এর pin ব্যবহার করা।

যেমন:

GPIO 32
GPIO 33
GPIO 34
GPIO 35
GPIO 36
GPIO 39

এগুলো analog reading-এর জন্য ভালো choice।

GPIO 34–39-এর বিশেষ নিয়ম

GPIO 34 থেকে GPIO 39 একটু আলাদা। এগুলো input-only pin। অর্থাৎ:

Sensor ───> GPIO 34

এটা করা যাবে।

কিন্তু:

GPIO 34 ───> LED

এভাবে LED control করা যাবে না। কারণ GPIO 34–39 output দিতে পারে না।

তাহলে এগুলো কোথায় ব্যবহার করব?

Sensor reading-এর জন্য এগুলো খুব ভালো। কিন্তু LED বা relay control করতে চাইলে অন্য GPIO ব্যবহার করতে হবে। আরেকটি বিষয় হলো, GPIO 34–39-এ built-in internal pull-up resistor নেই। তাই button-এর মতো circuit-এ external resistor প্রয়োজন হতে পারে।

Boot-এর সময় কিছু GPIO কেন গুরুত্বপূর্ণ?

ESP32 চালু হওয়ার সময় কিছু GPIO-এর voltage level পরীক্ষা করে chip সিদ্ধান্ত নেয় কীভাবে boot করবে। এগুলোকে strapping pins বলা হয়। এর মধ্যে গুরুত্বপূর্ণ কয়েকটি হলো:

GPIO 0
GPIO 2
GPIO 12
GPIO 15

এগুলোর সাথে ভুলভাবে কোনো component connected থাকলে ESP32 boot করতে সমস্যা করতে পারে।

Beginner হিসেবে কী করবেন?

শুরুতে খুব বেশি চিন্তা করার দরকার নেই। শুধু মনে রাখতে হবে GPIO 0, 12 এবং 15 অপ্রয়োজনে ব্যবহার না করাই ভালো। GPIO 2 অনেক ESP32 board-এ onboard LED-এর সাথে connected থাকে এবং basic LED project-এ এটি ব্যবহার করা হয়।

তাহলে LED-এর জন্য কোন GPIO ব্যবহার করব?

সাধারণ digital output-এর জন্য আমরা এমন GPIO বেছে নেব যেগুলোতে বিশেষ restriction কম।

উদাহরণ:

GPIO 4
GPIO 5
GPIO 18
GPIO 19
GPIO 23
GPIO 25
GPIO 26
GPIO 27

এগুলো LED, button, relay বা buzzer-এর মতো সাধারণ component-এর জন্য ব্যবহার করা যায়।

GPIO আসলে কী?

GPIO-এর পূর্ণরূপ হচ্ছে General Purpose Input/Output। সহজভাবে বললে, GPIO হলো ESP32-এর এমন pin যেটা দিয়ে আমরা বাইরের electronic component-এর সাথে signal আদান-প্রদান করতে পারি।

Input

ESP32 বাইরের কোনো signal পড়বে

Button ─────> ESP32 GPIO

Output

ESP32 বাইরের কোনো component-কে control করবে

ESP32 GPIO ─────> LED

তাই:

Input = ESP32 কিছু পড়ছে
Output = ESP32 কিছু control করছে


Serial Monitor

ESP32-এর সাথে কাজ করার সময় Serial Monitor আমাদের জন্য খুব গুরুত্বপূর্ণ। এটি ব্যবহার করে ESP32-এর ভিতরের data computer-এ দেখতে পারি। Code-এ যদি লিখি:

Serial.begin(115200);

তাহলে Serial Monitor-এও:

115200

দিতে হবে।

দুটো একই না হলে output এমন হতে পারে:

����������������
▒▒╫╫╫�

এটা দেখে মনে হতে পারে ESP32 নষ্ট হয়ে গেছে।

আসলে বেশিরভাগ সময় শুধু baud rate mismatch হয়েছে। তাই মনে রাখুন:

Code:          115200
Serial Monitor: 115200

শুরুতে শুধু এই নিয়মগুলো মনে রাখুন

সব GPIO-এর details এখনই মুখস্থ করার দরকার নেই। শুরুতে এই কয়েকটি rule মনে রাখলেই যথেষ্ট:

1. Power

3V3 → Sensor/module-এর power

2. Ground

GND → সব component-এর common ground

3. GPIO

GPIO → Signal

4. Analog

Analog sensor → ADC1 / GPIO 32–39

5. GPIO 34–39

শুধু Input

6. Voltage

GPIO-তে 5V দেবেন না

7. Wi-Fi + Analog

Wi-Fi ব্যবহার করলে ADC2 এড়িয়ে চলুন

8. Boot

GPIO 0, 12, 15-এর ব্যাপারে সতর্ক থাকুন

এই কয়েকটি নিয়ম ঠিকভাবে বুঝে গেলে ESP32-এর সাথে sensor এবং অন্যান্য component connect করা অনেক সহজ হয়ে যাবে।

Leave a Comment