基于ESP32单片机的物联网小电视

系统简介

伴随着我国国内经济水平的高速发展以及城市化进程的不断加快,很明显国民的生活水平不断得到提高,而物联
网行业也由此得到飞速的发展进步。物联网即“万物相连的互联网”,是对于互联网延扩的网络,物联网将各种用于
获取信息的设备与互联网结合起来形成一个庞大的网络,以实现在任何时间、任何地点,实现人、机、物的互联互通
。物联网类电子产品的使用,极大地提高了了人们的日常生活水平,从最开始的黑白电视机、电冰箱等,到如今的
网络电视、智能空调等,无一不显现出科技的进步和时代的进步,也从侧面体现出当代物联网类电子产品的巨大发
展潜力,并向着小型化、智能化、网络化的方向进步,这都得益于电子芯片集成度的不断提高和网络通讯技术的高
速发展。ESP32物联网桌面小电视,定位于车载,家庭卧室,可实时显示时间、天气状况、及生活指数,WiFi下自动
联网定位城市,实时更新天气情况。该设计使用ESP32-WROOM-32D作为主控芯片,外围电路包括电源电路、程序自动
下载匹配电路、屏幕接口及背光驱动电路、模式按钮及光感电路,以Arduino框架作为主要的开发途径;ESP32自建
热点,手机或PC连接该热点,打开指定HTML(HyperTextMarkupLanguage)页面,配置完成后,将WiFi信息存储在NVS
(Nonvolatile Storage)区域中。通过WiFi进行网络连接,使用HTTP(Hyper Text Transfer Protocol)请求在网
页端获取信息,接收返回的JSON(JavaScript Object Notation)格式数据经过ArduinoJSON数据解析通过LVGL
(Light and Versatile Graphics Library)推送到屏幕上。
关键词 物联网 小型化 WiFi HTTP请求 JSON数据解析 LVGL

1 绪论

在社会的飞速发展和进步的大背景下,人们的生活节奏也在悄无声息的加快,在忙碌的学习工作之中可能会忽
略一些信息资讯。现如今物联网行业的不断进步,导致数据传输技术和信息获取技术也跟着不断地快速发展和进
步。其中获取信息的方式也就愈来愈多,希望获得的信息愈来愈准确,所以由此见得物联网技术也必然是在不断的
在迈向更高的台阶。获取信息的方式一共有两类:有一类是手动获取,即使用一些搜索引擎去主动的搜索自己想得
到的信息。而另一类获取信息的方式则是自动获取即通过一些技术去获取固定的信息咨询。由于物联网技术已经非
常成熟能够实现多种设备和网络的通信,所以其现如今已经应用于智能家居、社会活动、以及军事研究等很多重要
行业。
1.1 课题的研究背景
  每一次大革命,都会衍生一些新的技术,而新的技术也是使人们的生活走向更台阶的巨大推动力。互联网在经
历了十几年的快速发展之后,还处于一个虚拟的状态,而随着互联网和感知技术的出现,使得互联网由虚拟走向真
实。而物联网,才是真正的互联网,将虚拟与真实结合起来,相比于网络时代的“鼠标+水泥”,其影响更大。我们
可以将物联网比作"天网",它散布在现实生活中。
  物联网所引发的资讯工业浪潮,是二十一世纪电脑科技的一次重大突破,改变了人们的生活,然而现在,不管
网络多么发达,都是虚幻的,与我们所处的世界有着巨大的不同,在这个世界里,我们很难感受到真实的世界,许
多东西都无法实现,因为这个时代需要新的科技。在这种情况下,物联网技术就是一种全新的网络技术。
  物联网概念是 ITU多年前提出的。当今世界,尤其是无线网路的发展,使得物联网技术迈向新台阶。随着通信
网络技术的飞速进步,网络传输速度不断加快,物联网信息交流技术也得到了快速的发展。近几年,各国纷纷加大
了经费和人力,致力于研发新型的物联网技术,积极抢占标准、技术和应用领域的制高点。
  在这方面这项技术已经被我国纳入了国家中长期科技发展计划。现如今,国内的物联网通讯技术,主要是针对
物联网领域的部分国产高性能主控芯片。同时,还建立了大量的开发平台,专门的技术和标准在这个平台上进行。
专家们预计,未来10年,物联网将会得到广泛的应用。它被广泛地用于智能运输、环境保护、治安管理、防火消
防、设备监控、照顾老人、医疗卫生等领域。交通、教育、军事、交通、医疗等各领域在新一代信息技术的发展与
实施的背景下逐步走向信息化。网络的普及无处不在,信息的快速传递和安全的信息传递将成为信息时代的必然趋
势。
  物联网通信技术资源将会在未来的信息社会发挥关键的作用,其将引领无线技术的发展和部署方式。因此,对
无线通信技术研究是必要的,也是新一代物联网通信技术发展所迫切需要的。
1.2 课题的研究意义
  在经过几十年的社会经济建设后,人们的生活质量变得越来越好,物联网通信技术也因此得到了快速的进步。
黑白电视、电冰箱、网络电视、智能空调等,都在不断的体现着技术的进步,也体现出了今天的电子设备的发展。
  互联网让人们和计算机的交流越来越便捷,很多没有实现的商业模式也在不断的出现在人们的生活中,包括电
商、社交媒体等,物联网让人们的关系更加紧密,使人们的生活更加丰富多彩。
  物联网芯片技术已发展到相当成熟的程度,为物联网提供了物质基础,又能满足经济需求;过去三十年间,通
信技术的发展,由模拟到数码,再到简单的调制,再到繁复的调制技术,使得无线通信能以极低的成本,达到数百
米乃至数千米的距离,并能实现密集的数据采集。物联网技术是物联网的主流技术,在提高国民生活水平、提高人
民生活质量等方面都起着十分重要的作用。
  随着物联网技术本身的特点,对采集数据的实时、高效的需求,近年来,随着信息技术的飞速发展,为保证数
据的精确采集提供了必要的信息。
  此次毕业设计基于ESP32单片机的物联网小电视其研究目的在于丰富人们获取信息的途径和日常生活及娱乐方
式。同样的,意义也在于发展自己的综合水平, 使自己能够独立的解决问题,发展物联网专业技术等问题。为自己
在今后的学习和工作奠定一定的经验和阅历基础立志于研究和发展国家的物联网通信技术,使人们的生活水准更上
一层楼。
1.3 国内外研究现状
  多年以来,随着国家、政府的大力扶持,以及大数据分析、人工智能等技术的不断发展,物联网也逐渐从理论
