【Wio Terminal教程】使用LCD屏幕(3)

使用LCD屏幕(3)

  • 一、加载图片
    • 1、安装库
    • 2、 图像格式配置
    • 3、开始
  • 二、线图
    • 1、安装库
    • 2、开始
  • 三、直方图
    • 1、安装库
    • 2、开始

一、加载图片

本节将讲述如何在 Wio Terminal 上从 SD 卡加载并显示图像到 TFT LCD 屏幕。这对于你的设计可能是一个非常有用的实现,并可以在各种地方使用!

在这里插入图片描述

1、安装库

同上一节安装的库。

2、 图像格式配置

步骤1:准备图片

我们需要将图像格式转换为Windows 24位BMP格式,并将图像放置在已设置好的正确文件夹中。推荐使用Microsoft paint(微软画图)来完成此操作。
  • 步骤 1-1:使用 Microsoft Paint 调整图像大小以适应屏幕显示区域的最大像素尺寸
  • 步骤 1-2:保存图像
    点击“另存为”(Save as)。
    选择“BMP 图片”(BMP picture)。
    从文件类型下拉菜单中选择“24 位位图”(24-bit bitmap,即 .bmp)文件。
  • 步骤 1-3:创建并保存图像
    创建一个名为“bmp”的文件夹。
    将你的 Windows .bmp 格式图像保存在这个文件夹内。
    在这里插入图片描述

步骤 2:将 24 位位图图像转换为微控制器可读的 8 位或 16 位 BMP 格式

要在我们的嵌入式系统上显示 BMP 图像,我们需要去除 Windows BMP 格式中的一些信息(头部文件)。我们编写了一个 Python 脚本来帮助我们完成这项工作,因此请选择以下两种方法之一来转换您的图像。

选项1:使用预构建的 Windows 可执行文件(仅限 Windows)

  • 步骤 2-1-1: 我们已经使用 Pyinstaller {target=_blank} 包准备了可执行文件,您可以通过单击 bmp_converter.exe 直接下载。
  • 步骤 2-1-2: 将下载的 bmp_converter.exe 放置在步骤 1-3 中创建的 bmp 文件夹所在的相同目录中。
  • 步骤 2-1-3: 双击运行 bmp_converter.exe,然后在弹出的终端中选择两个选项之一:“输入 1 进行 8 位颜色转换;输入 2 进行 16 位颜色转换”。
  • 在这里插入图片描述

选项2:使用 Python 源代码(适用于跨平台)

需要在你的电脑上安装Python
  • 步骤 2-2-1: 下载 Python 脚本 bmp_converter.py,并将其保存在步骤 1-3 中创建的 bmp 文件夹所在的同一目录中。
  • 步骤 2-2-2: 打开命令提示符(cmd)或终端以运行 Python 脚本。首先,使用 cd 命令导航到保存了 bmp_converter.py 和 bmp 文件夹的目录,然后运行 Python 脚本。
  • 步骤 2-2-3: 选择两个选项之一:输入 1 进行 8 位颜色转换;输入 2 进行 16 位颜色转换。
    在这里插入图片描述

步骤 3:图像准备完成

现在,您可以在 bmp 文件夹内找到名为 rgb332(8 位)或 rgb565(16 位)的另一个文件夹,里面包含了转换后的 .bmp 图像。
在这里插入图片描述

3、开始

下载 RawImage.h 文件

这个文件是用来简化图像加载和显示的。你需要下载 RawImage.h 文件,并将其附加到您的项目位置(即你的代码所在的文件夹或目录)。

在Arduino上初始化

  • 在屏幕上显示图像
// 在屏幕坐标(x, y)处开始画 8-bit 颜色图片:
drawImage<uint8_t>("path to sd card iamge", x, y);

// 在屏幕坐标(x, y)处开始画 16-bit 颜色图片:
drawImage<uint16_t>("path to sd card iamge", x, y);
  • 初始化图像(如果使用上面的drawImage函数则不需要)
// 当使用 8-bit 颜色, 用下面的来初始化图片:
Raw8 * img8 = newImage<uint8_t>("path to sd card image");

