ESP32 টিউটোরিয়াল ৪৩/৫৫ - IoT ইন্টারনেট ওয়েদার স্টেশন | সানফাউন্ডারের ESP32 IoT লার্নিং কিট
এই টিউটোরিয়ালে, আমরা SunFounder-এর ESP32 এবং এর ক্যামেরা এক্সটেনশন বোর্ড ব্যবহার করে একটি ইন্টারনেট-সংযুক্ত আবহাওয়া স্টেশন তৈরি করব। এই প্রকল্পটি ESP32-কে রিয়েল-টাইম আবহাওয়ার ডেটা, যেমন তাপমাত্রা এবং আর্দ্রতা, সংগ্রহ করতে এবং একটি LCD স্ক্রিনে প্রদর্শন করতে সক্ষম করে। এই অ্যাপ্লিকেশনটি শুধু ESP32-এর ক্ষমতাই প্রদর্শন করে না, বরং একটি বাহ্যিক API থেকে ডেটা আনতে এবং পার্স করতে শেখায়।

টিউটোরিয়ালটি এগিয়ে যাওয়ার সাথে সাথে, আমরা উপাদানগুলো সংযোগ করব, কোড কনফিগার করব এবং সবকিছু নির্বিঘ্নে একসাথে কাজ করে তা নিশ্চিত করব। চূড়ান্ত ফলাফল হবে একটি সম্পূর্ণ কার্যকরী আবহাওয়া স্টেশন যা প্রতি ১০ সেকেন্ডে তার রিডিং আপডেট করবে, বর্তমান আবহাওয়ার অবস্থার একটি স্পষ্ট এবং সংক্ষিপ্ত প্রদর্শন প্রদান করবে (ভিডিওতে ০০:৩০ এ)।
হার্ডওয়্যার ব্যাখ্যা
এই প্রকল্পে ব্যবহৃত প্রধান উপাদানগুলির মধ্যে রয়েছে ESP32 মাইক্রোকন্ট্রোলার, একটি LCD ডিসপ্লে এবং প্রয়োজনীয় তারের সংযোগ। ESP32 বিল্ট-ইন Wi-Fi এবং ব্লুটুথ দিয়ে সজ্জিত, যা এটিকে ইন্টারনেটে সংযোগ করতে এবং ডেটা সংগ্রহ করতে দেয়। LCD ডিসপ্লে বর্তমান আবহাওয়ার তথ্য, যেমন তাপমাত্রা এবং আর্দ্রতা দেখাবে।
আমরা যে LCD ব্যবহার করছি তা একটি ১৬x২ অক্ষর ডিসপ্লে, যার অর্থ এটি প্রতিটি ১৬ অক্ষরের দুটি লাইন দেখাতে পারে। এটি আমাদের আবহাওয়ার তথ্য আউটপুটের জন্য যথেষ্ট হবে। ESP32 I2C এর মাধ্যমে LCD-এর সাথে যোগাযোগ করবে, যা শুধুমাত্র দুটি ডেটা লাইন ব্যবহার করে তারের সংযোগ সহজ করে।
ডেটাশিট বিবরণ
| প্রস্তুতকারক | Espressif |
|---|---|
| পার্ট নম্বর | ESP32-WROOM-32 |
| লজিক/IO ভোল্টেজ | ৩.৩ V |
| সাপ্লাই ভোল্টেজ | ৩.০–৩.৬ V |
| আউটপুট কারেন্ট (প্রতি চ্যানেল) | সর্বোচ্চ ১২ mA |
| পিক কারেন্ট (প্রতি চ্যানেল) | ৪০ mA |
| PWM ফ্রিকোয়েন্সি নির্দেশিকা | ১ kHz |
| ইনপুট লজিক থ্রেশহোল্ড | ০.৩ V (নিম্ন), ০.৭ V (উচ্চ) |
| ভোল্টেজ ড্রপ / RDS(on) / স্যাচুরেশন | ০.৫ V |
| থার্মাল সীমা | -৪০ থেকে ৮৫ °C |
| প্যাকেজ | QFN48 |
| নোট / ভেরিয়েন্ট | বিভিন্ন অ্যাপ্লিকেশনের জন্য একাধিক ভেরিয়েন্ট অন্তর্ভুক্ত |
- ESP32 একটি স্থিতিশীল ৩.৩ V সাপ্লাই দিয়ে পাওয়ার করা নিশ্চিত করুন।
- যোগাযোগের সমস্যা এড়াতে সমস্ত উপাদানের জন্য একটি সাধারণ গ্রাউন্ড ব্যবহার করুন।
- একটি I2C স্ক্যানার ব্যবহার করে LCD-এর I2C ঠিকানা পরীক্ষা করুন।
- ডেটা সংগ্রহের সময় সংযোগ বিচ্ছিন্ন এড়াতে Wi-Fi সংযোগের অবস্থা পর্যবেক্ষণ করুন।
- ডেটা সংগ্রহের দৃঢ়তার জন্য JSON পার্সিং ত্রুটিগুলি পরিচালনা করুন।
ওয়্যারিং নির্দেশাবলী

