دليل ESP32 43/55 - محطة الطقس على الإنترنت IoT | مجموعة تعلم ESP32 من SunFounder
في هذا الدرس، سنبني محطة طقس متصلة بالإنترنت باستخدام جهاز ESP32 ولوحة الكاميرا الخاصة به من شركة SunFounder. يتيح هذا المشروع لجهاز ESP32 استرداد بيانات الطقس في الوقت الفعلي، بما في ذلك درجة الحرارة والرطوبة، وعرضها على شاشة LCD. لا تعرض هذه التطبيق فقط قدرات جهاز ESP32 ولكن توضح أيضًا كيفية استرداد البيانات وتحليلها من واجهة برمجة التطبيقات الخارجية.

مع تقدمنا في البرنامج التعليمي، سنقوم بتوصيل المكونات، وضبط الكود، والتأكد من أن كل شيء يعمل بشكل سلس معًا. ستكون النتيجة النهائية محطة طقس كاملة الوظائف تقوم بتحديث قراءاتها كل 10 ثوانٍ، مما يوفر عرضًا واضحًا وموجزًا لظروف الطقس الحالية (في الفيديو عند 00:30).
شرح الأجهزة
تشمل المكونات الرئيسية المستخدمة في هذا المشروع متحكم ESP32 الدقيق، وعرض LCD، والأسلاك اللازمة. يتميز ESP32 بوجود Wi-Fi وBluetooth مدمجين، مما يتيح له الاتصال بالإنترنت واسترجاع البيانات. سيعرض شاشة LCD معلومات الطقس الحالية، بما في ذلك درجة الحرارة والرطوبة.
الشاشة LCD التي نستخدمها هي شاشة عرض بحجم 16x2 حرف، مما يعني أنها يمكن أن تعرض سطرين يحتوي كل منهما على 16 حرفًا. وهذا سيكون كافيًا لمخرجات معلومات الطقس لدينا. سيتواصل ESP32 مع الشاشة LCD عبر I2C، مما يبسط التوصيلات باستخدام سطرين للبيانات فقط.
تفاصيل ورقة البيانات
| الصانع | إسبريسيف |
|---|---|
| رقم الجزء | ESP32-WROOM-32 |
| جهد المنطق/المدخلات والمخرجات | ٣.٣ فولت |
| جهد الإمداد | ٣.٠-٣.٦ ف |
| التيار الخارجي (لكل قناة) | 12 مللي أمبير كحد أقصى |
| التيار الذروي (لكل قناة) | ٤٠ مللي أمبير |
| إرشادات تردد PWM | 1 كيلو هرتز |
| عتبات منطق الإدخال | 0.3 فولت (منخفض)، 0.7 فولت (مرتفع) |
| انخفاض الجهد / Rدي إس (أون)السعة | 0.5 فولت |
| الحدود الحرارية | -40 إلى 85 درجة مئوية |
| حزمة | QFN48 |
| ملاحظات / أنواع | يتضمن عدة أنواع لتطبيقات مختلفة |
- تأكد من أن وحدة ESP32 مزودة بجهد ثابت قدره 3.3 فولت.
- استخدم قاعدة مشتركة لجميع المكونات لتفادي مشكلات الاتصال.
- تحقق من عنوان I2C لشاشة LCD باستخدام جهاز مسح I2C.
- راقب حالة اتصال Wi-Fi لتجنب الانفصالات أثناء استرجاع البيانات.
- تعامل مع أخطاء تحليل JSON لضمان القوة في استرجاع البيانات.
تعليمات الأسلاك

