Bincika Lambar

Tutorial na ESP32 43/55 - Tashar Yanayi ta Intanet ta IoT | Kayan Koyon IoT na SunFounder ESP32

Tutorial na ESP32 43/55 - Tashar Yanayi ta Intanet ta IoT | Kayan Koyon IoT na SunFounder ESP32

A cikin wannan koyawa, za mu gina tashar yanayi mai haɗin Intanet ta amfani da ESP32 da allo na kyamara daga SunFounder. Wannan aikin yana ba ESP32 damar samun bayanan yanayi na ainihin lokaci, gami da zafin jiki da zafi, kuma ya nuna su akan allon LCD. Wannan aikace-aikacen ba wai kawai yana nuna iyawar ESP32 ba, har ma yana nuna yadda ake ɗauko da tantance bayanai daga wani API na waje.

Yayin da muke ci gaba da koyawa, za mu haɗa kayan aikin, mu tsara lambar, kuma mu tabbatar komai yana aiki tare cikin sauƙi. Sakamakon ƙarshe zai zama tashar yanayi mai cikakken aiki wanda ke sabunta karatunsa kowane daƙiƙa 10, yana ba da nuni mai haske kuma a taƙaice na yanayin yanayi na yanzu (a cikin bidiyo a 00:30).

Bayanin Kayan Aiki

Babban kayan aikin da aka yi amfani da su a wannan aikin sun haɗa da microcontroller na ESP32, allon LCD, da kuma haɗin wayoyi da ake buƙata. ESP32 yana da Wi-Fi da Bluetooth da aka gina a ciki, wanda ke ba shi damar haɗawa da Intanet da ɗauko bayanai. Allon LCD zai nuna bayanan yanayi na yanzu, gami da zafin jiki da zafi.

LCD ɗin da muke amfani da shi nuni ne na haruffa 16x2, wanda ke nufin yana iya nuna layuka biyu na haruffa 16 kowanne. Wannan zai isa ga fitar da bayanan yanayi namu. ESP32 zai sadarwa da LCD ta hanyar I2C, wanda ke sauƙaƙa haɗin wayoyi ta amfani da layukan bayanai biyu kawai.

Cikakkun Bayanai na Datasheet

Mai ƙeraEspressif
Lambar sashiESP32-WROOM-32
Wutar Logic/IO3.3 V
Wutar samarwa3.0–3.6 V
Fitar wutar (kowane tashar)12 mA max
Kololuwar wutar (kowane tashar)40 mA
Jagorar mitar PWM1 kHz
Matakan shigar da hankali0.3 V (ƙasa), 0.7 V (sama)
Rage wutar / RDS(on) / cikar0.5 V
Iyakokin zafi-40 zuwa 85 °C
KunshinQFN48
Bayanan kula / bambance-bambanceYa haɗa da bambance-bambance da yawa don aikace-aikace daban-daban

  • Tabbatar da cewa ESP32 yana da wutar 3.3 V mai tsayayye.
  • Yi amfani da ƙasa ɗaya ga duk kayan aikin don guje wa matsalolin sadarwa.
  • Duba adireshin I2C na LCD ta amfani da na'urar binciken I2C.
  • Kula da matsayin haɗin Wi-Fi don guje wa katsewa yayin ɗauko bayanai.
  • Sarrafa kurakuran tantance JSON don ƙarfin aiki wajen ɗauko bayanai.

Umarnin Haɗin Wayoyi

esp32-43-weather_station-wiring

Don haɗa kayan aikin, fara da haɗa LCD zuwa ESP32. LCD zai yi amfani da hanyar I2C, don haka haɗa pin ɗin SDA na LCD zuwa GPIO21 akan ESP32 da pin ɗin SCL zuwa GPIO22. Tabbatar da haɗa pins ɗin wutar da ƙasa na LCD zuwa pins ɗin 5V da GND akan ESP32, bi da bi.

Na gaba, tabbatar da cewa ESP32 yana da wutar da ta dace ta amfani da baturin lithium da aka haɗa ko haɗin USB. Baturin yana ba da damar ɗauka, yayin da haɗin USB ke da amfani don shirye-shirye da gyara kurakurai. A ƙarshe, duba duk haɗin sun tabbata don guje wa matsalolin wayoyi marasa ƙarfi waɗanda zasu iya rushe aiki.

Misalan Lamba & Bayani

A cikin matakin saitin shirin namu, muna fara sadarwar serial kuma mu haɗa da hanyar Wi-Fi ta amfani da SSID da kalmar sirri da aka bayar. Wannan ɓangaren lambar yana sarrafa haɗin Wi-Fi:

WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
Serial.println("An haɗa da hanyar Wi-Fi tare da adireshin IP: ");
Serial.println(WiFi.localIP());

Wannan lambar tana tabbatar da cewa ESP32 ya haɗa da hanyar Wi-Fi da aka ƙayyade kafin ya ci gaba da ɗauko bayanai. Idan haɗin ya gaza, zai ci gaba da ƙoƙarin sake haɗawa.

Na gaba, muna buƙatar aika buƙatar HTTP GET don ɗauko bayanan yanayi. Ana yin wannan ta amfani da wannan ɓangaren lambar:

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

A nan, muna gina URL ɗin don buƙatar API, wanda ya haɗa da birni, lambar ƙasa, da maɓallin API namu. Ana kiran aikin httpGETRequest don ɗauko bayanan yanayi.

A ƙarshe, muna tantance amsar JSON kuma mu nuna bayanan da suka dace akan 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("%");

Wannan ɓangaren lambar yana sabunta nuni na LCD da lokacin yanzu, yanayin yanayi, zafin jiki, da zafi. Yana share nuni na baya kuma ya saita cursor zuwa wuraren da suka dace ga kowane layi.

Nuni / Abin da za a Yi Tsammani

Bayan haɗin wayoyi da shirye-shirye cikin nasara, tashar yanayi naku za ta haɗa da Wi-Fi kuma ta fara ɗauko bayanan yanayi kowane daƙiƙa 10. Za ku ga zafin jiki na yanzu, zafi, da yanayin yanayi da aka nuna akan allon LCD. Idan ESP32 ya kasa haɗawa da Wi-Fi, zai buga saƙon kuskure ga mai duba serial.

Yi da hankali ga iyakokin kiran API don guje wa toshewa daga sabis na OpenWeatherMap. Idan ka ci karo da wata matsala wajen dawo da bayanai, duba maɓallin API ɗinka kuma ka tabbatar an rubuta sunan birni da lambar ƙasarka daidai (a cikin bidiyo a 15:45).

Lokutan Bidiyo

  • 00:00 Farawa
  • 2:00 Gabatarwa ga aikin
  • 5:04 Asusun OpenWeather
  • 6:11 Haɗin wayoyi
  • 8:05 Bayanin lambar Arduino
  • 14:13 Abubuwan JASON a cikin lambar
  • 20:23 Zaɓin allo na ESP32 da tashar COM a cikin Arduino IDE
  • 22:05 Nunin Tashar Yanayi akan LCD1602
  • 23:45 Nunin Tashar Yanayi akan LCD2004

Hotuna

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
Harshe: 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;
}

Albarkatun da kuma shafukan da za a duba

Fayiloli📁

Babu fayiloli da ake da su.