走向了实际应用。智能家居产品也逐渐走进了我们的日常生活,包括智能厨房,智能扫地机器人,智能电视,智能
窗帘等。回顾物联网的发展历程,大致可以归纳为三个时期:
  第一个时期是主机和主机的联网。第一代电脑,是最早期的物联网。从1946年到1964年,电脑的体积大,功率
消耗也大,可靠性不好。但是,它还是为未来的物联网技术发展打下了一些基础。
  第二个时期是手机连接。由于其小巧、性能稳定、操作速度快等特点,广泛应用于各个行业领域,使物联网产
品具有通用化、系列化、规范化等特点。
第三个时期是嵌入式物联网的兴起。
  在中国,很多网络大公司都在做类似的事情,比如阿里、百度、小米等公司,都在2018年推出了自己的智能音
箱。华为已经开始搭建自己HUAWEI-HILink系统,并发布 HiLink协议,华为和荣耀已经和海尔、 BroadLink等公司
达成了合作,共同致力于建立一个物联网生态系统,解决了封闭的生态、破碎的场景和复杂的业务。而小米的智能
硬件,也是五花八门,智能插座,智能电饭煲,智能洗衣机等等。
  在国外, IBM在2008年就推出了“智慧地球”的概念,它的核心就是将所有的东西都融合到一起,形成一种叫
做“物联网”的东西,而物联网则是将所有的东西都集中到一起,实现人与物的融合。欧洲联盟在2009世界物联网
大会上向各国代表递交了《欧盟物联网行动计划》,希望这份计划能够成为未来物联网领域的领军人物。同时,欧
各地区的设备制造商和运营商也要积极参与,推动物联网技术的推广和发展。日本于2004年推出u-Japan战略,将人
与事物连接在一起,从而促进了数字网络社会的发展。2011年,日本大地震频繁,政府寄希望于利用物联网技术解决自然灾害,并计划在未来,在日本推广使用物联网,从而降低因自然灾害造成的经济损失。
1.4 课题的技术构成
  该设计主要利用ESP32-WROOM-32D单片机作为控制器,使用Arduino框架作为主要的开发途径,使用VScode下的
Platformio作为编译环境进行程序的编写。通过ESP32自建热点,手机或PC连接该热点,打开指定HTML页面,配置完
成后,将WiFi信息存储在NVS区域中。获取新闻数据时使用天行数据的api接口,发起api请求后,通过 ArduinoJSON
库来解析返回JSON格式数据,然后通过 LVGL把数据传送到屏幕上。
硬件方面运用模电知识,使用立创EDA画出原理图,在此基础上完成PCB设计。
  ESP32是一款2.4 GHzWiFi与 Bluetooth双模式的单片,它的射频性能、稳定性、通用性和可靠性都达到了高层
次水准,可以适应各种功率消耗的要求。2.4 GHz的发射机利用高功率补充 MOS(CMOS)的功率放大器来驱动一个
2.4 GHz的 RF信号。该数字标定进一步提高了功率放大器的线性度,从而使802.11 b的无线传输功率达到+20.5
dBm,而802.11 n则达到+18 dBm。ESP32包括:射频、功率放大器、接收机、滤波器、电源管理等。ESP32只需少量
的外部设备即可实现高处理能力,安全可靠,WiFi及自带蓝牙等特点。
  HTTP要求是一个从客户机发送到服务器端的一个请求。HTTP协定定义了网络客户机是怎样向网络服务器发出网
页的,和服务器如何将页面发送给用户。HTTP协议中有一种要求/响应方式。客户端向服务器发送请求报文,包含请
求方法、 URL、协定的版本、要求的报头以及数据请求。服务器响应包含协议版本,成功或错误代码,服务器信
息,响应头和响应数据。在这个设计中, HTTP请求可以获得包括时间,天气状况,城市信息等在内的页面信息。
  LVGL是一种自由的开源图形库,能够为用户轻松地创建图形元素、漂亮的视觉和较少的内嵌式 GUI。在这个设
计中,通过lv_label_set_text_fmt功能,将数据传送到屏幕上。
  在嵌入式系统中, ArduinoJSON是一种优雅而有效的 JSON类库。它只使用最基础的 API,以保证在工作中占用
最少的记忆体。ArduinoJson是一款完全由 C++编写的 Json库,它能够支持大多数 Json常见的数据处理;
ArduinoJson的数据量更小,仅有一个. h文件。还可以下载 zip文件,并在 Arduino IDE中进行选择:工程>装入库

增加 ZIP库;尽管它很小,但是它的官方网页却是毫不含糊,它的字体很好,信息也很详尽,而且它也是一个很便
利的工具。

2 物联网小电视总体方案设计

2.1 物联网小电视设计要求分析
  该设计主要利用ESP32-WROOM-32D单片机作为控制器,自建热点,打开指定HTML页面,配置WiFi信息,发起api
请求后,接收返回的JSON格式数据,解析后用LVGL将数据推送到屏幕显示。
该毕业设计的具体内容及要求如下:
(1)对ESP32单片机及物联网通信技术有总体认识;
(2)设计适合该方案总体框图;
  (3)了解硬件电路,包括单片机控制电路、电源电路、程序自动下载匹配电路、屏幕接口及背光驱动电路、模
式按钮及光感电路等;
(4)设计单片机程序,编写该设计所需的详细程序;
(5)调试方案并实现此方案的要求;
其中技术指标需达到:
(1)ESP32可以自建热点;
(2)在设置WiFi信息后ESP32可通过WiFi与手机连接;
(3)通过发送HTTP请求获取网页信息,通过LVGL将信息推送到屏幕上;
(4)显示地理位置、天气情况、时间、温湿度等。
通过对以上要求的分析得出此次设计:
  (1)选择以Xtensa架构的双核32位LX6的ESP32作为数据处理核心,利用 MCU的灵活编程和丰富的 IO接口,可
以用基本的 MCU来控制周边电路。
  (2)该系统使用了ESP32-WROOM-32D单片机,其时钟频率可达到240 MHz。内置448 KB ROM+520KB内存+16 KB
RTC内存.采用802.11 b/g/n的802.11 n传输速率,支持 Bluetooth V4.2 BR/EDR以及 Bluetooth LE协议。+19.5
dBm的天线端输出功率,保证了很好的覆盖。包含的外设有,以太网,高速SPI, UART,I2S,I2C, CAN, ADC, DAC, PWM
等。
2.2 物联网小电视设计方案
该设计整体结构框图如图2-1所示:

