热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Arduino+ESP32C3+TFT(1.8‘ST7735S)基础平台(实验四)直接显示网络图片

------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------

 ​​​​​​Arduino + ESP32-C3 + TFT(1.8‘ ST7735S)基础平台

Arduino + ESP32-C3 + TFT(1.8‘ ST7735S)基础平台(实验一)

Arduino + ESP32-C3 + TFT(1.8‘ ST7735S)基础平台(实验二)玩具示波器

Arduino + ESP32-C3 + TFT(1.8‘ ST7735S)基础平台(实验三)折腾 TFT_eSPI 库

Arduino + ESP32-C3 + TFT(1.8‘ ST7735S)基础平台(实验四)直接显示网络图片

Arduino + ESP32-C3 + TFT(1.8‘ ST7735S)基础平台(实验五)温湿度

----------------------------------------------------------------------------------------------------------------------

前篇搞定了 TFT_eSPI , 那么肯定是用来显示点什么。存 数组或 FATFS 里面什么的都有些麻烦,直接显示一个网页图片还不错,搜一下还真有:   Pngle GitHub - kikuchan/pngle: Pngle - PNG Loader for Embeddinghttps://github.com/kikuchan/pngle例程如下,如按前篇写的配置好 TFT_eSPI ,能够正确显示,那么本实验只需要配置 wifi 。

注意:

首先,确保 http://www.joindesign.cn/1.png 可以在浏览器看到如下图片( 目前放了10张,编号1.png - 10.png ),如失效了可以另外找,或者内网跑一个web服务器,甚至 ESP32 ESP8266 都能跑简单的web服务器。

 其次,本实验是特指这块合宙的 1.8‘TFT ,分辨率 160x128 ,所以呢图片也是这个规格的 png, 本程序暂时不支持其他图片格式。实测图片大些也能显示,只是没有自动缩放填充这些windows里常用的功能,参数里好像也有缩放设定,没测试。


