Search Code

Kifurushi cha ESP32 43/55 - Kituo cha Hali ya Hewa cha IoT Mtandaoni | Kifurushi cha Kujifunza cha ESP32 cha SunFounder

Kifurushi cha ESP32 43/55 - Kituo cha Hali ya Hewa cha IoT Mtandaoni | Kifurushi cha Kujifunza cha ESP32 cha SunFounder

Katika mafunzo haya, tutaunda kituo cha hali ya hewa kinachounganishwa na mtandao kwa kutumia ESP32 na bodi yake ya upanuzi ya kamera kutoka SunFounder. Mradi huu unaiwezesha ESP32 kupata data ya hali ya hewa ya wakati halisi, ikijumuisha joto na unyevu, na kuiweka kwenye skrini ya LCD. Programu hii haionyeshi tu uwezo wa ESP32 bali pia inaonyesha jinsi ya kupata na kuchambua data kutoka kwa API ya nje.

Tunapoendelea kupitia mafunzo, tutaunganisha vifaa, kusanidi msimbo, na kuhakikisha kila kitu kinafanya kazi kwa ushirikiano. Matokeo ya mwisho yatakuwa kituo cha hali ya hewa kinachofanya kazi kikamilifu ambacho kinasasisha usomaji wake kila sekunde 10, kikitoa onyesho wazi na fupi la hali ya sasa ya hewa (katika video saa 00:30).

Maelezo ya Vifaa

Vifaa kuu vinavyotumika katika mradi huu vinajumuisha microcontroller ya ESP32, skrini ya LCD, na wiring muhimu. ESP32 ina Wi-Fi na Bluetooth iliyojengewa ndani, inayoiruhusu kuunganisha kwenye mtandao na kupata data. Skrini ya LCD itaonyesha taarifa ya sasa ya hali ya hewa, ikijumuisha joto na unyevu.

LCD tunayotumia ni skrini ya herufi 16x2, ambayo ina maana inaweza kuonyesha mistari miwili ya herufi 16 kila moja. Hii itatosha kwa matokeo yetu ya taarifa ya hali ya hewa. ESP32 itawasiliana na LCD kupitia I2C, ambayo inarahisisha wiring kwa kutumia mistari miwili tu ya data.

Maelezo ya Datasheet

MtengenezajiEspressif
Nambari ya sehemuESP32-WROOM-32
Voltage ya Logic/IO3.3 V
Voltage ya usambazaji3.0–3.6 V
Mkondo wa pato (kwa kila chaneli)12 mA max
Mkondo wa kilele (kwa kila chaneli)40 mA
Mwongozo wa mzunguko wa PWM1 kHz
Viwango vya kizingiti cha logic ya kuingiza0.3 V (chini), 0.7 V (juu)
Kushuka kwa voltage / RDS(on) / kueneza0.5 V
Mipaka ya joto-40 hadi 85 °C
KifurushiQFN48
Vidokezo / lahajaInajumuisha lahaja nyingi kwa matumizi tofauti

  • Hakikisha ESP32 ina nguvu na usambazaji thabiti wa 3.3 V.
  • Tumia ardhi ya pamoja kwa vifaa vyote ili kuepuka matatizo ya mawasiliano.
  • Angalia anwani ya I2C ya LCD kwa kutumia skana ya I2C.
  • Fuatilia hali ya muunganisho wa Wi-Fi ili kuepuka kukatika wakati wa kupata data.
  • Shughulikia makosa ya uchambuzi wa JSON kwa uthabiti katika upatikanaji wa data.

Maagizo ya Wiring

esp32-43-weather_station-wiring

Ili kuunganisha vifaa, anza kwa kuunganisha LCD kwenye ESP32. LCD itatumia kiolesura cha I2C, kwa hivyo unganisha pini ya SDA ya LCD kwenye GPIO21 kwenye ESP32 na pini ya SCL kwenye GPIO22. Hakikisha umeunganisha pini za nguvu na ardhi za LCD kwenye pini za 5V na GND kwenye ESP32, mtawalia.

Kisha, hakikisha ESP32 ina nguvu ipasavyo kwa kutumia betri ya lithiamu iliyojumuishwa au muunganisho wa USB. Betri hutoa uwezo wa kubebeka, wakati muunganisho wa USB ni muhimu kwa programu na utatuzi. Hatimaye, angalia miunganisho yote ni salama ili kuepuka matatizo ya wiring yaliyolegea ambayo yanaweza kuvuruga utendaji.

Mifano ya Msimbo na Maelezo

Katika awamu ya usanidi wa programu yetu, tunaanzisha mawasiliano ya serial na kuunganisha kwenye mtandao wa Wi-Fi kwa kutumia SSID na nenosiri lililotolewa. Sehemu ifuatayo ya msimbo inashughulikia muunganisho wa Wi-Fi:

WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
Serial.println("Imeunganishwa kwenye mtandao wa Wi-Fi na anwani ya IP: ");
Serial.println(WiFi.localIP());

Msimbo huu unahakikisha ESP32 inaunganisha kwenye mtandao wa Wi-Fi uliobainishwa kabla ya kuendelea na upatikanaji wowote wa data. Ikiwa muunganisho utashindwa, itaendelea kujaribu kuunganisha tena.

Ifuatayo, tunahitaji kutuma ombi la HTTP GET kupata data ya hali ya hewa. Hii inafanywa kwa kutumia sehemu ifuatayo ya msimbo:

String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());

Hapa, tunaunda URL ya ombi la API, ambayo inajumuisha jiji, msimbo wa nchi, na ufunguo wetu wa API. Kazi ya httpGETRequest kisha inaitwa kupata data ya hali ya hewa.

Hatimaye, tunachambua majibu ya JSON na kuonyesha data husika kwenye 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("%");

Sehemu hii ya msimbo inasasisha onyesho la LCD kwa wakati wa sasa, hali ya hewa, joto, na unyevu. Inafuta onyesho la awali na kuweka mshale kwenye nafasi zinazofaa kwa kila mstari.

Maonyesho / Nini cha Kutarajia

Baada ya wiring na programu kufanikiwa, kituo chako cha hali ya hewa kitaunganisha kwenye Wi-Fi na kuanza kupata data ya hali ya hewa kila sekunde 10. Utaona joto la sasa, unyevu, na hali ya hewa ikionyeshwa kwenye skrini ya LCD. Ikiwa ESP32 itashindwa kuunganisha kwenye Wi-Fi, itachapisha ujumbe wa makosa kwenye mfuatiliaji wa serial.

Kuwa makini na mipaka ya miito ya API ili kuepuka kuzuiwa kutoka kwa huduma ya OpenWeatherMap. Ukikumbana na matatizo yoyote ya kupata data, angalia ufunguo wako wa API na uhakikishe jina la mji wako na msimbo wa nchi vimebainishwa kwa usahihi (kwenye video saa 15:45).

Vidokezo vya Muda wa Video

  • 00:00 Mwanzo
  • 2:00 Utangulizi wa mradi
  • 5:04 Akaunti ya OpenWeather
  • 6:11 Uunganishaji wa nyaya
  • 8:05 Msimbo wa Arduino umeelezwa
  • 14:13 Vipengele vya JASON kwenye msimbo
  • 20:23 Kuchagua bodi ya ESP32 na bandari ya COM kwenye Arduino IDE
  • 22:05 Maonyesho ya Kituo cha Hali ya Hewa kwenye LCD1602
  • 23:45 Maonyesho ya Kituo cha Hali ya Hewa kwenye LCD2004

Bilder

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
Språk: 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;
}

Resurser och referenser

Filer📁

Inga filer tillgängliga.