在这里插入图片描述

图2-1 整体结构框图
  该设计提出一种选择以Xtensa架构的双核32位LX6的ESP32作为数据处理核心,用其来控制整个物联网小电视系
统的设计方案。该设计主要利用ESP32-WROOM-32D单片机作为控制器。通过单片机自建热点,手机或PC连接该热点,
打开指定HTML页面,配置完成后,将WiFi信息存储在NVS区域中。从网页获取新闻数据时使用天行数据的api接口,
发起api请求后,接收返回的JSON格式数据,经过JSON数据解析,解析后用LVGL将数据推送到屏幕显示。
2.3 物联网小电视设计理论依据
  在电路的设计中,FP6381A的电压补偿型 PWM控制器,它能提供一个稳定的开关和循环的电流极限,从而达到良
好的负载,线路响应,内部的主开关保护,以及同步整流器。FP6381A的开关频率为常数(1.5 MHz),并且对输出电
压进行调整。PWM比较器根据反馈的错误电压,在每一循环内改变感测器的峰值电流,对传送至负荷的电力进行调
制。在正常操作过程中,主开关会在一定的时间内打开,使感应电流在内部振荡器的上升边缘倾斜,当感应电流的
峰值比错误电压高时断开。在主关断时,同步整流器会立刻开启,并在下一循环开始前一直处于开启状态。
FP6381A EN管脚可对调整器进行数字控制。在 EN电压高于门限时,稳压器会开始软起动。若 EN管脚的电压在关断
门限以下,则稳压器会进入关闭状态,截止电流不超过1微安。它使用了内置的软起动功能,减少了起动过程中的冲
击电流。内置的软起子只需要1 ms。在FP6381A上电后,在 VIN电压超出 UVLO门限之前,该内部电路仍处于不工作
状态。而在 VIN低于 UVLO门限电压时,该稳压器会被关闭。UVLO比较器的延迟是200 mV。
  FP6381A采用循环电流限制结构,实现了过电流保护的功能。利用高质量 MOSFET的串联检测电阻电压,监测感
应电流。随着负荷电流的增大,感应电流也随之增大。在感应峰值电流到达临界值后,输出端的电压会逐渐降低。
在过电流状态消失后,输出电压会恢复至调整状态。它具有短路保护作用,可以避免设备的短路。在出现短路时,
反馈电压下降到40%以下,振荡器的频率就会下降,从而避免感应电流超出限值。为了减小短路电流,减小了电流的
极限。当故障排除后,频率和电流的极限就会恢复到原来的水平。FP6381A具有过热保护功能,可以防止温度过高。
在结温超出了热关门限时,调节阀将关闭。温度过热保护延迟时间为30℃。
  PG管脚为开漏式输出,并要求上拉电阻.PG在软启动、待机和关闭状态下都能有效地维持较低的电位。在超过
90%的额定调整节点时,将会被解除。

输出电压VOUT通过使用电阻分压器来设置。FB引脚调节电压为0.6V。因此,输出电压如式2-1所示。
(2-1)大多数使用的输出电压的R1和R2的推荐值如表2-1所示。
表2-1 R1和R2的推荐值
  
VOUT R1 R2
3.3V 453K 100K
2.5V 316K 100K
1.8V 200K 100K
1.5V 150K 100K
1.2V 100K 100K

3 硬件设计

3.1 系统基本组成
  本系统主要由ESP32主控电路、电源电路、程序自动下载匹配电路、屏幕接口及背光驱动电路、模式按钮及光感
电路和ST7789显示屏组成。
3.2 MCU处理器的选择
微型控制器单位;MCU)是一种用于实现多种不同功能的晶片级别的电脑。它减少了中央处理单元(Central
Process Unit;CPU)的频率以及规格,同时,将计数器、 ADC、 DAC、 USB、 UART、 DMA SPI、 UART、I2S、
I2C、 CAN、 PWM等外部设备都集成起来,所以也被称为单片微机或单片机。
  本次设计使用ESP32-WROOM-32D作为数据处理核心。它是以Xtensa XL6为内核的微控制器,与ESP8266单片机相
比较,ESP32的CPU是160 MHz到240兆赫的 CPU,ESP8266是80 MHz的单核心。同时,ESP32的 WiFi速度也比ESP8266
快, GPIO也更多,而且还支持 Bluetooth4.2;另外,ESP32还配备了触觉感应针,可以让ESP32深度睡眠。ESP32内
置多种尺寸的嵌入式快闪记忆体,并可支援多种 QSPI快闪及 SRAM (16 MB),其应用范围非常广泛。其原理图如下
图3-1。
  ESP32相比于ESP8266有许多优势,主要包括更先进的内核、更多的资源、增强的外设功能、更高的性能以及更
低的功耗。ESP32芯片采用34个 GPIO管脚,并且大多数 GPIO可以通过内置的上拉式和下拉式电阻来进行多路传输。
ESP32也有2个8bit DAC信道和12bit SAR模数转换器,可从18个信道中输出数据。与ESP8266的20毫安相比,ESP32的
工作电流要小得多。在比较其时钟速率比较其方面,ESP32同样是ESP8266的两倍。对于接口的扩展来说,ESP32中的
蓝牙和 GPIO都有更多的插头,可以更好适应不同的连接。但ESP8266具有的接口没有前者的丰富。ESP32芯片具有低
于5微安的休眠电流,这使得它适合于使用电池驱动的可佩戴式电子产品。该模块支持150 Mbps的数据传送,20 dBm
的天线,可以最大限度地进行无线通讯。该模块在高集成度,无线传输距离,功耗和网络连接等方面表现优异。
ESP32的操作系统是一个支持 LwIP的 FreeRTOS,它还具有 TLS1.2的硬件加速能力。该芯片还支持 OTA的密码更
新,便于用户在产品推出后进行后续的升级。
图3-1 ESP32主控电路原理图

在这里插入图片描述

3.3 电源电路模块设计
  在之前的学习中了解到的电源设计方案大致有两种;一类是输入电压要大于输出电压的低压差线性稳压器否。
LDO压差很小,主要以 PMOS管为主, PNP型三极管作为线性稳压器, PMOS是以电压为动力,不需要电流,可以大大
减少 LDO自身需要的电流;传统 PNP三极管的输出功率会因为饱和而降低,所以 PMOS管的导通内阻非常小,因此
PMOS管的导通内阻与其输出的电流相等,因此其导通压力降非常低。LDO的典型电路如图3-2;