#include
TFT_eSPI tft = TFT_eSPI(); #include
#include
WiFiClient client;#include "pngle.h"#define WIFI_SSID "xxx"
#define WIFI_PASS "xxx"// ===================================================
// pngle example for TFT_eSPI
// ===================================================double g_scale = 1.0;
// pngle callback, called during decode process for each pixel
void pngle_on_draw(pngle_t *pngle, uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint8_t rgba[4])
{// Convert to RGB 565 formatuint16_t color &#61; tft.color565(rgba[0], rgba[1], rgba[2]);// If alpha > 0 then drawif (rgba[3]) {if (g_scale <&#61; 1.0) tft.drawPixel(x, y, color);else {x &#61; ceil(x * g_scale);y &#61; ceil(y * g_scale);w &#61; ceil(w * g_scale);h &#61; ceil(h * g_scale);tft.fillRect(x, y, w, h, color);}}}void load_png(const char *url, double scale &#61; 1.0)
{HTTPClient http;http.begin(client,url);int httpCode &#61; http.GET();if (httpCode !&#61; HTTP_CODE_OK) {tft.printf("HTTP ERROR: %u\n", httpCode);http.end();return ;}int total &#61; http.getSize();WiFiClient *stream &#61; http.getStreamPtr();pngle_t *pngle &#61; pngle_new();pngle_set_draw_callback(pngle, pngle_on_draw);g_scale &#61; scale;uint8_t buf[2048];int remain &#61; 0;uint32_t timeout &#61; millis();while (http.connected() && (total > 0 || remain > 0)) {// Break out of loop after 10sif ((millis() - timeout) > 10000UL){tft.printf("HTTP request timeout\n");break;}size_t size &#61; stream->available();if (!size) { delay(1); continue; }if (size > sizeof(buf) - remain) {size &#61; sizeof(buf) - remain;}int len &#61; stream->readBytes(buf &#43; remain, size);if (len > 0) {int fed &#61; pngle_feed(pngle, buf, remain &#43; len);if (fed <0) {tft.printf("ERROR: %s\n", pngle_error(pngle));break;}total -&#61; len;remain &#61; remain &#43; len - fed;if (remain > 0) memmove(buf, buf &#43; fed, remain);} else {delay(1);}}pngle_destroy(pngle);http.end();
}
// &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;void setup()
{Serial.begin(115200);tft.begin();tft.setRotation(3); tft.fillScreen(TFT_GREEN);tft.setTextColor(TFT_BLUE);tft.setTextFont(2);tft.printf("Welcome.\n");WiFi.begin(WIFI_SSID, WIFI_PASS);while (WiFi.status() !&#61; WL_CONNECTED) { delay(500);}tft.printf("WiFi connected.\n");delay(1000);
}void loop()
{long t;t &#61; micros();load_png("http://www.joindesign.cn/1.png");delay(2000);load_png("http://www.joindesign.cn/2.png");delay(2000);load_png("http://www.joindesign.cn/3.png");delay(2000);load_png("http://www.joindesign.cn/4.png");delay(2000);load_png("http://www.joindesign.cn/5.png");delay(2000);load_png("http://www.joindesign.cn/6.png");delay(2000);load_png("http://www.joindesign.cn/7.png");delay(2000);load_png("http://www.joindesign.cn/8.png");delay(2000);load_png("http://www.joindesign.cn/9.png");delay(2000);load_png("http://www.joindesign.cn/10.png");delay(2000);t &#61; ( micros() -t - 20000000) / 1000; // (扣除显示延时)单位微秒&#xff0c;除1000后单位毫秒tft.fillScreen(TFT_GREEN);tft.setTextColor(TFT_BLUE);tft.setCursor(30,10);tft.setTextFont(4);tft.print(t); // 显示10张图的总加载时间&#xff0c; 大概10秒左右delay(5000);}

------------------------------------------------------------------------------------------

Pngle 顾名思义是适用png图片&#xff0c; 再搜一下&#xff0c; 找到 适用 jpg 图片的库 TJpg_decoder 

也是基于 TFT_eSPI 的&#xff0c; 库自带有几个例程&#xff0c;我实验的 SPIFFS_Web_Jpg 几乎不用怎么改动就成功显示出 jpg图片。 如果例程的图片失效&#xff0c; 下面几个网络图片供测试&#xff1a;

-----------------------------------------------------------------------------------------------------------------

小结一下&#xff1a;

显示网络图片是比较有意思的功能&#xff0c;这是建立在ESP32-C3有 wifi功能的基础上。比如上图是实际的一个测试&#xff1a;先显示飞机图片&#xff0c;然后在服务器端把图片替换为月历&#xff0c;那么ESP32-C3这边只需要复位一次就能变身月历显示屏。这样&#xff0c;几乎就不用折腾汉字硬字库、图标、取模、排版、阴历阳历转换这些对单片机占用内存多且麻烦枯燥的工作&#xff0c;在电脑端用python等工具准备好素材&#xff0c;转换为图片&#xff0c;上传服务器即可。运用适当的web或者蓝牙这些可以交互的方式&#xff0c;甚至可以连复位都不用&#xff0c;实时更新图片。

如果我有一家超市&#xff0c;每个电子价签对应一个唯一序列号&#xff0c;并在服务器建立一个对应图片文件。需要更换价签就在服务器跑一下脚本就完成了&#xff0c;整套成本应该不比墨水屏的高。

​ 还有人用它玩 stream  &#xff08;电脑桌面缩略图实时推送到单片机&#xff0c;帧率10&#43;&#xff09; ​https://www.jianshu.com/p/2195acbe2404  

也还有人用来 显示 ESP32-CAM 的照片https://www.bilibili.com/read/cv14845053


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 微软评估和规划(MAP)的工具包介绍及应用实验手册
    本文介绍了微软评估和规划(MAP)的工具包,该工具包是一个无代理工具,旨在简化和精简通过网络范围内的自动发现和评估IT基础设施在多个方案规划进程。工具包支持库存和使用用于SQL Server和Windows Server迁移评估,以及评估服务器的信息最广泛使用微软的技术。此外,工具包还提供了服务器虚拟化方案,以帮助识别未被充分利用的资源和硬件需要成功巩固服务器使用微软的Hyper - V技术规格。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 如何使用Python从工程图图像中提取底部的方法?
    本文介绍了使用Python从工程图图像中提取底部的方法。首先将输入图片转换为灰度图像,并进行高斯模糊和阈值处理。然后通过填充潜在的轮廓以及使用轮廓逼近和矩形核进行过滤,去除非矩形轮廓。最后通过查找轮廓并使用轮廓近似、宽高比和轮廓区域进行过滤,隔离所需的底部轮廓,并使用Numpy切片提取底部模板部分。 ... [详细]
  • 文件路径的生成及其在文件操作中的应用
    本文介绍了文件路径的生成方法及其在文件操作中的应用。在进行文件操作时,需要知道文件的具体位置才能打开文件。文件的位置有绝对路径和相对路径之分。绝对路径通常只在特定电脑上有效,不同电脑上的文件存放路径可能不同,导致程序报错。相对路径是解决这个问题的最好方式,它不依赖于文件的具体存放位置,只需要按照统一的规范进行文件存放即可。使用相对路径可以避免冗余和麻烦,特别适用于大项目和团队维护代码的情况。 ... [详细]
  • 本文总结和分析了JDK核心源码(2)中lang包下的基础知识,包括常用的对象类型包和异常类型包。在对象类型包中,介绍了Object类、String类、StringBuilder类、StringBuffer类和基本元素的包装类。在异常类型包中,介绍了Throwable类、Error类型和Exception类型。这些基础知识对于理解和使用JDK核心源码具有重要意义。 ... [详细]
  • 本文介绍了使用FormData对象上传文件同时附带其他参数的方法。通过创建一个表单,将文件和参数添加到FormData对象中,然后使用ajax发送POST请求进行文件上传。在发送请求时,需要设置processData为false,告诉jquery不要处理发送的数据;同时设置contentType为false,告诉jquery不要设置content-Type请求头。 ... [详细]
  • SQL Server 内存中OLTP内部机制概述(一)
    内存中OLTP(项目名为“Hekaton”)是一个新的完全集成到SQLServer中的数据库引擎组件。它专为访问内存常驻数据的OLTP工作负荷而进行优化。内存中OLTP有助于OLT ... [详细]
author-avatar
陈鑫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有