Search Code

Tutorial ESP32 43/55 - Saldhiga Cimilada Internetka ee IoT | Qalabka Barashada IoT ee SunFounder ee ESP32

Tutorial ESP32 43/55 - Saldhiga Cimilada Internetka ee IoT | Qalabka Barashada IoT ee SunFounder ee ESP32

Cashiggan, waxaanu ku dhisaynaa xarun cimilo oo ku xidhan internetka iyadoo la adeegsanayo ESP32 iyo looxa sawir-qabashada ee SunFounder. Mashruucani wuxuu u oggolaanayaa ESP32 inuu soo celiyo xogta cimilada ee waqtiga dhabta ah, oo ay ku jiraan heerkulka iyo qoyaanka, oo uu ku muujiyo shaashadda LCD. Codsiyadani ma muujiyaan oo kaliya awoodaha ESP32, laakiin waxay sidoo kale muujinayaan sida loo soo qaado oo loo kala saaro xogta API-ga dibadda ah.

Markaan ku sii socono casharrada, waxaanu isku xidhaynaa qaybaha, waxaanu habaynaynaa koodhka, waxaanu hubinaynaa in wax walba si wanaagsan u wada shaqeeyaan. Natiijada ugu dambaysa waxay noqon doontaa xarun cimilo oo si buuxda u shaqeysa oo cusboonaysiisa akhrinteeda 10 ilbiriqsi kasta, iyadoo bixinaysa muujin cad oo kooban oo ku saabsan xaaladaha cimilada ee hadda jira (fiidiyowga 00:30).

Qalabka La Sharxay

Qaybaha ugu muhiimsan ee loo isticmaalo mashruucan waxaa ka mid ah microcontroller-ka ESP32, shaashadda LCD, iyo fiilooyinka lagama maarmaanka ah. ESP32 wuxuu ku qalabaysan yahay Wi-Fi iyo Bluetooth oo ku dhex jira, taasoo u oggolaanaysa inuu ku xidhmao internetka oo uu soo celiyo xogta. Shaashadda LCD waxay muujin doontaa macluumaadka cimilada ee hadda jira, oo ay ku jiraan heerkulka iyo qoyaanka.

LCD-ga aan isticmaalayno waa shaashad 16x2 oo xarfo ah, taasoo la macno ah inay muujin karto laba sadar oo 16 xaraf ah mid kasta. Tani waxay ku filnaan doontaa soo-saarka macluumaadka cimilada. ESP32 wuxuu la xidhiidhi doonaa LCD-ga iyadoo loo marayo I2C, taasoo fududaynaysa fiilooyinka iyadoo la isticmaalayo kaliya laba khad oo xog ah.

Faahfaahinta Xogta

Soo-saareEspressif
Nambarka qaybtaESP32-WROOM-32
Danabka Logic/IO3.3 V
Danabka sahayda3.0–3.6 V
Korontada soo-saarka (kanaal kasta)12 mA ugu badan
Korontada ugu sarreysa (kanaal kasta)40 mA
Hagaha soo-noqnoqoshada PWM1 kHz
Heerarka xadka gelinta0.3 V (hoose), 0.7 V (sare)
Hoos-u-dhaca danabka / RDS(on) / dheregsanaanta0.5 V
Xadka kulaylka-40 ilaa 85 °C
BaakadQFN48
Xusuus / noocyo kaleWaxaa ku jira noocyo badan oo loogu talagalay codsiyo kala duwan

  • Hubi in ESP32 lagu shideeyo danab deggan oo 3.3 V ah.
  • Isticmaal dhul (ground) wadaag ah dhammaan qaybaha si looga fogaado dhibaatooyinka isgaarsiinta.
  • Hubi cinwaanka I2C ee LCD-ga adigoo isticmaalaya scanner-ka I2C.
  • La soco xaaladda xidhiidhka Wi-Fi si looga fogaado go'itaanka inta lagu jiro soo-celinta xogta.
  • Maaree khaladaadka JSON parsing si loo helo xog lagu kalsoonaan karo.

Tilmaamaha Fiilooyinka

esp32-43-weather_station-wiring