উপাদানগুলো সংযোগ করতে, প্রথমে LCD-কে ESP32-এর সাথে সংযুক্ত করুন। LCD I2C ইন্টারফেস ব্যবহার করবে, তাই LCD-এর SDA পিনটি ESP32-এর GPIO21-এর সাথে এবং SCL পিনটি GPIO22-এর সাথে সংযুক্ত করুন। LCD-এর পাওয়ার এবং গ্রাউন্ড পিনগুলি যথাক্রমে ESP32-এর 5V এবং GND পিনের সাথে সংযুক্ত করতে ভুলবেন না।
এরপর, অন্তর্ভুক্ত লিথিয়াম ব্যাটারি বা একটি USB সংযোগ ব্যবহার করে ESP32 সঠিকভাবে পাওয়ার করা হয়েছে তা নিশ্চিত করুন। ব্যাটারি বহনযোগ্যতা প্রদান করে, যখন USB সংযোগ প্রোগ্রামিং এবং ডিবাগিংয়ের জন্য দরকারী। অবশেষে, কার্যকারিতা ব্যাহত করতে পারে এমন কোনো ঢিলেঢালা তারের সমস্যা এড়াতে সমস্ত সংযোগ নিরাপদ কিনা তা পরীক্ষা করুন।
কোড উদাহরণ ও ওয়াকথ্রু
আমাদের প্রোগ্রামের সেটআপ পর্যায়ে, আমরা সিরিয়াল যোগাযোগ শুরু করি এবং প্রদত্ত SSID এবং পাসওয়ার্ড ব্যবহার করে Wi-Fi নেটওয়ার্কে সংযোগ করি। নিম্নলিখিত কোড স্নিপেটটি Wi-Fi সংযোগ পরিচালনা করে:
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Wi-Fi নেটওয়ার্কে সংযুক্ত, IP ঠিকানা: ");
Serial.println(WiFi.localIP());
এই কোডটি নিশ্চিত করে যে ESP32 কোনো ডেটা সংগ্রহের আগে নির্দিষ্ট Wi-Fi নেটওয়ার্কে সংযুক্ত হয়। সংযোগ ব্যর্থ হলে, এটি ক্রমাগত পুনরায় সংযোগের চেষ্টা করবে।
এরপর, আবহাওয়ার ডেটা সংগ্রহ করতে আমাদের একটি HTTP GET অনুরোধ পাঠাতে হবে। এটি নিম্নলিখিত কোড স্নিপেট ব্যবহার করে সম্পন্ন করা হয়:
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());
এখানে, আমরা API অনুরোধের জন্য URL তৈরি করি, যাতে শহর, দেশের কোড এবং আমাদের API কী অন্তর্ভুক্ত থাকে। তারপর আবহাওয়ার ডেটা আনতে httpGETRequest ফাংশনটি কল করা হয়।
অবশেষে, আমরা JSON প্রতিক্রিয়া পার্স করি এবং LCD-তে প্রাসঙ্গিক ডেটা প্রদর্শন করি:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time);
lcd.print(" ");
lcd.print(myObject["weather"][0]["main"]);
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(myObject["main"]["temp"]);
lcd.print("\xDF"); // "°" অক্ষর
lcd.print("C ");
lcd.print("H:");
lcd.print(myObject["main"]["humidity"]);
lcd.print("%");
এই কোড স্নিপেটটি বর্তমান সময়, আবহাওয়ার অবস্থা, তাপমাত্রা এবং আর্দ্রতা সহ LCD ডিসপ্লে আপডেট করে। এটি পূর্ববর্তী ডিসপ্লে মুছে দেয় এবং প্রতিটি লাইনের জন্য কার্সারকে উপযুক্ত অবস্থানে সেট করে।
প্রদর্শন / কী আশা করবেন
সফলভাবে ওয়্যারিং এবং প্রোগ্রামিংয়ের পরে, আপনার আবহাওয়া স্টেশনটি Wi-Fi-তে সংযুক্ত হবে এবং প্রতি ১০ সেকেন্ডে আবহাওয়ার ডেটা সংগ্রহ করা শুরু করবে। আপনি LCD স্ক্রিনে বর্তমান তাপমাত্রা, আর্দ্রতা এবং আবহাওয়ার অবস্থা দেখতে পাবেন। যদি ESP32 Wi-Fi-তে সংযোগ করতে ব্যর্থ হয়, তবে এটি সিরিয়াল মনিটরে একটি ত্রুটি বার্তা প্রিন্ট করবে।
ওপেনওয়েদারম্যাপ পরিষেবা থেকে ব্লক হওয়া এড়াতে API কলের সীমা সম্পর্কে সতর্ক থাকুন। ডেটা সংগ্রহে কোনো সমস্যা হলে, আপনার API কী পরীক্ষা করুন এবং নিশ্চিত করুন যে আপনার শহর ও দেশের কোড সঠিকভাবে উল্লেখ করা হয়েছে (ভিডিওতে ১৫:৪৫ মিনিটে)।
ভিডিও টাইমস্ট্যাম্প
- ০০:০০ শুরু
- ২:০০ প্রকল্পের পরিচিতি
- ৫:০৪ ওপেনওয়েদার অ্যাকাউন্ট
- ৬:১১ ওয়্যারিং
- ৮:০৫ আরডুইনো কোড ব্যাখ্যা
- ১৪:১৩ কোডে জেসন উপাদান
- ২০:২৩ আরডুইনো আইডিইতে ESP32 বোর্ড এবং COM পোর্ট নির্বাচন
- ২২:০৫ LCD1602-এ ওয়েদার স্টেশনের প্রদর্শন
- ২৩:৪৫ LCD2004-এ ওয়েদার স্টেশনের প্রদর্শন
/*
Rui Santos
Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-get-open-weather-map-thingspeak-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
// Replace the next variables with your SSID/Password combination
const char* ssid = "SSID";
const char* password = "PASSWORD";
// Your Domain name with URL path or IP address with path
String openWeatherMapApiKey = "openWeatherMapApiKey";
// Replace with your country code and city
// Fine the country code by https://openweathermap.org/find
String city = "CITY";
String countryCode = "COUNTRY CODE";
// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 10 seconds (10000)
unsigned long timerDelay = 10000;
String jsonBuffer;
// set the LCD number of columns and rows
int lcdColumns = 16;
int lcdRows = 2;
// set LCD address, number of columns and rows
// SDA -> GPIO21, SCL -> GPIO22
// lcd address is 0x27, run an I2C scanner sketch
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
// NTP Server time
const char* ntpServer = "pool.ntp.org";
long gmtOffset_sec = 0;
int daylightOffset_sec = 0; //3600;
void setup() {
Serial.begin(115200);
// WiFi
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");
// initialize LCD
lcd.init();
// turn on LCD backlight
lcd.backlight();
}
void loop() {
// Send an HTTP GET request
if ((millis() - lastTime) > timerDelay) {
// Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());
Serial.println(jsonBuffer);
JSONVar myObject = JSON.parse(jsonBuffer);
// JSON.typeof(jsonVar) can be used to get the type of the var
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
// Serial.print("JSON object = ");
// Serial.println(myObject);
// Serial.print("Temperature: ");
// Serial.println(myObject["main"]["temp"]);
// Serial.print("Pressure: ");
// Serial.println(myObject["main"]["pressure"]);
// Serial.print("Humidity: ");
// Serial.println(myObject["main"]["humidity"]);
// Serial.print("Wind Speed: ");
// Serial.println(myObject["wind"]["speed"]);
// Get time
gmtOffset_sec = myObject["timezone"];
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
// time =
String time = printLocalTime();
// LCD Print
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time);
lcd.print(" ");
lcd.print(myObject["weather"][0]["main"]);
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(myObject["main"]["temp"]);
lcd.print("\xDF"); // "°" char
lcd.print("C ");
lcd.print("H:");
lcd.print(myObject["main"]["humidity"]);
lcd.print("%");
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
String printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return "null";
}
// Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
// get time format HH:MM
char timeHour[3];
strftime(timeHour,3, "%H", &timeinfo);
char timeMinute[3];
strftime(timeMinute,3, "%M", &timeinfo);
String time = String(timeHour) + ":" + String(timeMinute);
Serial.println(time)
; return time;
}
String httpGETRequest(const char* serverName) {
WiFiClient client;
HTTPClient http;
// Your Domain name with URL path or IP address with path
http.begin(client, serverName);
// Send HTTP POST request
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
payload = http.getString();
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Free resources
http.end();
return payload;
}
Common Course Links
Common Course Files
সম্পদ ও রেফারেন্সসমূহ
-
ডকুমেন্টেশনESP32 Tutorial 43/55- SunFounder doc page for IoT Internet Weather Stationdocs.sunfounder.com
ফাইলসমূহ📁
কোনো ফাইল উপলব্ধ নেই।