FastBond2阶段2-基于ESP32-S3-WROOM的天气预报桌面摆件
FastBond2阶段2-基于ESP32-S3-WROOM的天气预报桌面摆件
标签
KiCad
嵌入式系统
得捷电子
FastBond第二季
Tide
更新2023-11-10
514

一、项目介绍

      该项目为复刻野生程序猿的GSM-Weather-S3项目,以ESP32-S3-WROOM-1-N16R8为主控芯片,能够实现以下功能

  1. 天气预报。
  2. B站信息。
  3. 老黄历。
  4. 时钟。
  5. 语言切换。
  6. wifi搜索。

二、项目设计思路

      硬件部分的设计参考 ESP32-S3-WROOM-1-N16R8最小系统,在此原理图的基础上增加一个LDO电源、锂电池充电电路(用于恒流充电)、USB口(用于下载程序和供电)、sd卡(存储扩展)、1.69寸TFT触摸屏。

      软件部分使用ESP32官方esp-idf-v5.0开发。

三、设计框图及原理介绍

  3.1 设计框图    

      设计流程图与原理图初步设计均由Scheme-it网页绘制,Scheme-it 是一款在线原理图和图表绘制工具,能让用户在浏览器网页中创建并分享自己的技术布局设计。 该工具包括了构建电路所需的一整套原理图符号以及集成式 Digi-Key 目录,支持将产品图片和图像插入您的设计中。该工具还包括一个集成式物料清单 (BOM),以便用户将每个通用符号或制造商元件与一个 Digi-Key 零件编号相关联。同时,也支持框图导出为png、pdf以及KiCad做后续开发。分享链接如下:

https://www.digikey.cn/schemeit/project/weather-993f1a73a778476db0d9a16a4954930a

硬件框图如下图所示:

         Fn-BQWpnNvSmySUoJ3UOUrSUQa-Q

3.2 原理图

mainboard

Fivviw-1abt8tKg7FTIMLdNUtJPZ

      主板部分采用ESP32-S3-WROOM-1-N16R8作为主控芯片,与屏幕之间通过I2C进行通信,使用一个NMOS管作为屏幕的驱动。电池电压检测电路中,BAT连接到锂电池正极,通过两个电阻分压,连接到单片机的ADC引脚。ADC测到的电压,就是锂电池电压的一半,因为锂电池的电压范围大概在2.7V到4.2V之间,所以ADC引脚的电压会在1.35~2.1V之间,不会超过普通单片机的3.3V电压。不过当产品处于关机状态时,我们以为锂电池就不耗电了,其实,通过电路可以发现,锂电池其实还在通过2个10k的电阻耗电,随着时间的推移,该产品放着放着电就减少了,而且当电池电压减少到2.7V以下时,就可能无法充起电来了。因此可以通过加入一个MOS管来解决这个问题,这里加MOS管并不是用来控制“是否要测量电池电压”,而是为了在产品关机的时候,不要让锂电池电池的电压通过两个分压电阻。在设备关机的时候,将单片机IO口电平拉高,PMOS将电路断开,不让这两个分压电阻消耗电量。

usbboard

FqSoShX84p9nrwewJAZscbf-14z-

       USB板通过18Pin的端口与主板连接,主要作用是给主板供电以及下载程序,使用了CH340C作为USB转TTL的下载电路,额外增加了两个三极管让它可以自动下载,预留SD卡内存扩展卡槽,使用PMOS管作为电池和USB供电切换电路,当USB供电时,PMOS管G极电压为5V,没有导通,5V电压经过D4直接单独供给VCC;当USB供电断开时,PMOS管G极电压由R26电阻下拉到地,此时PMOS管导通,由电池供电。VCC电压经过滤波和SPX3819芯片的稳压后,对主板进行供电

3.3 PCB板

mainboard

Fj9C9c4pdhKDOUNGwRcv9w-vytVV

       由于这个WM8978为QFN封装,中间焊盘接地部分使用烙铁无法焊接,故在布板的时候将中间焊盘设置为通孔,这样可以从板子背面进行焊接。FPC座子有点不好焊接,有条件的建议使用锡膏和热台进行焊接。

usbboard

Fnh8h_rrCu48IL6kCBDVjs60PJXq

      USB板在打板的时候选择不要半孔工艺,打板厚度要求1.6mm以下,否则价格会很贵,建议先焊接好FPC座子

3.4 结构外壳

Fv_yXZmRpI0IdwP9Zjs6Un26oCZn

      3D外壳材料建议选择8111X或者9000R,usb板子可以通过底部的3个卡点直接安装在结构外壳上