在这里插入图片描述

图3-2 LDO的典型电路
  另外一种是DC-DC,也就是开关电源,从理论上来说,LDO就是DC-DC,而在功率芯片的选择上,LDO与DC-DC是两
种截然不同的芯片。DC-DC分为三大类:降压、升压、降压和升压。一种典型的DC-DC BUCK电路,由输入/输出电容
器、 FREQ频率设定、 EN启动引脚、FB反馈电阻器、SW上接续电流二极管及电感器、BST电容、COMP调频等。
 通过对 LDO与DC-DC的比较,可以看出 LDO外围电路器件数量少、线路简单、价格低廉;DC/DC外围电路器件数
量多,电路复杂,价格昂贵;LDO负载具有较高的响应速度和较低的输出波动;DC-DC系统的负载响应较低,且输出
波动较大;LDO的效率较低,不能有较大的输入和输出压力;DC-DC转换器具有较高的工作效率和较宽的输入电压;
DC-DC具有降、升电压功能;LDO与DC-DC的静态电流均较低,视具体芯片而定;LDO的输出电流是有限制的,最大的
功率可以是几 A,并且输出的最大值与输入和输出的电压有关;直流-直流高输出功率,低功耗低;直流-直流开关
的噪音较大,许多应用都会在DC-DC后端连接 LDO,以改善DC-DC的准确度;LDO可分为可调节的和固化的;直流-直
流是可调整的,由 FB的反馈电阻来调整。
在此设计中,选择采用国产DC-DC方案,DC方案相比LDO效率高、发热低,
  该设计使用的FP6381A芯片是一款国产的高效率、内部补偿及恒频电流方式的DC-DC变换器。它整合了高端(300
米欧姆,标准的数值)。100%占空比功能延长了便携式系统的电池寿命。内部同步开关提高了效率,所以外部电路
就不需要肖特基二极管。在芯片不工作时候,电路输入的电流会小于1µA。FP6381A故障保护包括逐循环电流限制、
短路保护、UVLO和热停机。内部软启动功能防止开启时涌电流。以及低电压。电源切换,输出1.2 A的持续负载电
流。该系统能把输入的电压从2.5V降到6V,而输出电压降到0.6伏。

3.4 程序自动下载匹配电路设计
  这款产品采用CH340k,是一款用于 USB传输接口的国产 USB总线转接芯片。CH340采用串行模式,可为电脑扩充
异步串行接口,或直接升级通用串行装置至 USB总线。通过2N7002双MOS管配合,巧妙运用流控接口(DTR/RTS)可
以实现程序自动下载。
3.5 屏幕选择及背光驱动电路设计
  LCD(Liquid Crystal Display)即“液态晶体显示器”,也就是液晶显示屏,在通常情况下,其液晶盒放在两
块表面特别平滑的薄玻璃片当中,并且这两块薄玻璃片互相平行。其中在上面的薄玻璃片上放置彩色滤光片,在下
面的薄玻璃上放置 TFT。通过改变信号和 TFT的电压来控制液晶分子的转动,因此能否被显示取决于各象素点的偏
振光能否发射
LCD按其背光的不同可划分为 CCFL和 LED。CCFL是以冷阴极荧光管为背景光源的 LCD。
   它具有良好的色彩表现,但能耗高;LED是一种很普通的 LCD,它被用来作为背光源,通常指的就是白色的
LED。由于 LED具有更小巧、更低的功率、更轻、同时也
  能同时获得更高的亮度,但其不足之处在于其色彩性能不如 CCFL,故目前大部分专业的液晶显示器仍采用
CCFL作为背光光源。
  分子具有方向性的液体叫做液晶。在不同的电压下,液晶显示出不同的光属性,而这正是其工作的方式。LCD可
以分成两种,一种是被动型的 LCD;第二种是以 TFT为主的主动液晶。被动式液晶与主动式液晶相比,其不同之处
在于,被动式液晶本身不能发出光,需要依靠其他光源来传输或反射;后者是一种可以自己发光的晶体管。尽管被
动式液晶价格较低,但在色彩饱和度方面,要想让显示器的色彩更加鲜艳,必须采用主动式液晶,其色彩饱和程度
要比被动式液晶高得多。
  LCD显示屏是由很多排列的液晶构成,在单色 LCD中,每个液晶为一像素,而在 LCD中,每个像素都有三种颜
色。可以设想,每个液晶显示器后面都有8比特的寄存器,三个液晶显示器的亮度取决于其寄存器,但是这个数字只
能通过“调色板”来间接地调节三个液晶显示器的亮度。
  无源矩阵 LCD主要由TN-LCD、STN-LCD和DSTN-LCD组成,除了液晶分子的偏转角度稍有差异外,其他都是大同小
异。TFT是一个薄膜晶体管。由于每一各象素点上都有一个栅极,所以该栅极可以很好地解决由于晶体管的串音问
题。由于其自身的特点, TFT也需要具备更高的闭合电阻和更低的通态电阻。
TFT-LCD有以下五个方面的应用特征,这是其在当今社会技术和技术方面取得迅速发展和发展的关键因素。
  (1)它是固体化的,提高了其安全性和可靠性,同时它也十分轻薄,能够节省制作成本,不会造成大量浪费,
关键的是其功耗低,为科技行业节省了很多能源。另外,它的规格性也使它维修更容易。
(2)它对外界没有辐射,也不会一直闪烁而伤害到使用者的眼睛。
  (3)广泛应用:它的正常工作温度为-20~+50℃,经温控处理后的 TFT LCD显示可达到-80摄氏度。
(4)其特征在于,其制造技术具有高度的自动化和良好的生产特征,从而实现了大规模的工业化。
  (5) TFT-LCD易于整合,更新速度快。这是一种将半导体晶片与光源技术相结合的大型集成电路技术。目前,液
晶显示的主流是单晶,多晶硅、无定形三种,未来 TFT还会成为其它玻璃、塑料的原料。
  该设计采用的是1.54寸TFT-LCD液晶显示屏幕由ST7789驱动,该模块具有1.54英寸对角测量的活动显示区域,分
辨率为240(RGB)×240。每个像素被分为红、绿、蓝三个子像素和以垂直条纹排列的点。LCD的颜色由每个像素的160
万种颜色信号来确定。适用于能够实现低功率、高速和高对比度的接口方法。
  该系统包括了720条源极线和320个栅极线驱动电路。此晶片可与外置单片机直接相连。显示数据可以储存在一
