当前位置: 首页 > news >正文

【rust/esp32】在idf中使用embedded-graphics控制st7789 LCD屏幕

文章目录

  • 说在前面
  • 模块详情
  • 准备工作
  • 开始
  • 编译
  • 烧录
  • 结果

说在前面

  • esp32版本:s3
  • 运行环境:esp-idf(std)
  • 开发环境:wsl2
  • LCD模块:ST7789V2 240*280 LCD
  • github地址:这里

模块详情

  • 某宙的esp32s3开发板
    在这里插入图片描述

  • 某雪的1.69inch LCD模块,包含杜邦线
    在这里插入图片描述

准备工作

  • 开发环境(std)搭建,见上篇

  • lcd引脚
    在这里插入图片描述

  • esp32引脚
    在这里插入图片描述

  • 引脚连接
    除了几个固定的,其它可以自行选择,这里我的连接如下

    LCDesp32(括号里为上图的序号)esp32 gpio
    VCC3.3V(18)/
    GNDGND(17)/
    DINSPI_MOSI(20)GPIO17
    CLKSPI_CK(19)GPIO18
    CSSPI_CS(23)GPIO14
    DCGPIO15(22)GPIO15
    RSTGPIO16(21)GPIO16
    BLGPIO13(24)GPIO13

开始

  • 如果从空工程开始的话,可以使用code-generate
    cargo generate esp-rs/esp-idf-template cargo
    
  • 添加依赖
    [features]
    default = ["std", "embassy", "esp-idf-svc/native"]pio = ["esp-idf-svc/pio"]
    std = ["alloc", "esp-idf-svc/binstart", "esp-idf-svc/std"]
    alloc = ["esp-idf-svc/alloc"]
    nightly = ["esp-idf-svc/nightly"]
    experimental = ["esp-idf-svc/experimental"]
    embassy = ["esp-idf-svc/embassy-sync", "esp-idf-svc/critical-section", "esp-idf-svc/embassy-time-driver"][dependencies]
    anyhow = {version = "1", features = ["backtrace"]}
    log = { version = "0.4", default-features = false }
    esp-idf-svc = { version = "0.47.1", default-features = false }
    embedded-graphics = "0.8.1"
    display-interface-spi = "0.4"
    mipidsi = "0.7.1"[build-dependencies]
    embuild = "0.31.3"[package.metadata.esp-idf-sys]
    esp_idf_tools_install_dir = "global"
    
  • 代码(逻辑基本和树莓派一致)
    use display_interface_spi::SPIInterfaceNoCS;
    use embedded_graphics::{mono_font::{MonoTextStyle, ascii::FONT_10X20}, pixelcolor::Rgb565, text::Text, prelude::*, Drawable};
    use esp_idf_svc::hal::{spi, gpio, prelude::*};
    use anyhow::Result;fn main() -> Result<()> {// It is necessary to call this function once. Otherwise some patches to the runtime// implemented by esp-idf-sys might not link properly. See https://github.com/esp-rs/esp-idf-template/issues/71esp_idf_svc::sys::link_patches();// Bind the log crate to the ESP Logging facilitiesesp_idf_svc::log::EspLogger::initialize_default();let peripherals = Peripherals::take().unwrap();let pins = peripherals.pins;test_lcd(peripherals.spi2,pins.gpio13.into(),pins.gpio15.into(),pins.gpio16.into(),pins.gpio18.into(),pins.gpio17.into(),pins.gpio14.into(),)?;Ok(())
    }fn test_lcd(spi: spi::SPI2,backlight: gpio::AnyOutputPin,dc: gpio::AnyOutputPin,rst: gpio::AnyOutputPin,sclk: gpio::AnyOutputPin,sdo: gpio::AnyOutputPin,cs: gpio::AnyOutputPin,
    ) -> Result<()> {let driver = spi::SpiDeviceDriver::new_single(spi,sclk,sdo,Option::<gpio::AnyIOPin>::None,Some(cs),&spi::SpiDriverConfig::new().dma(spi::Dma::Disabled),&spi::SpiConfig::new().baudrate(20_000_000.into()).data_mode(esp_idf_svc::hal::spi::config::MODE_0),)?;let dc = gpio::PinDriver::output(dc)?;let rst = gpio::PinDriver::output(rst)?;let mut backlight = gpio::PinDriver::output(backlight)?;let di = SPIInterfaceNoCS::new(driver, dc);let mut delay = esp_idf_svc::hal::delay::Ets;let mut display = mipidsi::Builder::st7789(di).with_display_size(240, 280).with_orientation(mipidsi::Orientation::Landscape(true)).init(&mut delay, Some(rst)).unwrap();// Textlet text = "Hello World ^_^;";let text_x = 120;let text_y = 280 / 2;let text_style = MonoTextStyle::new(&FONT_10X20, Rgb565::WHITE);// Alternating colorlet colors = [Rgb565::RED, Rgb565::GREEN, Rgb565::BLUE];// Clear the display initiallydisplay.clear(colors[0]).unwrap();// Turn on backlightlet _ = backlight.set_high();// Draw textText::new(text, Point::new(text_x, text_y), text_style).draw(&mut display).unwrap();println!("Draw Hello from Rust!");Ok(())
    }
    

