شِفر (کود) جستجو

آموزش ESP32 43/55 - ایستگاه هواشناسی اینترنتی IoT | کیت یادگیری IoT ESP32 سان‌فاندر

آموزش ESP32 43/55 - ایستگاه هواشناسی اینترنتی IoT | کیت یادگیری IoT ESP32 سان‌فاندر

در این آموزش، ما یک ایستگاه هواشناسی متصل به اینترنت را با استفاده از ESP32 و برد توسعه دوربین آن از سان‌فاندِر می‌سازیم. این پروژه به ESP32 این امکان را می‌دهد که داده‌های آب و هوایی به‌روز شامل دما و رطوبت را دریافت کرده و آن را بر روی یک صفحه نمایش LCD نمایش دهد. این برنامه نه تنها توانایی‌های ESP32 را به نمایش می‌گذارد بلکه نشان می‌دهد چگونه داده‌ها را از یک API خارجی دریافت و تجزیه کنیم.

همان‌طور که در حال پیشرفت در آموزش هستیم، اجزاء را سیم‌کشی می‌کنیم، شِفر (کود) را پیکربندی می‌کنیم و اطمینان حاصل می‌کنیم که همه چیز به طور یکپارچه با هم کار می‌کند. نتیجه نهایی یک ایستگاه هوای کامل است که هر 10 ثانیه خوانش‌های خود را به‌روزرسانی می‌کند و نمایشی واضح و مختصر از شرایط کنونی آب و هوا ارائه می‌دهد (در ویدیو در 00:30).

توضیح سخت‌افزار

اجزای اصلی استفاده شده در این پروژه شامل میکروکنترلر ESP32، یک نمایشگر LCD و سیم کشی لازم است. ESP32 با Wi-Fi و Bluetooth داخلی مجهز شده است که به آن اجازه می‌دهد به اینترنت متصل شده و داده‌ها را دریافت کند. نمایشگر LCD اطلاعات وضعیت فعلی هوا، از جمله دما و رطوبت را نشان خواهد داد.

LCD که ما استفاده می‌کنیم یک نمایشگر 16x2 کاراکتری است، به این معنی که می‌تواند دو خط از 16 خصیصه را نمایش دهد. این برای خروجی اطلاعات آب و هوایی ما کافی خواهد بود. ESP32 از طریق I2C با LCD ارتباط برقرار می‌کند که با استفاده از فقط دو خط داده، سیم‌کشی را ساده‌تر می‌کند.

جزئیات برگه داده

تولیدکنندهاسپرسيف
شماره قطعهESP32-WROOM-32
ولتاژ منطقی/ورودی و خروجی3.3 ولت
ولتاژ تغذیه۳.۰-۳.۶ ولت
جریان خروجی (به ازای هر کانال)۱۲ میلی آمپر حداکثر
جریان اوج (به ازای هر کانال)۴۰ میلی‌آمپر
راهنمایی فرکانس PWM1 کیلوهرتز
آستانه‌های منطق ورودی۰.۳ ولت (پایین)، ۰.۷ ولت (بالا)
افت ولتاژ / RDS(on)/ اشباع۰.۵ ولت
محدودیت‌های حرارتی-۴۰ تا ۸۵ درجه سلسیوس
بستهQFN48
یادداشت‌ها / واریانت‌هاشامل چندین نوع مختلف برای کاربردهای مختلف است

  • اطمینان حاصل کنید که ESP32 با یک منبع 3.3 ولت پایدار تغذیه می‌شود.
  • از یک زمین مشترک برای همه اجزاء استفاده کنید تا از مشکلات ارتباطی جلوگیری شود.
  • آدرس I2C LCD را با استفاده از یک اسکنر I2C بررسی کنید.
  • وضعیت اتصال Wi-Fi را تحت نظر داشته باشید تا از قطع شدن در هنگام دریافت داده‌ها جلوگیری کنید.
  • خطاهای تجزیه JSON را برای افزایش استحکام در بازیابی داده‌ها مدیریت کنید.

دستورالعمل‌های سیم‌کشی

esp32-43-weather_station-wiring

