የESP32 ትምህርት 43/55 - IoT የበይነመረብ የአየር ሁኔታ ጣቢያ | SunFounder የESP32 IoT መማሪያ ኪት
በዚህ ትምህርት ውስጥ፣ ከSunFounder የESP32 እና የካሜራ ማስፋፊያ ሰሌዳውን በመጠቀም ከበይነመረብ ጋር የተገናኘ የአየር ሁኔታ ጣቢያ እንገነባለን። ይህ ፕሮጀክት ESP32 የእውነተኛ ጊዜ የአየር ሁኔታ መረጃን፣ የሙቀት መጠን እና እርጥበትን ጨምሮ፣ እንዲያገኝ እና በኤልሲዲ ስክሪን ላይ እንዲያሳይ ያስችላል። ይህ መተግበሪያ የESP32 አቅሞችን ከማሳየት በተጨማሪ ከውጭ ኤፒአይ መረጃን እንዴት ማግኘት እና መተንተን እንደሚቻል ያሳያል።

በትምህርቱ ውስጥ ስንራመድ፣ ክፍሎቹን እናገናኛለን፣ ኮዱን እናዋቅራለን፣ እና ሁሉም ነገር በተቀላጠፈ ሁኔታ አብሮ እንዲሰራ እናረጋግጣለን። የመጨረሻው ውጤት በየ10 ሰከንዱ ንባቦቹን የሚያዘምን፣ የአሁኑን የአየር ሁኔታ ሁኔታዎች ግልጽ እና አጭር ማሳያ የሚሰጥ ሙሉ በሙሉ የሚሰራ የአየር ሁኔታ ጣቢያ ይሆናል (በቪዲዮ በ00:30)።
ሃርድዌር ተብራርቷል
በዚህ ፕሮጀክት ውስጥ ጥቅም ላይ የዋሉት ዋና ዋና ክፍሎች ESP32 ማይክሮኮንትሮለር፣ ኤልሲዲ ማሳያ እና አስፈላጊውን ሽቦ ያካትታሉ። ESP32 አብሮ የተሰራ ዋይፋይ እና ብሉቱዝ የተገጠመለት ሲሆን፣ ከበይነመረብ ጋር እንዲገናኝ እና መረጃ እንዲያገኝ ያስችለዋል። ኤልሲዲ ማሳያው የሙቀት መጠን እና እርጥበትን ጨምሮ የአሁኑን የአየር ሁኔታ መረጃ ያሳያል።
እየተጠቀምንበት ያለው ኤልሲዲ ባለ 16x2 ቁምፊ ማሳያ ነው፣ ይህም ማለት እያንዳንዳቸው 16 ቁምፊዎች ያሏቸው ሁለት መስመሮችን ማሳየት ይችላል። ይህ ለአየር ሁኔታ መረጃ ውጤታችን በቂ ይሆናል። ESP32 ከኤልሲዲ ጋር በI2C በኩል ይገናኛል፣ ይህም ሁለት የውሂብ መስመሮችን ብቻ በመጠቀም ሽቦውን ያቃልላል።
የዳታሼት ዝርዝሮች
| አምራች | Espressif |
|---|---|
| የክፍል ቁጥር | ESP32-WROOM-32 |
| የሎጂክ/IO ቮልቴጅ | 3.3 ቪ |
| የአቅርቦት ቮልቴጅ | 3.0–3.6 ቪ |
| የውጤት ጅረት (በአንድ ቻናል) | 12 ሚኤ ከፍተኛ |
| ከፍተኛ ጅረት (በአንድ ቻናል) | 40 ሚኤ |
| የPWM ድግግሞሽ መመሪያ | 1 ኪሎሄርትዝ |
| የግቤት ሎጂክ ገደቦች | 0.3 ቪ (ዝቅተኛ)፣ 0.7 ቪ (ከፍተኛ) |
| የቮልቴጅ ጠብታ / RDS(on) / ሙሌት | 0.5 ቪ |
| የሙቀት ገደቦች | -40 እስከ 85 °ሴ |
| ፓኬጅ | QFN48 |
| ማስታወሻዎች / ልዩነቶች | ለተለያዩ መተግበሪያዎች በርካታ ልዩነቶችን ያካትታል |
- ESP32 በተረጋጋ የ3.3 ቪ አቅርቦት መሰራቱን ያረጋግጡ።
- የግንኙነት ችግሮችን ለማስወገድ ለሁሉም ክፍሎች የጋራ መሬት ይጠቀሙ።
- የኤልሲዲውን I2C አድራሻ በI2C ስካነር በመጠቀም ያረጋግጡ።
- በመረጃ ማግኛ ጊዜ መቋረጥን ለማስወገድ የዋይፋይ ግንኙነት ሁኔታን ይቆጣጠሩ።
- በመረጃ ማግኛ ውስጥ ጠንካራነት ለማግኘት የJSON መተንተን ስህተቶችን ያስተናግዱ።
የሽቦ መጫኛ መመሪያዎች

