基于ESP32-S2制作的本地气象台/温度计
本项目基于ESP32-S2模块的物联网平台,制作了一个本地气象台及温度计,项目内容包括通过wifi获取本地时间、天气和温度,并利用OLED屏进行显示。
标签
嵌入式系统
显示
网络与通信
物联网
esp-idf
2022寒假在家练
yushui
更新2022-03-01
中南大学
1200

项目描述

本项目基于ESP32-S2模块的物联网平台,制作了一个本地气象台及温度计,项目内容包括通过Wi-Fi获取本地时间、天气和温度,并利用OLED屏进行显示。

平台介绍

本项目使用的物联网平台,使用了乐鑫公司的ESP32-S2-Mini-1模块,ESP32-S2-MINI-1是一颗通用型Wi-Fi MCU模组,功能强大,具有丰富的外设接口。ESP32-S2-MINI-1模组配置了4MB SPI flash,采用的是 ESP32-S2FN4 芯片。该芯片搭载了Xtensa® 32 位LX7 单核处理器,工作频率高达 240 MHz。官方提供了ESP-IDF和Arduino等开发框架,本项目中使用ESP-IDF作为开发框架开发。

功能实现

制作一个本地气象台/收音机

  1. 利用OLED显示
  2. 通过Wi-Fi获取本地时间、天气和温度
  3. 显示当前本地的时间、温度和气象信息
  4. 系统能够自动校时,能自动调节到准确的时间(年、月、日、时、分、秒)

 

设计思路

FuJ5XyvuiL4JZCEZTv6KoQipoDQT

具体实现及代码说明

初始化

对于12864的OLED屏,使用SPI通讯。

U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=LCD_SCK*/ 36, /* data=LCD_SDA*/ 35, /* cs=*/ 46, /* dc=LCD_DC*/ 33, /* reset=LCD_RST*/ 34);

Wi-Fi配置

设置好Wi-Fi名称和密码后进行Wi-Fi连接,并在串口输出Wi-Fi连接状态。

  WiFi.begin(ssid,password);
  while(WiFi.status()!=WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println(" CONNECTED");

获取当地时间,自动校时

Wi-Fi连接好以后,访问设置好的ntpServer,获取当地时间。

 configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
 struct tm timeinfo;
 if(!getLocalTime(&timeinfo)){
   Serial.println("Failed to obtian time");
   return ;
 }
 Serial.println(&timeinfo,"%A, %B %d %Y %H:%M:%S");

获取天气温度

根据不同的城市代号,获取不同城市的天气和温度,并通过ArduinoJson库解析Json信息。

    http.begin("http://t.weather.sojson.com/api/weather/city/101251101");
    int httpCode = http.GET();
    if(httpCode == HTTP_CODE_OK){
      String pageData = http .getString();

    DynamicJsonDocument doc(6144);

    DeserializationError error = deserializeJson(doc, pageData);

    if (error) {
      Serial.print("deserializeJson() failed: ");
      Serial.println(error.c_str());
      return;
    }

    JsonObject cityInfo = doc["cityInfo"];
    String cityInfo_city = cityInfo["city"]; 
    
    JsonObject data = doc["data"];

    JsonArray data_forecast = data["forecast"];

    JsonObject data_forecast_0 = data_forecast[0];
    String data_forecast_0_high = data_forecast_0["high"]; 
    String data_forecast_0_low = data_forecast_0["low"]; 
    String data_forecast_0_type = data_forecast_0["type"]; 

    String cityInform ="地点:"+ cityInfo_city;
    String tempInfo =data_forecast_0_low + "~" + data_forecast_0_high;
    String cityWeatherinfo = "天气状况:" + data_forecast_0_type;
    Serial.println("获得天气情况如下:");
    printLocalTime();
    Serial.print(cityInform);
    Serial.print(tempInfo);
    Serial.println(cityWeatherinfo);
    }else{
      Serial.println("GET ERR");
    }
    http.end();

OLED屏显示

利用u8g2库在OLED屏上适当位置显示出需要的信息。

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_wqy12_t_gb2312);
    u8g2.setCursor(0, 13);
    u8g2.print(cityInform);
    u8g2.setCursor(0, 28);
    u8g2.print(tempInfo);
    u8g2.setCursor(0, 43);
    u8g2.print(cityWeatherinfo);
    u8g2.sendBuffer();
    u8g2.setCursor(0,55);
    u8g2.print(&timeinfo,"%F %T");
    u8g2.sendBuffer();

Fsg-7PwrQtA6sJTh4A7LpBagIaco

遇到的主要难题及解决方法

刚开始虽然跟着乐鑫官方的教程搭建好了ESP-IDF的环境,但是由于对软件操作不太熟悉,再加上IDF中很多都是基于FreeRTOS,而从这里才刚刚接触FreeRTOS,因此在项目的推进上遇到很大的难题。由于Arduino内部有更多封装好的库与函数,感觉对新手更加友好,因此最终选择了Arduino作为本次项目的开发平台。

软硬件
元器件
ESP32-S2-MINI-1
2.4GHz Wi­Fi (802.11 b/g/n) 模组, 内置ESP32­S2系列芯片,Xtensa® 单核32位LX7微处理器, 内置芯片叠封4MB flash,可叠封2MB PSRAM, 37个GPIO,丰富的外设, 板载PCB天线或外部天线连接器
附件下载
homeworkFinal.ino
团队介绍
学生
团队成员
yushui
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号