个240x320x18位的内存中。该系统不需要外接操作时钟就能读取和写入显示数据,从而减少功耗。另外,由于需要
集成的功率电路来驱动液晶,所以可以生产出最小的显示系统。其内部结构如图3-9所示。

在这里插入图片描述

图3-9 ST7789内部结构图
3.6 模式按钮及光感电路设计
  光敏电阻指的是利用诸如硫化镉、硒化镉等半导体材料制成的电阻。光敏电阻在受到光照射后,其电阻值降
低,而在高光环境下,电阻会迅速降低,亮度电阻降低至1 K。光敏电阻很容易受到光的影响,在不受光的情况下,
其阻值为高,通常为1.5 M欧姆。由于其独特的特性,在科学技术的发展中必将被广泛应用。
  光敏电阻器通常被用来控制光、测量光和转换光(把光的改变变成电压的改变)。一般的感光电阻器都是采用
半导体的。光敏电阻对于光的灵敏度,也就是它的频谱特征,和人类眼睛在0.4~0.76微米之间的反应非常类似,哪
怕是很微弱的光,都会使光敏电阻的电阻值发生变化。在光控电路方面,利用白炽灯泡和自然光作为控制光源,使
设计得到了极大的简化。光敏电阻基于其内部的光电效应。将一条电极引线固定在一种半导体感光材料上,再将其
包裹在一层透明的玻璃窗内,从而产生一种感光电阻,这种电阻一般都是用梳状结构来增加灵敏度。光敏电阻主要
由硫化物、硒化物等制成。光敏电阻基于其内部的光电效应。将一条电极引线固定在一种半导体感光材料上,再将
其包裹在一层透明的玻璃窗内,从而产生一种感光电阻,这种电阻一般都是用梳状结构来增加灵敏度。光敏电阻主
要由硫化物、硒化物等制成。通常,通过涂敷、喷涂、烧结等方法,在绝缘衬底上制作出一种很薄的感光电阻和梳
状欧姆电极,再将导线封在一个装有透明透镜的密闭容器内,以防止受潮,从而降低灵敏度。在入射光线消失后,
由光子激发而产生的电子-空穴对将会被重组,从而使电阻值恢复到最初的值。在光敏电阻的两端,加上一个电压,
就可以使电流通过,在一定的波长下,电流会随著光束强度的增大而增大,以实现光电转换。光敏电阻没有极性,
仅是一种能同时添加的简单电阻。
  在半导体导带中,导电率取决于载流子的数目。载流子的数量决定了其导电性。在感光电阻器上,价带的电子
在吸收光子能后,跃进导带,形成一个自由电子,并在此过程中形成了一个空穴,从而减小了电阻率。在较高的光
照条件下,较多的光致电子-空穴对将会降低。在光敏电阻器上加入一个电压后,通过感光电阻器的电流就会增加。
当入射光线消失时,电子-空穴对会重新组合,电阻会逐渐回复到原来的数值,而电流则会变得越来越低。感光电阻
器对光非常敏感,在没有光的情况下,它的阻值是很高的,通常的暗阻可以达到1.5 M欧姆。在光照条件下,由于电
子和空穴的存在,电阻值会下降,而在光照条件下,电阻值会急剧下降,而亮电阻值则会小于1 K欧姆。光敏电阻的
照明性能在很大程度上是非线性的,仅在很小的范围内是线性的,而光敏电阻的电阻具有很大的离散性(电阻变化
大,范围大)。光敏电阻器的敏感性是指感光电阻器在被照明时不会被阻值(暗阻)和在被照明时的阻值(亮
阻)。光敏电阻的暗电阻与亮电阻之比约为1500:1,当暗电阻较高时,应采用直流或交流偏置, MG感光电阻适用于
可见光。该系统在各种自动控制电路以及彩色电视机的亮度自动调节等方面得到了广泛的应用。光敏电阻是一类半
导体感光器件,其特点是灵敏度高、响应速度快、光谱特性好、 阻值高,在高温、潮湿、严酷的环境中依然表现出
高的稳定性和可靠性,被广泛应用于照相机、太阳花园灯、草坪灯、验钞机、石英钟表、音乐杯、礼品盒、微型夜
灯、光学声控开关、自动路灯开关、各种光控玩具、照明灯饰、照明器具等。
  硫化铅感应电阻在较宽的光谱范围内有较高的灵敏度,其峰位为红外;可见光区硫化镉、硒化镉呈现出最大
值;因此,在选用感光电阻时,应充分考虑材料和光源的种类,以获得最佳的性能。。
  该设计使用GL5528光敏电阻去设计光感电路,随着光照的增强,光敏电阻阻值变小,其分压变小,与其串联电
阻分压就会变大,输出电压也会变大,屏幕亮度就会相应的提高,电路如图

原理图
在这里插入图片描述

4 软件设计

4.1 软件设计方法
  现今在电子信息专业的学习过程中,单片机已经成为我们在学习过程中不可缺少的一部分,它还具有非常广泛
的使用领域,许多应用产品一旦使用了单片机,就能起到产品升级的作用。使得产品的性能得到很大提升,用户的
体验也会相应的得到提升。当然,学习单片机与编程是并列的,目前大多MCU在开发过程中常用的编程语言主要为C
语言和汇编语言。
  硬件电路是由程序直接控制的,并且去实现某种控制效果的语言是汇编语言。C语言是一种更高级的语言,所以
在不需要考虑硬件的情况下,就可以在一定程度上实现对计算机的控制。如果把其他更为复杂的操作规则和汇编语
言结合起来,那么就很难编写代码了。然而, C语言简洁紧凑,使用了灵活的语法机制,简化了复杂的编程;如果
只使用逻辑操作、逻辑操作或简单操作,使用汇编方法可以得到更加精确的代码;同时,由于各种处理器的汇编语
法也不尽相同,因此 C语言在程序上的扩展和移植上要优于汇编。
  根据设计中选择的 MCU和编程语言,采用了 Visual Studio Code+ PlatformIO,采用 Arduino框架。VS Code
