Кодты іздеу

ESP32 Оқулық 43/55 - IoT Интернет Ауа Райы Станциясы | SunFounder ESP32 IoT Оқу жиынтығы

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 талдау қателерін өңдеңіз.

Сымдарды қосу нұсқаулары

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("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-тегі ауа райы станциясының демонстрациясы

Суреттер

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++
/*
  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;
}

Ресурстар мен сілтемелер

Файлдар📁

Файлдар жоқ.