Si aad u xidho qaybaha, ka bilow adigoo ku xidhaya LCD-ga ESP32. LCD-ga wuxuu isticmaali doonaa interface-ka I2C, markaa ku xidh binka SDA ee LCD-ga GPIO21 ee ESP32 iyo binka SCL GPIO22. Hubi inaad ku xidho binnada korontada iyo dhulka ee LCD-ga 5V iyo GND ee ESP32, siday u kala horreeyaan.

Marka xigta, hubi in ESP32 si sax ah loo shideeyo iyadoo la isticmaalayo batteriga lithium-ka ee ku jira ama xidhiidhka USB. Batterigu wuxuu bixiyaa fududayn, halka xidhiidhka USB uu faa'iido u leeyahay barnaamijyada iyo cillad-sheegista. Ugu dambayntii, hubi dhammaan xidhiidhada inay adag yihiin si looga fogaado dhibaatooyinka fiilooyinka dabacsan ee carqaladayn kara shaqada.

Tusaalooyinka Koodhka & Sharaxaad

Waqtiga dejinta barnaamijkeena, waxaanu bilaabaynaa isgaarsiinta serial-ka waxaanu ku xidhnaa shabakadda Wi-Fi iyadoo la isticmaalayo SSID iyo erayga sirta ah ee la bixiyay. Qaybta koodhka ee soo socota waxay maamushaa xidhiidhka 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());

Koodhkani wuxuu hubinayaa in ESP32 uu ku xidhmaado shabakadda Wi-Fi ee la cayimay ka hor inta uusan sii wadin soo-celinta xogta. Haddii xidhiidhku fashilmo, wuxuu si joogto ah ugu dadaali doonaa inuu dib u xidho.

Marka xigta, waxaanu u baahanahay inaanu dirno codsi HTTP GET si aanu u soo celino xogta cimilada. Tan waxaa lagu sameeyaa iyadoo la isticmaalayo qaybta koodhka ee soo socota:

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

Halkan, waxaanu dhisaynaa URL-ka codsiga API, kaasoo ay ku jiraan magaalada, koodhka dalka, iyo furayaasheena API. Shaqada httpGETRequest ayaa markaa loo yaqaan si loo soo celiyo xogta cimilada.

Ugu dambayntii, waxaanu kala saaraynaa jawaabta JSON waxaanu ku muujinaynaa xogta ku habboon LCD-ga:

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("%");

Qaybta koodhka ee soo socota waxay cusboonaysiisaa shaashadda LCD macluumaadka waqtiga hadda, xaaladda cimilada, heerkulka, iyo qoyaanka. Waxay nadiifisaa shaashaddii hore waxayna dejisaa cursor-ka meelaha ku habboon sadar kasta.

Muuujin / Waxa Lagu Filan Karaa

Marka fiilooyinka iyo barnaamijyada si guul leh loo dhammeeyo, xaruntaada cimiladu waxay ku xidhmi doontaa Wi-Fi waxayna bilaabi doontaa soo-celinta xogta cimilada 10 ilbiriqsi kasta. Waxaad arki doontaa heerkulka hadda, qoyaanka, iyo xaaladaha cimilada oo lagu muujiyay shaashadda LCD. Haddii ESP32 uu ku guuldareysto inuu ku xidhmaado Wi-Fi, waxa uu daabici doonaa farriin khalad ah kormeeraha serial-ka.

Ka fiirsada xaddidka wicitaannada API si aadan uga xannaan laabmin adeegga OpenWeatherMap. Haddii aad la kulanto dhibaatooyin soo celinta xogta, hubi furaha API-gaaga oo hubi in magaaladaada iyo koodka waddankaagu si sax ah loo qoray (fiidiyowga 15:45).

Waqtiyada Fiidiyowga

  • 00:00 Bilow
  • 2:00 Hordhaca mashruuca
  • 5:04 Xisaabta OpenWeather
  • 6:11 Xirista (Wiring)
  • 8:05 Sharaxaada koodka Arduino
  • 14:13 Curiyeyaasha JASON ee koodka
  • 20:23 Doorashada guddiga ESP32 iyo dekedda COM ee Arduino IDE
  • 22:05 Muujinta Saldhigga Cimilada ee LCD1602
  • 23:45 Muujinta Saldhigga Cimilada ee LCD2004

Sawirro

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

Kheyraadka & Tixraacyada

Faylasha📁

Fayl la'aan.