ክፍሎቹን ለማገናኘት፣ ኤልሲዲውን ከESP32 ጋር በማገናኘት ይጀምሩ። ኤልሲዲው የI2C በይነገጽ ይጠቀማል፣ ስለዚህ የኤልሲዲውን SDA ፒን ከESP32 ላይ ካለው GPIO21 ጋር እና የSCL ፒንን ከGPIO22 ጋር ያገናኙ። የኤልሲዲውን የኃይል እና የመሬት ፒኖች በቅደም ተከተል ከESP32 ላይ ካሉት 5ቪ እና GND ፒኖች ጋር ማገናኘትዎን ያረጋግጡ።
በመቀጠል፣ ESP32 የተካተተውን የሊቲየም ባትሪ ወይም የዩኤስቢ ግንኙነት በመጠቀም በትክክል መሰራቱን ያረጋግጡ። ባትሪው ተንቀሳቃሽነት ይሰጣል፣ የዩኤስቢ ግንኙነት ደግሞ ለፕሮግራም አወጣጥ እና ስህተት ማረም ጠቃሚ ነው። በመጨረሻም፣ ተግባርን ሊያውኩ የሚችሉ ልቅ ሽቦዎችን ለማስወገድ ሁሉም ግንኙነቶች ደህንነታቸው የተጠበቀ መሆናቸውን ያረጋግጡ።
የኮድ ምሳሌዎች እና ጉዞ
በፕሮግራማችን የማዋቀር ደረጃ ላይ፣ ተከታታይ ግንኙነትን እንጀምራለን እና የቀረበውን 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 ማንኛውንም የመረጃ ማግኛ ከመቀጠሉ በፊት ከተገለጸው የዋይፋይ አውታረ መረብ ጋር መገናኘቱን ያረጋግጣል። ግንኙነቱ ካልተሳካ፣ እንደገና ለመገናኘት በተከታታይ ይሞክራል።
በመቀጠል፣ የአየር ሁኔታ መረጃን ለማግኘት የኤችቲቲፒ GET ጥያቄ መላክ አለብን። ይህ የሚከናወነው በሚከተለው የኮድ ቁራጭ ነው፦
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());
እዚህ፣ ከተማውን፣ የሀገር ኮድን እና የኤፒአይ ቁልፋችንን የሚያካትት የኤፒአይ ጥያቄውን ዩአርኤል እንገነባለን። ከዚያም የአየር ሁኔታ መረጃን ለማግኘት httpGETRequest ተግባር ይጠራል።
በመጨረሻም፣ የJSON ምላሹን እንተነትናለን እና አግባብነት ያለውን መረጃ በኤልሲዲ ላይ እናሳያለን፦
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("%");
ይህ የኮድ ቁራጭ የኤልሲዲ ማሳያውን በአሁኑ ሰዓት፣ የአየር ሁኔታ ሁኔታ፣ የሙቀት መጠን እና እርጥበት ያዘምናል። የቀደመውን ማሳያ ያጸዳል እና ጠቋሚውን ለእያንዳንዱ መስመር በተገቢው ቦታ ያስቀምጣል።
ማሳያ / ምን እንደሚጠበቅ
በተሳካ ሁኔታ ሽቦ ከተጫነ እና ፕሮግራም ከተዘጋጀ በኋላ፣ የአየር ሁኔታ ጣቢያዎ ከዋይፋይ ጋር ይገናኛል እና በየ10 ሰከንዱ የአየር ሁኔታ መረጃን መሰብሰብ ይጀምራል። የአሁኑን የሙቀት መጠን፣ እርጥበት እና የአየር ሁኔታ ሁኔታዎች በኤልሲዲ ስክሪን ላይ ሲታዩ ያያሉ። ESP32 ከዋይፋይ ጋር መገናኘት ካልቻለ፣ የስህተት መልእክት ወደ ተከታታይ መቆጣጠሪያው ያትማል።
የኤፒአይ ጥሪ ገደቦችን በጥንቃቄ ይከታተሉ፣ ከOpenWeatherMap አገልግሎት እንዳይታገዱ ለማድረግ። የውሂብ ማውጣት ላይ ማንኛውም ችግር ካጋጠምዎት፣ የኤፒአይ ቁልፍዎን ያረጋግጡ እና የከተማዎ እና የሀገር ኮድዎ በትክክል መገለጹን ያረጋግጡ (በቪዲዮ 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 ላይ የአየር ሁኔታ ጣቢያ ማሳያ
/*
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
ፋይሎች📁
አንድ ፋይል የለም።