四、设计使用器件介绍

主控:ESP32-S3-WROOM-1-N16R8

      ESP32-S3-WROOM-1 是通用型 Wi-Fi + 低功耗蓝牙 MCU 模组,搭载 ESP32-S3系列芯片。ESP32-S3 系列芯片搭载 Xtensa® 32 位 LX7 双核处理器(支持单精度浮点运算单元),工作频率高达 240 MHz。CPU 电源可被关闭,利用低功耗协处理器监测外设的状态变化或某些模拟量是否超出阈值。ESP32-S3 集成了丰富的外设,包括模组接口:SPI、LCD、Camera 接口、UART、I2C、I2S、红外遥控、脉冲计数器、LED PWM、USB Serial/JTAG 控制器、MCPWM、SDIO host、GDMA、TWAI® 控制器(兼容 ISO 11898-1)、ADC、触摸传感器、温度传感器、定时器和看门狗,和多达 45 个 GPIO。此外,ESP32-S3 还有一个全速 USB 2.0 On-The-Go (OTG) 接口用于 USB 通信。 除具有丰富的外设接口外,模组还拥有强大的神经网络运算能力和信号处理能力,适用于 AIoT 领域的多种应用场景,例如唤醒词检测和语音命令识别、人脸检测和识别、智能家居、智能家电、智能控制面板、智能扬声器等。ESP32-S3-WROOM-1 采用 PCB 板载天线,对新手友好,无需调节天线的阻抗匹配。

                                   Fjk_UnGF4_QBEsEeyWnU5aPRLDCz

电源:SPX3819

      SPX3819是具有低压差和低噪声输出的正电压调节器。此外,该器件在100mA输出时提800μA的极低接地电流。SPX3819的初始公差最大不超过1%,并且具有逻辑兼容的开/关切换输入。禁用时,功耗降至几乎为零。其他关键功能包括反向电池保护,电流限制和热关机。SPX3819包括一个基准旁路引脚,可实现最佳的低噪声输出性能。由于其非常低的输出温度系数,该器件还可以提供出色的低功耗电压基准。SPX3819是电池供电应用(例如无线电话,无线电控制系统和便携式计算机)的绝佳选择。它具有多种固定输出电压选项或可调输出电压。

USB转串口电路+自动烧录电路:CH340C+UMH3N

      ESP32-S3支持串口下载,由于电脑没有串口接口,所以需要一个USB转串口芯片CH340C,该芯片支持一路usb转串口ttl,带有RTS、DTR控制引脚,内部集成晶振大大简化了外部电路。

      根据ESP3S3数据手册,进入串口下载模式需要在上电前拉低IO0,上面介绍了CH340C带有RTS、DTR引脚,可以在加入开关控制电路来实现自动复位和拉低IO0,UMH3N芯片内部带有两个三极管并且集成偏置电压,如电路所示利用CH340C的RTS、DTR引脚可以实现自动下载程序。

Fo_aIRYIftooUPHjk6QpocZnodre

音频输出:WM8978

      WM8978是一款低功耗、高质量的立体声编解码器,专为便携式应用设计,如多媒体电话,数码相机或数码摄像机。该设备集成了立体声差分麦克风的前置放大器,并包括扬声器,耳机和差速器的驱动器立体声线输出。无需单独的麦克风或耳机放大器,从而减少了对外部组件的需求。先进的片上数字信号处理包括一个5波段均衡器,混合信号自动电平控制麦克风或线路输入通过 ADC 对麦克风或线路输入进行混合信号自动电平控制,以及用于录音或播放的纯数字限制器功能。额外的数字滤波选项可在ADC路径,以满足应用过滤,如“风噪声降低”。WM8978数字音频接口可以作为主机或一个从机。一个内部锁相环可以产生所有需要的音频时钟从通用参考时钟频率,如为12MHz和13MHz。WM8978工作在模拟电源电压从2.5V到尽管数字核心可以在低至3.3V的电压下工作1.71V省电。扬声器输出和OUT3/4线如果增加输出功率,输出可以从5V电源运行必需的。芯片的各个部分也可以供电在软件控制下。

其它器件:

      液晶显示屏:用于显示时间、天气等

      SD卡:用于存储扩展

      TYPE-C:用于供电和充电、程序下载

      LTH7R.:用于锂电池充电

五、硬件功能测试与遇到的问题解决

      首先是拿到了打样回来的板子,检查没有什么问题