// 当使用 16-bit 颜色, 用下面的来初始化图片:
Raw16 * img16 = newImage<uint16_t>("path to sd card image");

示例:


# include"TFT_eSPI.h"
# include "Seeed_FS.h" //Including SD card library
# include"RawImage.h"  //Including image processing library
TFT_eSPI tft;

void setup() {
    //初始化 SD 卡
    if(!SD.begin(SDCARD_SS_PIN, SDCARD_SPI)) {
        while (1);
    }
    tft.begin();
    tft.setRotation(3);

    drawImage<uint8_t>("test.bmp", 0, 0); // 在(0, 0)处显示这张在SD卡中的 8-bit 图片

}

void loop() {
}

二、线图

本节描述了如何在Wio Terminal上绘制线图。你可以使用它来显示原始传感器值,以便在屏幕上可视化读数,就像串行绘图仪一样!这个库非常灵活,可以根据你自己的需要进行修改。
在这里插入图片描述

1、安装库

为 Wio Terminal 安装支持绘制 2D 图形的 Seeed_Arduino_Linechart 库。
下载Seeed_Arduino_Linechart并安装到arduino,可参考之前所述.zip安装。

2、开始

  • 初始化绘制线形图。
    首先,定义要存储的变量的最大数量,以及存储数据的doubles类型,并使用TFT Sprite函数创建缓冲区。
#define max_size 50 // 最大数据大小
doubles data; // 申明一个 doubles 类型来储存数据
TFT_eSprite spr = TFT_eSprite(&tft);  // Sprite
// 创建一个TFT_eSprite对象的实例,名为spr。这个对象通常用于图形显示
// TFT_eSprite可能是一个库或框架中定义的类,用于管理和操作屏幕上的图形元素。通过这个类的对象,你可以绘制形状、文本、图像等,并控制它们在屏幕上的显示。
// &tft是一个指向tft对象的指针,spr对象将与tft对象关联,所有通过spr进行的图形操作都将影响tft所代表的屏幕。
  • 初始化屏幕
void setup() {
    tft.begin();
    tft.setRotation(3);
    spr.createSprite(TFT_HEIGHT,TFT_WIDTH);
}
  • 将变量加载到数据
    将变量加载到数据使用data.prush(variable)将变量(即传感器读数)存储在数据中,如果达到预定义的最大值,则删除第一个变量(继续)。
    spr.fillSprite(TFT_WHITE);
    if (data.size() == max_size) {
        data.pop(); // 这是用来移除第一个读取的变量的。
    }
    data.push(0.01 * random(1, 10)); // 读取变量并将其存储在数据中
  • 初始化线图标题的设置
    配置线图标题所需显示的一些设置。初始化一个文本(x, y)结构体,其中(x, y)是标题的起始坐标。并配置如下设置。在此示例中,header是该结构体的名称,可以更改设置并进行配置,如header.value(“test”)等。
    // 线图标题的设置
    auto header =   text(0, 0)      // 标题的起始坐标
                .value("test")      // 线图的实际标题
                .align(center)      // 标题水平对齐
                .valign(vcenter)    // 标题垂直对齐
                .width(tft.width()) // 标题宽度
                .thickness(3);      // 字体的粗细程度

    header.height(header.font_height() * 2); // 标题的高度是字体高度的两倍
    header.draw(); 

为了帮助您理解这段示例代码,标题的配置可以参考以下图片:
在这里插入图片描述

  • 初始化线条图的设置并在液晶显示屏上绘制
    一些用于配置期望的折线图显示的设置。初始化一个line_chart(x, y)结构体,其中(x, y)是折线图的起始坐标。并按如下方式配置设置。在这个例子中,content是这个结构体的名称,可以像content.based_on(0.0)等一样更改和配置设置。根据需要更改这些设置以优化显示!
  // 折线图的设置
    auto content = line_chart(20, header.height()); //(x,y) 折线图的开始
         content
                .height(tft.height() - header.height() * 1.5) // 折线图的实际高度
                .width(tft.width() - content.x() * 2) // 折线图的实际宽度
                .based_on(0.0) 		// Y轴的起点,必须是一个浮点数
                .show_circle(false) // 在每个数据点上绘制一个圆,默认是开启的
                .value(data) 		// 将数据传递给折线图
                .color(TFT_PURPLE)  // 线的颜色
                .draw();

    spr.pushSprite(0, 0);
    delay(50);

