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


推荐阅读
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 题面:P3178[HAOI2015]树上操作好像其他人都嫌这道题太容易了懒得讲,好吧那我讲。题解:第一个操作和第二个操作本质上是一样的&# ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 页面预渲染适用于主要包含静态内容的页面。对于依赖大量API调用的动态页面,建议采用SSR(服务器端渲染),如Nuxt等框架。更多优化策略可参见:https://github.com/HaoChuan9421/vue-cli3-optimization ... [详细]
  • 本文探讨为何Request对象的外观设计被认为是精妙的,重点在于其如何利用门面模式确保数据安全,同时保持系统的高效交互。 ... [详细]
  • 本文针对HDU 1042 N! 问题提供详细的解析和代码实现。题目要求计算给定整数N(0 ≤ N ≤ 10000)的阶乘N!。文章不仅提供了算法思路,还附上了C++语言的具体实现。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 分布式计算助力链力实现毫秒级安全响应,确保100%数据准确性
    随着分布式计算技术的发展,其在数据存储、文件传输、在线视频、社交平台及去中心化金融等多个领域的应用日益广泛。国际知名企业如Firefox、Google、Opera、Netflix、OpenBazaar等均已采用该技术,推动了技术创新和服务升级。 ... [详细]
  • 深入理解Java字节码:方法调用详解
    本文详细介绍了Java字节码中的方法调用机制,通过具体示例解析了字节码如何处理方法调用及其参数传递。文章由Mahmoud Anouti撰写,原文链接:https://dzone.com/articles/introduction-to-java-bytecode ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 本文探讨了服务器系统架构的性能评估方法,包括性能评估的目的、步骤以及如何选择合适的度量标准。文章还介绍了几种常用的基准测试程序及其应用,并详细说明了Web服务器性能评估的关键指标与测试方法。 ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
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社区 版权所有