编译

  • 编译如果不通过,可以参考环境搭建
    cargo build --target xtensa-esp32s3-espidf
    

烧录

  • wsl访问usb设备见环境搭建
    espflash flash target/xtensa-esp32s3-espidf/debug/rs-esp32s3-st7789-demo
    

结果

在这里插入图片描述

相关文章:

【rust/esp32】在idf中使用embedded-graphics控制st7789 LCD屏幕

文章目录 说在前面模块详情准备工作开始编译烧录结果 说在前面 esp32版本&#xff1a;s3运行环境&#xff1a;esp-idf(std)开发环境&#xff1a;wsl2LCD模块&#xff1a;ST7789V2 240*280 LCDgithub地址&#xff1a;这里 模块详情 某宙的esp32s3开发板 某雪的1.69inch LCD模块…...

YOLOv8如何添加注意力模块?

分为两种&#xff1a;有参注意力和无参注意力。 eg: 有参&#xff1a; import torch from torch import nnclass EMA(nn.Module):def __init__(self, channels, factor8):super(EMA, self).__init__()self.groups factorassert channels // self.groups > 0self.softmax …...

用LibreOffice在excel中画折线图

数据表格如下。假设想以x列为横坐标&#xff0c;y1和y2列分别为纵坐标画折线图。 选择插入-》图表&#xff1a; 选择折线图-》点和线&#xff0c;然后点击“下一步”&#xff1a; 选择&#xff1a;列中包含数据序列&#xff0c;然后点击完成&#xff08;因为图挡住了数据…...

RabbitMQ 链接管理-发布者-消费者