是微软公司在2015年4月30日 Build开发会议上发布的一款基于 Mac OS、 Windows和 Linux的跨平台源码编辑器,
它可以在桌面上运行,也可以在 Windows、 MacOS和 Linux上使用。它内置了 JavaScript, TypeScript, Node.
js,以及大量其它语言。这个编辑器还整合了现代编辑器应有的功能,其中包含了语法突出,可定制的热键绑定,
括号匹配,和代码片段采集。Somasegar还向作者透露,该编辑器同样可以直接使用 Git。Microsoft Docs 为用户
提供了相关的学习指南,以帮助他们在 Visual Studio Code上登录 GitHub。此编辑器支持多种语言及档案的撰
写,截至今年九月,已支援以下37种语文或档案。
  PlatformIO是一种开源的物联网应用平台.提供一个跨平台的代码构建器,一个与 Arduino,ESP32, mbed等兼
容 IDE的集成开发环境。新一代 Atom集成开发平台,并提供了 C/C++智能代码提示、库管理、命令行内建等多种功
能。支持 Visual Stuido代码的 PlatfromIO主要功能包括:构造、配置、设备监控、程序库检索。它为350多台嵌
入式系统的开发提供了一个很好的平台。利用 PlatformIO的库管理,用户可以很容易地利用 PlatformIO站点或命
令行工具对依赖的库进行组织和更新。
在使用VS Code首先新建一个文件夹,在其中新建一个.ino文件。
  然后用VS Code打开这个文件夹,打开文件夹后,在VScode中打开.ino文件,点击右下角来配置编程器、开发板
参数、COM口。
ESP32的GPIO0短接到地上电,下载程序。
  在选择字体文件(如宋体、黑体等)时,指定字体文件中提取需要的文字,因为如果将整个字体文件做成字
库,将导致 ESP32 的 Flash 存不下,因此只提取必要的部分,提取出来后,会重新生成字体文件,然后使用
Processing 软件,将字体文件转换成vlw 格式,转换过程中需要设置转换后的字体大小,最后将vlw转换成hex文
件,将hex做成一个h头文件即可。
  在制作图片数据时,需要注意图片的分辨率,最大显示尺寸由你的屏幕分辨率决定,ESP32物联网小电视使用的
是240*240分辨率的屏幕,那最大图片尺寸不能超过这个参数,将准备好的jpg图片放置桌面或自定义的文件夹内,
然后打开“jpg 转 Hex.exe”软件,通过它转换后会自动在jpg的目录下生成一个jpg文件名.h 的文件,制作动图
GIF,则需使用“GIF 动图分解.exe”,首先将 gif文件进行分解,然后按照上面的jpg转hex一个个转,动图动作越
流畅,分解的 jpg 就越多。
  在文字的显示部分,使用TFT eSPI库显示文字,显示文字的大致流程为: 创建指定大小的画布,设置画布的填
充颜色,加载显示的字体,设置文本位置参考基准,设置字体显示区域的颜色,含背景颜色和字体颜色,指定文字
显示在画布的指定位置 将画图推送至屏幕的指定位置,删除画布,卸载字体,释放资源。
JSON数据在 JSON数据分析中是由分隔符组成的,但这些分隔符的含义各不相同:中括号表示阵列;圆括号表示物
体;双引号代表了一个属性;冒号表示前后的关系,在冒号之前,是一个属性的名字,然后是一个属性的数值。
  JSON数据解析构造方法JOSNObject(String),获取属性值get(String):Objec:得到数组和对象getJOSNArray
(String):JOSNArray,获取迭代器包含关键字 keys():lterator。
4.2 主程序流程图
  整个程序按照该设计的操作步骤执行,整个过程为:单片机各模组进行程序初始化,在这里的初始化包括:
wifi模组初始化、按键初始化、屏幕初始化、串口初始化、光敏电阻模组初始化,配网初始化等。Wifi模组先进行
网络连接查看是否存在上次进行网络连接时存储的wifi信息,如果有则进行网络连接,如果没有则进入模块初始化
的配网初始化部分,网络连接完成后会自动获取本地IP地址,接下来进行同步NTP、同步时间,自动设置城市代码,
获取天气信息。
主程序流程图如图4-1。
在这里插入图片描述

图4-1 主程序流程图
4.3 LCD子模块流程图
LCD子模块流程图如图4-2所示。
其中,界面初始化显示主要包括:打开LTDC;自动加载字体资源;释放字体资源;
加载获取信息;加载图片内容。
在这里插入图片描述

图4-2 LCD子模块流程图
  该设计采用的是TFT_eSPI库过修改TFT_eSPI库提供的配置文件User_Setup.h实现驱动TFT屏幕Notes: 需要在
User_Setup.h文件中做的修改主要有:选定设备(IC)型号,屏幕尺寸,根据屏幕上的标签颜色选定初始化的定
义,是否有背光控制,找到引脚定义的地方,并取消注释。根据显示效果微调。看是否有黑白对调、蓝红转色等,
如果有按文件提示取消相应行的注释。
4.4 WiFi子模块流程图
  WiFi子模块包括:初始化各个模块,配网模式下的WiFi信息储存函数、配网页面设计、访问主页回调函数、
Post回调函数等。
WiFi子模块流程图如图4-3。
  其中,初始化各个模块包括:初始化基础、初始化AP模式、初始化WebServer、初始化DNS服务器、自动连接模
式。在这里插入图片描述

图4-3 WiFi子模块流程图
  其中,主要的Post回调函数的运行过程为:首先初始化,判断是否有账号密码参数 如果有账号密码,则将账号
参数拷贝到sta_ssid中;如果没有参数,则返回错误页面,自建热点,设置WiFi信息,设置完成后重启系统。
Post回调函数流程图如图4-4。
图4-4 Post回调函数流程图
在这里插入图片描述

附录B 程序
#include <Arduino.h>
//*****************
  #include <ArduinoJson.h> //请使用ArduinoJson V6版本,V5版本会导致编译失败
#include <TimeLib.h>
#include <TFT_eSPI.h> 
#include <SPI.h>
#include <TJpg_Decoder.h>
#include <EEPROM.h>
#include <WiFiUdp.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <Preferences.h>
Preferences preferences; // 声明Preferences对象
String PrefSSID, PrefPassword; 
#include "SetWiFi/SetWiFi.h" //Web配网
#include "font/ZdyLwFont_20.h"
#include "font/FxLED_32.h"
#include "img/main_img/main_img.h"
#include "img/temperature.h"
#include "img/humidity.h"
#include "img/watch_top.h"
#include "img/watch_bottom.h"
#include "img/start_gif.h"
#include "img/weather_code_jpg.h"
#include "weather_code_jpg/d00.h"
#include "img/taikongren/i0.h"
#include "img/taikongren/i1.h"
#include "img/taikongren/i2.h"
#include "img/taikongren/i3.h"
#include "img/taikongren/i4.h"
#include "img/taikongren/i5.h"
#include "img/taikongren/i6.h"
#include "img/taikongren/i7.h"
#include "img/taikongren/i8.h"
#include "img/taikongren/i9.h"
#include "img/setWiFi_img.h"
#include "img\Weather_Warning_Icon.h"
#include "img\Gif\ziji.h"
#include "img\Gif\dagu.h"
#include "img\Gif\zzzzzzz.h"
  /***********************功能参数配置**********************************/
