[ESP32 IDF+Vscode]OLED多级菜单显示(摇杆控制)

news/2024/2/21 3:06:33

ADC介绍

ESP32集成了两个 12SAR(逐次逼近寄存器)adc ,共支持18个测量通道。

1、两个 ADC 通道简介:

ADC1:

  • 支持 8 个通道,包括:GPIO32 - GPIO39(并非按顺序)

ADC2:

  • 支持 10 个通道,包括:GPIO0, GPIO2, GPIO4, GPIO12 - GPIO15, GOIO25 - GPIO27(并非按顺序)

ESP32 内置霍尔传感器,采用 ADC1 的通道0和3(GPIO36 和 GPIO39)。如果想要使用ESP32内置的霍尔传感器,请不要对这两个GPIO做任何配置! 

接线方式

Ps2---        ----ESP32

VRY                ADC_CHANNEL_6(GPIO 34)

VRX                ADC_CHANNEL_7(GPIO 35)

SW                  GPIO_NUM_12

效果

 

 

 代码

void Get_keyNum(void)
{uint8_t KeyNum = 0;BaseType_t err;//int val_x = adc1_get_raw(PS2_X_CHANNEL);if (adc1_get_raw(PS2_X_CHANNEL) ==4095) {Delay_ms(20);while (adc1_get_raw(PS2_X_CHANNEL)==4095);Delay_ms(20);KeyNum = 1;} else if (adc1_get_raw(PS2_X_CHANNEL)==0) {Delay_ms(20);while (adc1_get_raw(PS2_X_CHANNEL)==0);Delay_ms(20);KeyNum = 2;}// 检测SW按键是否按下if (btn_intr_flag == 1) {KeyNum = 3;btn_intr_flag = 0;}if((key_queue!=NULL)&&(KeyNum)){err=xQueueSend(key_queue,&KeyNum,10);if(err!= pdPASS){printf("Send Failed\r\n");}}//printf("KeyNum:%d\n", KeyNum);
}

OLED

