Search Code

ESP32 ٹیوٹوریل 43/55 - IoT انٹرنیٹ ویدر اسٹیشن | سن فاؤنڈر کا ESP32 IoT لرننگ کٹ

ESP32 ٹیوٹوریل 43/55 - IoT انٹرنیٹ ویدر اسٹیشن | سن فاؤنڈر کا ESP32 IoT لرننگ کٹ

اس ٹیوٹوریل میں، ہم ESP32 اور سن فاؤنڈر کے اس کے کیمرہ ایکسٹینشن بورڈ کا استعمال کرتے ہوئے ایک انٹرنیٹ سے منسلک موسمی اسٹیشن بنائیں گے۔ یہ پروجیکٹ ESP32 کو حقیقی وقت کا موسمی ڈیٹا حاصل کرنے کے قابل بناتا ہے، بشمول درجہ حرارت اور نمی، اور اسے LCD اسکرین پر ظاہر کرتا ہے۔ یہ ایپلیکیشن نہ صرف ESP32 کی صلاحیتوں کو ظاہر کرتی ہے بلکہ یہ بھی دکھاتی ہے کہ بیرونی API سے ڈیٹا کیسے حاصل اور پارس کیا جائے۔

جیسے جیسے ہم ٹیوٹوریل میں آگے بڑھیں گے، ہم اجزاء کو وائر کریں گے، کوڈ کو ترتیب دیں گے، اور یقینی بنائیں گے کہ سب کچھ بغیر کسی رکاوٹ کے مل کر کام کرے۔ حتمی نتیجہ ایک مکمل طور پر فعال موسمی اسٹیشن ہوگا جو ہر 10 سیکنڈ میں اپنی ریڈنگز کو اپ ڈیٹ کرتا ہے، موجودہ موسمی حالات کی واضح اور جامع ڈسپلے فراہم کرتا ہے (ویڈیو میں 00:30 پر)۔

ہارڈویئر کی وضاحت

اس پروجیکٹ میں استعمال ہونے والے اہم اجزاء میں ESP32 مائیکروکنٹرولر، ایک LCD ڈسپلے، اور ضروری وائرنگ شامل ہیں۔ ESP32 بلٹ ان وائی فائی اور بلوٹوتھ سے لیس ہے، جو اسے انٹرنیٹ سے منسلک ہونے اور ڈیٹا حاصل کرنے کی اجازت دیتا ہے۔ LCD ڈسپلے موجودہ موسمی معلومات دکھائے گا، بشمول درجہ حرارت اور نمی۔

ہم جو LCD استعمال کر رہے ہیں وہ ایک 16x2 کریکٹر ڈسپلے ہے، جس کا مطلب ہے کہ یہ 16 کریکٹرز کی دو لائنیں دکھا سکتا ہے۔ یہ ہماری موسمی معلومات کے آؤٹ پٹ کے لیے کافی ہوگا۔ ESP32 I2C کے ذریعے LCD کے ساتھ بات چیت کرے گا، جو صرف دو ڈیٹا لائنوں کا استعمال کرکے وائرنگ کو آسان بناتا ہے۔

ڈیٹاشیٹ کی تفصیلات

مینوفیکچررEspressif
پارٹ نمبرESP32-WROOM-32
لاجک/آئی او وولٹیج3.3 V
سپلائی وولٹیج3.0–3.6 V
آؤٹ پٹ کرنٹ (فی چینل)زیادہ سے زیادہ 12 mA
پیک کرنٹ (فی چینل)40 mA
PWM فریکوئنسی گائیڈنس1 kHz
ان پٹ لاجک تھریشولڈز0.3 V (کم)، 0.7 V (زیادہ)
وولٹیج ڈراپ / RDS(on) / سیچوریشن0.5 V
تھرمل حدود-40 سے 85 °C
پیکیجQFN48
نوٹس / ویریئنٹسمختلف ایپلیکیشنز کے لیے متعدد ویریئنٹس شامل ہیں

  • یقینی بنائیں کہ ESP32 کو مستحکم 3.3 V سپلائی سے پاور کیا گیا ہے۔
  • مواصلاتی مسائل سے بچنے کے لیے تمام اجزاء کے لیے مشترکہ گراؤنڈ استعمال کریں۔
  • I2C اسکینر کا استعمال کرکے LCD کا I2C ایڈریس چیک کریں۔
  • ڈیٹا حاصل کرنے کے دوران منقطع ہونے سے بچنے کے لیے وائی فائی کنکشن کی حیثیت کی نگرانی کریں۔
  • ڈیٹا حاصل کرنے میں مضبوطی کے لیے JSON پارسنگ کی غلطیوں کو ہینڈل کریں۔

وائرنگ ہدایات

esp32-43-weather_station-wiring

