ESP32 Оқулық 43/55 - IoT Интернет Ауа Райы Станциясы | SunFounder ESP32 IoT Оқу жиынтығы
Бұл оқулықта біз ESP32 және оның SunFounder камера кеңейту тақтасын пайдаланып, интернетке қосылған ауа райы станциясын жасаймыз. Бұл жоба ESP32-ге температура мен ылғалдылықты қоса алғанда, нақты уақыттағы ауа райы деректерін алуға және оларды LCD экранда көрсетуге мүмкіндік береді. Бұл қолданба ESP32 мүмкіндіктерін көрсетіп қана қоймай, сыртқы API-ден деректерді алу және талдау жолын да көрсетеді.

Оқулық барысында біз компоненттерді қосамыз, кодты конфигурациялаймыз және бәрінің үздіксіз жұмыс істеуін қамтамасыз етеміз. Соңғы нәтиже - әр 10 секунд сайын көрсеткіштерін жаңартып, ағымдағы ауа райы жағдайларын анық әрі қысқаша көрсететін толық функционалды ауа райы станциясы (бейнеде 00:30).
Аппараттық құрал түсіндірмесі
Бұл жобада қолданылатын негізгі компоненттерге ESP32 микроконтроллері, LCD дисплей және қажетті сымдар кіреді. ESP32 кіріктірілген Wi-Fi және Bluetooth-пен жабдықталған, бұл оған интернетке қосылып, деректерді алуға мүмкіндік береді. LCD дисплей температура мен ылғалдылықты қоса алғанда, ағымдағы ауа райы ақпаратын көрсетеді.
Біз қолданатын LCD - 16x2 таңбалы дисплей, яғни ол әрқайсысы 16 таңбадан тұратын екі жолды көрсете алады. Бұл біздің ауа райы ақпаратын шығару үшін жеткілікті болады. ESP32 LCD-пен 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 °C-қа дейін |
| Қаптама | QFN48 |
| Ескертулер / нұсқалар | Әртүрлі қолданбаларға арналған бірнеше нұсқаларды қамтиды |
- ESP32-ні тұрақты 3.3 В қоректендірумен қамтамасыз етіңіз.
- Байланыс ақауларын болдырмау үшін барлық компоненттер үшін ортақ жерді пайдаланыңыз.
- I2C сканерін пайдаланып LCD-тің I2C мекенжайын тексеріңіз.
- Деректерді алу кезінде үзілістерді болдырмау үшін Wi-Fi қосылым күйін бақылаңыз.
- Деректерді алу сенімділігі үшін JSON талдау қателерін өңдеңіз.
Сымдарды қосу нұсқаулары

Компоненттерді қосу үшін алдымен 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("Wi-Fi желісіне IP мекенжайымен қосылды: ");
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"); // "°" таңбасы
lcd.print("C ");
lcd.print("H:");
lcd.print(myObject["main"]["humidity"]);
lcd.print("%");
Бұл код үзіндісі LCD дисплейін ағымдағы уақытпен, ауа райы жағдайымен, температурамен және ылғалдылықпен жаңартады. Ол алдыңғы көрсетілімді тазартады және курсорды әр жол үшін тиісті орындарға қояды.
Демонстрация / Не күтуге болады
Сымдарды дұрыс қосып, бағдарламалағаннан кейін, сіздің ауа райы станцияңыз Wi-Fi-ға қосылып, әр 10 секунд сайын ауа райы деректерін ала бастайды. Сіз LCD экранда ағымдағы температураны, ылғалдылықты және ауа райы жағдайларын көресіз. Егер ESP32 Wi-Fi-ға қосыла алмаса, ол сериялық мониторға қате туралы хабарлама шығарады.
OpenWeatherMap қызметінен бұғатталып қалмау үшін API шақыру шектеулеріне назар аударыңыз. Деректерді алу кезінде қандай да бір мәселелер туындаса, 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-тегі ауа райы станциясының демонстрациясы
/*
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
Файлдар📁
Файлдар жоқ.