لربط المكونات، ابدأ بتوصيل شاشة LCD إلى ESP32. ستستخدم شاشة LCD واجهة I2C، لذا قم بتوصيل دبوس SDA الخاص بشاشة LCD إلى GPIO21 على ESP32 ودبوس SCL إلى GPIO22. تأكد من توصيل دبابيس الطاقة والأرض لشاشة LCD إلى دبابيس 5 فولت و GND على ESP32، على التوالي.
بعد ذلك، تأكد من أن جهاز 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 بشبكة Wi-Fi المحددة قبل المتابعة مع أي جلب للبيانات. إذا فشل الاتصال، فسوف يحاول الاتصال مجددًا بشكل مستمر.
بعد ذلك، نحتاج إلى إرسال طلب GET عبر HTTP لاسترجاع بيانات الطقس. يتم ذلك باستخدام مقتطف الشيفرة التالي:
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());هنا، نقوم بإنشاء عنوان URL لطلب API، والذي يتضمن المدينة، رمز الدولة، ومفتاح 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 في الاتصال بشبكة الواي فاي، سيظهر رسالة خطأ على الشاشة التسلسلية.
كن حذرًا من حدود استدعاء واجهة برمجة التطبيقات لتجنب حظر الخدمة من OpenWeatherMap. إذا واجهت أي مشكلات في استرجاع البيانات، تحقق من مفتاح واجهة برمجة التطبيقات الخاصة بك وتأكد من تحديد المدينة ورمز الدولة بشكل صحيح (في الفيديو الساعة 15:45).
طوابع زمنية للفيديو
- 00:00 بدء
- :00 مقدمة عن المشروع
- 5:04 حساب OpenWeather
- 6:11 التوصيلات
- 8:05 شرح كود الأردوينو
- :13 جيسون العناصر في الكود
- ٢٠:٢٣ تحديد لوحة ESP32 ومنفذ COM في Arduino IDE
- عرض محطة الطقس على LCD1602 الساعة 22:05
- ٢٣:٤٥ عرض محطة الطقس على LCD2004
/*
* روي سانتوس
* تفاصيل المشروع كاملة على https://RandomNerdTutorials.com/esp32-http-get-open-weather-map-thingspeak-arduino/
*
* يُمنح الإذن بموجب هذا، مجانًا، لأي شخص يحصل على نسخة
* من هذا البرنامج وملفات الوثائق المصاحبة.
*
* يجب تضمين إشعار حقوق الطبع المذكور أعلاه وإشعار الإذن هذا في جميع
* النسخ أو الأجزاء الكبيرة من البرنامج.
*/
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
// استبدل المتغيرات التالية بمزيج اسم الشبكة وكلمة المرور الخاصة بك
const char* ssid = "SSID";
const char* password = "PASSWORD";
// اسم المجال الخاص بك مع مسار URL أو عنوان IP مع المسار
String openWeatherMapApiKey = "openWeatherMapApiKey";
// استبدل برمز دولتك ومدينةك
// قم بالبحث عن رمز الدولة من خلال https://openweathermap.org/find
String city = "CITY";
String countryCode = "COUNTRY CODE";
// تم ضبط المؤقت الافتراضي على 10 ثوانٍ لأغراض الاختبار
// للإجراء النهائي، تحقق من حدود استدعاء واجهة البرمجة API في الساعة/الدقيقة لتجنب الحظر/المنع.
unsigned long lastTime = 0;
// تم ضبط المؤقت على 10 دقائق (600000)
// unsigned long timerDelay = 600000;
// اضبط المؤقت على 10 ثوانٍ (10000)
unsigned long timerDelay = 10000;
String jsonBuffer;
// حدد عدد الأعمدة والصفوف في شاشة LCD
int lcdColumns = 16;
int lcdRows = 2;
// تعيين عنوان LCD، عدد الأعمدة والصفوف
// SDA -> GPIO21، SCL -> GPIO22
// عنوان LCD هو 0x27، قم بتشغيل برنامج فحص I2C
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
// وقت خادم NTP
const char* ntpServer = "pool.ntp.org";
long gmtOffset_sec = 0;
int daylightOffset_sec = 0; // ٣٦٠٠
void setup() {
Serial.begin(115200);
// واي فاي
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.");
// تهيئة شاشة LCD
lcd.init();
// تشغيل الإضاءة الخلفية لشاشة LCD
lcd.backlight();
}
void loop() {
// أرسل طلب GET عبر HTTP
if ((millis() - lastTime) > timerDelay) {
// تحقق من حالة اتصال واي فاي
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) للحصول على نوع المتغير
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
// تسلسل.طباعة("كائن JSON = ");
// Serial.println(myObject);
// سيريل.طباعة("درجة الحرارة: ");
// سيريال.println(myObject["main"]["temp"]);
// ضغط:
// سيريال.طباعة(myObject["الرئيسية"]["الضغط"]);
// طباعة سلسلة("الرطوبة: ");
// سيريل.println(myObject["main"]["الرطوبة"]);
// سرعة الرياح:
// سرير.طباعة(myObject["الرياح"]["السرعة"]);
// احصل على الوقت
gmtOffset_sec = myObject["timezone"];
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
// الوقت =
String time = printLocalTime();
// طباعة 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("%");
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
String printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return "null";
}
// سيريال.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
// احصل على تنسيق الوقت 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;
// اسم المجال الخاص بك مع مسار URL أو عنوان IP مع المسار
http.begin(client, serverName);
// إرسال طلب HTTP POST
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);
}
// موارد مجانية
http.end();
return payload;
}
Common Course Links
Common Course Files
الموارد والمراجع
-
توثيقدليل ESP32 43/55 - صفحة مستند SunFounder لمحطة الطقس على الإنترنت IoTdocs.sunfounder.com
ملفات📁
لا توجد ملفات متاحة.