#define SerialBaud 115200 //串口波特率
  bool AutoBright = true; //自动亮度控制 true - 打开 false - 关闭
25
byte setNTPSyncTime = 20; //设置NTP时间同步频率,10分钟同步一次
byte setWeatherTime = 30; //设置天气数据更新频率,30分钟更新一次
//*****************
//NTP服务器
static const char ntpServerName[] = "ntp6.aliyun.com";
const int timeZone = 8; //东八区
//*****************
WiFiUDP Udp;
unsigned int localPort = 8000;
//*****************
time_t getNtpTime();
void digitalClockDisplay();
void printDigits(int digits);
String num2str(int digits);
void sendNTPpacket(IPAddress &address);
//*****************
int weatherCode = 99;
bool getCityWeaterFlag = false;
bool getCityCodeFlag = false;
unsigned long t1 = 0,t2 = 0;
  //**********************************************************************
byte loadNum = 6;
void loading(byte delayTime,byte NUM)
{
clk.setColorDepth(8);
clk.createSprite(200, 50);
clk.fillSprite(0x0000);
clk.loadFont(ZdyLwFont_20); //加载font/ZdyLwFont_20字体
clk.drawRoundRect(0,0,200,16,8,0xFFFF);
clk.fillRoundRect(3,3,loadNum,10,5,0xFFFF);
clk.setTextDatum(CC_DATUM);
clk.setTextColor(TFT_WHITE, 0x0000);
  clk.drawString("正在连接 "+ PrefSSID + " ...",100,40,2);
clk.pushSprite(20,110);
clk.deleteSprite();
//*****************
//显示wifi连接失败,并重新进入配网模式
void displayConnectWifiFalse()
{
TJpgDec.setJpgScale(1);
TJpgDec.setSwapBytes(true);
TJpgDec.setCallback(tft_output);
   TJpgDec.drawJpg(0,0,wififalse, sizeof(wififalse));
delay(5000);
}
  //**********************************************************************
//强制门户Web配网
26
bool setWiFi_Flag = false;
void setWiFi()
{
TJpgDec.setJpgScale(1);
TJpgDec.setSwapBytes(true);
TJpgDec.setCallback(tft_output);
   TJpgDec.drawJpg(0,0,setWiFi_img, sizeof(setWiFi_img));
initBasic();
initSoftAP();
initWebServer();
initDNS();
while(setWiFi_Flag == false)
{
server.handleClient();
dnsServer.processNextRequest();
if(WiFi.status() == WL_CONNECTED)
{
server.stop();
setWiFi_Flag = true;
}
}
}
void setup()
{
//*****************
if(Boards == 1) //ST7789
{
GL5528 = 32; //光敏电阻引脚
Button = 4; //按键引脚
}
else if(Boards == 2) //ILI 9488
{
GL5528 = 35; //光敏电阻引脚
Button = 18; //按键引脚
}
//*****************
EEPROM.begin(8);
guanggao_Flag = EEPROM.read(0); //读出是否有广告
//*****************
tft.init();
tft.setRotation(0); // 设置屏幕显示的旋转角度,参数为:0, 1, 2, 3,分别代表 0°、90°、180°、270°
//*****************
Serial.begin(SerialBaud);
pinMode(Button,INPUT); //配网按钮接GPIO-4
pinMode(GL5528,INPUT); //光敏电阻
randomSeed(analogRead(GL5528));
ledcSetup(0,5000,8);
27
ledcAttachPin(22,0);
ledcWrite(0,150);
//*******************
   preferences.begin("wifi", false); // 打开命名空间wifi
PrefSSID = preferences.getString("ssid", "none"); // 获取当前命名空间中的键名为"ssid"的值,如果没有则
返回none
   PrefPassword = preferences.getString("password", "none");
   if(cityCode.length() >= 8)//如果在cityCode中已定义了城市代码,就不用原来保存的。
{
}
   else cityCode = preferences.getString("citycode", "none");
   preferences.end(); // 关闭当前命名空间
if( PrefSSID == "none" )
{
setWiFi();
}
int buttonStateTime = 0;
while(digitalRead(Button) == HIGH) //按键高有效,在按键按下时,再开始计数
{
   buttonStateTime = millis(); //保存现在的时间(微秒)
clk.loadFont(ZdyLwFont_20);
clk.createSprite(240, 80); //在屏的中间显示一块区域
clk.setTextDatum(CC_DATUM);
clk.setTextColor(TFT_WHITE, bgColor);
//*****************
Serial.print("本地IP: ");
Serial.println(WiFi.localIP());
//Serial.println("启动UDP");
Udp.begin(localPort);
//Serial.print("端口号: ");
//Serial.println(Udp.localPort());
//Serial.println("等待同步...");
setSyncProvider(getNtpTime);
setSyncInterval(setNTPSyncTime*60); //NTP网络同步频率,单位秒。
Serial.println("同步时间成功...");
//*****************
TJpgDec.setJpgScale(1);
TJpgDec.setSwapBytes(true);
TJpgDec.setCallback(tft_output);
int x=0,y=0,dt=50,xyz=1; //x\y=图片显示坐标,dt=单帧切换时间,xyz=gif整体播放的次数
while(imgNum_1 <= 19 & xyz >= 0)
{
if(millis() - oldTime_1 >= dt)
{
imgNum_1 = imgNum_1 + 1;
oldTime_1 = millis();
}
28
//*****************
if(cityCode.length() >= 8)
{
Serial.print("手动设置cityCode:");
Serial.println(cityCode);
getCityWeater(); //获取天气数据
}
else
{
Serial.println("自动设置cityCode");
getCityCode(); //获取城市代码
}
/间隔5秒切换显示温度和湿度,该数据为气象站获取的室外参数
  //**********************************************************************
void weatherWarning()
{
if(millis() - wdsdTime > 5000)
{
wdsdValue = wdsdValue + 1;
//Serial.println("wdsdValue0" + String(wdsdValue));
clk.setColorDepth(8);
clk.loadFont(ZdyLwFont_20);
//*****************
switch(wdsdValue)
{
case 1:
//Serial.println("wdsdValue1" + String(wdsdValue));
   TJpgDec.drawJpg(165,171,temperature, sizeof(temperature)); //温度图标
for(int i=20;i>0;i--)
{
clk.createSprite(50, 32);
clk.fillSprite(bgColor);
clk.setTextDatum(CC_DATUM);
clk.setTextColor(TFT_BLACK, bgColor);
clk.drawString(wendu+"℃",25,i+16);
clk.pushSprite(188,168);
clk.deleteSprite();
vTaskDelay(3);
}
break;
case 2:
//Serial.println("wdsdValue2" + String(wdsdValue));
   TJpgDec.drawJpg(165,171,humidity, sizeof(humidity)); //湿度图标
for(int i=20;i>0;i--)
{
clk.createSprite(50, 32);
clk.fillSprite(bgColor);
29
clk.setTextDatum(CC_DATUM);
clk.setTextColor(TFT_BLACK, bgColor);
clk.drawString(shidu,25,i+16);
clk.pushSprite(188,168);
clk.deleteSprite();
vTaskDelay(3);
}
wdsdValue = 0;
wdsdTime = millis();
clk.unloadFont();
***unsigned long oldTime = 0,imgNum = 1;
void imgDisplay()
{
int x,y=94,dt;
switch(Warn_Flag) {//如果有气象预警信息,图标自动左移
case 0:x = 90;break;
case 1:
//****************************
if(Gif_Mode == 4)
{
x = 65;y = 85;
}
else if(Gif_Mode == 3)
{
x = 70;y = 94;
}
else if(Gif_Mode == 2)
{
x = 70;y = 86;
}
else if(Gif_Mode == 1)
{
x = 60;y = 94;
}
break;
//****************************
}
//****************************
switch(Gif_Mode)//修改动画的播放速度
{
case 1:dt = 100;break;
case 2:dt = 50;break;
case 3:dt = 100;break;
case 4:dt = 100;break; }
void digitalClockDisplay()
{
//****************************

//****************************
/***中间时间区***/
//****************************时分
clk.createSprite(140, 48);
clk.fillSprite(bgColor);
//clk.loadFont(FxLED_48);
clk.setTextDatum(CC_DATUM);
clk.setTextColor(TFT_BLACK, bgColor);
clk.drawString(hourMinute(),70,24,7); //绘制时和分
//clk.unloadFont();
clk.pushSprite(28,40);
clk.deleteSprite();
//****************************秒
clk.createSprite(40, 28);
clk.fillSprite(bgColor);
clk.loadFont(FxLED_32);
clk.setTextDatum(CC_DATUM);
clk.setTextColor(TFT_BLACK, bgColor);
clk.drawString(num2str(second()),20,12);

5 系统测试结果

5.1 硬件调试
硬件调试要在设计完善的基础上进行,针对各个电路的运作情况进行问题排查。
  首先是电源部分的调试,电源作为电路工作的能源基础,是系统必不可少的。再开始,电路输出的电源为2.5
V,后来经过计算发现是因为选择了错误的电阻值316K,后经重新计算换成451K电阻解决问题,经过电压表检测,可
以看出最后的输出电压大约为3.3V。如图5-1所示。
在这里插入图片描述

图5-1 电源电路电压输出侧视图
其次是下载电路测试,在进行程序下载的时候发现程序并不能正常下载到单片机中,在查阅芯片手册后发现是
CH340K的供电发生问题,在经过手工跳线之后,电脑检
测到新端口的接入,如图5-2所示 在这里插入图片描述

图5-2 下载电路测试图
5.2 硬件调试结果

通过ESP32单片机自建热点,手机锻或PC端连接该热点,打开指定HTML页面,配置完成后,将WiFi信息存储在
NVS区域中。获取新闻数据时使用天行数据的api接口,发起api请求后,使用ArduinoJSON库解析接收返回的JSON格
式的数据,解析后用LVGL中的一个函数将数据推送到屏幕显示。如图5-
图5-3 测试结果在这里插入图片描述

由图会发现,在测试中屏幕显示实时时间、地点、天气情况、湿度、最高气温、最低气温、风向、风的等级、
生活指数等。
5.3 软件验证
  软件验证主要包含连接WiFi网络、获取本地IP地址、同步NTP、同步时间、自动设置城市代码获取天气信息。测
试结果如图5-4(1)、(2)、(3)所示。
在这里插入图片描述

图5-4 软件验证结果

结论

在拿到该毕设题目后,首先需要进行的就是查阅资料,对“基于ESP32单片机的物联网小电视”这个题目有所了
解,对ESP32单片机以及物联网有系统的认识,根据这些知识选取合适型号的单片机芯片。之后对选取的ESP32-
WROOM-32D单片机深入学习,了解其主要包括单片机控制系统、电源电路、程序下载电路、背光驱动电路、光感电
路、按键电路以及液晶显示电路等,并了解这些模块的工作原理及应用领域。
  在使用VSCode PlatformIO IDE开发ESP3时,用数据线将ESP32开发板和电脑连接之后,开发板红灯亮,点击
upload,报错提示upload port未选择,打开windows的设备管理器,COM端口确实没有显示出来。出现这种情况有三
种原因:开发板出问题,数据线出现问题,在更换数据线之后,设备管理器中显示出了com端口,问题解决。继续点
击upload,还是报upload port错误,再看设备管理器的com端口,发现有个黄色的叹号,说明驱动有问题,下载最
新的驱动安装之后,黄色叹号消失,问题解决。继续点击upload,不再报upload port错误,控制台显示连接开发板
中,过了一会显示连接超时。这里涉及到ESP32的一个特性,上传的时候ESP32的0号针脚必须是低电平,可以直接把
0针脚和GND连接,开发板上有IO0的按钮,也可以按住这个按钮。按住IO0点击upload,直到显示上传成功再松开按
钮,问题终于解决。
  本次设计达到拟定的技术指标,成功ESP32可以自建热点;在设置WiFi信息后ESP32可通过WiFi与手机连接;通
过发送HTTP请求获取网页信息,通过LVGL将信息推送到屏幕上;显示实时时间、地点、天气情况、湿度、最高气
温、最低气温、风向、风的等级、生活指数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值