FpC4y3Q7jqoGvFv_7xO2OvgPdWKt

      然后按照BOM表,把相应的器件给焊接上去,大家在焊接的时候一定要注意二极管是有方向的哈,避免焊反。咪头和喇叭以及电池SD卡不用焊接也可以正常工作,建议先焊接FPC座子,把最难焊接的先焊好再去焊接其它器件,下图是焊接好的两个板卡 

FpUWOjATDcaQavzH7p_ZXpVTXarZ

       在上电之前可以先用万用表蜂鸣档检查电源和地之间是否有短路现象,以及是否有虚焊漏焊还有焊接反的器件,避免将芯片烧坏。做完这些之后,就可以先将USB板单独上电试试电压是否正常,5V电压经过LDO芯片是否转换为3.3V电压,如果没有,需要检查一下LDO芯片的输入输出电压是否有电,以及是否焊错了芯片。检查正常之后,再连接上主板,注意不要将主板的插座和FPC连接线插反,要按照图中的方向连接好。我在组装的时候碰到的一个问题就是主控芯片发热严重,检查了几遍之后才发现我把插座的位置插错了,导致5V和地直接连接在一起造成短路。如果没有什么其它问题的话,就可以将USB板安装在结构外壳上面了,外壳底部有3个卡点刚好卡住USB板,实物部分如下图所示

   FlQBXV3dahuwJSEDz-65K4dbwi1h

      这是整体安装完成后的效果

FqtNIWHpBW44N6hx1hvFi3HTUsqD

       做到这一步,硬件部分基本就完成了,接下来需要软件部分的调试

六、部分软件功能说明

        关机代码在bsp_power.c文件里,关机代码如下,关机逻辑是在开机情况下检测按键是否按下,按下时开始计时,计时到2秒认为用户关机,调用窗口提示“松手关机”,然后检测按键是否抬起,抬起后调用bsp_power_off(),该函数是拉低开机引脚POWER_IO,关闭3.3V稳压芯片输出,使整个系统断电,当程序下载到芯片时出现了问题,代码执行后并没有立刻关机,而是等了一会才关机,原因是关闭QI控制脚后,ESP32模块存有余电情况下没有关闭,等待放电结束后才能关机,后来加入了关闭背光和执行一次连接wifi操作的代码来加快esp32模块余电消耗。

if(bsp_key_read_power_gpio()==1)
			{
				bap_power_debug("关机计数:%d",count);
				if(++count>20)
				{
					lvgl_hint_create(lv_scr_act(),"松手关机",200,20);

					while(bsp_key_read_power_gpio())
					{
						vTaskDelay(pdMS_TO_TICKS(10));
					}

					bsp_ledc_set_duty(0);
					system_save_config();
					vTaskDelay(pdMS_TO_TICKS(1000));
					bsp_power_off();

					//bsp_power_sleep();
					wifi_lianjie(0,system_data.wifi_name,system_data.wifi_password,NULL);
					vTaskDelay(pdMS_TO_TICKS(1000));
					vTaskDelay(pdMS_TO_TICKS(1000));
					esp_restart();
					while(1)
					{
						bsp_power_off();
						vTaskDelay(pdMS_TO_TICKS(100));
					}
				}
			}

     获取天气的程序是通过esp32的wifi库连接到互联网后,再通过esp32的http库向心知天气的服务器发送请求获取天气的数据,获取到的数据格式为json,之后再对json格式的数据进行解析,然后就能获取需要的内容了。