اجزاء کو وائر کرنے کے لیے، LCD کو ESP32 سے منسلک کرکے شروع کریں۔ LCD I2C انٹرفیس استعمال کرے گا، لہذا LCD کے SDA پن کو ESP32 پر GPIO21 سے اور SCL پن کو GPIO22 سے جوڑیں۔ یقینی بنائیں کہ LCD کے پاور اور گراؤنڈ پنز کو بالترتیب ESP32 پر 5V اور GND پنز سے جوڑیں۔

اگلا، یقینی بنائیں کہ ESP32 کو شامل لیتھیم بیٹری یا USB کنکشن کا استعمال کرکے صحیح طریقے سے پاور کیا گیا ہے۔ بیٹری پورٹیبلٹی فراہم کرتی ہے، جبکہ USB کنکشن پروگرامنگ اور ڈیبگنگ کے لیے مفید ہے۔ آخر میں، چیک کریں کہ تمام کنکشن محفوظ ہیں تاکہ ڈھیلی وائرنگ کے مسائل سے بچا جا سکے جو فعالیت میں خلل ڈال سکتے ہیں۔

کوڈ مثالیں اور واک تھرو

ہمارے پروگرام کے سیٹ اپ مرحلے میں، ہم سیریل کمیونیکیشن کو انیشیالائز کرتے ہیں اور فراہم کردہ SSID اور پاس ورڈ کا استعمال کرکے وائی فائی نیٹ ورک سے منسلک ہوتے ہیں۔ درج ذیل کوڈ سنیپٹ وائی فائی کنکشن کو ہینڈل کرتا ہے:

WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
Serial.println("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());

یہ کوڈ یقینی بناتا ہے کہ ESP32 کسی بھی ڈیٹا حاصل کرنے سے پہلے مخصوص وائی فائی نیٹ ورک سے منسلک ہو جائے۔ اگر کنکشن ناکام ہو جاتا ہے، تو یہ مسلسل دوبارہ منسلک ہونے کی کوشش کرے گا۔

اگلا، ہمیں موسمی ڈیٹا حاصل کرنے کے لیے 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");  // "°" char
lcd.print("C ");    
lcd.print("H:");    
lcd.print(myObject["main"]["humidity"]);  
lcd.print("%");

یہ کوڈ سنیپٹ LCD ڈسپلے کو موجودہ وقت، موسمی حالت، درجہ حرارت، اور نمی کے ساتھ اپ ڈیٹ کرتا ہے۔ یہ پچھلی ڈسپلے کو صاف کرتا ہے اور ہر لائن کے لیے کرسر کو مناسب پوزیشنوں پر سیٹ کرتا ہے۔

ڈیمونسٹریشن / کیا توقع کریں

کامیاب وائرنگ اور پروگرامنگ کے بعد، آپ کا موسمی اسٹیشن وائی فائی سے منسلک ہوگا اور ہر 10 سیکنڈ میں موسمی ڈیٹا حاصل کرنا شروع کر دے گا۔ آپ LCD اسکرین پر موجودہ درجہ حرارت، نمی، اور موسمی حالات دیکھیں گے۔ اگر ESP32 وائی فائی سے منسلک ہونے میں ناکام ہو جاتا ہے، تو یہ سیریل مانیٹر پر ایک ایرر میسج پرنٹ کرے گا۔

API کال کی حدود کا خیال رکھیں تاکہ OpenWeatherMap سروس سے بلاک ہونے سے بچ سکیں۔ اگر ڈیٹا حاصل کرنے میں کوئی مسئلہ درپیش آئے تو اپنی API کلید چیک کریں اور یقینی بنائیں کہ آپ کا شہر اور ملک کا کوڈ درست طریقے سے درج ہے (ویڈیو میں 15:45 پر)۔

ویڈیو ٹائم اسٹیمپس

  • 00:00 آغاز
  • 2:00 پروجیکٹ کا تعارف
  • 5:04 OpenWeather اکاؤنٹ
  • 6:11 وائرنگ
  • 8:05 Arduino کوڈ کی وضاحت
  • 14:13 کوڈ میں JSON عناصر
  • 20:23 Arduino IDE میں ESP32 بورڈ اور COM پورٹ کا انتخاب
  • 22:05 LCD1602 پر ویدر اسٹیشن کا مظاہرہ
  • 23:45 LCD2004 پر ویدر اسٹیشن کا مظاہرہ

تصاویر

esp32-43-weather_station-main
esp32-43-weather_station-main
esp32-43-weather_station-wiring
esp32-43-weather_station-wiring
844-ESP32 Tutorial 43/55- Arduino code for IoT Internet Weather Station
زبان: C++
/*
  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;
}

وسائل اور حوالہ جات

فائلیں📁

کوئی فائلیں دستیاب نہیں ہیں۔