برای سیم‌کشی اجزا، ابتدا LCD را به ESP32 متصل کنید. LCD از رابط I2C استفاده خواهد کرد، بنابراین پایه SDA LCD را به GPIO21 روی ESP32 و پایه SCL را به GPIO22 متصل کنید. اطمینان حاصل کنید که پایه‌های تغذیه و زمین LCD را به ترتیب به پایه‌های 5V و GND روی ESP32 متصل کنید.

سپس، اطمینان حاصل کنید که 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());

در اینجا، ما 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 را با زمان جاری، وضعیت آب و هوا، دما و رطوبت به‌روز می‌کند. این شِفر (کود) صفحه قبلی را پاک کرده و نشانگر را در موقعیت‌های مناسب برای هر خط قرار می‌دهد.

نمایشگاه / چه انتظاری باید داشته باشید

پس از سیم‌کشی و برنامه‌ریزی موفقیت‌آمیز، ایستگاه هواشناسی شما به Wi-Fi متصل شده و هر ۱۰ ثانیه داده‌های آب و هوا را دریافت خواهد کرد. شما دما، رطوبت و شرایط آب و هوایی کنونی را بر روی صفحه نمایش LCD خواهید دید. اگر ESP32 نتواند به Wi-Fi متصل شود، یک پیام خطا در نمایشگر مسلسل چاپ خواهد کرد.

به محدودیت‌های تماس API توجه داشته باشید تا از مسدود شدن از خدمات OpenWeatherMap جلوگیری کنید. اگر با مشکلی در بازیابی داده‌ها مواجه شدید، کلید API خود را بررسی کنید و اطمینان حاصل کنید که شِفر (کود) شهر و کشور شما به‌درستی مشخص شده است (در ویدیو در ساعت ۱۵:۴۵).

زمان‌بندی ویدیو

  • ۰۰:۰۰ شروع
  • ۲:۰۰ معرفی پروژه
  • اکانت OpenWeather 5:04
  • ۶:۱۱ سیم‌کشی
  • شِفر (کود) آردوینو در ساعت ۸:۰۵ توضیح داده شده است
  • ۱۴:۱۳ جیسون عناصر در شِفر (کود)
  • ۲۰:۲۳ انتخاب برد ESP32 و پورت COM در Arduino IDE
  • ۲۲:۰۵ نمایش ایستگاه هواشناسی بر روی LCD1602
  • نمایش ایستگاه آب و هوا روی LCD2004 در ساعت 23:45

تصاویر

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++
/*
 * روئی سانتوس
 * جزئیات کامل پروژه در 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>


 // متغیرهای بعدی را با ترکیب SSID/Password خود جایگزین کنید
const char* ssid = "SSID";
const char* password = "PASSWORD";

 // نام دامنه شما با مسیر URL یا آدرس IP با مسیر
String openWeatherMapApiKey = "openWeatherMapApiKey";

 // با شِفر (کود) کشور و شهر خود جایگزین کنید
 // شِفر (کود) کشور را از طریق https://openweathermap.org/find پیدا کنید.
String city = "CITY";
String countryCode = "COUNTRY CODE";

 // زمانسنج پیش‌فرض برای اهداف آزمایشی بر روی ۱۰ ثانیه تنظیم شده است
 // برای یک برنامه نهایی، محدودیت‌های تماس API را در هر ساعت/دقیقه بررسی کنید تا از مسدود شدن/تحریم شدن جلوگیری کنید.
unsigned long lastTime = 0;
 // زمان‌سنج روی 10 دقیقه (600000) تنظیم شده است
 // unsigned long timerDelay = 600000;
 // زمان‌سنج را روی ۱۰ ثانیه (۱۰۰۰۰) تنظیم کن
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) {
 // وضعیت اتصال WiFi را بررسی کنید
    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;
      }

 // Serial.print("شیء JSON = ");
 // سریال.println(myObject);
 // دما را چاپ کنید: 
 // سریال.println(myObject["main"]["temp"]);
 // فشار: 
 // Serial.println(myObject["main"]["pressure"]);
 // سریال.چاپ("رطوبت: ");
 // سریال.println(myObject["main"]["humidity"]);
 // سرعت باد: 
 // Serial.println(myObject["wind"]["speed"]);

 // زمان بگیرید
      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";
  }
 // Serial.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;
}

فایل‌ها📁

هیچ فایلی موجود نیست.