热门标签 | 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


推荐阅读
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文介绍了如何在Python中使用join()方法将列表中的元素连接成一个字符串。join()方法允许用户指定分隔符,从而灵活地生成所需格式的字符串。此外,我们还将探讨一些实际应用中的注意事项和技巧。 ... [详细]
  • 智能手机的快速耗电问题困扰着许多人。通过一些简单的设置和调整,你可以显著提升手机的电池续航能力,甚至实现两天一充的目标。 ... [详细]
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社区 版权所有