#include <stdio.h>
#include "menu.h"
#include "dht11.h"
#include "OLED.h"
#include "bmp.h"#define Number 25//定义时间,日期,星期变量
uint16_t hour = 17;
uint16_t minute = 51;
uint16_t second = 0;
uint16_t day = 27;
uint16_t month = 8;
uint16_t year = 23;
uint8_t week = 7;//索引数组相关
void (*current_operation_index)(); //执行当前操作函数
uint8_t func_index = 0;/*定义了索引数组,索引数组要配合主程序按键值进行选择*/Menu_table  table[26]=
{//序号,下一项,确定,返回{0, 1, 4, 0,(*show1)},//一级界面    图片{1, 2, 11, 1,(*show2)},//一级界面   时间{2, 3, 12, 2,(*show3)},//一级界面   led{3, 0, 13, 3,(*show4)},//一级界面   游戏//图片的下层界面{4, 5, 4, 0, (*show5)},  //二级界面 猫{5, 6, 5, 0, (*show10)}, //二级界面{6, 7, 6, 0, (*show6)}, //二级界面{7, 8, 7, 0, (*show7)}, //二级界面{8, 9, 8, 0, (*show8)}, //二级界面{9, 10, 9, 0,( *show9)},    //二级界面{10, 4 ,10, 0, (*show12)},  //二级界面 //时间的下层界面{11, 11, 11, 1, (*show13)},  //二级界面  时间//LED的下层界面{12, 12, 2, 2,(*show14)}, //二级界面 		//控制led//游戏的下层界面{13, 13, 13, 3, (*show11)}, //二级界面 };//按键
void  Menu_key_set(uint8_t KeyNum)
{OLED_Clear();if(KeyNum == 1){   func_index=table[func_index].next;//按键next按下后的索引号OLED_Clear();}if(KeyNum == 3){func_index=table[func_index].enter;OLED_Clear();}if(KeyNum == 2){   func_index=table[func_index].back;//按键next按下后的索引号OLED_Clear();}current_operation_index=table[func_index].current_operation;//执行当前索引号所对应的功能函数。(*current_operation_index)();//执行当前操作函数}//显示菜单函数void show0(void)//眼睛
{OLED_DrawBMPFast(yanjing);
}void show1(void)//图片
{OLED_DrawBMPFast(tupian);}void show2(void)//时间
{OLED_ShowCHinese(50,3,0);OLED_ShowCHinese(66,3,1);}void show3(void)//LED
{OLED_DrawBMPFast(led);}void show4(void)//游戏图标
{OLED_DrawBMPFast(youxiji);
}//显示图片
void show5(void)
{OLED_DrawBMPFast(cat);
}
void show6(void)
{OLED_DrawBMPFast(baozi);
}
void show7(void)
{OLED_DrawBMPFast(baoziyi);
}
void show8(void)
{OLED_DrawBMPFast(daishu);
}
void show9(void)
{OLED_DrawBMPFast(mapi);
}
void show10(void)
{OLED_DrawBMPFast(dog);
}
//显示太空人
void show11(void)
{OLED_DrawBMPFast(gImage_1);Delay_ms(Number);OLED_DrawBMPFast(gImage_2);Delay_ms(Number);OLED_DrawBMPFast(gImage_3);Delay_ms(Number);OLED_DrawBMPFast(gImage_4);Delay_ms(Number);OLED_DrawBMPFast(gImage_5);Delay_ms(Number);OLED_DrawBMPFast(gImage_6);Delay_ms(Number);OLED_DrawBMPFast(gImage_7);Delay_ms(Number);OLED_DrawBMPFast(gImage_8);Delay_ms(Number);OLED_DrawBMPFast(gImage_9);Delay_ms(Number);OLED_DrawBMPFast(gImage_10);Delay_ms(Number);OLED_DrawBMPFast(gImage_11);Delay_ms(Number);OLED_DrawBMPFast(gImage_12);Delay_ms(Number);OLED_DrawBMPFast(gImage_13);Delay_ms(Number);OLED_DrawBMPFast(gImage_14);Delay_ms(Number);OLED_DrawBMPFast(gImage_15);Delay_ms(Number);OLED_DrawBMPFast(gImage_16);Delay_ms(Number);OLED_DrawBMPFast(gImage_17);Delay_ms(Number);OLED_DrawBMPFast(gImage_18);Delay_ms(Number);OLED_DrawBMPFast(gImage_19);Delay_ms(Number);OLED_DrawBMPFast(gImage_20);Delay_ms(Number);
}
void show12(void)
{OLED_ShowCHinese(50,3,9);OLED_ShowCHinese(66,3,10);
}//显示时间
void show13(void)
{OLED_ShowCHinese(0,3,2);OLED_ShowCHinese(16,3,3);OLED_ShowChar(32,3,':',16);OLED_ShowNum(40,3,20,2,16);OLED_ShowNum(56,3,year/10,1,16);OLED_ShowNum(64,3,year%10,1,16);OLED_ShowChar(72,3,'-',16);OLED_ShowNum(80,3,month/10,1,16);OLED_ShowNum(88,3,month%10,1,16);OLED_ShowChar(98,3,'-',16);OLED_ShowNum(104,3,day/10,1,16);OLED_ShowNum(112,3,day%10,1,16);//显示时间OLED_ShowCHinese(0,1,0);OLED_ShowCHinese(16,1,1);OLED_ShowChar(32,1,':',16);OLED_ShowNum(40,1,hour/10,1,16);OLED_ShowNum(48,1,hour%10,1,16);OLED_ShowChar(56,1,':',16);OLED_ShowNum(64,1,minute/10,1,16);OLED_ShowNum(72,1,minute%10,1,16);OLED_ShowChar(80,1,':',16);OLED_ShowNum(88,1,second/10,1,16);OLED_ShowNum(96,1,second%10,1,16);//显示星期OLED_ShowCHinese(0,5,4);OLED_ShowCHinese(16,5,5);OLED_ShowChar(32,5,':',16);OLED_ShowNum(70,5,week,1,16);
}//控制led
void show14(void)
{OLED_DrawBMPFast(dengbao);}
//void show15(void)
//{
//}
//void show16(void)
//{
//}//控制时间,日期与星期增加
void Date_Time(void)
{//显示日期//判断日期if(hour>=24){day++;week++;if(week >= 7)week = 1;if(day==30){month++;day = 0;if(month==12){year++;month = 0;if(year > 2050 || year < 2000) year = 0;}}}
}

 完整代码:

ESP32 IDF Vscode: ESP32开发 - Gitee.com


http://www.ppmy.cn/news/1130672.html

相关文章

嵌入式Linux应用开发-第十二章设备树的改造

嵌入式Linux应用开发-第十二章设备树的改造 第十二章 LED模板驱动程序的改造&#xff1a;设备树12.1 总结3种写驱动程序的方法12.2 怎么使用设备树写驱动程序12.2.1 设备树节点要与platform_driver能匹配12.2.2 设备树节点指定资源&#xff0c;platform_driver获得资源 12.3 开…

【2023集创赛】加速科技杯三等奖作品:私密性高精度刷手身份认证系统

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;加速科技杯三等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电子礼…

uniapp js 合成canvas画布

代码 <template><view><canvas canvas-id"canvas" class"canvas-c"></canvas><!-- <h1>999</h1> --></view> </template><script>export default {name: sharePos,props: {// 绘制图片的尺寸…

socat管理haproxy配置

文章目录 前言一、配置二、简单使用1. 先安装 socat2. 获取 haproxy 的监控数据 总结 前言 我们可以通过 socat 命令 实现对 haproxy 的管理&#xff0c;包括获取监控数据&#xff0c;对后端服务器实现启动停止&#xff0c;服务流量控制等等。 一、配置 要想 haproxy 支持通过…

手动实现Transformer

Transformer和BERT可谓是LLM的基础模型&#xff0c;彻底搞懂极其必要。Transformer最初设想是作为文本翻译模型使用的&#xff0c;而BERT模型构建使用了Transformer的部分组件&#xff0c;如果理解了Transformer&#xff0c;则能很轻松地理解BERT。 一.Transformer模型架构 1…

【数据结构】抽象数据类型

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f38f;数据类型 &#x1f38f;抽象数据类型 结语 &#x1f38f;数据类型 数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称. 数据类型(d…

【SQL server】数据库入门基本操作教学

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 前言 数据库是计算机系统中用于存储和管理数据的一种软件系统。它通常由一个或多个数据集合、管理系统和应用程序组成&#xff0c;被广泛应用于企业、政府和个人等各种领域。目前常用的数…

JavaScript高阶班之ES6 → ES11(九)

JavaScript高阶班之ES6 → ES11 1、class类1.1、class的静态成员1.2、类的继承1.3、类的get和set方法 2、数值扩展2.1、Number.EPSILON2.2、二进制和八进制2.3、Number.isFinite2.4、Number.isNaN2.5、Number.parseInt、Number.parseFloat2.6、Number.isInteger2.7、Math.trunc…

cesium源码无法更新的解决方案

一、环境&#xff1a; 中国移动的宽带 win10操作系统 二、问题复现步骤&#xff1a; 1、开了VPN&#xff0c;设置为全局代理 2、在vscode中执行git pull命令 3、结果显示无法更新 三、解决方案&#xff1a; 1、安装Github官方开发的软件Github Desktop 下载地址&#xf…

嵌入式Linux应用开发-面向对象-分层-分离及总线驱动模型

嵌入式Linux应用开发-面向对象-分层-分离及总线驱动模型 第八章 驱动设计的思想&#xff1a;面向对象/分层/分离8.1 面向对象8.2 分层8.3 分离8.4 写示例代码8.5 课后作业 第九章 驱动进化之路&#xff1a;总线设备驱动模型9.1 驱动编写的 3种方法9.1.1 传统写法9.1.2 总线设备…

全面横扫:dlib Python API在Linux和Windows的配置方案

前言 在计算机视觉和人工智能领域&#xff0c;dlib是一个备受推崇的工具库。它为开发者提供了强大的图像处理、机器学习和深度学习功能。在计算机视觉项目中&#xff0c;配置dlib Python API是一个重要的初始步骤。本文将引导读者详细了解在Linux和Windows系统上安装和配置dli…

YOLOV8-DET转ONNX和RKNN

目录 1. 前言 2.环境配置 (1) RK3588开发板Python环境 (2) PC转onnx和rknn的环境 3.PT模型转onnx 4. ONNX模型转RKNN 6.测试结果 1. 前言 yolov8就不介绍了&#xff0c;详细的请见YOLOV8详细对比&#xff0c;本文章注重实际的使用&#xff0c;从拿到yolov8的pt检测模型&…

优化 Node.js 性能:检测内存泄漏和高 CPU 使用率

优化 Node.js 性能&#xff1a;检测内存泄漏和高 CPU 使用率 Node.js 是一种流行的 JavaScript 运行时&#xff0c;以其速度、性能和可扩展性而闻名。然而&#xff0c;即使是优化和编写得非常好的 Node.js 应用程序也可能会遇到性能问题&#xff0c;例如内存泄漏和 CPU 使用率…

SW免安装的toolbox只读问题

把SOLIDWORKSDATA 整体复制到另外的目录&#xff0c;然后这里设置目录位置。不然原始位置有只读属性

【问题思考总结】CPU怎么访问磁盘?CPU只有32位,最多只能访问4GB的空间吗?

问题 在学习操作系统的时候发现了这样一个问题&#xff0c;32位的CPU寻址空间只有4GB&#xff0c;难道只有4GB的空间可以使用吗&#xff1f;以此为始&#xff0c;我开始了一些思考。 思考 Q1&#xff1a;首先&#xff0c;我似乎混淆了一个概念&#xff0c;内存和外存&#x…

【面试题精讲】Java移位运算符

“ 有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是移位运算符? 在 Java 中&#xff0c;移位运算符用于对二进制数进行位移操作。它们…

查找排序部分习题 242. 有效的字母异位词 74. 搜索二维矩阵 1. 两数之和 167.两数之和 II

242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 class Solution(object):def isAnagram(self, s, t):""…

快速幂算法-python

看了大神讲解&#xff0c;理论在这里&#xff1a;快速幂算法&#xff08;全网最详细地带你从零开始一步一步优化&#xff09;-CSDN博客 例题&#xff1a;求整数 base 的 整数 power 次方&#xff0c;对整数 num_mod 取幂。 python 代码如下&#xff1a; import timedef norm…

C理解(一):内存与位操作

本文主要探讨C语言的内存和为操作操作相关知识。 冯诺依曼结构和哈佛结构 冯诺依曼结构&#xff1a;数据和代码放在一起,便于读取和修改,安全性低 哈佛结构是&#xff1a;数据和代码分开存放,安全性高,读取和修麻烦 内存 内存是用来存储全局变量、局…

ahk系列——ahk_v2实现win10任意界面ocr

前言&#xff1a; 不依赖外部api接口&#xff0c;界面简洁&#xff0c;翻译快速&#xff0c;操作简单&#xff0c; 有网络就能用 、还可以把ocr结果非中文翻译成中文、同样可以识别中英日韩等60多个国家语言并翻译成中文&#xff0c;十分的nice 1、所需环境 windows10及其以上…
最新文章