RabbitMQ连接管理器 using RabbitMQ.Client; using System; public class RabbitMQConnectionManager { private readonly IConnectionFactory _connectionFactory; private IConnection _connection; public RabbitMQConnectionManager(string hostName) { …...

JAVA中的垃圾回收器(3)----ZGC

一)ZGC介绍:是JAVA11新引入的低延迟垃圾收集器 ZGC是一款基于Regin的&#xff0c;暂时没有分代概念的&#xff0c;使用了读屏障&#xff0c;颜色指针等技术来实现并发的标记清除和标记整理算法&#xff0c;一低延迟为主要目标的一款垃圾回收器 ZGC的regin可以分为是下图中具有大…...

IDEA 如何运行 SpringBoot 项目

步骤一&#xff1a;配置 Maven 第一步&#xff1a;用 IDEA 打开项目&#xff0c;准备配置 maven 环境 &#xff0c;当然如果本地没有提前配置好 maven&#xff0c;就用 IDEA 默认的配置即可 配置 maven 步骤 情况 1&#xff1a;如果本地没有配置过 maven&#xff0c;可以保持如…...

Linux MeterSphere测试平台远程访问你不会?来试试这篇文章

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网…...

15.k8s集群防火墙配置

防火墙配置 ######################## # master节点防火墙设置 ######################### 所有master节点开放相关防火墙端口 $ firewall-cmd --zonepublic --add-port6443/tcp --permanent $ firewall-cmd --zonepublic --add-port2379-2380/tcp --permanent $ firewall-cmd…...

Python beautifulsoup网络抓取和解析cnblog首页帖子数据

视频版教程&#xff1a;一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium 我们抓取下https://www.cnblogs.com/ 首页所有的帖子信息&#xff0c;包括帖子标题&#xff0c;帖子地址&#xff0c;以及帖子作者信息。 首先用requests获取网页文件&#xff0…...

Java集成腾讯云OCR身份证识别接口

一、背景 项目用到身份证识别获取人员信息的功能&#xff0c;于是想到了腾讯云提供这样的API。在整合代码过程都很顺利&#xff0c;利用腾讯云官方SDK很快集成进来。但是在上测试环境部署时有了新的问题&#xff0c;通过Nginx代理后的环境无法访问到目标腾讯云接口&#xff0c;…...

C++之C++11引入enum class与传统enum关键字总结(二百五十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

如何将word格式的文档转换成markdown格式的文档

如何将word格式的文档转换成markdown格式的文档 前言 A. 介绍Markdown和Word格式文档 什么是Markdown&#xff1f; Markdown是一种轻量级标记语言&#xff0c;旨在简化文本格式化和排版的过程。它以纯文本形式编写&#xff0c;通过使用简单的标记语法&#xff0c;使文档更具…...

Leetcode—2558.从数量最多的堆取走礼物【简单】

2023每日刷题&#xff08;十二&#xff09; Leetcode—2558.从数量最多的堆取走礼物 大顶堆实现代码 void swap(int *a, int *b) {int tmp *a;*a *b;*b tmp; }void downAdjustHeap(int *heap, int low, int high) {int i low;int j 2 * i 1;while(j < high) {if(j …...

【如何写论文】硕博学位论文的结构框架、过程与大纲分析

硕士论文可以说是毕业前最重要的一部分&#xff0c;也可以说是展示和检验你3年研究生学习的成果的一个考试。硕士论文答辩和检验合格&#xff0c;才能够顺利拿到毕业生和学位证&#xff0c;可见其重要性。 目录 一、基础框架1.1、摘要&#xff08;Abstract&#xff09;1.2、绪论…...

砷化镓(GaAs)纳米线 砷化镓纳米线 GaAs纳米线 瑞禧

砷化镓&#xff08;GaAs)纳米线 名称&#xff1a;砷化镓(GaAs&#xff09;纳米线 直径&#xff1a;50-400 nm 长度&#xff1a;10-80μm 纳米线是一种新型的材料结构&#xff0c;具有较小的直径和高的长度比&#xff0c;因此在纳米电子学、光电器件等领域有着广泛的应用前景…...

PostGreSQL:JSON|JSONB数据类型

JSON JSON 指的是 JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09;JSON 是轻量级的文本数据交换格式JSON 独立于语言&#xff1a;JSON 使用 Javascript语法来描述数据对象&#xff0c;但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许…...

树----数据结构

树的概念 树是一种非线性的数据结构&#xff0c;它是由 n (n>1) 个有限结点组成一个具有层次关系的集合&#xff0c;它看起来就像一颗倒挂的树&#xff0c;根朝上&#xff0c;叶朝下。由 0 个节点构成的树&#xff0c;叫做空树。 树的特点&#xff1a;每个结点有 0 个或多…...

GitLab定时备份

GitLab定时备份 文章目录 GitLab定时备份GitLab基础环境备份命令自动清理备份上传命令设置定时任务参考链接 GitLab基础环境 部署方式&#xff1a;Docker 版本&#xff1a;16.2.2 备份命令 Notes&#xff1a; 编写sh脚本时&#xff0c;不要使用Windows上的Notepad类似编辑…...

SQL IN 运算符

SQL IN 运算符 IN 运算符允许您在 WHERE 子句中指定多个值。 IN 运算符是多个 OR 条件的简写。 SQL IN 语法 SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, ...); 或者 SELECT column_name(s) FROM table_name WHERE column_name IN (SELE…...

虚拟机构建单体项目及前后端分离项目

引言 在现代化办公环境中&#xff0c;会议是组织沟通、决策和合作的重要方式之一。为了提高会议的效率和质量&#xff0c;许多企业选择部署会议OA系统来实现会议管理的自动化和数字化。本博客将介绍如何部署和优化会议OA系统&#xff0c;并探讨前后端分离的SPA项目在此过程中的…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...