【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 
  实验二百三十八:ESP32开发板WiFi蓝牙2.8寸240*320智能液晶显示屏带触摸屏TFT模块 
  项目实验之二十五:带 LVGL 的 ESP32 CYD:气象站(天气描述、温度和湿度) 
 
实验开源代码 
 
			
			
			- /*
 -   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
 -   实验二百三十八:ESP32开发板WiFi蓝牙2.8寸240*320智能液晶显示屏带触摸屏TFT模块
 -   项目实验之二十五:带 LVGL 的 ESP32 CYD:气象站(天气描述、温度和湿度)
 - */
 - 
 - #include <lvgl.h>
 - #include <TFT_eSPI.h>
 - #include "weather_images.h"
 - #include <WiFi.h>
 - #include <HTTPClient.h>
 - #include <ArduinoJson.h>
 - 
 - // Replace with your network credentials
 - const char* ssid = "zhz3";
 - const char* password = "z156721";
 - 
 - // Replace with the latitude and longitude to where you want to get the weather
 - String latitude = "41.14961";
 - String longitude = "-8.61099";
 - // Enter your location
 - String location = "Porto";
 - // Type the timezone you want to get the time for
 - String timezone = "Europe/Lisbon";
 - 
 - // Store date and time
 - String current_date;
 - String last_weather_update;
 - String temperature;
 - String humidity;
 - int is_day;
 - int weather_code = 0;
 - String weather_description;
 - 
 - // SET VARIABLE TO 0 FOR TEMPERATURE IN FAHRENHEIT DEGREES
 - #define TEMP_CELSIUS 1
 - 
 - #if TEMP_CELSIUS
 -   String temperature_unit = "";
 -   const char degree_symbol[] = "\u00B0C";
 - #else
 -   String temperature_unit = "&temperature_unit=fahrenheit";
 -   const char degree_symbol[] = "\u00B0F";
 - #endif
 - 
 - #define SCREEN_WIDTH 240
 - #define SCREEN_HEIGHT 320
 - 
 - #define DRAW_BUF_SIZE (SCREEN_WIDTH * SCREEN_HEIGHT / 10 * (LV_COLOR_DEPTH / 8))
 - uint32_t draw_buf[DRAW_BUF_SIZE / 4];
 - 
 - // If logging is enabled, it will inform the user about what is happening in the library
 - void log_print(lv_log_level_t level, const char * buf) {
 -   LV_UNUSED(level);
 -   Serial.println(buf);
 -   Serial.flush();
 - }
 - 
 - static lv_obj_t * weather_image;
 - static lv_obj_t * text_label_date;
 - static lv_obj_t * text_label_temperature;
 - static lv_obj_t * text_label_humidity;
 - static lv_obj_t * text_label_weather_description;
 - static lv_obj_t * text_label_time_location;
 - 
 - static void timer_cb(lv_timer_t * timer){
 -   LV_UNUSED(timer);
 -   get_weather_data();
 -   get_weather_description(weather_code);
 -   lv_label_set_text(text_label_date, current_date.c_str());
 -   lv_label_set_text(text_label_temperature, String("      " + temperature + degree_symbol).c_str());
 -   lv_label_set_text(text_label_humidity, String("   " + humidity + "%").c_str());
 -   lv_label_set_text(text_label_weather_description, weather_description.c_str());
 -   lv_label_set_text(text_label_time_location, String("Last Update: " + last_weather_update + "  |  " + location).c_str());
 - }
 - 
 - void lv_create_main_gui(void) {
 -   LV_IMAGE_DECLARE(image_weather_sun);
 -   LV_IMAGE_DECLARE(image_weather_cloud);
 -   LV_IMAGE_DECLARE(image_weather_rain);
 -   LV_IMAGE_DECLARE(image_weather_thunder);
 -   LV_IMAGE_DECLARE(image_weather_snow);
 -   LV_IMAGE_DECLARE(image_weather_night);
 -   LV_IMAGE_DECLARE(image_weather_temperature);
 -   LV_IMAGE_DECLARE(image_weather_humidity);
 - 
 -   // Get the weather data from open-meteo.com API
 -   get_weather_data();
 - 
 -   weather_image = lv_image_create(lv_screen_active());
 -   lv_obj_align(weather_image, LV_ALIGN_CENTER, -80, -20);
 -   
 -   get_weather_description(weather_code);
 - 
 -   text_label_date = lv_label_create(lv_screen_active());
 -   lv_label_set_text(text_label_date, current_date.c_str());
 -   lv_obj_align(text_label_date, LV_ALIGN_CENTER, 70, -70);
 -   lv_obj_set_style_text_font((lv_obj_t*) text_label_date, &lv_font_montserrat_26, 0);
 -   lv_obj_set_style_text_color((lv_obj_t*) text_label_date, lv_palette_main(LV_PALETTE_TEAL), 0);
 - 
 -   lv_obj_t * weather_image_temperature = lv_image_create(lv_screen_active());
 -   lv_image_set_src(weather_image_temperature, &image_weather_temperature);
 -   lv_obj_align(weather_image_temperature, LV_ALIGN_CENTER, 30, -25);
 -   text_label_temperature = lv_label_create(lv_screen_active());
 -   lv_label_set_text(text_label_temperature, String("      " + temperature + degree_symbol).c_str());
 -   lv_obj_align(text_label_temperature, LV_ALIGN_CENTER, 70, -25);
 -   lv_obj_set_style_text_font((lv_obj_t*) text_label_temperature, &lv_font_montserrat_22, 0);
 - 
 -   lv_obj_t * weather_image_humidity = lv_image_create(lv_screen_active());
 -   lv_image_set_src(weather_image_humidity, &image_weather_humidity);
 -   lv_obj_align(weather_image_humidity, LV_ALIGN_CENTER, 30, 20);
 -   text_label_humidity = lv_label_create(lv_screen_active());
 -   lv_label_set_text(text_label_humidity, String("   " + humidity + "%").c_str());
 -   lv_obj_align(text_label_humidity, LV_ALIGN_CENTER, 70, 20);
 -   lv_obj_set_style_text_font((lv_obj_t*) text_label_humidity, &lv_font_montserrat_22, 0);
 - 
 -   text_label_weather_description = lv_label_create(lv_screen_active());
 -   lv_label_set_text(text_label_weather_description, weather_description.c_str());
 -   lv_obj_align(text_label_weather_description, LV_ALIGN_BOTTOM_MID, 0, -40);
 -   lv_obj_set_style_text_font((lv_obj_t*) text_label_weather_description, &lv_font_montserrat_18, 0);
 - 
 -   // Create a text label for the time and timezone aligned center in the bottom of the screen
 -   text_label_time_location = lv_label_create(lv_screen_active());
 -   lv_label_set_text(text_label_time_location, String("Last Update: " + last_weather_update + "  |  " + location).c_str());
 -   lv_obj_align(text_label_time_location, LV_ALIGN_BOTTOM_MID, 0, -10);
 -   lv_obj_set_style_text_font((lv_obj_t*) text_label_time_location, &lv_font_montserrat_12, 0);
 -   lv_obj_set_style_text_color((lv_obj_t*) text_label_time_location, lv_palette_main(LV_PALETTE_GREY), 0);
 - 
 -   lv_timer_t * timer = lv_timer_create(timer_cb, 600000, NULL);
 -   lv_timer_ready(timer);
 - }
 - 
 - /*
 -   WMO Weather interpretation codes (WW)- Code        Description
 -   0        Clear sky
 -   1, 2, 3        Mainly clear, partly cloudy, and overcast
 -   45, 48        Fog and depositing rime fog
 -   51, 53, 55        Drizzle: Light, moderate, and dense intensity
 -   56, 57        Freezing Drizzle: Light and dense intensity
 -   61, 63, 65        Rain: Slight, moderate and heavy intensity
 -   66, 67        Freezing Rain: Light and heavy intensity
 -   71, 73, 75        Snow fall: Slight, moderate, and heavy intensity
 -   77        Snow grains
 -   80, 81, 82        Rain showers: Slight, moderate, and violent
 -   85, 86        Snow showers slight and heavy
 -   95 *        Thunderstorm: Slight or moderate
 -   96, 99 *        Thunderstorm with slight and heavy hail
 - */
 - void get_weather_description(int code) {
 -   switch (code) {
 -     case 0:
 -       if(is_day==1) { lv_image_set_src(weather_image, &image_weather_sun); }
 -       else { lv_image_set_src(weather_image, &image_weather_night); }
 -       weather_description = "CLEAR SKY";
 -       break;
 -     case 1: 
 -       if(is_day==1) { lv_image_set_src(weather_image, &image_weather_sun); }
 -       else { lv_image_set_src(weather_image, &image_weather_night); }
 -       weather_description = "MAINLY CLEAR";
 -       break;
 -     case 2: 
 -       lv_image_set_src(weather_image, &image_weather_cloud);
 -       weather_description = "PARTLY CLOUDY";
 -       break;
 -     case 3:
 -       lv_image_set_src(weather_image, &image_weather_cloud);
 -       weather_description = "OVERCAST";
 -       break;
 -     case 45:
 -       lv_image_set_src(weather_image, &image_weather_cloud);
 -       weather_description = "FOG";
 -       break;
 -     case 48:
 -       lv_image_set_src(weather_image, &image_weather_cloud);
 -       weather_description = "DEPOSITING RIME FOG";
 -       break;
 -     case 51:
 -       lv_image_set_src(weather_image, &image_weather_rain);
 -       weather_description = "DRIZZLE LIGHT INTENSITY";
 -       break;
 -     case 53:
 -       lv_image_set_src(weather_image, &image_weather_rain);
 -       weather_description = "DRIZZLE MODERATE INTENSITY";
 -       break;
 -     case 55:
 -       lv_image_set_src(weather_image, &image_weather_rain); 
 -       weather_description = "DRIZZLE DENSE INTENSITY";
 -       break;
 -     case 56:
 -       lv_image_set_src(weather_image, &image_weather_rain);
 -       weather_description = "FREEZING DRIZZLE LIGHT";
 -       break;
 -     case 57:
 -       lv_image_set_src(weather_image, &image_weather_rain);
 -       weather_description = "FREEZING DRIZZLE DENSE";
 -       break;
 -     case 61:
 -       lv_image_set_src(weather_image, &image_weather_rain);
 -       weather_description = "RAIN SLIGHT INTENSITY";
 -       break;
 -     case 63:
 -       lv_image_set_src(weather_image, &image_weather_rain);
 -       weather_description = "RAIN MODERATE INTENSITY";
 -       break;
 -     case 65:
 -       lv_image_set_src(weather_image, &image_weather_rain);
 -       weather_description = "RAIN HEAVY INTENSITY";
 -       break;
 -     case 66:
 -       lv_image_set_src(weather_image, &image_weather_rain);
 -       weather_description = "FREEZING RAIN LIGHT INTENSITY";
 -       break;
 -     case 67:
 -       lv_image_set_src(weather_image, &image_weather_rain);
 -       weather_description = "FREEZING RAIN HEAVY INTENSITY";
 -       break;
 -     case 71:
 -       lv_image_set_src(weather_image, &image_weather_snow);
 -       weather_description = "SNOW FALL SLIGHT INTENSITY";
 -       break;
 -     case 73:
 -       lv_image_set_src(weather_image, &image_weather_snow);
 -       weather_description = "SNOW FALL MODERATE INTENSITY";
 -       break;
 -     case 75:
 -       lv_image_set_src(weather_image, &image_weather_snow);
 -       weather_description = "SNOW FALL HEAVY INTENSITY";
 -       break;
 -     case 77:
 -       lv_image_set_src(weather_image, &image_weather_snow);
 -       weather_description = "SNOW GRAINS";
 -       break;
 -     case 80:
 -       lv_image_set_src(weather_image, &image_weather_rain);
 -       weather_description = "RAIN SHOWERS SLIGHT";
 -       break;
 -     case 81:
 -       lv_image_set_src(weather_image, &image_weather_rain);
 -       weather_description = "RAIN SHOWERS MODERATE";
 -       break;
 -     case 82:
 -       lv_image_set_src(weather_image, &image_weather_rain);
 -       weather_description = "RAIN SHOWERS VIOLENT";
 -       break;
 -     case 85:
 -       lv_image_set_src(weather_image, &image_weather_snow);
 -       weather_description = "SNOW SHOWERS SLIGHT";
 -       break;
 -     case 86:
 -       lv_image_set_src(weather_image, &image_weather_snow);
 -       weather_description = "SNOW SHOWERS HEAVY";
 -       break;
 -     case 95:
 -       lv_image_set_src(weather_image, &image_weather_thunder);
 -       weather_description = "THUNDERSTORM";
 -       break;
 -     case 96:
 -       lv_image_set_src(weather_image, &image_weather_thunder);
 -       weather_description = "THUNDERSTORM SLIGHT HAIL";
 -       break;
 -     case 99:
 -       lv_image_set_src(weather_image, &image_weather_thunder);
 -       weather_description = "THUNDERSTORM HEAVY HAIL";
 -       break;
 -     default: 
 -       weather_description = "UNKNOWN WEATHER CODE";
 -       break;
 -   }
 - }
 - 
 - void get_weather_data() {
 -   if (WiFi.status() == WL_CONNECTED) {
 -     HTTPClient http;
 -     // Construct the API endpoint
 -     String url = String("http://api.open-meteo.com/v1/forecast?latitude=" + latitude + "&longitude=" + longitude + "¤t=temperature_2m,relative_humidity_2m,is_day,precipitation,rain,weather_code" + temperature_unit + "&timezone=" + timezone + "&forecast_days=1");
 -     http.begin(url);
 -     int httpCode = http.GET(); // Make the GET request
 - 
 -     if (httpCode > 0) {
 -       // Check for the response
 -       if (httpCode == HTTP_CODE_OK) {
 -         String payload = http.getString();
 -         //Serial.println("Request information:");
 -         //Serial.println(payload);
 -         // Parse the JSON to extract the time
 -         JsonDocument doc;
 -         DeserializationError error = deserializeJson(doc, payload);
 -         if (!error) {
 -           const char* datetime = doc["current"]["time"];
 -           temperature = String(doc["current"]["temperature_2m"]);
 -           humidity = String(doc["current"]["relative_humidity_2m"]);
 -           is_day = String(doc["current"]["is_day"]).toInt();
 -           weather_code = String(doc["current"]["weather_code"]).toInt();
 -           /*Serial.println(temperature);
 -           Serial.println(humidity);
 -           Serial.println(is_day);
 -           Serial.println(weather_code);
 -           Serial.println(String(timezone));*/
 -           // Split the datetime into date and time
 -           String datetime_str = String(datetime);
 -           int splitIndex = datetime_str.indexOf('T');
 -           current_date = datetime_str.substring(0, splitIndex);
 -           last_weather_update = datetime_str.substring(splitIndex + 1, splitIndex + 9); // Extract time portion
 -         } else {
 -           Serial.print("deserializeJson() failed: ");
 -           Serial.println(error.c_str());
 -         }
 -       }
 -       else {
 -         Serial.println("Failed");
 -       }
 -     } else {
 -       Serial.printf("GET request failed, error: %s\n", http.errorToString(httpCode).c_str());
 -     }
 -     http.end(); // Close connection
 -   } else {
 -     Serial.println("Not connected to Wi-Fi");
 -   }
 - }
 - 
 - void setup() {
 -   String LVGL_Arduino = String("LVGL Library Version: ") + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch();
 -   Serial.begin(115200);
 -   Serial.println(LVGL_Arduino);
 - 
 -   // Connect to Wi-Fi
 -   WiFi.begin(ssid, password);
 -   Serial.print("Connecting");
 -   while (WiFi.status() != WL_CONNECTED) {
 -     delay(500);
 -     Serial.print(".");
 -   }
 -   Serial.print("\nConnected to Wi-Fi network with IP Address: ");
 -   Serial.println(WiFi.localIP());
 -   
 -   // Start LVGL
 -   lv_init();
 -   // Register print function for debugging
 -   lv_log_register_print_cb(log_print);
 - 
 -   // Create a display object
 -   lv_display_t * disp;
 -   // Initialize the TFT display using the TFT_eSPI library
 -   disp = lv_tft_espi_create(SCREEN_WIDTH, SCREEN_HEIGHT, draw_buf, sizeof(draw_buf));
 -   lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_270);
 -   
 -   // Function to draw the GUI
 -   lv_create_main_gui();
 - }
 - 
 - void loop() {
 -   lv_task_handler();  // let the GUI do its work
 -   lv_tick_inc(5);     // tell LVGL how much time has passed
 -   delay(5);           // let this time pass
 - }
 
  复制代码
  
 
 |