为了帮助您理解这段示例代码,标题的配置可以参考以下图片:
在这里插入图片描述
示例:

#include"seeed_line_chart.h"    // 包含库
TFT_eSPI tft;

#define max_size 50             // 最大数据大小
doubles data;                   //  初始化一个doubles类型来储存数据
TFT_eSprite spr = TFT_eSprite(&tft);  // Sprite 

void setup() {
    tft.begin();
    tft.setRotation(3);
    spr.createSprite(TFT_HEIGHT,TFT_WIDTH);
}

void loop() {
    spr.fillSprite(TFT_WHITE);
    if (data.size() == max_size) {
        data.pop();                   // 这是用来移除第一个读取的变量
    }
    data.push(0.01 * random(1, 10));  // 读取变量并将其存储在数据中

    // 折线图的标题设置
    auto header =  text(0, 0)
                .value("test")
                .align(center)
                .valign(vcenter)
                .width(tft.width())
                .thickness(3);

    header.height(header.font_height() * 2);
    header.draw(); 					// 标题的高度是字体高度的两倍

  //Settings for the line graph
    auto content = line_chart(20, header.height()); //(x,y) where the line graph begins
         content
                .height(tft.height() - header.height() * 1.5) //actual height of the line chart
                .width(tft.width() - content.x() * 2) //actual width of the line chart
                .based_on(0.0) //Starting point of y-axis, must be a float
                .show_circle(false) //drawing a cirle at each point, default is on.
                .value(data) //passing through the data to line graph
                .color(TFT_PURPLE) //Setting the color for the line
                .draw();

    spr.pushSprite(0, 0);
    delay(50);
}

三、直方图

本节描述了如何在 Wio Terminal 上绘制直方图。与折线图库类似,你可以使用它来显示原始传感器值,从而在屏幕上可视化读数。这个库非常灵活,可以根据你自己的需要进行修改。
在这里插入图片描述

1、安装库

下载Seeed_Arduino_Histogram并添加到arduino。

2、开始

  • 初始化绘制直方图
#include <TFT_eSPI.h> // 特定硬件库
#include <SPI.h>
#include"Histogram.h"

TFT_Histogram histogram=TFT_Histogram(); // 初始化Histogram
TFT_eSPI tft = TFT_eSPI(); // 初始化 TFT

void setup(void) {
  tft.init();
  histogram.initHistogram(&tft);
}
  • 在直方图中创建柱形
void formHistogram(String label,int NO,double Histogram_value,int Histogram_WIDTH,uint32_t colour);

其中,label 是其所在列的列名,NO 是直方图列的编号标签,Histogram_value 是直方图列的值,Histogram_WIDTH 是直方图列的宽度,而 colour 是直方图列的颜色。

  • 显示直方图
void showHistogram();
  • 修改列的值
void changeParam(uint8_t NO, String lable, float Histogram_value, uint32_t colour);

其中,NO 指的是直方图列的编号标签(即要更改哪一列)。

  • 删除列
void deleteCylinder(uint8_t NO);

其中,NO 指的是直方图列的编号标签。

  • 在直方图上添加折线图
void lineChart(uint32_t colour);

其中,color 是折线图的颜色。

  • 隐藏直方图的坐标轴
void notShowAxis();
  • 其他有用的功能
    要了解直方图库的其他更多有用功能,请参考Histogram.h文件。此外,它还提供了多组示例以及一个完整的功能演示,这些都可以在examples文件夹中找到。

示例:

#include <TFT_eSPI.h> //Hardware-specific library
#include <SPI.h>
#include"Histogram.h" //include histogram library

TFT_Histogram histogram=TFT_Histogram(); //Initializing tft and histogram
TFT_eSPI tft = TFT_eSPI();