int HTTP_Get_KongQi(char * city_name_buf,_kongqi_Data  *read_buf)
{
 int res=0;
  int i=0;
  int return_dat=0;
  char *http_recv_buff=NULL;
  char buf[256];
  if(read_buf==NULL)
   return 1;

  http_recv_buff = (char*)os_malloc(1024*2);


  kongqi_debug("开始获取空气质量\r\n");
  sprintf(buf,"%s%s",HTTPS_KongQi,city_name_buf);
  res = HTTP_Read_Data(buf,NULL,http_recv_buff,GET_REQ);
  if(res==0)
  {

    char *str=strstr((char *)http_recv_buff, "\"}]}");
    if(str==NULL||strstr((char *)http_recv_buff, "The API key is invalid")!=NULL)
    {
      kongqi_debug("空气质量数据错误\r\n");
      return_dat= -1;
    }else
    {

      kongqi_debug("开始解析空气质量数据\r\n");
      char *json_data = http_recv_buff;
      cJSON *json_A = cJSON_Parse(os_strchr(json_data, '{'));//获取整个大的句柄
      cJSON *results = cJSON_GetObjectItem(json_A,"results");
      cJSON *location = cJSON_GetObjectItem(cJSON_GetArrayItem(results,0),"location");
      cJSON *air = cJSON_GetObjectItem(cJSON_GetArrayItem(results,0),"air");
      cJSON *city = cJSON_GetObjectItem(air,"city");


      kongqi_debug("city: %s\n%s\n",
                cJSON_Print(cJSON_GetObjectItem(location, "name")),
                cJSON_Print(city)
                );

      cJSON *data;
      data = cJSON_GetObjectItem(city, "aqi");
      kongqi_debug("空气质量指数:%s\r\n",data->valuestring);
      sprintf(read_buf->aqi,"%s",data->valuestring);

      data = cJSON_GetObjectItem(city, "pm25");
      kongqi_debug("PM2.5颗粒物:%s\r\n",data->valuestring);
      sprintf(read_buf->pm25,"%s",data->valuestring);

      data = cJSON_GetObjectItem(city, "pm10");
      kongqi_debug("PM10颗粒物:%s\r\n",data->valuestring);
      sprintf(read_buf->pm10,"%s",data->valuestring);

      data = cJSON_GetObjectItem(city, "so2");
      kongqi_debug("二氧化硫1小时平均值:%s\r\n",data->valuestring);
      sprintf(read_buf->so2,"%s",data->valuestring);

      data = cJSON_GetObjectItem(city, "no2");
      kongqi_debug("二氧化氮1小时平均值:%s\r\n",data->valuestring);
      sprintf(read_buf->no2,"%s",data->valuestring);

      data = cJSON_GetObjectItem(city, "co");
      kongqi_debug("一氧化碳1小时平均值:%s\r\n",data->valuestring);
      sprintf(read_buf->co,"%s",data->valuestring);

      data = cJSON_GetObjectItem(city, "o3");
      kongqi_debug("臭氧1小时平均值:%s\r\n",data->valuestring);
      sprintf(read_buf->o3,"%s",data->valuestring);

      data = cJSON_GetObjectItem(city, "primary_pollutant");
      if(data->valuestring!=NULL)
      {
        kongqi_debug("首要污染物:%s\r\n",data->valuestring);
        sprintf(read_buf->primary_pollutant,"%s",data->valuestring);
      }else
      {
        kongqi_debug("首要污染物:%s\r\n","NULL");
        sprintf(read_buf->primary_pollutant,"%s","NULL");
      }

      data = cJSON_GetObjectItem(city, "quality");
      kongqi_debug("空气质量类别:%s\r\n",data->valuestring);
      sprintf(read_buf->quality,"%s",data->valuestring);

      data = cJSON_GetObjectItem(city, "last_update");
      kongqi_debug("数据发布时间:%s\r\n",data->valuestring);
      sprintf(read_buf->last_update,"%s",data->valuestring);

      cJSON_Delete(json_A);
    }
  }else
  {
    kongqi_debug("获取天气失败:%d\r\n", res);
    return_dat= -3;
  }

       附软件源码:https://gitee.com/Tide9/weather.git

七、软件烧录设置与遇到的问题解决

      烧录软件使用的是乐鑫官方的软件esp32 download tool,下载链接为:工具 | 乐鑫科技 (espressif.com.cn)。然后选择相应的固件,按照下图方式进行设置就行。

   FrCtcA6-MIDgibnSmKhg6-88eIsD

       在软件烧录的时候,我碰到了两个问题,第一个问题是烧录的时候 一直在等待上电同步,解决方法是将芯片的GPIO0脚接一下地,然后就可以正常烧录了。第二个问题是烧录时会提示16-bin file overlap,主要的原因是bin文件重叠了,然后重新修改了bin文件的地址就可以正常烧录软件了。烧录完成后的成品如下图所示。 

FutQ2fjc6sBa9Iu6uba-i5Y03e-0

八、活动总结

     非常感谢硬禾学堂和得捷电子联合举办的FastBond2活动,让我能够有机会完整的参与一个项目,可以学习到如何使用Scheme-it在线绘制图表以及使用Kicad绘制原理图和PCB,这次的活动真的是对我非常有意义,积累了宝贵的经验,也提高了解决问题的能力,在直播课中,主讲工程师给我们介绍了ElectronicsHub等项目网站,帮助我们拓宽了个人眼界,而且可以通过阅读项目提高自己的项目设计能力和解决分析问题的能力,祝FastBond越办越好!

 

附件下载
固件.zip
原理图PCB和结构图.zip
团队介绍
个人
团队成员
Tide
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号