Search Code

د ESP32 ټیوټوریل 43/55 - IoT انټرنیټ هوا سټیشن | سن فاونډر د ESP32 IoT زده کړې کټ

د ESP32 ټیوټوریل 43/55 - IoT انټرنیټ هوا سټیشن | سن فاونډر د ESP32 IoT زده کړې کټ

په دې ټیوټوریل کې، موږ به د ESP32 او د هغې د کیمرې پراختیایي بورډ په کارولو سره د سن فاونډر څخه یو انټرنیټ سره تړلی هوا پېژندونکی سټیشن جوړوو. دا پروژه ESP32 ته دا وړتیا ورکوي چې د هوا ریښتیني وخت معلومات ترلاسه کړي، په شمول د تودوخې او رطوبت، او په LCD سکرین کې یې ښکاره کړي. دا غوښتنلیک نه یوازې د ESP32 وړتیاوې ښیې، بلکې دا هم ښیې چې څنګه د بهرني API څخه معلومات ترلاسه او تجزیه کړو.

لکه څنګه چې موږ په ټیوټوریل کې پرمختګ کوو، موږ به اجزاوې سره ونښلوو، کوډ تنظیم کړو، او ډاډ ترلاسه کړو چې هرڅه په سمه توګه سره کار کوي. وروستۍ پایله به یو بشپړ فعال هوا پېژندونکی سټیشن وي چې هر ۱۰ ثانیو کې خپل لوستل تازه کوي، او د اوسني هوا شرایطو روښانه او لنډ ښودنه چمتو کوي (په ویډیو کې په ۰۰:۳۰ کې).

هارډویر تشریح شوی

په دې پروژه کې کارول شوي اصلي اجزاوې د ESP32 مایکروکنټرولر، د LCD ښودنه، او اړین تارونه شامل دي. ESP32 د جوړ شوي Wi-Fi او Bluetooth سره سمبال دی، چې دا اجازه ورکوي چې انټرنیټ سره وصل شي او معلومات ترلاسه کړي. د LCD ښودنه به د اوسني هوا معلومات وښیې، په شمول د تودوخې او رطوبت.

هغه LCD چې موږ یې کاروو د 16x2 کرکټر ښودنه ده، چې معنی یې دا ده چې دا کولی شي د ۱۶ کرکټرونو دوه کرښې وښیې. دا زموږ د هوا معلوماتو تولید لپاره کافي به وي. ESP32 به د I2C له لارې له LCD سره اړیکه ونیسي، کوم چې د یوازې دوه ډیټا کرښو په کارولو سره تارونه ساده کوي.

د ډیټاشیټ تفصیلات

جوړونکیEspressif
د پرزې شمېرهESP32-WROOM-32
د منطق/IO ولټاژ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 پته وګورئ.
  • د معلوماتو ترلاسه کولو پر مهال د بې ارتباطۍ څخه مخنیوي لپاره د Wi-Fi اړیکې حالت وڅارئ.
  • د معلوماتو ترلاسه کولو کې د پیاوړتیا لپاره د JSON تجزیې تېروتنې اداره کړئ.

د تارونو لارښوونې

esp32-43-weather_station-wiring

د اجزاوو د تارونو لپاره، لومړی LCD له ESP32 سره وصل کړئ. LCD به د I2C انٹرفیس وکاروي، نو د LCD د SDA پن له ESP32 په GPIO21 سره او د SCL پن له GPIO22 سره وصل کړئ. ډاډ ترلاسه کړئ چې د LCD د برېښنا او ځمکني تارونه په ترتیب سره د ESP32 په 5V او GND پنونو سره وصل کړئ.

بیا، ډاډ ترلاسه کړئ چې ESP32 په سمه توګه د شامل لیتیم بیټرۍ یا د USB اړیکې په کارولو سره ځواکمن شوی دی. بیټرۍ د لیږد وړتیا چمتو کوي، پداسې حال کې چې د USB اړیکه د پروګرام کولو او ډیبګ کولو لپاره ګټوره ده. په پای کې، ټولې اړیکې وګورئ چې خوندي دي ترڅو د نرمو تارونو ستونزو څخه مخنیوی وشي چې کولی شي فعالیت ګډوډ کړي.

د کوډ مثالونه او تفصیلي کتنه

زموږ د پروګرام په تنظیم مرحله کې، موږ د سیریل اړیکه پیل کوو او د چمتو شوي SSID او پاسورډ په کارولو سره د Wi-Fi شبکې سره وصل کیږو. لاندې کوډ ټوټه د Wi-Fi اړیکه اداره کوي:

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 د کوم معلوماتو ترلاسه کولو دمخه د ټاکل شوي 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");  // "°" char
lcd.print("C ");    
lcd.print("H:");    
lcd.print(myObject["main"]["humidity"]);  
lcd.print("%");

دا کوډ ټوټه د LCD ښودنه د اوسني وخت، د هوا حالت، تودوخې، او رطوبت سره تازه کوي. دا پخوانۍ ښودنه پاکوي او د هرې کرښې لپاره کرسور په مناسب موقعیتونو کې ټاکي.

ښکارونه / څه تمه وکړو

د بریالي تارونو او پروګرام کولو په صورت کې، ستاسو هوا پېژندونکی سټیشن به د Wi-Fi سره وصل شي او هر ۱۰ ثانیو کې به د هوا معلومات ترلاسه کول پیل کړي. تاسو به په LCD سکرین کې اوسنۍ تودوخه، رطوبت، او د هوا شرایط وګورئ. که ESP32 د Wi-Fi سره وصل نشي، نو دا به په سیریل مانیټر کې د تېروتنې پیغام چاپ کړي.

د API د زنګ وهلو محدودیتونو ته پام وکړئ ترڅو د OpenWeatherMap خدمت څخه د بندیدو مخه ونیسئ. که تاسو د معلوماتو ترلاسه کولو کې کومه ستونزه سره مخ شئ، خپل API کیلي وګورئ او ډاډ ترلاسه کړئ چې ستاسو ښار او د هیواد کوډ په سمه توګه ټاکل شوي دي (په ویډیو کې په 15:45).

د ویډیو وخت نښې

  • 00:00 پیل
  • 2:00 د پروژې پیژندنه
  • 5:04 د OpenWeather حساب
  • 6:11 تارونه نښلول
  • 8:05 د Arduino کوډ تشریح شوی
  • 14:13 په کوډ کې د JASON عناصر
  • 20:23 په Arduino IDE کې د ESP32 بورډ او COM پورټ غوره کول
  • 22:05 په LCD1602 باندې د هوا سټیشن ننداره
  • 23:45 په LCD2004 باندې د هوا سټیشن ننداره

Images

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
Language: 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;
}

Resources & references

Files📁

No files available.