void setup() {
  tft.init();
  histogram.initHistogram(&tft);
  histogram.formHistogram("a",1,50.55,40,TFT_RED); 	//列 1
  histogram.formHistogram("b",2,20,40,TFT_BLACK); 	//Column 2
  histogram.formHistogram("c",3,100,50,TFT_GREEN); 	//Column 3
  histogram.formHistogram("d",4,53,50,TFT_BLUE); 	//Column 4
  histogram.formHistogram("e",5,133,30,TFT_YELLOW); //Column 5
  histogram.formHistogram("f",6,53,50,TFT_ORANGE); 	//Column 6
  histogram.formHistogram("g",7,80,50,TFT_PINK); 	//Column 7

  histogram.showHistogram(); 	//show histogram
  delay(3000);

  histogram.changeParam(6,"F",55,TFT_PINK);			//change column 6
  histogram.deleteCylinder(7);						//delete colum 7
  histogram.lineChart(TFT_BLACK);

  delay(2000);
  histogram.notShowAxis();				//hiding the axis of histogram
}
void loop() {

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/381936.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言字符串常量

字符串常量 字符串常量在内存中的存储&#xff0c;实质是一个匿名数组匿名数组&#xff0c;同样满足数组两种涵义的规定示例&#xff1a; printf("%d\n", sizeof("abcd")); // 此处 "abcd" 代表整个数组 printf("%p\n", &"…

038 什么是面向对象

面向过程&面向对象 什么是面向对象 现实世界中的事物、类、对象之间的关系 在我们想通过计算机解决一个具体问题的时候&#xff0c;我们可以研究与问题有关事物的共性&#xff0c;比如我在观察了大量的杯子后得出一些结论&#xff1a;杯子都应该有材质、颜色、尺寸、形状这…

Unity 接口、抽象类、具体类对象的配合使用案例

文章目录 示例1&#xff1a;接口&#xff08;Interface&#xff09;示例2&#xff1a;抽象类&#xff08;Abstract Class&#xff09;示例3&#xff1a;结合使用接口与抽象类示例4&#xff1a;多接口实现示例5&#xff1a;抽象类与接口结合 在Unity中使用C#编程时&#xff0c;接…

74HC154D-LED

一、引脚说明 1-11 13-17 &#xff1a;输出端。&#xff08;outputs (active LOW)&#xff09; 12&#xff1a;Gnd电源地 &#xff08;ground (0 V)&#xff09; 18-19&#xff1a;使能输入端、低电平有效 (enable inputs (active LOW)) 20-23&#xff1a;地址输入端 (addr…

计算机网络——04接入网和物理媒体

接入网和物理媒体 接入网络和物理媒体 怎样将端系统和边缘路由器连接&#xff1f; 住宅接入网络单位接入网络&#xff08;学校、公司&#xff09;无线接入网络 住宅接入&#xff1a;modem 将上网数据调制加载到音频信号上&#xff0c;在电话线上传输&#xff0c;在局端将其…

Redis核心技术与实战【学习笔记】 - 30.番外篇:Redis学习资料、运维说明及使用规范建议

1.Redis学习资料 虽然前面已经学习了 Redis 理论和技术点&#xff0c;但是如果想要持续提升自己的技术能力&#xff0c;还是需要不断丰富自己的知识体系。本章&#xff0c;给你推荐几本优秀的书籍&#xff0c;以及拓展知识面的其他资料。 1.1 经典书籍 在学习 Redis 时&…

如何实现视线(目光)的检测与实时跟踪

如何实现视线(目光)的检测与实时跟踪 核心步骤展示说明 找到人脸 检测人脸特征点 根据特征点找到人眼区域 高精度梯度算法检测瞳孔中心 根据眼睛周边特征点计算眼睛中心 瞳孔中心和眼睛中心基于视线模型计算视线方向 视线方向可视化 详细实现与说明&#xff1a; https://stud…

机器学习2--逻辑回归(案列)

糖尿病数据线性回归预测 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_diabetes diabetesload_diabetes() datadiabetes[data] targetdiabetes[target] feature_namesdiabetes[feature_names] data.shape df …

【知识整理】招人理念、组织结构、招聘

1、个人思考 几个方面&#xff1a; 新人&#xff1a;选、育、用、留 老人&#xff1a;如何甄别&#xff1f; 团队怎么演进&#xff1f; 有没有什么注意事项 怎么做招聘&#xff1f; 2、 他人考虑 重点&#xff1a; 1、从零开始&#xff0c;讲一个搭建团队的流程 2、标…

【MySQL】字符串函数的学习

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-J7VN4RbrBi51ozap {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

【论文阅读笔记】InstantID : Zero-shot Identity-Preserving Generation in Seconds

InstantID:秒级零样本身份保持生成 理解摘要Introduction贡献 Related WorkText-to-image Diffusion ModelsSubject-driven Image GenerationID Preserving Image Generation Method实验定性实验消融实验与先前方法的对比富有创意的更多任务新视角合成身份插值多身份区域控制合…

探索C语言的内存魔法:动态内存管理解析

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C语言学习 贝蒂的主页&#xff1a;Betty‘s blog 1. 静态开辟内存 通过前面的学习&#xff0c;我们已经掌握了两种开辟内存的方…

auto.js教程(autojs教程、autox.js、autoxjs)笔记(一)Autojs概述

参考文章&#xff1a;【自动化技术】Autojs从入门到精通 参考文章&#xff1a;AutoXJS开发入门简介菜鸟教程 参考文章&#xff1a;关于Auto.js的下架说明 参考文章&#xff1a;Auto.js 4.1.0 文档 文章目录 001--【Autojs概述】1、Autojs是什么&#xff0c;能做什么&#x…

【算法与数据结构】496、503、LeetCode下一个更大元素I II

文章目录 一、496、下一个更大元素 I二、503、下一个更大元素II三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、496、下一个更大元素 I 思路分析&#xff1a;本题思路和【算法与数据结构】739、LeetCode每日温度类似…

大脑是宇宙中最复杂的物体——科学家们试图破译它,读懂人们的思想

2023年&#xff0c;德克萨斯大学HuthLab进行的一项研究在神经科学和技术领域引发了震动。通过人工智能(AI)和脑成像技术的结合&#xff0c;无法与外界交流的人的思想首次被翻译成连续的自然语言。 这是迄今为止最接近读心术的科学方法。在过去的二十年里&#xff0c;神经成像技…

Zookeeper集群搭建(3台)

准备工作 1、提前安装好hadoop102、hadoop103、hadoop104三台机器&#xff0c;参照&#xff1a;CentOS7集群环境搭建&#xff08;3台&#xff09;-CSDN博客 2、提前下载好Zookeeper安装包并上传到/opt/software上、安装包&#xff0c;链接&#xff1a;https://pan.baidu.com/…

如何解决利用cron定时任务自动更新SSL证书后Nginx重启问题

利用cron定时任务自动更新SSL证书后&#xff0c;用浏览器访问网站&#xff0c;获取到的证书仍然是之前的。原因在于没有对Nginx进行重启。 据说certbot更新完成证书后会自动重启Nginx,但显然经我检测不是这回事儿。 所以我们需要创建一bash脚本&#xff0c;然后定时调用这个脚…

Java多线程:定时器

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、Timer类二、手动实现定时器1、实现逻辑2、问题描述2.1、问题一&#xff1a;线程安全问题2.2、问题二&#xff1a;使用 slee…

[C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改

问题描述 WPF中DataGrid的选中行或选中者单元格&#xff0c;在焦点失去后&#xff0c;颜色会很淡&#xff0c;很不明显&#xff0c;不容易区分。 解决方法 在失去焦点的情况下&#xff0c;如何设置行或单元格与选中的时候颜色一样&#xff1f; <DataGrid.Resources>&…

滑块识别验证

滑块识别 1. 获取图片 测试网站&#xff1a;https://www.geetest.com/adaptive-captcha-demo 2. 点击滑块拼图并开始验证 # 1.打开首页 driver.get(https://www.geetest.com/adaptive-captcha-demo)# 2.点击【滑动拼图验证】 tag WebDriverWait(driver, 30, 0.5).until(la…